rebase: consider rewrite.empty-successor configuration
This adds support for the recently added rewrite.empty-successor configuration.
--- a/hgext/rebase.py Sun Jul 12 06:06:06 2020 +0200
+++ b/hgext/rebase.py Mon Jun 01 08:38:42 2020 +0200
@@ -206,6 +206,9 @@
self.backupf = ui.configbool(b'rewrite', b'backup-bundle')
self.keepf = opts.get(b'keep', False)
self.keepbranchesf = opts.get(b'keepbranches', False)
+ self.skipemptysuccessorf = rewriteutil.skip_empty_successor(
+ repo.ui, b'rebase'
+ )
self.obsoletenotrebased = {}
self.obsoletewithoutsuccessorindestination = set()
self.inmemory = inmemory
@@ -530,7 +533,10 @@
for c in self.extrafns:
c(ctx, extra)
destphase = max(ctx.phase(), phases.draft)
- overrides = {(b'phases', b'new-commit'): destphase}
+ overrides = {
+ (b'phases', b'new-commit'): destphase,
+ (b'ui', b'allowemptycommit'): not self.skipemptysuccessorf,
+ }
with repo.ui.configoverride(overrides, b'rebase'):
if self.inmemory:
newnode = commitmemorynode(
@@ -650,6 +656,14 @@
if newnode is not None:
self.state[rev] = repo[newnode].rev()
ui.debug(b'rebased as %s\n' % short(newnode))
+ if repo[newnode].isempty():
+ ui.warn(
+ _(
+ b'note: created empty successor for %s, its '
+ b'destination already has all its changes\n'
+ )
+ % desc
+ )
else:
if not self.collapsef:
ui.warn(
--- a/mercurial/helptext/config.txt Sun Jul 12 06:06:06 2020 +0200
+++ b/mercurial/helptext/config.txt Mon Jun 01 08:38:42 2020 +0200
@@ -1896,7 +1896,8 @@
operations. If set to ``skip``, the successor is not created. If set to
``keep``, the empty successor is created and kept.
- Currently, no command considers this configuration. (EXPERIMENTAL)
+ Currently, only the rebase command considers this configuration.
+ (EXPERIMENTAL)
``storage``
-----------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebase-empty-successor.t Mon Jun 01 08:38:42 2020 +0200
@@ -0,0 +1,44 @@
+ $ cat << EOF >> $HGRCPATH
+ > [extensions]
+ > rebase=
+ > [alias]
+ > tglog = log -G -T "{rev} '{desc}'\n"
+ > EOF
+
+ $ hg init
+
+ $ echo a > a; hg add a; hg ci -m a
+ $ echo b > b; hg add b; hg ci -m b1
+ $ hg up 0 -q
+ $ echo b > b; hg add b; hg ci -m b2 -q
+
+ $ hg tglog
+ @ 2 'b2'
+ |
+ | o 1 'b1'
+ |/
+ o 0 'a'
+
+
+With rewrite.empty-successor=skip, b2 is skipped because it would become empty.
+
+ $ hg rebase -s 2 -d 1 --config rewrite.empty-successor=skip --dry-run
+ starting dry-run rebase; repository will not be changed
+ rebasing 2:6e2aad5e0f3c "b2" (tip)
+ note: not rebasing 2:6e2aad5e0f3c "b2" (tip), its destination already has all its changes
+ dry-run rebase completed successfully; run without -n/--dry-run to perform this rebase
+
+With rewrite.empty-successor=keep, b2 will be recreated although it became empty.
+
+ $ hg rebase -s 2 -d 1 --config rewrite.empty-successor=keep
+ rebasing 2:6e2aad5e0f3c "b2" (tip)
+ note: created empty successor for 2:6e2aad5e0f3c "b2" (tip), its destination already has all its changes
+ saved backup bundle to $TESTTMP/.hg/strip-backup/6e2aad5e0f3c-7d7c8801-rebase.hg
+
+ $ hg tglog
+ @ 2 'b2'
+ |
+ o 1 'b1'
+ |
+ o 0 'a'
+