summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
authorJeroen Dhollander <jeroendh@google.com>2025-10-15 17:27:09 +0200
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2025-10-15 08:32:00 -0700
commite4872ac8baec782c86222ca93efb4a7c9b9e0c7b (patch)
tree1dc658cef9a04937e4240eddec28b050d97ee094 /project.py
parent46232648091f5490ac31eba2ec54c8b9c20729bf (diff)
downloadgit-repo-e4872ac8baec782c86222ca93efb4a7c9b9e0c7b.tar.gz
sync: Use 'git rebase' during 'repo sync --rebase'
'repo sync --rebase' should do a rebase if it encounters local commits during a 'repo sync'. This was broken by https://gerrit-review.git.corp.google.com/c/git-repo/+/437421, which caused this to execute the '_doff' hook (which stands for 'do fast forward'), which is implemented using 'git merge --no-stat'. This caused *multiple* actual editor windows to pop up (*) during 'repo sync --rebase', asking the user to enter a commit message for the merge. In this CL I explicitly make that code path do a 'git rebase'. (*) and if you use a terminal editor like 'vim', this means you have 2+ concurrent vim windows rendered in the same terminal, while 'repo sync' keeps on printing other output lines, again in the same terminal. The result is .... not pretty to say the least :( Bug: b:434565811 Test: Used it myself for over a week. Change-Id: I0bf3ff181f15b9d5b2e3f85f7f84e302139fdab7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/518602 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Jeroen Dhollander <jeroendh@google.com> Commit-Queue: Jeroen Dhollander <jeroendh@google.com>
Diffstat (limited to 'project.py')
-rw-r--r--project.py32
1 files changed, 20 insertions, 12 deletions
diff --git a/project.py b/project.py
index dfc20098..8e430175 100644
--- a/project.py
+++ b/project.py
@@ -1589,6 +1589,9 @@ class Project:
1589 self._FastForward(revid) 1589 self._FastForward(revid)
1590 self._CopyAndLinkFiles() 1590 self._CopyAndLinkFiles()
1591 1591
1592 def _dorebase():
1593 self._Rebase(upstream="@{upstream}")
1594
1592 def _dosubmodules(): 1595 def _dosubmodules():
1593 self._SyncSubmodules(quiet=True) 1596 self._SyncSubmodules(quiet=True)
1594 1597
@@ -1680,19 +1683,24 @@ class Project:
1680 if pub: 1683 if pub:
1681 not_merged = self._revlist(not_rev(revid), pub) 1684 not_merged = self._revlist(not_rev(revid), pub)
1682 if not_merged: 1685 if not_merged:
1683 if upstream_gain and not force_rebase: 1686 if upstream_gain:
1684 # The user has published this branch and some of those 1687 if force_rebase:
1685 # commits are not yet merged upstream. We do not want 1688 # Try to rebase local published but not merged changes
1686 # to rewrite the published commits so we punt. 1689 # on top of the upstream changes.
1687 fail( 1690 syncbuf.later1(self, _dorebase, not verbose)
1688 LocalSyncFail( 1691 else:
1689 "branch %s is published (but not merged) and is " 1692 # The user has published this branch and some of those
1690 "now %d commits behind. Fix this manually or rerun " 1693 # commits are not yet merged upstream. We do not want
1691 "with the --rebase option to force a rebase." 1694 # to rewrite the published commits so we punt.
1692 % (branch.name, len(upstream_gain)), 1695 fail(
1693 project=self.name, 1696 LocalSyncFail(
1697 "branch %s is published (but not merged) and "
1698 "is now %d commits behind. Fix this manually "
1699 "or rerun with the --rebase option to force a "
1700 "rebase." % (branch.name, len(upstream_gain)),
1701 project=self.name,
1702 )
1694 ) 1703 )
1695 )
1696 return 1704 return
1697 syncbuf.later1(self, _doff, not verbose) 1705 syncbuf.later1(self, _doff, not verbose)
1698 return 1706 return