git-codereview: add [serverbranch] prefix for work on non-master server branches
For example this will add [dev.cc] to the work on the dev.cc (C to Go conversion) branch,
and it will add [release-branch.go1.4] to the upcoming 1.4.1 cherry-pick CLs.
Change-Id: I59fff85ced61453796b52c738a47ea1fc4a5bf36
Reviewed-on: https://go-review.googlesource.com/2782
Reviewed-by: Andrew Gerrand <adg@golang.org>
diff --git a/git-codereview/hook.go b/git-codereview/hook.go
index 921fd91..31dff11 100644
--- a/git-codereview/hook.go
+++ b/git-codereview/hook.go
@@ -113,33 +113,59 @@
// It adds a Change-Id line to the bottom of the commit message
// if there is not one already.
func hookCommitMsg(args []string) {
- // Add Change-Id to commit message if needed.
if len(args) != 1 {
dief("usage: git-codereview hook-invoke commit-msg message.txt\n")
}
+
+ b := CurrentBranch()
+ if b.DetachedHead() {
+ // Likely executing rebase or some other internal operation.
+ // Probably a mistake to make commit message changes.
+ return
+ }
+
file := args[0]
data, err := ioutil.ReadFile(file)
if err != nil {
dief("%v", err)
}
data = stripComments(data)
+
+ // Empty message not allowed.
if len(bytes.TrimSpace(data)) == 0 {
dief("empty commit message")
}
- if bytes.Contains(data, []byte("\nChange-Id: ")) {
- return
+
+ // Add Change-Id to commit message if not present.
+ edited := false
+ if !bytes.Contains(data, []byte("\nChange-Id: ")) {
+ edited = true
+ n := len(data)
+ for n > 0 && data[n-1] == '\n' {
+ n--
+ }
+ var id [20]byte
+ if _, err := io.ReadFull(rand.Reader, id[:]); err != nil {
+ dief("generating Change-Id: %v", err)
+ }
+ data = append(data[:n], fmt.Sprintf("\n\nChange-Id: I%x\n", id[:])...)
}
- n := len(data)
- for n > 0 && data[n-1] == '\n' {
- n--
+
+ // Add branch prefix to commit message if not present and not on master.
+ branch := strings.TrimPrefix(b.OriginBranch(), "origin/")
+ if branch != "master" {
+ prefix := "[" + branch + "] "
+ if !bytes.HasPrefix(data, []byte(prefix)) {
+ edited = true
+ data = []byte(prefix + string(data))
+ }
}
- var id [20]byte
- if _, err := io.ReadFull(rand.Reader, id[:]); err != nil {
- dief("generating Change-Id: %v", err)
- }
- data = append(data[:n], fmt.Sprintf("\n\nChange-Id: I%x\n", id[:])...)
- if err := ioutil.WriteFile(file, data, 0666); err != nil {
- dief("%v", err)
+
+ // Write back.
+ if edited {
+ if err := ioutil.WriteFile(file, data, 0666); err != nil {
+ dief("%v", err)
+ }
}
}
diff --git a/git-codereview/hook_test.go b/git-codereview/hook_test.go
index 9465b55..671af94 100644
--- a/git-codereview/hook_test.go
+++ b/git-codereview/hook_test.go
@@ -48,6 +48,42 @@
}
}
+func TestHookCommitMsgBranchPrefix(t *testing.T) {
+ gt := newGitTest(t)
+ defer gt.done()
+
+ checkPrefix := func(prefix string) {
+ write(t, gt.client+"/msg.txt", "Test message.\n")
+ testMain(t, "hook-invoke", "commit-msg", gt.client+"/msg.txt")
+ data, err := ioutil.ReadFile(gt.client + "/msg.txt")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !bytes.HasPrefix(data, []byte(prefix)) {
+ t.Errorf("after hook-invoke commit-msg on %s, want prefix %q:\n%s", CurrentBranch().Name, prefix, data)
+ }
+ }
+
+ // Create server branch and switch to server branch on client.
+ // Test that commit hook adds prefix.
+ trun(t, gt.server, "git", "checkout", "-b", "dev.cc")
+ trun(t, gt.client, "git", "fetch", "-q")
+ trun(t, gt.client, "git", "change", "dev.cc")
+ checkPrefix("[dev.cc] Test message.\n")
+
+ // Work branch with server branch as upstream.
+ trun(t, gt.client, "git", "change", "ccwork")
+ checkPrefix("[dev.cc] Test message.\n")
+
+ // Master has no prefix.
+ trun(t, gt.client, "git", "change", "master")
+ checkPrefix("Test message.\n")
+
+ // Work branch from master has no prefix.
+ trun(t, gt.client, "git", "change", "work")
+ checkPrefix("Test message.\n")
+}
+
func TestHookPreCommit(t *testing.T) {
gt := newGitTest(t)
defer gt.done()