changeset 44985:1ca0047fd7e1

absorb: preserve changesets which were already empty Most commands in Mercurial (commit, rebase, absorb itself) don’t create empty changesets or drop them if they become empty. If there’s a changeset that’s empty, it must be a deliberate choice of the user. At least it shouldn’t be absorb’s responsibility to prune them. The fact that changesets that became empty during absorb are pruned, is unaffected by this. This case was found while writing patches which make it possible to configure absorb and rebase to not drop empty changesets. Even without having such config set, I think it’s valuable to preserve changesets which were already empty.
author Manuel Jacob <me@manueljacob.de>
date Mon, 01 Jun 2020 20:57:14 +0200
parents bfef35bb4ecb
children 0ff59434af72
files hgext/absorb.py tests/test-absorb.t
diffstat 2 files changed, 21 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/absorb.py	Mon Jun 01 11:07:33 2020 +0200
+++ b/hgext/absorb.py	Mon Jun 01 20:57:14 2020 +0200
@@ -782,7 +782,9 @@
                 # nothing changed, nothing commited
                 nextp1 = ctx
                 continue
-            if self._willbecomenoop(memworkingcopy, ctx, nextp1):
+            if ctx.files() and self._willbecomenoop(
+                memworkingcopy, ctx, nextp1
+            ):
                 # changeset is no longer necessary
                 self.replacemap[ctx.node()] = None
                 msg = _(b'became empty and was dropped')
--- a/tests/test-absorb.t	Mon Jun 01 11:07:33 2020 +0200
+++ b/tests/test-absorb.t	Mon Jun 01 20:57:14 2020 +0200
@@ -587,3 +587,21 @@
       b |  0
       2 files changed, 1 insertions(+), 0 deletions(-)
   
+
+  $ cd ..
+  $ hg init repo8
+  $ cd repo8
+  $ echo a1 > a
+  $ hg commit -m a -A a
+  $ hg commit -m empty --config ui.allowemptycommit=True
+  $ echo a2 > a
+  $ hg absorb --apply-changes --verbose | grep became
+  0:ecf99a8d6699: 1 file(s) changed, became 2:7e3ccf8e2fa5
+  1:97f72456ae0d: 1 file(s) changed, became 3:2df488325d6f
+  $ hg log -T '{rev} {desc}\n' -G --stat
+  @  3 empty
+  |
+  o  2 a
+      a |  1 +
+      1 files changed, 1 insertions(+), 0 deletions(-)
+