func syncNotes(repo repository.Repo) error { var err error for attempt := 0; attempt < retryAttempts; attempt++ { err = repo.PullNotes(remoteName, notesRefPattern) if err == nil { err = repo.PushNotes(remoteName, notesRefPattern) if err == nil { return err } } } return err }
// pull updates the local git-notes used for reviews with those from a remote repo. func pull(repo repository.Repo, args []string) error { if len(args) > 1 { return errors.New("Only pulling from one remote at a time is supported.") } remote := "origin" if len(args) == 1 { remote = args[0] } repo.PullNotes(remote, notesRefPattern) return nil }
func mirrorRepoToReview(repo repository.Repo, tool review_utils.Tool, syncToRemote bool) { if syncToRemote { repo.PullNotes("origin", "refs/notes/devtools/*") } stateHash, err := repo.GetRepoStateHash() if err != nil { log.Fatal(err) } if processedStates[repo.GetPath()] != stateHash { log.Print("Mirroring repo: ", repo) for _, r := range review.ListAll(repo) { reviewJson, err := r.GetJSON() if err != nil { log.Fatal(err) } log.Println("Mirroring review: ", reviewJson) existingComments[r.Revision] = r.Comments reviewDetails, err := r.Details() if err == nil { tool.EnsureRequestExists(repo, *reviewDetails) } } openReviews[repo.GetPath()] = tool.ListOpenReviews(repo) processedStates[repo.GetPath()] = stateHash tool.Refresh(repo) } ReviewLoop: for _, phabricatorReview := range openReviews[repo.GetPath()] { if reviewCommit := phabricatorReview.GetFirstCommit(repo); reviewCommit != "" { log.Println("Processing review: ", reviewCommit) r, err := review.GetSummary(repo, reviewCommit) if err != nil { log.Fatal(err) } else if r == nil { log.Printf("Skipping unknown review %q", reviewCommit) continue ReviewLoop } revisionComments := existingComments[reviewCommit] log.Printf("Loaded %d comments for %v\n", len(revisionComments), reviewCommit) for _, c := range phabricatorReview.LoadComments() { if !hasOverlap(c, revisionComments) { // The comment is new. note, err := c.Write() if err != nil { log.Fatal(err) } log.Printf("Appending a comment: %s", string(note)) repo.AppendNote(comment.Ref, reviewCommit, note) } else { log.Printf("Skipping '%v', as it has already been written\n", c) } } } } if syncToRemote { if err := repo.PushNotes("origin", "refs/notes/devtools/*"); err != nil { log.Printf("Failed to push updates to the repo %v: %v\n", repo, err) } } }