github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/scripts/create-version-pr/main.go (about) 1 package main 2 3 import ( 4 "os" 5 6 "github.com/ActiveState/cli/internal/errs" 7 wc "github.com/ActiveState/cli/scripts/internal/workflow-controllers" 8 wh "github.com/ActiveState/cli/scripts/internal/workflow-helpers" 9 "github.com/andygrunwald/go-jira" 10 "github.com/blang/semver" 11 "github.com/google/go-github/v45/github" 12 ) 13 14 func main() { 15 if err := run(); err != nil { 16 wc.Print("Error: %s\n", errs.JoinMessage(err)) 17 } 18 } 19 20 type Meta struct { 21 Version semver.Version 22 JiraVersion string 23 VersionPRName string 24 VersionBranchName string 25 } 26 27 func (m Meta) GetVersion() semver.Version { 28 return m.Version 29 } 30 31 func (m Meta) GetJiraVersion() string { 32 return m.JiraVersion 33 } 34 35 func (m Meta) GetVersionBranchName() string { 36 return m.VersionBranchName 37 } 38 39 func (m Meta) GetVersionPRName() string { 40 return m.VersionPRName 41 } 42 43 func run() error { 44 finish := wc.PrintStart("Initializing clients") 45 // Initialize Clients 46 ghClient := wh.InitGHClient() 47 jiraClient, err := wh.InitJiraClient() 48 if err != nil { 49 return errs.Wrap(err, "failed to initialize Jira client") 50 } 51 finish() 52 53 // Grab input 54 if len(os.Args) != 2 { 55 return errs.New("Usage: create-version-branch <version>") 56 } 57 versionName := os.Args[1] 58 59 finish = wc.PrintStart("Fetching meta for version %s", versionName) 60 // Collect meta information about the PR and all it's related resources 61 meta, err := fetchMeta(ghClient, jiraClient, versionName) 62 if err != nil { 63 return errs.Wrap(err, "failed to fetch meta") 64 } 65 finish() 66 67 finish = wc.PrintStart("Creating version PR for version %s", meta.Version) 68 if err := wc.CreateVersionPR(ghClient, jiraClient, meta); err != nil { 69 return errs.Wrap(err, "failed to create version PR") 70 } 71 finish() 72 73 wc.Print("All Done") 74 75 return nil 76 } 77 78 func fetchMeta(ghClient *github.Client, jiraClient *jira.Client, versionName string) (Meta, error) { 79 version, err := wh.ParseJiraVersion(versionName) 80 if err != nil { 81 return Meta{}, errs.Wrap(err, "failed to parse version") 82 } 83 84 finish := wc.PrintStart("Fetching Jira Project info") 85 project, _, err := jiraClient.Project.Get("DX") 86 if err != nil { 87 return Meta{}, errs.Wrap(err, "failed to fetch Jira project") 88 } 89 finish() 90 91 versionPRName := wh.VersionedPRTitle(version) 92 93 // Retrieve Relevant Fixversion Pr 94 finish = wc.PrintStart("Checking if Version PR with title '%s' exists", versionPRName) 95 versionPR, err := wh.FetchPRByTitle(ghClient, versionPRName) 96 if err != nil { 97 return Meta{}, errs.Wrap(err, "failed to get target PR") 98 } 99 if versionPR != nil { 100 return Meta{}, errs.New("Version PR already exists: %s", versionPR.GetLinks().GetHTML().GetHRef()) 101 } 102 finish() 103 104 finish = wc.PrintStart("Fetching Jira version info") 105 for _, v := range project.Versions { 106 if v.Name == versionName { 107 finish() 108 return Meta{ 109 Version: version, 110 JiraVersion: v.Name, 111 VersionPRName: versionPRName, 112 VersionBranchName: wh.VersionedBranchName(version), 113 }, nil 114 } 115 } 116 117 return Meta{}, errs.New("failed to find Jira version matching: %s", versionName) 118 }