// update syncs code in the relevant repositories. func (r *repoManager) update() error { // Sync the projects. r.mtx.Lock() defer r.mtx.Unlock() // Create the chromium parent directory if needed. if _, err := os.Stat(r.chromiumParentDir); err != nil { if err := os.MkdirAll(r.chromiumParentDir, 0755); err != nil { return err } } if _, err := os.Stat(path.Join(r.chromiumDir, ".git")); err == nil { if err := r.cleanChromium(); err != nil { return err } } if _, err := exec.RunCommand(&exec.Command{ Dir: r.chromiumParentDir, Env: []string{fmt.Sprintf("PATH=%s:%s", r.depot_tools, os.Getenv("PATH"))}, Name: r.gclient, Args: []string{"config", REPO_CHROMIUM}, }); err != nil { return err } if _, err := exec.RunCommand(&exec.Command{ Dir: r.chromiumParentDir, Env: []string{fmt.Sprintf("PATH=%s:%s", r.depot_tools, os.Getenv("PATH"))}, Name: r.gclient, Args: []string{"sync", "--nohooks"}, }); err != nil { return err } // Create the child GitInfo if needed. if r.childRepo == nil { childRepo, err := gitinfo.NewGitInfo(r.childDir, false, true) if err != nil { return err } r.childRepo = childRepo } // Get the last roll revision. lastRollRev, err := r.getLastRollRev() if err != nil { return err } r.lastRollRev = lastRollRev // Record child HEAD childHead, err := r.childRepo.FullHash("origin/master") if err != nil { return err } r.childHead = childHead return nil }
// getDepotToolsUser returns the authorized depot tools user. func getDepotToolsUser(depotTools string) (string, error) { output, err := exec.RunCommand(&exec.Command{ Env: []string{fmt.Sprintf("PATH=%s:%s", depotTools, os.Getenv("PATH"))}, Name: path.Join(depotTools, "depot-tools-auth"), Args: []string{"info", autoroll.RIETVELD_URL}, }) if err != nil { return "", err } m := DEPOT_TOOLS_AUTH_USER_REGEX.FindStringSubmatch(output) if len(m) != 2 { return "", fmt.Errorf("Unable to parse the output of depot-tools-auth.") } return m[1], nil }
// cleanChromium forces the Chromium checkout into a clean state. func (r *repoManager) cleanChromium() error { if _, err := exec.RunCwd(r.chromiumDir, "git", "clean", "-d", "-f", "-f"); err != nil { return err } _, _ = exec.RunCwd(r.chromiumDir, "git", "rebase", "--abort") if _, err := exec.RunCwd(r.chromiumDir, "git", "checkout", "origin/master", "-f"); err != nil { return err } _, _ = exec.RunCwd(r.chromiumDir, "git", "branch", "-D", DEPS_ROLL_BRANCH) if _, err := exec.RunCommand(&exec.Command{ Dir: r.chromiumDir, Env: []string{fmt.Sprintf("PATH=%s:%s", r.depot_tools, os.Getenv("PATH"))}, Name: r.gclient, Args: []string{"revert", "--nohooks"}, }); err != nil { return err } return nil }
// CreateNewRoll creates and uploads a new DEPS roll to the given commit. // Returns the issue number of the uploaded roll. func (r *repoManager) CreateNewRoll(emails, cqExtraTrybots []string, dryRun bool) (int64, error) { r.mtx.Lock() defer r.mtx.Unlock() // Clean the checkout, get onto a fresh branch. if err := r.cleanChromium(); err != nil { return 0, err } if _, err := exec.RunCwd(r.chromiumDir, "git", "checkout", "-b", DEPS_ROLL_BRANCH, "-t", "origin/master", "-f"); err != nil { return 0, err } // Defer some more cleanup. defer func() { util.LogErr(r.cleanChromium()) }() // Create the roll CL. if _, err := exec.RunCwd(r.chromiumDir, "git", "config", "user.name", autoroll.ROLL_AUTHOR); err != nil { return 0, err } if _, err := exec.RunCwd(r.chromiumDir, "git", "config", "user.email", autoroll.ROLL_AUTHOR); err != nil { return 0, err } if _, err := exec.RunCommand(&exec.Command{ Dir: r.chromiumDir, Env: []string{fmt.Sprintf("PATH=%s:%s", r.depot_tools, os.Getenv("PATH"))}, Name: r.rollDep, Args: []string{r.childPath, r.childHead}, }); err != nil { return 0, err } // Build the commit message, starting with the message provided by roll-dep. commitMsg, err := exec.RunCwd(r.chromiumDir, "git", "log", "-n1", "--format=%B", "HEAD") if err != nil { return 0, err } if cqExtraTrybots != nil && len(cqExtraTrybots) > 0 { commitMsg += "\n" + fmt.Sprintf(TMPL_CQ_INCLUDE_TRYBOTS, strings.Join(cqExtraTrybots, ",")) } uploadCmd := &exec.Command{ Dir: r.chromiumDir, Env: []string{fmt.Sprintf("PATH=%s:%s", r.depot_tools, os.Getenv("PATH"))}, Name: "git", Args: []string{"cl", "upload", "--bypass-hooks", "-f"}, } if dryRun { uploadCmd.Args = append(uploadCmd.Args, "--cq-dry-run") } else { uploadCmd.Args = append(uploadCmd.Args, "--use-commit-queue") } tbr := "\nTBR=" if emails != nil && len(emails) > 0 { emailStr := strings.Join(emails, ",") tbr += emailStr uploadCmd.Args = append(uploadCmd.Args, "--send-mail", "--cc", emailStr) } commitMsg += tbr uploadCmd.Args = append(uploadCmd.Args, "-m", commitMsg) // Upload the CL. uploadOutput, err := exec.RunCommand(uploadCmd) if err != nil { return 0, err } issues := ISSUE_CREATED_REGEX.FindStringSubmatch(uploadOutput) if len(issues) != 2 { return 0, fmt.Errorf("Failed to find newly-uploaded issue number!") } return strconv.ParseInt(issues[1], 10, 64) }