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