Mercurial > hg
annotate hgext/narrow/narrowcommands.py @ 39532:55eea29833d2
narrow: validate patterns returned by expandnarrow
Remotes could supply malicious or invalid patterns. We should
validate them as soon as possible.
Differential Revision: https://phab.mercurial-scm.org/D4523
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 11 Sep 2018 10:36:07 -0700 |
parents | e82da0fcc7c5 |
children | 8301741e1f89 |
rev | line source |
---|---|
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 # narrowcommands.py - command modifications for narrowhg extension |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 # |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 # Copyright 2017 Google, Inc. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 # |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 from __future__ import absolute_import |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 import itertools |
39247
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
10 import os |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 from mercurial.i18n import _ |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 from mercurial import ( |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 cmdutil, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 commands, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 discovery, |
39440
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
17 encoding, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 error, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 exchange, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 extensions, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 hg, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 merge, |
36160
9fd8c2a3db5a
narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36154
diff
changeset
|
23 narrowspec, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 node, |
36154
4a7ba3ac9163
narrowcommands: use pycompat.{bytes,str}kwargs
Augie Fackler <augie@google.com>
parents:
36100
diff
changeset
|
25 pycompat, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 registrar, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 repair, |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38528
diff
changeset
|
28 repository, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
29 repoview, |
39247
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
30 sparse, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 util, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
32 ) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
34 from . import ( |
39529
e82da0fcc7c5
narrow: move wire proto capabilities to narrowwirepeer
Martin von Zweigbergk <martinvonz@google.com>
parents:
39528
diff
changeset
|
35 narrowwirepeer, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 ) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 table = {} |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 command = registrar.command(table) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 def setup(): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 """Wraps user-facing mercurial commands with narrow-aware versions.""" |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 entry = extensions.wrapcommand(commands.table, 'clone', clonenarrowcmd) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
45 entry[1].append(('', 'narrow', None, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 _("create a narrow clone of select files"))) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 entry[1].append(('', 'depth', '', |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 _("limit the history fetched by distance from heads"))) |
39247
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
49 entry[1].append(('', 'narrowspec', '', |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
50 _("read narrowspecs from file"))) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 # TODO(durin42): unify sparse/narrow --include/--exclude logic a bit |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 if 'sparse' not in extensions.enabled(): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 entry[1].append(('', 'include', [], |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
54 _("specifically fetch this file/directory"))) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
55 entry[1].append( |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
56 ('', 'exclude', [], |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
57 _("do not fetch this file/directory, even if included"))) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
59 entry = extensions.wrapcommand(commands.table, 'pull', pullnarrowcmd) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
60 entry[1].append(('', 'depth', '', |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
61 _("limit the history fetched by distance from heads"))) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
62 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
63 extensions.wrapcommand(commands.table, 'archive', archivenarrowcmd) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
64 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 def expandpull(pullop, includepats, excludepats): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 if not narrowspec.needsexpansion(includepats): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 return includepats, excludepats |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
68 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 heads = pullop.heads or pullop.rheads |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
70 includepats, excludepats = pullop.remote.expandnarrow( |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
71 includepats, excludepats, heads) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
72 pullop.repo.ui.debug('Expanded narrowspec to inc=%s, exc=%s\n' % ( |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
73 includepats, excludepats)) |
39532
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
74 |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
75 includepats = set(includepats) |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
76 excludepats = set(excludepats) |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
77 |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
78 # Nefarious remote could supply unsafe patterns. Validate them. |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
79 narrowspec.validatepatterns(includepats) |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
80 narrowspec.validatepatterns(excludepats) |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
81 |
55eea29833d2
narrow: validate patterns returned by expandnarrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39529
diff
changeset
|
82 return includepats, excludepats |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
83 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
84 def clonenarrowcmd(orig, ui, repo, *args, **opts): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
85 """Wraps clone command, so 'hg clone' first wraps localrepo.clone().""" |
36154
4a7ba3ac9163
narrowcommands: use pycompat.{bytes,str}kwargs
Augie Fackler <augie@google.com>
parents:
36100
diff
changeset
|
86 opts = pycompat.byteskwargs(opts) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
87 wrappedextraprepare = util.nullcontextmanager() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 opts_narrow = opts['narrow'] |
39247
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
89 narrowspecfile = opts['narrowspec'] |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
90 |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
91 if narrowspecfile: |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
92 filepath = os.path.join(pycompat.getcwd(), narrowspecfile) |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
93 ui.status(_("reading narrowspec from '%s'\n") % filepath) |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
94 try: |
39465
4062bbb1d10f
narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39440
diff
changeset
|
95 fdata = util.readfile(filepath) |
4062bbb1d10f
narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39440
diff
changeset
|
96 except IOError as inst: |
4062bbb1d10f
narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39440
diff
changeset
|
97 raise error.Abort(_("cannot read narrowspecs from '%s': %s") % |
4062bbb1d10f
narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39440
diff
changeset
|
98 (filepath, encoding.strtolocal(inst.strerror))) |
39247
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
99 |
39465
4062bbb1d10f
narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39440
diff
changeset
|
100 includes, excludes, profiles = sparse.parseconfig(ui, fdata, 'narrow') |
39247
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
101 if profiles: |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
102 raise error.Abort(_("cannot specify other files using '%include' in" |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
103 " narrowspec")) |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
104 |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
105 # narrowspec is passed so we should assume that user wants narrow clone |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
106 opts_narrow = True |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
107 opts['include'].extend(includes) |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
108 opts['exclude'].extend(excludes) |
f4d4bd8c8911
narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38835
diff
changeset
|
109 |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
110 if opts_narrow: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
111 def pullbundle2extraprepare_widen(orig, pullop, kwargs): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
112 # Create narrow spec patterns from clone flags |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
113 includepats = narrowspec.parsepatterns(opts['include']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
114 excludepats = narrowspec.parsepatterns(opts['exclude']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
115 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 # If necessary, ask the server to expand the narrowspec. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
117 includepats, excludepats = expandpull( |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
118 pullop, includepats, excludepats) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
119 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
120 if not includepats and excludepats: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
121 # If nothing was included, we assume the user meant to include |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
122 # everything, except what they asked to exclude. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
123 includepats = {'path:.'} |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
124 |
36469
28c7f580360b
narrow: reduce depedence on narrowspec.save()
Martin von Zweigbergk <martinvonz@google.com>
parents:
36468
diff
changeset
|
125 pullop.repo.setnarrowpats(includepats, excludepats) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
126 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
127 # This will populate 'includepats' etc with the values from the |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
128 # narrowspec we just saved. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
129 orig(pullop, kwargs) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
130 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
131 if opts.get('depth'): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 kwargs['depth'] = opts['depth'] |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
133 wrappedextraprepare = extensions.wrappedfunction(exchange, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 '_pullbundle2extraprepare', pullbundle2extraprepare_widen) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
135 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
136 def pullnarrow(orig, repo, *args, **kwargs): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
137 if opts_narrow: |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38528
diff
changeset
|
138 repo.requirements.add(repository.NARROW_REQUIREMENT) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
139 repo._writerequirements() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
140 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
141 return orig(repo, *args, **kwargs) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
142 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
143 wrappedpull = extensions.wrappedfunction(exchange, 'pull', pullnarrow) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
144 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
145 with wrappedextraprepare, wrappedpull: |
36154
4a7ba3ac9163
narrowcommands: use pycompat.{bytes,str}kwargs
Augie Fackler <augie@google.com>
parents:
36100
diff
changeset
|
146 return orig(ui, repo, *args, **pycompat.strkwargs(opts)) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
147 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
148 def pullnarrowcmd(orig, ui, repo, *args, **opts): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
149 """Wraps pull command to allow modifying narrow spec.""" |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
150 wrappedextraprepare = util.nullcontextmanager() |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38528
diff
changeset
|
151 if repository.NARROW_REQUIREMENT in repo.requirements: |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
152 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
153 def pullbundle2extraprepare_widen(orig, pullop, kwargs): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
154 orig(pullop, kwargs) |
36456
9ff5cbfbc26a
py3: fix more keyword arguments handling
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36352
diff
changeset
|
155 if opts.get(r'depth'): |
9ff5cbfbc26a
py3: fix more keyword arguments handling
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36352
diff
changeset
|
156 kwargs['depth'] = opts[r'depth'] |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
157 wrappedextraprepare = extensions.wrappedfunction(exchange, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
158 '_pullbundle2extraprepare', pullbundle2extraprepare_widen) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
159 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
160 with wrappedextraprepare: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
161 return orig(ui, repo, *args, **opts) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
162 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
163 def archivenarrowcmd(orig, ui, repo, *args, **opts): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
164 """Wraps archive command to narrow the default includes.""" |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38528
diff
changeset
|
165 if repository.NARROW_REQUIREMENT in repo.requirements: |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
166 repo_includes, repo_excludes = repo.narrowpats |
36352
5dbeddbf164a
narrowcommands: add some missing strkwargs calls for py3
Augie Fackler <augie@google.com>
parents:
36166
diff
changeset
|
167 includes = set(opts.get(r'include', [])) |
5dbeddbf164a
narrowcommands: add some missing strkwargs calls for py3
Augie Fackler <augie@google.com>
parents:
36166
diff
changeset
|
168 excludes = set(opts.get(r'exclude', [])) |
36100
8fd0a9e2d7e9
narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents:
36088
diff
changeset
|
169 includes, excludes, unused_invalid = narrowspec.restrictpatterns( |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
170 includes, excludes, repo_includes, repo_excludes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
171 if includes: |
36352
5dbeddbf164a
narrowcommands: add some missing strkwargs calls for py3
Augie Fackler <augie@google.com>
parents:
36166
diff
changeset
|
172 opts[r'include'] = includes |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
173 if excludes: |
36352
5dbeddbf164a
narrowcommands: add some missing strkwargs calls for py3
Augie Fackler <augie@google.com>
parents:
36166
diff
changeset
|
174 opts[r'exclude'] = excludes |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
175 return orig(ui, repo, *args, **opts) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
176 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
177 def pullbundle2extraprepare(orig, pullop, kwargs): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
178 repo = pullop.repo |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38528
diff
changeset
|
179 if repository.NARROW_REQUIREMENT not in repo.requirements: |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
180 return orig(pullop, kwargs) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
181 |
39529
e82da0fcc7c5
narrow: move wire proto capabilities to narrowwirepeer
Martin von Zweigbergk <martinvonz@google.com>
parents:
39528
diff
changeset
|
182 if narrowwirepeer.NARROWCAP not in pullop.remote.capabilities(): |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
183 raise error.Abort(_("server doesn't support narrow clones")) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
184 orig(pullop, kwargs) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
185 kwargs['narrow'] = True |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
186 include, exclude = repo.narrowpats |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
187 kwargs['oldincludepats'] = include |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
188 kwargs['oldexcludepats'] = exclude |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
189 kwargs['includepats'] = include |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
190 kwargs['excludepats'] = exclude |
39524
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
191 # calculate known nodes only in ellipses cases because in non-ellipses cases |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
192 # we have all the nodes |
39529
e82da0fcc7c5
narrow: move wire proto capabilities to narrowwirepeer
Martin von Zweigbergk <martinvonz@google.com>
parents:
39528
diff
changeset
|
193 if narrowwirepeer.ELLIPSESCAP in pullop.remote.capabilities(): |
39524
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
194 kwargs['known'] = [node.hex(ctx.node()) for ctx in |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
195 repo.set('::%ln', pullop.common) |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
196 if ctx.node() != node.nullid] |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
197 if not kwargs['known']: |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
198 # Mercurial serializes an empty list as '' and deserializes it as |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
199 # [''], so delete it instead to avoid handling the empty string on |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
200 # the server. |
294c571490f0
narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39465
diff
changeset
|
201 del kwargs['known'] |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
202 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
203 extensions.wrapfunction(exchange,'_pullbundle2extraprepare', |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
204 pullbundle2extraprepare) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
205 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
206 def _narrow(ui, repo, remote, commoninc, oldincludes, oldexcludes, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
207 newincludes, newexcludes, force): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
208 oldmatch = narrowspec.match(repo.root, oldincludes, oldexcludes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
209 newmatch = narrowspec.match(repo.root, newincludes, newexcludes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
210 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
211 # This is essentially doing "hg outgoing" to find all local-only |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
212 # commits. We will then check that the local-only commits don't |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
213 # have any changes to files that will be untracked. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
214 unfi = repo.unfiltered() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
215 outgoing = discovery.findcommonoutgoing(unfi, remote, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
216 commoninc=commoninc) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
217 ui.status(_('looking for local changes to affected paths\n')) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
218 localnodes = [] |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
219 for n in itertools.chain(outgoing.missing, outgoing.excluded): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
220 if any(oldmatch(f) and not newmatch(f) for f in unfi[n].files()): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
221 localnodes.append(n) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
222 revstostrip = unfi.revs('descendants(%ln)', localnodes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
223 hiddenrevs = repoview.filterrevs(repo, 'visible') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
224 visibletostrip = list(repo.changelog.node(r) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
225 for r in (revstostrip - hiddenrevs)) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
226 if visibletostrip: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
227 ui.status(_('The following changeset(s) or their ancestors have ' |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
228 'local changes not on the remote:\n')) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
229 maxnodes = 10 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
230 if ui.verbose or len(visibletostrip) <= maxnodes: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
231 for n in visibletostrip: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
232 ui.status('%s\n' % node.short(n)) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
233 else: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
234 for n in visibletostrip[:maxnodes]: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
235 ui.status('%s\n' % node.short(n)) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
236 ui.status(_('...and %d more, use --verbose to list all\n') % |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
237 (len(visibletostrip) - maxnodes)) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
238 if not force: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
239 raise error.Abort(_('local changes found'), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
240 hint=_('use --force-delete-local-changes to ' |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
241 'ignore')) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
242 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
243 with ui.uninterruptable(): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
244 if revstostrip: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
245 tostrip = [unfi.changelog.node(r) for r in revstostrip] |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
246 if repo['.'].node() in tostrip: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
247 # stripping working copy, so move to a different commit first |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
248 urev = max(repo.revs('(::%n) - %ln + null', |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
249 repo['.'].node(), visibletostrip)) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
250 hg.clean(repo, urev) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
251 repair.strip(ui, unfi, tostrip, topic='narrow') |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
252 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
253 todelete = [] |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
254 for f, f2, size in repo.store.datafiles(): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
255 if f.startswith('data/'): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
256 file = f[5:-2] |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
257 if not newmatch(file): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
258 todelete.append(f) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
259 elif f.startswith('meta/'): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
260 dir = f[5:-13] |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
261 dirs = ['.'] + sorted(util.dirs({dir})) + [dir] |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
262 include = True |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
263 for d in dirs: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
264 visit = newmatch.visitdir(d) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
265 if not visit: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
266 include = False |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
267 break |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
268 if visit == 'all': |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
269 break |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
270 if not include: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
271 todelete.append(f) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
272 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
273 repo.destroying() |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
274 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
275 with repo.transaction("narrowing"): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
276 for f in todelete: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
277 ui.status(_('deleting %s\n') % f) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
278 util.unlinkpath(repo.svfs.join(f)) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
279 repo.store.markremoved(f) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
280 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
281 for f in repo.dirstate: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
282 if not newmatch(f): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
283 repo.dirstate.drop(f) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
284 repo.wvfs.unlinkpath(f) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
285 repo.setnarrowpats(newincludes, newexcludes) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
286 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
287 repo.destroyed() |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
288 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
289 def _widen(ui, repo, remote, commoninc, newincludes, newexcludes): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
290 newmatch = narrowspec.match(repo.root, newincludes, newexcludes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
291 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
292 # TODO(martinvonz): Get expansion working with widening/narrowing. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
293 if narrowspec.needsexpansion(newincludes): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
294 raise error.Abort('Expansion not yet supported on pull') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
295 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
296 def pullbundle2extraprepare_widen(orig, pullop, kwargs): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
297 orig(pullop, kwargs) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
298 # The old{in,ex}cludepats have already been set by orig() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
299 kwargs['includepats'] = newincludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
300 kwargs['excludepats'] = newexcludes |
39356
c8e4eae84808
narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39247
diff
changeset
|
301 kwargs['widen'] = True |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
302 wrappedextraprepare = extensions.wrappedfunction(exchange, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
303 '_pullbundle2extraprepare', pullbundle2extraprepare_widen) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
304 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
305 # define a function that narrowbundle2 can call after creating the |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
306 # backup bundle, but before applying the bundle from the server |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
307 def setnewnarrowpats(): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
308 repo.setnarrowpats(newincludes, newexcludes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
309 repo.setnewnarrowpats = setnewnarrowpats |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
310 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
311 with ui.uninterruptable(): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
312 ds = repo.dirstate |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
313 p1, p2 = ds.p1(), ds.p2() |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
314 with ds.parentchange(): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
315 ds.setparents(node.nullid, node.nullid) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
316 common = commoninc[0] |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
317 with wrappedextraprepare: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
318 exchange.pull(repo, remote, heads=common) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
319 with ds.parentchange(): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
320 ds.setparents(p1, p2) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
321 |
39357
2b8adb7ca39a
narrow: update the narrowspecs to new ones after pulling when widening
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39356
diff
changeset
|
322 repo.setnewnarrowpats() |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
323 actions = {k: [] for k in 'a am f g cd dc r dm dg m e k p pr'.split()} |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
324 addgaction = actions['g'].append |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
325 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
326 mf = repo['.'].manifest().matches(newmatch) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
327 for f, fn in mf.iteritems(): |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
328 if f not in repo.dirstate: |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
329 addgaction((f, (mf.flags(f), False), |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
330 "add from widened narrow clone")) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
331 |
38528
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
332 merge.applyupdates(repo, actions, wctx=repo[None], |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
333 mctx=repo['.'], overwrite=False) |
a1d5951efce7
narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents:
36469
diff
changeset
|
334 merge.recordupdates(repo, actions, branchmerge=False) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
335 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
336 # TODO(rdamazio): Make new matcher format and update description |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
337 @command('tracked', |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
338 [('', 'addinclude', [], _('new paths to include')), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
339 ('', 'removeinclude', [], _('old paths to no longer include')), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
340 ('', 'addexclude', [], _('new paths to exclude')), |
39440
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
341 ('', 'import-rules', '', _('import narrowspecs from a file')), |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
342 ('', 'removeexclude', [], _('old paths to no longer exclude')), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
343 ('', 'clear', False, _('whether to replace the existing narrowspec')), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
344 ('', 'force-delete-local-changes', False, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
345 _('forces deletion of local changes when narrowing')), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
346 ] + commands.remoteopts, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
347 _('[OPTIONS]... [REMOTE]'), |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
348 inferrepo=True) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
349 def trackedcmd(ui, repo, remotepath=None, *pats, **opts): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
350 """show or change the current narrowspec |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
351 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
352 With no argument, shows the current narrowspec entries, one per line. Each |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
353 line will be prefixed with 'I' or 'X' for included or excluded patterns, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
354 respectively. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
355 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
356 The narrowspec is comprised of expressions to match remote files and/or |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
357 directories that should be pulled into your client. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
358 The narrowspec has *include* and *exclude* expressions, with excludes always |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
359 trumping includes: that is, if a file matches an exclude expression, it will |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
360 be excluded even if it also matches an include expression. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
361 Excluding files that were never included has no effect. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
362 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
363 Each included or excluded entry is in the format described by |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
364 'hg help patterns'. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
365 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
366 The options allow you to add or remove included and excluded expressions. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
367 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
368 If --clear is specified, then all previous includes and excludes are DROPPED |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
369 and replaced by the new ones specified to --addinclude and --addexclude. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
370 If --clear is specified without any further options, the narrowspec will be |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
371 empty and will not match any files. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
372 """ |
36166
ccf7ae119769
narrowcommands: more byteskwargs cleanup
Augie Fackler <augie@google.com>
parents:
36160
diff
changeset
|
373 opts = pycompat.byteskwargs(opts) |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38528
diff
changeset
|
374 if repository.NARROW_REQUIREMENT not in repo.requirements: |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
375 ui.warn(_('The narrow command is only supported on respositories cloned' |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
376 ' with --narrow.\n')) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
377 return 1 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
378 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
379 # Before supporting, decide whether it "hg tracked --clear" should mean |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
380 # tracking no paths or all paths. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
381 if opts['clear']: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
382 ui.warn(_('The --clear option is not yet supported.\n')) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
383 return 1 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
384 |
39440
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
385 # import rules from a file |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
386 newrules = opts.get('import_rules') |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
387 if newrules: |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
388 try: |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
389 filepath = os.path.join(pycompat.getcwd(), newrules) |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
390 fdata = util.readfile(filepath) |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
391 except IOError as inst: |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
392 raise error.Abort(_("cannot read narrowspecs from '%s': %s") % |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
393 (filepath, encoding.strtolocal(inst.strerror))) |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
394 includepats, excludepats, profiles = sparse.parseconfig(ui, fdata, |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
395 'narrow') |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
396 if profiles: |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
397 raise error.Abort(_("including other spec files using '%include' " |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
398 "is not supported in narrowspec")) |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
399 opts['addinclude'].extend(includepats) |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
400 opts['addexclude'].extend(excludepats) |
ab20ee07b82d
narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
39357
diff
changeset
|
401 |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
402 if narrowspec.needsexpansion(opts['addinclude'] + opts['addexclude']): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
403 raise error.Abort('Expansion not yet supported on widen/narrow') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
404 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
405 addedincludes = narrowspec.parsepatterns(opts['addinclude']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
406 removedincludes = narrowspec.parsepatterns(opts['removeinclude']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
407 addedexcludes = narrowspec.parsepatterns(opts['addexclude']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
408 removedexcludes = narrowspec.parsepatterns(opts['removeexclude']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
409 widening = addedincludes or removedexcludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
410 narrowing = removedincludes or addedexcludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
411 only_show = not widening and not narrowing |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
412 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
413 # Only print the current narrowspec. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
414 if only_show: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
415 include, exclude = repo.narrowpats |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
416 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
417 ui.pager('tracked') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
418 fm = ui.formatter('narrow', opts) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
419 for i in sorted(include): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
420 fm.startitem() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
421 fm.write('status', '%s ', 'I', label='narrow.included') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
422 fm.write('pat', '%s\n', i, label='narrow.included') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
423 for i in sorted(exclude): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
424 fm.startitem() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
425 fm.write('status', '%s ', 'X', label='narrow.excluded') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
426 fm.write('pat', '%s\n', i, label='narrow.excluded') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
427 fm.end() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
428 return 0 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
429 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
430 with repo.wlock(), repo.lock(): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
431 cmdutil.bailifchanged(repo) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
432 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
433 # Find the revisions we have in common with the remote. These will |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
434 # be used for finding local-only changes for narrowing. They will |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
435 # also define the set of revisions to update for widening. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
436 remotepath = ui.expandpath(remotepath or 'default') |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
437 url, branches = hg.parseurl(remotepath) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
438 ui.status(_('comparing with %s\n') % util.hidepassword(url)) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
439 remote = hg.peer(repo, opts, url) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
440 commoninc = discovery.findcommonincoming(repo, remote) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
441 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
442 oldincludes, oldexcludes = repo.narrowpats |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
443 if narrowing: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
444 newincludes = oldincludes - removedincludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
445 newexcludes = oldexcludes | addedexcludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
446 _narrow(ui, repo, remote, commoninc, oldincludes, oldexcludes, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
447 newincludes, newexcludes, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
448 opts['force_delete_local_changes']) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
449 # _narrow() updated the narrowspec and _widen() below needs to |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
450 # use the updated values as its base (otherwise removed includes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
451 # and addedexcludes will be lost in the resulting narrowspec) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
452 oldincludes = newincludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
453 oldexcludes = newexcludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
454 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
455 if widening: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
456 newincludes = oldincludes | addedincludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
457 newexcludes = oldexcludes - removedexcludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
458 _widen(ui, repo, remote, commoninc, newincludes, newexcludes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
459 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
460 return 0 |