[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() {}