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 }