// runCLMail is a wrapper that sets up and runs a review instance. func runCLMail(env *cmdline.Env, _ []string) error { ctx := tool.NewContextFromEnv(env) // Sanity checks for the <presubmitFlag> flag. if !checkPresubmitFlag() { return env.UsageErrorf("invalid value for the -presubmit flag. Valid values: %s.", strings.Join(gerrit.PresubmitTestTypes(), ",")) } host := hostFlag if host == "" { var err error if host, err = project.GerritHost(ctx); err != nil { return err } } // Create and run the review. review, err := newReview(ctx, gerrit.CLOpts{ Autosubmit: autosubmitFlag, Ccs: parseEmails(ccsFlag), Draft: draftFlag, Edit: editFlag, Host: host, Presubmit: gerrit.PresubmitTestType(presubmitFlag), RemoteBranch: remoteBranchFlag, Reviewers: parseEmails(reviewersFlag), Verify: verifyFlag, }) if err != nil { return err } if confirmed, err := review.confirmFlagChanges(); err != nil { return err } else if !confirmed { return nil } return review.run() }
func newReview(jirix *jiri.X, project project.Project, opts gerrit.CLOpts) (*review, error) { // Sync all CLs in the sequence of dependent CLs ending in the // current branch. if err := syncCL(jirix); err != nil { return nil, err } // Make sure that all CLs in the above sequence (possibly except for // the current branch) have been exported to Gerrit. This is needed // to make sure we have commit messages for all but the last CL. // // NOTE: The alternative here is to prompt the user for multiple // commit messages, which seems less user friendly. if err := checkDependents(jirix); err != nil { return nil, err } branch, err := gitutil.New(jirix.NewSeq()).CurrentBranchName() if err != nil { return nil, err } opts.Branch = branch if opts.Topic == "" { opts.Topic = fmt.Sprintf("%s-%s", os.Getenv("USER"), branch) // use <username>-<branchname> as the default } if opts.Presubmit == gerrit.PresubmitTestType("") { opts.Presubmit = gerrit.PresubmitTestTypeAll // use gerrit.PresubmitTestTypeAll as the default } if opts.RemoteBranch == "" { opts.RemoteBranch = "master" // use master as the default } return &review{ jirix: jirix, project: project, featureBranch: branch, reviewBranch: branch + "-REVIEW", CLOpts: opts, }, nil }
func runCLMailCurrent(jirix *jiri.X, _ []string) error { // Check that working dir exist on remote branch. Otherwise checking out // remote branch will break the users working dir. git := gitutil.New(jirix.NewSeq()) wd, err := os.Getwd() if err != nil { return err } topLevel, err := git.TopLevel() if err != nil { return err } relWd, err := filepath.Rel(topLevel, wd) if err != nil { return err } if !git.DirExistsOnBranch(relWd, remoteBranchFlag) { return fmt.Errorf("directory %q does not exist on branch %q.\nPlease run 'jiri cl mail' from root directory of this repo.", relWd, remoteBranchFlag) } // Sanity checks for the <presubmitFlag> flag. if !checkPresubmitFlag() { return jirix.UsageErrorf("invalid value for the -presubmit flag. Valid values: %s.", strings.Join(gerrit.PresubmitTestTypes(), ",")) } p, err := currentProject(jirix) if err != nil { return err } host := hostFlag if host == "" { if p.GerritHost == "" { return fmt.Errorf("No gerrit host found. Please use the '--host' flag, or add a 'gerrithost' attribute for project %q.", p.Name) } host = p.GerritHost } hostUrl, err := url.Parse(host) if err != nil { return fmt.Errorf("invalid Gerrit host %q: %v", host, err) } projectRemoteUrl, err := url.Parse(p.Remote) if err != nil { return fmt.Errorf("invalid project remote: %v", p.Remote, err) } gerritRemote := *hostUrl gerritRemote.Path = projectRemoteUrl.Path // Create and run the review. review, err := newReview(jirix, p, gerrit.CLOpts{ Autosubmit: autosubmitFlag, Ccs: parseEmails(ccsFlag), Draft: draftFlag, Edit: editFlag, Remote: gerritRemote.String(), Host: hostUrl, Presubmit: gerrit.PresubmitTestType(presubmitFlag), RemoteBranch: remoteBranchFlag, Reviewers: parseEmails(reviewersFlag), Verify: verifyFlag, }) if err != nil { return err } if confirmed, err := review.confirmFlagChanges(); err != nil { return err } else if !confirmed { return nil } err = review.run() // Ignore the error that is returned when there are no differences // between the local and gerrit branches. if err != nil && noChangesRE.MatchString(err.Error()) { return nil } return err }