ui: path option to declare which revisions to push by default
Now that we have a mechanism for declaring path sub-options, we can
start to pile on features!
Many power users have expressed frustration that bare `hg push`
attempts to push all local revisions to the remote. This patch
introduces the "pushrev" path sub-option to control which revisions
are pushed when no "-r" argument is specified.
The value of this sub-option is a revset, naturally.
A future feature addition could potentially introduce a "pushnames"
sub-options that declares the list of names (branches, bookmarks,
topics, etc) to push by default. The entire "what to push by default"
feature should probably be considered before this patch lands.
--- a/mercurial/commands.py Sat Jun 25 18:35:14 2016 -0700
+++ b/mercurial/commands.py Sun Jun 26 07:59:02 2016 -0700
@@ -5942,6 +5942,15 @@
if not revs:
raise error.Abort(_("specified revisions evaluate to an empty set"),
hint=_("use different revision arguments"))
+ elif path.pushrev:
+ # It doesn't make any sense to specify ancestor revisions. So limit
+ # to DAG heads to make discovery simpler.
+ expr = revset.formatspec('heads(%r)', path.pushrev)
+ revs = scmutil.revrange(repo, [expr])
+ revs = [repo[rev].node() for rev in revs]
+ if not revs:
+ raise error.Abort(_('default push revset for path evaluates to an '
+ 'empty set'))
repo._subtoppath = dest
try:
--- a/mercurial/help/config.txt Sat Jun 25 18:35:14 2016 -0700
+++ b/mercurial/help/config.txt Sun Jun 26 07:59:02 2016 -0700
@@ -1282,6 +1282,18 @@
The URL to use for push operations. If not defined, the location
defined by the path's main entry is used.
+``pushrev``
+ A revset defining which revisions to push by default.
+
+ When :hg:`push` is executed without a ``-r`` argument, the revset
+ defined by this sub-option is evaluated to determine what to push.
+
+ For example, a value of ``.`` will push the working directory's
+ revision by default.
+
+ Revsets specifying bookmarks will not result in the bookmark being
+ pushed.
+
The following special named paths exist:
``default``
--- a/mercurial/ui.py Sat Jun 25 18:35:14 2016 -0700
+++ b/mercurial/ui.py Sun Jun 26 07:59:02 2016 -0700
@@ -1281,6 +1281,10 @@
return str(u)
+@pathsuboption('pushrev', 'pushrev')
+def pushrevpathoption(ui, path, value):
+ return value
+
class path(object):
"""Represents an individual path and its configuration."""
--- a/tests/test-default-push.t Sat Jun 25 18:35:14 2016 -0700
+++ b/tests/test-default-push.t Sun Jun 26 07:59:02 2016 -0700
@@ -105,4 +105,43 @@
adding file changes
added 1 changesets with 1 changes to 1 files
+:pushrev is used when no -r is passed
+
+ $ cat >> .hg/hgrc << EOF
+ > default:pushrev = .
+ > EOF
+ $ hg -q up -r 0
+ $ echo head1 > foo
+ $ hg -q commit -A -m head1
+ $ hg -q up -r 0
+ $ echo head2 > foo
+ $ hg -q commit -A -m head2
+ $ hg push -f
+ pushing to file:/*/$TESTTMP/pushurlsource/../pushurldest (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+ $ hg --config 'paths.default:pushrev=draft()' push -f
+ pushing to file:/*/$TESTTMP/pushurlsource/../pushurldest (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+Invalid :pushrev raises appropriately
+
+ $ hg --config 'paths.default:pushrev=notdefined()' push
+ pushing to file:/*/$TESTTMP/pushurlsource/../pushurldest (glob)
+ hg: parse error: unknown identifier: notdefined
+ [255]
+
+ $ hg --config 'paths.default:pushrev=(' push
+ pushing to file:/*/$TESTTMP/pushurlsource/../pushurldest (glob)
+ hg: parse error at 1: not a prefix: end
+ [255]
+
$ cd ..
--- a/tests/test-help.t Sat Jun 25 18:35:14 2016 -0700
+++ b/tests/test-help.t Sun Jun 26 07:59:02 2016 -0700
@@ -1515,6 +1515,18 @@
The URL to use for push operations. If not defined, the location
defined by the path's main entry is used.
+ "pushrev"
+ A revset defining which revisions to push by default.
+
+ When 'hg push' is executed without a "-r" argument, the revset defined
+ by this sub-option is evaluated to determine what to push.
+
+ For example, a value of "." will push the working directory's revision
+ by default.
+
+ Revsets specifying bookmarks will not result in the bookmark being
+ pushed.
+
The following special named paths exist:
"default"