Mercurial > hg-stable
annotate hgext/children.py @ 27266:4dccc37b87bd
ui: support declaring path push urls as sub-options
Power users often want to apply per-path configuration options. For
example, they may want to declare an alternate URL for push operations
or declare a revset of revisions to push when `hg push` is used
(as opposed to attempting to push all revisions by default).
This patch establishes the use of sub-options (config options with
":" in the name) to declare additional behavior for paths.
New sub-options are declared by using the new ``@ui.pathsuboption``
decorator. This decorator serves multiple purposes:
* Declaring which sub-options are registered
* Declaring how a sub-option maps to an attribute on ``path``
instances (this is needed to `hg paths` can render sub-options
and values properly)
* Validation and normalization of config options to attribute
values
* Allows extensions to declare new sub-options without monkeypatching
* Allows extensions to overwrite built-in behavior for sub-option
handling
As convenient as the new option registration decorator is, extensions
(and even core functionality) may still need an additional hook point
to perform finalization of path instances. For example, they may wish
to validate that multiple options/attributes aren't conflicting with
each other. This hook point could be added later, if needed.
To prove this new functionality works, we implement the "pushurl"
path sub-option. This option declares the URL that `hg push` should
use by default.
We require that "pushurl" is an actual URL. This requirement might be
controversial and could be dropped if there is opposition. However,
objectors should read the complicated code in ui.path.__init__ and
commands.push for resolving non-URL values before making a judgement.
We also don't allow #fragment in the URLs. I intend to introduce a
":pushrev" (or similar) option to define a revset to control which
revisions are pushed when "-r <rev>" isn't passed into `hg push`.
This is much more powerful than #fragment and I don't think #fragment
is useful enough to continue supporting.
The [paths] section of the "config" help page has been updated
significantly. `hg paths` has been taught to display path sub-options.
The docs mention that "default-push" is now deprecated. However, there
are several references to it that need to be cleaned up. A large part
of this is converting more consumers to the new paths API. This will
happen naturally as more path sub-options are added and more and more
components need to access them.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 05 Dec 2015 21:11:04 -0800 |
parents | 80c5b2666a96 |
children | 3501bd89dad2 |
rev | line source |
---|---|
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
1 # Mercurial extension to provide the 'hg children' command |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
2 # |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
3 # Copyright 2007 by Intevation GmbH <intevation@intevation.de> |
8228
eee2319c5895
add blank line after copyright notices and after header
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
5 # Author(s): |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
6 # Thomas Arendsen Hein <thomas@intevation.de> |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
7 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8076
diff
changeset
|
8 # This software may be used and distributed according to the terms of the |
10263 | 9 # GNU General Public License version 2 or any later version. |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
10 |
16668
f393d20fb2ba
children: mark extension as deprecated
Augie Fackler <raf@durin42.com>
parents:
11321
diff
changeset
|
11 '''command to display child changesets (DEPRECATED) |
f393d20fb2ba
children: mark extension as deprecated
Augie Fackler <raf@durin42.com>
parents:
11321
diff
changeset
|
12 |
16670
052047753f7d
children: use hg reST role for example
Martin Geisler <mg@lazybytes.net>
parents:
16668
diff
changeset
|
13 This extension is deprecated. You should use :hg:`log -r |
052047753f7d
children: use hg reST role for example
Martin Geisler <mg@lazybytes.net>
parents:
16668
diff
changeset
|
14 "children(REV)"` instead. |
16668
f393d20fb2ba
children: mark extension as deprecated
Augie Fackler <raf@durin42.com>
parents:
11321
diff
changeset
|
15 ''' |
8873
e872ef2e6758
help: add/fix docstrings for a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8277
diff
changeset
|
16 |
21780
2d3fb8476d7a
children: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21248
diff
changeset
|
17 from mercurial import cmdutil |
6192
cd65a67aff31
Introduce templateopts and logopts to reduce duplicate option definitions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4785
diff
changeset
|
18 from mercurial.commands import templateopts |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
19 from mercurial.i18n import _ |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
20 |
21248
48e859e30cbf
children: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
17773
diff
changeset
|
21 cmdtable = {} |
48e859e30cbf
children: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
17773
diff
changeset
|
22 command = cmdutil.command(cmdtable) |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24482
diff
changeset
|
23 # Note for extension authors: ONLY specify testedwith = 'internal' for |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24482
diff
changeset
|
24 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24482
diff
changeset
|
25 # be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24482
diff
changeset
|
26 # leave the attribute unspecified. |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16670
diff
changeset
|
27 testedwith = 'internal' |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
28 |
21248
48e859e30cbf
children: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
17773
diff
changeset
|
29 @command('children', |
48e859e30cbf
children: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
17773
diff
changeset
|
30 [('r', 'rev', '', |
48e859e30cbf
children: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
17773
diff
changeset
|
31 _('show children of the specified revision'), _('REV')), |
48e859e30cbf
children: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
17773
diff
changeset
|
32 ] + templateopts, |
21780
2d3fb8476d7a
children: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21248
diff
changeset
|
33 _('hg children [-r REV] [FILE]'), |
2d3fb8476d7a
children: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21248
diff
changeset
|
34 inferrepo=True) |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
35 def children(ui, repo, file_=None, **opts): |
8026
683d8ebcf434
expand "dir" to "directory" in help texts
Martin Geisler <mg@lazybytes.net>
parents:
7986
diff
changeset
|
36 """show the children of the given or working directory revision |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
37 |
9253
d6d811d90976
children: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9055
diff
changeset
|
38 Print the children of the working directory's revisions. If a |
d6d811d90976
children: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9055
diff
changeset
|
39 revision is given via -r/--rev, the children of that revision will |
d6d811d90976
children: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9055
diff
changeset
|
40 be printed. If a file argument is given, revision in which the |
d6d811d90976
children: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9055
diff
changeset
|
41 file was last changed (after the working directory revision or the |
d6d811d90976
children: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9055
diff
changeset
|
42 argument to --rev if given) is printed. |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
43 """ |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
44 rev = opts.get('rev') |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
45 if file_: |
24482
3eb9045396b0
children: don't pass filectx to displayer
Yuya Nishihara <yuya@tcha.org>
parents:
21780
diff
changeset
|
46 fctx = repo.filectx(file_, changeid=rev) |
3eb9045396b0
children: don't pass filectx to displayer
Yuya Nishihara <yuya@tcha.org>
parents:
21780
diff
changeset
|
47 childctxs = [fcctx.changectx() for fcctx in fctx.children()] |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
48 else: |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6192
diff
changeset
|
49 ctx = repo[rev] |
24482
3eb9045396b0
children: don't pass filectx to displayer
Yuya Nishihara <yuya@tcha.org>
parents:
21780
diff
changeset
|
50 childctxs = ctx.children() |
4783
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
51 |
8b90d763ea90
Add extension to provide the 'hg children' command (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
diff
changeset
|
52 displayer = cmdutil.show_changeset(ui, repo, opts) |
24482
3eb9045396b0
children: don't pass filectx to displayer
Yuya Nishihara <yuya@tcha.org>
parents:
21780
diff
changeset
|
53 for cctx in childctxs: |
7369
87158be081b8
cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6747
diff
changeset
|
54 displayer.show(cctx) |
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
9253
diff
changeset
|
55 displayer.close() |