github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/scripts/internal/workflow-helpers/workflow.go (about)

     1  package workflow_helpers
     2  
     3  import (
     4  	"log"
     5  	"sort"
     6  	"strings"
     7  
     8  	"github.com/ActiveState/cli/internal/errs"
     9  	"github.com/blang/semver"
    10  	"github.com/google/go-github/v45/github"
    11  )
    12  
    13  const (
    14  	MasterBranch  = "master"
    15  	StagingBranch = "beta"
    16  	ReleaseBranch = "release"
    17  )
    18  
    19  const UpdateVersionCommitMessage = "Update version.txt"
    20  
    21  const VersionNextFeasible = "Next Feasible"
    22  const VersionNextUnscheduled = "Next Unscheduled"
    23  
    24  const VersionedPRPrefix = "Version "
    25  
    26  func VersionedPRTitle(version semver.Version) string {
    27  	return VersionedPRPrefix + version.String()
    28  }
    29  
    30  func VersionFromPRTitle(title string) (semver.Version, error) {
    31  	if !strings.HasPrefix(title, VersionedPRPrefix) {
    32  		return semver.Version{}, errs.New("Title: '%s' does not start with '%s'", title, VersionedPRPrefix)
    33  	}
    34  	v, err := semver.Parse(strings.TrimPrefix(title, VersionedPRPrefix))
    35  	if err != nil {
    36  		return semver.Version{}, errs.Wrap(err, "Failed to parse version from PR title")
    37  	}
    38  	return v, nil
    39  }
    40  
    41  const versionBranchPrefix = "version/"
    42  
    43  func IsVersionBranch(branchName string) bool {
    44  	return strings.HasPrefix(branchName, versionBranchPrefix)
    45  }
    46  
    47  func ValidVersionBranch(branchName string, version semver.Version) error {
    48  	desiredBranchName := VersionedBranchName(version)
    49  	if branchName != desiredBranchName {
    50  		return errs.New("Branch name: '%s' does not match desired branch name: '%s'", branchName, desiredBranchName)
    51  	}
    52  	return nil
    53  }
    54  
    55  func VersionedBranchName(version semver.Version) string {
    56  	if version.EQ(VersionMaster) {
    57  		return MasterBranch
    58  	}
    59  	return versionBranchPrefix + strings.Replace(version.String(), ".", "-", -1)
    60  }
    61  
    62  func issuesWithVersionAssert(issues []*github.Issue, assert Assertion, versionToCompare semver.Version) []*github.Issue {
    63  	result := []*github.Issue{}
    64  	for _, issue := range issues {
    65  		if !strings.HasPrefix(issue.GetTitle(), VersionedPRPrefix) {
    66  			// Search doesn't ensure that it's a prefix
    67  			continue
    68  		}
    69  		version, err := VersionFromPRTitle(issue.GetTitle())
    70  		if err != nil {
    71  			// Not a version PR
    72  			continue
    73  		}
    74  		switch assert {
    75  		case AssertLT:
    76  			if versionToCompare.LT(version) || versionToCompare.EQ(version) {
    77  				continue
    78  			}
    79  			result = append(result, issue)
    80  		case AssertGT:
    81  			if versionToCompare.GT(version) || versionToCompare.EQ(version) {
    82  				continue
    83  			}
    84  			result = append(result, issue)
    85  		default:
    86  			log.Printf("Unknown assertion: %v\n", assert)
    87  			continue
    88  		}
    89  	}
    90  
    91  	sort.Slice(result, func(i, j int) bool {
    92  		v1, _ := VersionFromPRTitle(result[i].GetTitle())
    93  		v2, _ := VersionFromPRTitle(result[j].GetTitle())
    94  		switch assert {
    95  		case AssertLT:
    96  			return v2.LT(v1)
    97  		case AssertGT:
    98  			return v2.GT(v1)
    99  		}
   100  
   101  		return false
   102  	})
   103  
   104  	return result
   105  }