From patchwork Sun Jul 12 05:13:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3,of,5,V2] rebase: consider rewrite.empty-successor configuration From: Manuel Jacob X-Patchwork-Id: 46702 Message-Id: <06400a64a1239a4a3bcc.1594530833@tmp> To: mercurial-devel@mercurial-scm.org Date: Sun, 12 Jul 2020 07:13:53 +0200 # HG changeset patch # User Manuel Jacob # Date 1590993522 -7200 # Mon Jun 01 08:38:42 2020 +0200 # Node ID 06400a64a1239a4a3bcc64d61e8e6d6a44119628 # Parent 216360d175b1dbbda8498bd8d4341b315e977ad1 # EXP-Topic keep_empty_successor rebase: consider rewrite.empty-successor configuration This adds support for the recently added rewrite.empty-successor configuration. 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( 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/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' +