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' +