[patch] Use 'git rebase' with '--rebase-merges' by default.

This change adds '--rebase-merges' flag to rebase when using 'jiri
patch'. Without this flag, git will drop merge commits, causing patch
errors.

Bug: INTK-1106
Test: Local
Change-Id: I7fd5a6fa4ad1af16a4b20b395758f56dd3fe7b76
diff --git a/cmd/jiri/patch.go b/cmd/jiri/patch.go
index a48b688..dc27721 100644
--- a/cmd/jiri/patch.go
+++ b/cmd/jiri/patch.go
@@ -194,7 +194,7 @@
 		jirix.IncrementFailures()
 		return nil
 	}
-	if err := scm.Rebase("remotes/origin/" + remoteBranch); err != nil {
+	if err := scm.Rebase("remotes/origin/"+remoteBranch, gitutil.RebaseMerges(true)); err != nil {
 		if err2 := scm.RebaseAbort(); err2 != nil {
 			return err2
 		}
@@ -221,7 +221,7 @@
 		jirix.IncrementFailures()
 		return nil
 	}
-	if err := scm.Rebase(revision); err != nil {
+	if err := scm.Rebase(revision, gitutil.RebaseMerges(true)); err != nil {
 		if err2 := scm.RebaseAbort(); err2 != nil {
 			return err2
 		}
diff --git a/gitutil/git.go b/gitutil/git.go
index fb4b6e1..45eb0f5 100644
--- a/gitutil/git.go
+++ b/gitutil/git.go
@@ -980,8 +980,21 @@
 }
 
 // Rebase rebases to a particular upstream branch.
-func (g *Git) Rebase(upstream string) error {
-	return g.run("rebase", upstream)
+func (g *Git) Rebase(upstream string, opts ...RebaseOpt) error {
+	args := []string{"rebase"}
+	rebaseMerges := false
+	for _, opt := range opts {
+		switch typedOpt := opt.(type) {
+		case RebaseMerges:
+			rebaseMerges = bool(typedOpt)
+		}
+	}
+
+	if rebaseMerges {
+		args = append(args, "--rebase-merges")
+	}
+	args = append(args, upstream)
+	return g.run(args...)
 }
 
 // CherryPickAbort aborts an in-progress cherry-pick operation.
diff --git a/gitutil/options.go b/gitutil/options.go
index 6e803c8..62745ca 100644
--- a/gitutil/options.go
+++ b/gitutil/options.go
@@ -31,6 +31,10 @@
 	resetOpt()
 }
 
+type RebaseOpt interface {
+	rebaseOpt()
+}
+
 type FollowTagsOpt bool
 
 func (FollowTagsOpt) pushOpt() {}
@@ -114,3 +118,7 @@
 type BareOpt bool
 
 func (BareOpt) cloneOpt() {}
+
+type RebaseMerges bool
+
+func (RebaseMerges) rebaseOpt() {}