diff --git a/hgext/absorb.py b/hgext/absorb.py --- a/hgext/absorb.py +++ b/hgext/absorb.py @@ -50,6 +50,7 @@ phases, pycompat, registrar, + rewriteutil, scmutil, util, ) @@ -782,8 +783,10 @@ # nothing changed, nothing commited nextp1 = ctx continue - if ctx.files() and self._willbecomenoop( - memworkingcopy, ctx, nextp1 + if ( + self.skip_empty_successor + and ctx.files() + and self._willbecomenoop(memworkingcopy, ctx, nextp1) ): # changeset is no longer necessary self.replacemap[ctx.node()] = None @@ -935,6 +938,10 @@ self.repo, replacements, operation=b'absorb', fixphase=True ) + @util.propertycache + def skip_empty_successor(self): + return rewriteutil.skip_empty_successor(self.ui, b'absorb') + def _parsechunk(hunk): """(crecord.uihunk or patch.recordhunk) -> (path, (a1, a2, [bline]))""" 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,7 @@ operations. If set to ``skip``, the successor is not created. If set to ``keep``, the empty successor is created and kept. - Currently, only the rebase command considers this configuration. + Currently, only the rebase and absorb commands consider this configuration. (EXPERIMENTAL) ``storage`` diff --git a/tests/test-absorb.t b/tests/test-absorb.t --- a/tests/test-absorb.t +++ b/tests/test-absorb.t @@ -490,6 +490,71 @@ +3 +Setting config rewrite.empty-successor=keep causes empty changesets to get committed: + + $ cd .. + $ hg init repo4a + $ cd repo4a + $ cat > a < 1 + > 2 + > EOF + $ hg commit -m a12 -A a + $ cat > b < 1 + > 2 + > EOF + $ hg commit -m b12 -A b + $ echo 3 >> b + $ hg commit -m b3 + $ echo 4 >> b + $ hg commit -m b4 + $ echo 1 > b + $ echo 3 >> a + $ hg absorb -pn + showing changes for a + @@ -2,0 +2,1 @@ + bfafb49 +3 + showing changes for b + @@ -1,3 +1,0 @@ + 1154859 -2 + 30970db -3 + a393a58 -4 + + 4 changesets affected + a393a58 b4 + 30970db b3 + 1154859 b12 + bfafb49 a12 + $ hg absorb -av --config rewrite.empty-successor=keep | grep became + 0:bfafb49242db: 1 file(s) changed, became 4:1a2de97fc652 + 1:115485984805: 2 file(s) changed, became 5:0c930dfab74c + 2:30970dbf7b40: 2 file(s) changed, became 6:df6574ae635c + 3:a393a58b9a85: 2 file(s) changed, became 7:ad4bd3462c9e + $ hg log -T '{rev} {desc}\n' -Gp + @ 7 b4 + | + o 6 b3 + | + o 5 b12 + | diff --git a/b b/b + | new file mode 100644 + | --- /dev/null + | +++ b/b + | @@ -0,0 +1,1 @@ + | +1 + | + o 4 a12 + diff --git a/a b/a + new file mode 100644 + --- /dev/null + +++ b/a + @@ -0,0 +1,3 @@ + +1 + +2 + +3 + + Use revert to make the current change and its parent disappear. This should move us to the non-obsolete ancestor.