diff options
| author | Austin Clements <austin@google.com> | 2015-11-05 15:37:08 -0500 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2015-11-11 00:37:54 +0000 |
| commit | 71f6d9db045156df0fa24056699431b108c4b67e (patch) | |
| tree | 37e8ee38f60980a7c85ddb38c053550e5b76fcbe /git-codereview/pending.go | |
| parent | 0d7a1437b7262e6eb433008f1187ff729ac867ca (diff) | |
| download | go-x-review-71f6d9db045156df0fa24056699431b108c4b67e.tar.xz | |
git-codereview: factor pending commit formatting
This lifts the code to format a commit for the pending subcommand in
to its own function in preparation for using it to format lines in git
submit -i scripts.
Change-Id: I2522256b4e290a7a2f39b28918f7a27ddd1dbc6b
Reviewed-on: https://go-review.googlesource.com/16675
Reviewed-by: Andrew Gerrand <adg@golang.org>
Diffstat (limited to 'git-codereview/pending.go')
| -rw-r--r-- | git-codereview/pending.go | 155 |
1 files changed, 86 insertions, 69 deletions
diff --git a/git-codereview/pending.go b/git-codereview/pending.go index e00071e..7d77618 100644 --- a/git-codereview/pending.go +++ b/git-codereview/pending.go @@ -7,6 +7,7 @@ package main import ( "bytes" "fmt" + "io" "net/http" "os" "sort" @@ -240,76 +241,12 @@ func cmdPending(args []string) { for _, c := range work { printed = true - g := c.g - msg := strings.TrimRight(c.Message, "\r\n") - fmt.Fprintf(&buf, "+ %s", c.ShortHash) - var tags []string - if pendingShort { - if i := strings.Index(msg, "\n"); i >= 0 { - msg = msg[:i] - } - fmt.Fprintf(&buf, " %s", msg) - if g.Number != 0 { - tags = append(tags, fmt.Sprintf("CL %d%s", g.Number, codeReviewScores(g))) - } - } else { - if g.Number != 0 { - fmt.Fprintf(&buf, " %s/%d", auth.url, g.Number) - } - } - if g.CurrentRevision == c.Hash { - tags = append(tags, "mailed") - } - if g.Status == "MERGED" { - tags = append(tags, "submitted") - } - if len(tags) > 0 { - fmt.Fprintf(&buf, " (%s)", strings.Join(tags, ", ")) - } - fmt.Fprintf(&buf, "\n") - if pendingShort { - continue - } - - fmt.Fprintf(&buf, "\t%s\n", strings.Replace(msg, "\n", "\n\t", -1)) - fmt.Fprintf(&buf, "\n") - - for _, name := range g.LabelNames() { - label := g.Labels[name] - minValue := 10000 - maxValue := -10000 - byScore := map[int][]string{} - for _, x := range label.All { - // Hide CL owner unless owner score is nonzero. - if g.Owner != nil && x.ID == g.Owner.ID && x.Value == 0 { - continue - } - byScore[x.Value] = append(byScore[x.Value], x.Name) - if minValue > x.Value { - minValue = x.Value - } - if maxValue < x.Value { - maxValue = x.Value - } - } - // Unless there are scores to report, do not show labels other than Code-Review. - // This hides Run-TryBot and TryBot-Result. - if minValue >= 0 && maxValue <= 0 && name != "Code-Review" { - continue - } - fmt.Fprintf(&buf, "\t%s:\n", name) - for score := maxValue; score >= minValue; score-- { - who := byScore[score] - if len(who) == 0 || score == 0 && name != "Code-Review" { - continue - } - sort.Strings(who) - fmt.Fprintf(&buf, "\t\t%+d %s\n", score, strings.Join(who, ", ")) - } + fmt.Fprintf(&buf, "+ ") + formatCommit(&buf, c, pendingShort) + if !pendingShort { + printFileList("in this change", c.committed) + fmt.Fprintf(&buf, "\n") } - - printFileList("in this change", c.committed) - fmt.Fprintf(&buf, "\n") } if pendingShort || !printed { fmt.Fprintf(&buf, "\n") @@ -319,7 +256,87 @@ func cmdPending(args []string) { stdout().Write(buf.Bytes()) } +// formatCommit writes detailed information about c to w. c.g must +// have the "CURRENT_REVISION" (or "ALL_REVISIONS") and +// "DETAILED_LABELS" options set. +// +// If short is true, this writes a single line overview. +// +// If short is false, this writes detailed information about the +// commit and its Gerrit state. +func formatCommit(w io.Writer, c *Commit, short bool) { + g := c.g + msg := strings.TrimRight(c.Message, "\r\n") + fmt.Fprintf(w, "%s", c.ShortHash) + var tags []string + if short { + if i := strings.Index(msg, "\n"); i >= 0 { + msg = msg[:i] + } + fmt.Fprintf(w, " %s", msg) + if g.Number != 0 { + tags = append(tags, fmt.Sprintf("CL %d%s", g.Number, codeReviewScores(g))) + } + } else { + if g.Number != 0 { + fmt.Fprintf(w, " %s/%d", auth.url, g.Number) + } + } + if g.CurrentRevision == c.Hash { + tags = append(tags, "mailed") + } + if g.Status == "MERGED" { + tags = append(tags, "submitted") + } + if len(tags) > 0 { + fmt.Fprintf(w, " (%s)", strings.Join(tags, ", ")) + } + fmt.Fprintf(w, "\n") + if short { + return + } + + fmt.Fprintf(w, "\t%s\n", strings.Replace(msg, "\n", "\n\t", -1)) + fmt.Fprintf(w, "\n") + + for _, name := range g.LabelNames() { + label := g.Labels[name] + minValue := 10000 + maxValue := -10000 + byScore := map[int][]string{} + for _, x := range label.All { + // Hide CL owner unless owner score is nonzero. + if g.Owner != nil && x.ID == g.Owner.ID && x.Value == 0 { + continue + } + byScore[x.Value] = append(byScore[x.Value], x.Name) + if minValue > x.Value { + minValue = x.Value + } + if maxValue < x.Value { + maxValue = x.Value + } + } + // Unless there are scores to report, do not show labels other than Code-Review. + // This hides Run-TryBot and TryBot-Result. + if minValue >= 0 && maxValue <= 0 && name != "Code-Review" { + continue + } + fmt.Fprintf(w, "\t%s:\n", name) + for score := maxValue; score >= minValue; score-- { + who := byScore[score] + if len(who) == 0 || score == 0 && name != "Code-Review" { + continue + } + sort.Strings(who) + fmt.Fprintf(w, "\t\t%+d %s\n", score, strings.Join(who, ", ")) + } + } +} + // codeReviewScores reports the code review scores as tags for the short output. +// +// g must have the "DETAILED_LABELS" option set. func codeReviewScores(g *GerritChange) string { label := g.Labels["Code-Review"] if label == nil { |
