func (tool *codeReviewTool) FinaliseRelease(v *version.Version) (action.Action, error) { // Get a GitHub client. config, err := LoadConfig() if err != nil { return nil, err } client := ghutil.NewClient(config.Token()) owner, repo, err := git.ParseUpstreamURL() if err != nil { return nil, err } // Get the relevant review milestone. releaseString := v.BaseString() task := fmt.Sprintf("Get GitHub review milestone for release %v", releaseString) log.Run(task) milestone, err := milestoneForVersion(config, owner, repo, v) if err != nil { return nil, errs.NewError(task, err) } if milestone == nil { log.Warn(fmt.Sprintf( "Weird, GitHub review milestone for release %v not found", releaseString)) return nil, nil } // Close the milestone unless there are some issues open. task = fmt.Sprintf( "Make sure the review milestone for release %v can be closed", releaseString) if num := *milestone.OpenIssues; num != 0 { return nil, errs.NewError( task, fmt.Errorf( "review milestone for release %v cannot be closed: %v issue(s) open", releaseString, num)) } milestoneTask := fmt.Sprintf("Close GitHub review milestone for release %v", releaseString) log.Run(milestoneTask) milestone, _, err = client.Issues.EditMilestone(owner, repo, *milestone.Number, &github.Milestone{ State: github.String("closed"), }) if err != nil { return nil, errs.NewError(milestoneTask, err) } // Return a rollback function. return action.ActionFunc(func() error { log.Rollback(milestoneTask) task := fmt.Sprintf("Reopen GitHub review milestone for release %v", releaseString) _, _, err := client.Issues.EditMilestone(owner, repo, *milestone.Number, &github.Milestone{ State: github.String("open"), }) if err != nil { return errs.NewError(task, err) } return nil }), nil }
func (tool *codeReviewTool) InitialiseRelease(v *version.Version) (action.Action, error) { // Get necessary config. config, err := LoadConfig() if err != nil { return nil, err } owner, repo, err := git.ParseUpstreamURL() if err != nil { return nil, err } // Check whether the review milestone exists or not. // People can create milestones manually, so this makes the thing more robust. task := fmt.Sprintf("Check whether GitHub review milestone exists for release %v", v.BaseString()) log.Run(task) milestone, err := milestoneForVersion(config, owner, repo, v) if err != nil { return nil, errs.NewError(task, err) } if milestone != nil { // Milestone already exists, we are done. log.Log(fmt.Sprintf("GitHub review milestone '%v' already exists", milestoneTitle(v))) return nil, nil } // Create the review milestone. _, act, err := createMilestone(config, owner, repo, v) return act, err }
// getOrCreateMilestone just calls ghissues.GetOrCreateMilestoneForTitle // using the client and config as contained in this issueTracker. func (tracker *issueTracker) getOrCreateMilestone( v *version.Version, ) (*github.Milestone, action.Action, error) { var ( client = tracker.newClient() owner = tracker.config.GitHubOwner repo = tracker.config.GitHubRepository title = v.BaseString() milestone *github.Milestone act action.Action err error ) withRequestAllocated(func() { milestone, act, err = ghissues.GetOrCreateMilestoneForTitle(client, owner, repo, title) }) return milestone, act, err }
// issuesByRelease returns the issues assigned to the relevant milestone. func (tracker *issueTracker) issuesByRelease(v *version.Version) ([]*github.Issue, error) { return tracker.searchIssues(`milestone:"%v"`, v.BaseString()) }
func milestoneTitle(v *version.Version) string { return fmt.Sprintf("%v-review", v.BaseString()) }
func getReleaseLabel(ver *version.Version) string { return fmt.Sprintf("release-%v", ver.BaseString()) }