absorb: preserve branch-closing changesets even if empty
This makes the behavior consistent with 'hg commit', which allows to create
otherwise empty changesets if they close the branch. A lost branch closure can
inadvertently re-open a branch, so it should be preserved.
--- a/hgext/absorb.py Mon Jun 01 10:33:00 2020 +0200
+++ b/hgext/absorb.py Mon Jun 01 11:07:33 2020 +0200
@@ -889,6 +889,8 @@
pctx = parents[0]
if ctx.branch() != pctx.branch():
return False
+ if ctx.extra().get(b'close'):
+ return False
# ctx changes more files (not a subset of memworkingcopy)
if not set(ctx.files()).issubset(set(memworkingcopy)):
return False
--- a/tests/test-absorb.t Mon Jun 01 10:33:00 2020 +0200
+++ b/tests/test-absorb.t Mon Jun 01 11:07:33 2020 +0200
@@ -553,3 +553,37 @@
b | 0
2 files changed, 1 insertions(+), 0 deletions(-)
+
+ $ cd ..
+ $ hg init repo7
+ $ cd repo7
+ $ echo a1 > a
+ $ touch b
+ $ hg commit -m a -A a b
+ $ echo b > b
+ $ hg commit -m foo --close-branch # will become empty
+ $ echo c > c
+ $ hg commit -m reopen -A c -q
+ $ hg commit -m bar --close-branch # is already empty
+ $ echo a2 > a
+ $ printf '' > b
+ $ hg absorb --apply-changes --verbose | grep became
+ 0:0cde1ae39321: 1 file(s) changed, became 4:fc7fcdd90fdb
+ 1:651b953d5764: 2 file(s) changed, became 5:0c9de988ecdc
+ 2:76017bba73f6: 2 file(s) changed, became 6:d53ac896eb25
+ 3:c7c1d67efc1d: 2 file(s) changed, became 7:66520267fe96
+ $ hg up null -q # to make visible closed heads
+ $ hg log -T '{rev} {desc}\n' -G --stat
+ _ 7 bar
+ |
+ o 6 reopen
+ | c | 1 +
+ | 1 files changed, 1 insertions(+), 0 deletions(-)
+ |
+ _ 5 foo
+ |
+ o 4 a
+ a | 1 +
+ b | 0
+ 2 files changed, 1 insertions(+), 0 deletions(-)
+