git-codereview: add -wip flag to mail command

Add a -wip flag to the mail command to set the status of a change to
work-in-progress. Per:

https://gerrit-review.googlesource.com/Documentation/intro-user.html#wip

Fixes golang/go#20991

Change-Id: I227beccb55570949e9b0f487d5394855611a118a
Reviewed-on: https://go-review.googlesource.com/c/review/+/233237
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
diff --git a/git-codereview/doc.go b/git-codereview/doc.go
index 7624909..8cf1e64 100644
--- a/git-codereview/doc.go
+++ b/git-codereview/doc.go
@@ -191,7 +191,7 @@
 
 The mail command starts the code review process for the pending change.
 
-	git codereview mail [-f] [-r email] [-cc email] [-trybot] [revision]
+	git codereview mail [-f] [-r email] [-cc email] [-trybot] [-wip] [revision]
 
 It pushes the pending change commit in the current branch to the Gerrit code
 review server and prints the URL for the change on the server.
@@ -210,6 +210,8 @@
 The -trybot flag runs the trybots on all new or updated changes. It is
 equivalent to setting the Run-Trybot+1 label from Gerrit.
 
+The -wip flag sets the status of the change to work-in-progress.
+
 The mail command fails if there are staged edits that are not committed.
 The -f flag overrides this behavior.
 
diff --git a/git-codereview/mail.go b/git-codereview/mail.go
index fd663af..52ef44a 100644
--- a/git-codereview/mail.go
+++ b/git-codereview/mail.go
@@ -18,6 +18,7 @@
 	var (
 		diff       = flags.Bool("diff", false, "show change commit diff and don't upload or mail")
 		force      = flags.Bool("f", false, "mail even if there are staged changes")
+		wip        = flags.Bool("wip", false, "set the status of a change to Work-in-Progress")
 		topic      = flags.String("topic", "", "set Gerrit topic")
 		trybot     = flags.Bool("trybot", false, "run trybots on the uploaded CLs")
 		rList      = new(stringList) // installed below
@@ -30,7 +31,7 @@
 	flags.Var(tagList, "hashtag", "comma-separated list of tags to set")
 
 	flags.Usage = func() {
-		fmt.Fprintf(stderr(), "Usage: %s mail %s [-r reviewer,...] [-cc mail,...] [-nokeycheck] [-topic topic] [-trybot] [commit]\n", os.Args[0], globalFlags)
+		fmt.Fprintf(stderr(), "Usage: %s mail %s [-r reviewer,...] [-cc mail,...] [-nokeycheck] [-topic topic] [-trybot] [-wip] [commit]\n", os.Args[0], globalFlags)
 	}
 	flags.Parse(args)
 	if len(flags.Args()) > 1 {
@@ -136,6 +137,10 @@
 		refSpec += start + "l=Run-TryBot"
 		start = ","
 	}
+	if *wip {
+		refSpec += start + "wip"
+		start = ","
+	}
 	args = []string{"push", "-q"}
 	if *noKeyCheck {
 		args = append(args, "-o", "nokeycheck")
diff --git a/git-codereview/mail_test.go b/git-codereview/mail_test.go
index 22d4747..c655b54 100644
--- a/git-codereview/mail_test.go
+++ b/git-codereview/mail_test.go
@@ -220,6 +220,19 @@
 	testPrintedStderr(t, "unknown reviewer: missing")
 }
 
+func TestWIP(t *testing.T) {
+	gt := newGitTest(t)
+	defer gt.done()
+	gt.work(t)
+
+	h := CurrentBranch().Pending()[0].ShortHash
+
+	testMain(t, "mail", "-wip")
+	testRan(t,
+		"git push -q origin HEAD:refs/for/master%wip",
+		"git tag -f work.mailed "+h)
+}
+
 func TestMailTopic(t *testing.T) {
 	gt := newGitTest(t)
 	defer gt.done()