Patchwork D8747: rebase: consider rewrite.empty-successor configuration

login
register
mail settings
Submitter phabricator
Date July 14, 2020, 3:33 p.m.
Message ID <differential-rev-PHID-DREV-owgqmdiwc4md5jhahe46-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46734/
State Superseded
Headers show

Comments

phabricator - July 14, 2020, 3:33 p.m.
mjacob created this revision.
Herald added a reviewer: martinvonz.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This adds support for the recently added rewrite.empty-successor configuration.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8747

AFFECTED FILES
  hgext/rebase.py
  mercurial/helptext/config.txt
  tests/test-rebase-empty-successor.t

CHANGE DETAILS




To: mjacob, martinvonz, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-rebase-empty-successor.t b/tests/test-rebase-empty-successor.t
new file mode 100644
--- /dev/null
+++ b/tests/test-rebase-empty-successor.t
@@ -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'
+  
diff --git a/mercurial/helptext/config.txt b/mercurial/helptext/config.txt
--- a/mercurial/helptext/config.txt
+++ b/mercurial/helptext/config.txt
@@ -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``
 -----------
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -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(