uncommit: add config option to keep commit by default
We have a Google-internal extension that keeps track of "review units"
(like Phabricator reviews, or Gerrit's Change-Id). This information is
stored outside of the commit. It is updated with rewrites. Every now
and then we get reports from users who are confused because `hg
uncommit` lost track of their review. Keeping the empty commit by
default would reduce this confusion. It may also cause confusion about
the empty commit. This patch adds a config option that lets us easily
test both behaviors on our users.
Differential Revision: https://phab.mercurial-scm.org/D5970
--- a/hgext/uncommit.py Thu Feb 14 15:17:54 2019 -0800
+++ b/hgext/uncommit.py Fri Feb 15 10:39:45 2019 -0800
@@ -44,6 +44,9 @@
configitem('experimental', 'uncommitondirtywdir',
default=False,
)
+configitem('experimental', 'uncommit.keep',
+ default=False,
+)
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
@@ -136,7 +139,7 @@
ds.copy(src, dst)
@command('uncommit',
- [('', 'keep', False, _('allow an empty commit after uncommiting')),
+ [('', 'keep', None, _('allow an empty commit after uncommiting')),
] + commands.walkopts,
_('[OPTION]... [FILE]...'),
helpcategory=command.CATEGORY_CHANGE_MANAGEMENT)
@@ -165,7 +168,12 @@
with repo.transaction('uncommit'):
match = scmutil.match(old, pats, opts)
- keepcommit = opts.get('keep') or pats
+ keepcommit = pats
+ if not keepcommit:
+ if opts.get('keep') is not None:
+ keepcommit = opts.get('keep')
+ else:
+ keepcommit = ui.configbool('experimental', 'uncommit.keep')
newid = _commitfiltered(repo, old, match, keepcommit)
if newid is None:
ui.status(_("nothing to uncommit\n"))
--- a/tests/test-uncommit.t Thu Feb 14 15:17:54 2019 -0800
+++ b/tests/test-uncommit.t Fri Feb 15 10:39:45 2019 -0800
@@ -307,7 +307,7 @@
$ hg phase -r ".^"
12: public
-Uncommit leaving an empty changeset
+Uncommit with --keep or experimental.uncommit.keep leaves an empty changeset
$ cd $TESTTMP
$ hg init repo1
@@ -327,9 +327,31 @@
|/
o P FILES: P
+ $ cat >> .hg/hgrc <<EOF
+ > [experimental]
+ > uncommit.keep=True
+ > EOF
+ $ hg ci --amend
+ $ hg uncommit
+ note: keeping empty commit
+ $ hg log -G -T '{desc} FILES: {files}'
+ @ Q FILES:
+ |
+ | x Q FILES: Q
+ |/
+ o P FILES: P
+
$ hg status
A Q
-
+ $ hg ci --amend
+ $ hg uncommit --no-keep
+ $ hg log -G -T '{desc} FILES: {files}'
+ x Q FILES: Q
+ |
+ @ P FILES: P
+
+ $ hg status
+ A Q
$ cd ..
$ rm -rf repo1