Mercurial > hg
annotate mercurial/sparse.py @ 35305:483b5dd0f1aa
push: restrict common discovery to the pushed set
This changeset make use of the ability of the set discovery to only search
common changeset for a subset of the repository. Restricting that search to the
pushed set avoid potential waste of time finding out the status of many
unrelated related revision.
Repository with many heads were especially badly affected by this. Here is an
example of findcommonhead discovery for pushing 11 outgoing changeset on a
repository with tens of thousand of unrelated heads. (discovery run over a ssh
link to localhost).
Before:
queries: 92
time: 44.1996s
After:
queries: 3
time: 0.6938s
A x63 speedup even with a network link without latency.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Wed, 06 Dec 2017 23:33:01 +0100 |
parents | b4955650eb57 |
children | 72b91f905065 |
rev | line source |
---|---|
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
1 # sparse.py - functionality for sparse checkouts |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
2 # |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
3 # Copyright 2014 Facebook, Inc. |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
4 # |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
7 |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
8 from __future__ import absolute_import |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
9 |
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
10 import collections |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
11 import hashlib |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
12 import os |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
13 |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
14 from .i18n import _ |
33301
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
15 from .node import nullid |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
16 from . import ( |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
17 error, |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
18 match as matchmod, |
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
19 merge as mergemod, |
33685
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
20 pathutil, |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
21 pycompat, |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
22 scmutil, |
33371
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
23 util, |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
24 ) |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
25 |
33299
41448fc51510
sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33298
diff
changeset
|
26 # Whether sparse features are enabled. This variable is intended to be |
41448fc51510
sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33298
diff
changeset
|
27 # temporary to facilitate porting sparse to core. It should eventually be |
41448fc51510
sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33298
diff
changeset
|
28 # a per-repo option, possibly a repo requirement. |
41448fc51510
sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33298
diff
changeset
|
29 enabled = False |
41448fc51510
sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33298
diff
changeset
|
30 |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
31 def parseconfig(ui, raw): |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
32 """Parse sparse config file content. |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
33 |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
34 Returns a tuple of includes, excludes, and profiles. |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
35 """ |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
36 includes = set() |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
37 excludes = set() |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
38 profiles = set() |
33551
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
39 current = None |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
40 havesection = False |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
41 |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
42 for line in raw.split('\n'): |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
43 line = line.strip() |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
44 if not line or line.startswith('#'): |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
45 # empty or comment line, skip |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
46 continue |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
47 elif line.startswith('%include '): |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
48 line = line[9:].strip() |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
49 if line: |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
50 profiles.add(line) |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
51 elif line == '[include]': |
33551
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
52 if havesection and current != includes: |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
53 # TODO pass filename into this API so we can report it. |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
54 raise error.Abort(_('sparse config cannot have includes ' + |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
55 'after excludes')) |
33551
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
56 havesection = True |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
57 current = includes |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
58 continue |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
59 elif line == '[exclude]': |
33551
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
60 havesection = True |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
61 current = excludes |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
62 elif line: |
33551
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
63 if current is None: |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
64 raise error.Abort(_('sparse config entry outside of ' |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
65 'section: %s') % line, |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
66 hint=_('add an [include] or [exclude] line ' |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
67 'to declare the entry type')) |
1d1779734c99
sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33550
diff
changeset
|
68 |
33297
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
69 if line.strip().startswith('/'): |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
70 ui.warn(_('warning: sparse profile cannot use' + |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
71 ' paths starting with /, ignoring %s\n') % line) |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
72 continue |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
73 current.add(line) |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
74 |
ba5d89774db6
sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
75 return includes, excludes, profiles |
33298
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
76 |
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
77 # Exists as separate function to facilitate monkeypatching. |
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
78 def readprofile(repo, profile, changeid): |
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
79 """Resolve the raw content of a sparse profile file.""" |
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
80 # TODO add some kind of cache here because this incurs a manifest |
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
81 # resolve and can be slow. |
f41a99c45956
sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33297
diff
changeset
|
82 return repo.filectx(profile, changeid=changeid).data() |
33300
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
83 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
84 def patternsforrev(repo, rev): |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
85 """Obtain sparse checkout patterns for the given rev. |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
86 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
87 Returns a tuple of iterables representing includes, excludes, and |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
88 patterns. |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
89 """ |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
90 # Feature isn't enabled. No-op. |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
91 if not enabled: |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
92 return set(), set(), set() |
33300
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
93 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
94 raw = repo.vfs.tryread('sparse') |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
95 if not raw: |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
96 return set(), set(), set() |
33300
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
97 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
98 if rev is None: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
99 raise error.Abort(_('cannot parse sparse patterns from working ' |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
100 'directory')) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
101 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
102 includes, excludes, profiles = parseconfig(repo.ui, raw) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
103 ctx = repo[rev] |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
104 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
105 if profiles: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
106 visited = set() |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
107 while profiles: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
108 profile = profiles.pop() |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
109 if profile in visited: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
110 continue |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
111 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
112 visited.add(profile) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
113 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
114 try: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
115 raw = readprofile(repo, profile, rev) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
116 except error.ManifestLookupError: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
117 msg = ( |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
118 "warning: sparse profile '%s' not found " |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
119 "in rev %s - ignoring it\n" % (profile, ctx)) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
120 # experimental config: sparse.missingwarning |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
121 if repo.ui.configbool( |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33447
diff
changeset
|
122 'sparse', 'missingwarning'): |
33300
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
123 repo.ui.warn(msg) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
124 else: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
125 repo.ui.debug(msg) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
126 continue |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
127 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
128 pincludes, pexcludes, subprofs = parseconfig(repo.ui, raw) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
129 includes.update(pincludes) |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
130 excludes.update(pexcludes) |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
131 profiles.update(subprofs) |
33300
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
132 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
133 profiles = visited |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
134 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
135 if includes: |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
136 includes.add('.hg*') |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
137 |
f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33299
diff
changeset
|
138 return includes, excludes, profiles |
33301
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
139 |
33370
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
140 def activeconfig(repo): |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
141 """Determine the active sparse config rules. |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
142 |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
143 Rules are constructed by reading the current sparse config and bringing in |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
144 referenced profiles from parents of the working directory. |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
145 """ |
33301
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
146 revs = [repo.changelog.rev(node) for node in |
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
147 repo.dirstate.parents() if node != nullid] |
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
148 |
33370
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
149 allincludes = set() |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
150 allexcludes = set() |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
151 allprofiles = set() |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
152 |
33301
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
153 for rev in revs: |
33370
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
154 includes, excludes, profiles = patternsforrev(repo, rev) |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
155 allincludes |= includes |
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
156 allexcludes |= excludes |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
157 allprofiles |= profiles |
33301
ca4b78eb11e7
sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33300
diff
changeset
|
158 |
33370
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
159 return allincludes, allexcludes, allprofiles |
33302
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33301
diff
changeset
|
160 |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
161 def configsignature(repo, includetemp=True): |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
162 """Obtain the signature string for the current sparse configuration. |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
163 |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
164 This is used to construct a cache key for matchers. |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
165 """ |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
166 cache = repo._sparsesignaturecache |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
167 |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
168 signature = cache.get('signature') |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
169 |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
170 if includetemp: |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
171 tempsignature = cache.get('tempsignature') |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
172 else: |
33318
526255fe7899
sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33317
diff
changeset
|
173 tempsignature = '0' |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
174 |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
175 if signature is None or (includetemp and tempsignature is None): |
33318
526255fe7899
sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33317
diff
changeset
|
176 signature = hashlib.sha1(repo.vfs.tryread('sparse')).hexdigest() |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
177 cache['signature'] = signature |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
178 |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
179 if includetemp: |
33318
526255fe7899
sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33317
diff
changeset
|
180 raw = repo.vfs.tryread('tempsparse') |
526255fe7899
sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33317
diff
changeset
|
181 tempsignature = hashlib.sha1(raw).hexdigest() |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
182 cache['tempsignature'] = tempsignature |
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
183 |
33318
526255fe7899
sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33317
diff
changeset
|
184 return '%s %s' % (signature, tempsignature) |
33317
df1287268cc0
sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33304
diff
changeset
|
185 |
33303
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
186 def writeconfig(repo, includes, excludes, profiles): |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
187 """Write the sparse config file given a sparse configuration.""" |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
188 with repo.vfs('sparse', 'wb') as fh: |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
189 for p in sorted(profiles): |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
190 fh.write('%%include %s\n' % p) |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
191 |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
192 if includes: |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
193 fh.write('[include]\n') |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
194 for i in sorted(includes): |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
195 fh.write(i) |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
196 fh.write('\n') |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
197 |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
198 if excludes: |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
199 fh.write('[exclude]\n') |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
200 for e in sorted(excludes): |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
201 fh.write(e) |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
202 fh.write('\n') |
8b571495d811
sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33302
diff
changeset
|
203 |
33325
38df146d0697
sparse: inline signature cache clearing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33324
diff
changeset
|
204 repo._sparsesignaturecache.clear() |
33304
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
205 |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
206 def readtemporaryincludes(repo): |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
207 raw = repo.vfs.tryread('tempsparse') |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
208 if not raw: |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
209 return set() |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
210 |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
211 return set(raw.split('\n')) |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
212 |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
213 def writetemporaryincludes(repo, includes): |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
214 repo.vfs.write('tempsparse', '\n'.join(sorted(includes))) |
33325
38df146d0697
sparse: inline signature cache clearing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33324
diff
changeset
|
215 repo._sparsesignaturecache.clear() |
33304
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
216 |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
217 def addtemporaryincludes(repo, additional): |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
218 includes = readtemporaryincludes(repo) |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
219 for i in additional: |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
220 includes.add(i) |
3e1accab7447
sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33303
diff
changeset
|
221 writetemporaryincludes(repo, includes) |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
222 |
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
223 def prunetemporaryincludes(repo): |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
224 if not enabled or not repo.vfs.exists('tempsparse'): |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
225 return |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
226 |
33356
ccb3e5399921
sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents:
33355
diff
changeset
|
227 s = repo.status() |
ccb3e5399921
sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents:
33355
diff
changeset
|
228 if s.modified or s.added or s.removed or s.deleted: |
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
229 # Still have pending changes. Don't bother trying to prune. |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
230 return |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
231 |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
232 sparsematch = matcher(repo, includetemp=False) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
233 dirstate = repo.dirstate |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
234 actions = [] |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
235 dropped = [] |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
236 tempincludes = readtemporaryincludes(repo) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
237 for file in tempincludes: |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
238 if file in dirstate and not sparsematch(file): |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
239 message = _('dropping temporarily included sparse files') |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
240 actions.append((file, None, message)) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
241 dropped.append(file) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
242 |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
243 typeactions = collections.defaultdict(list) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
244 typeactions['r'] = actions |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
245 mergemod.applyupdates(repo, typeactions, repo[None], repo['.'], False) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
246 |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
247 # Fix dirstate |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
248 for file in dropped: |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
249 dirstate.drop(file) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
250 |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
251 repo.vfs.unlink('tempsparse') |
33325
38df146d0697
sparse: inline signature cache clearing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33324
diff
changeset
|
252 repo._sparsesignaturecache.clear() |
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
253 msg = _('cleaned up %d temporarily added file(s) from the ' |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
254 'sparse checkout\n') |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
255 repo.ui.status(msg % len(tempincludes)) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33320
diff
changeset
|
256 |
33447
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
257 def forceincludematcher(matcher, includes): |
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
258 """Returns a matcher that returns true for any of the forced includes |
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
259 before testing against the actual matcher.""" |
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
260 kindpats = [('path', include, '') for include in includes] |
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
261 includematcher = matchmod.includematcher('', '', kindpats) |
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
262 return matchmod.unionmatcher([includematcher, matcher]) |
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
263 |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
264 def matcher(repo, revs=None, includetemp=True): |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
265 """Obtain a matcher for sparse working directories for the given revs. |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
266 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
267 If multiple revisions are specified, the matcher is the union of all |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
268 revs. |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
269 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
270 ``includetemp`` indicates whether to use the temporary sparse profile. |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
271 """ |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
272 # If sparse isn't enabled, sparse matcher matches everything. |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
273 if not enabled: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
274 return matchmod.always(repo.root, '') |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
275 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
276 if not revs or revs == [None]: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
277 revs = [repo.changelog.rev(node) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
278 for node in repo.dirstate.parents() if node != nullid] |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
279 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
280 signature = configsignature(repo, includetemp=includetemp) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
281 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
282 key = '%s %s' % (signature, ' '.join(map(pycompat.bytestr, revs))) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
283 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
284 result = repo._sparsematchercache.get(key) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
285 if result: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
286 return result |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
287 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
288 matchers = [] |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
289 for rev in revs: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
290 try: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
291 includes, excludes, profiles = patternsforrev(repo, rev) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
292 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
293 if includes or excludes: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
294 # Explicitly include subdirectories of includes so |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
295 # status will walk them down to the actual include. |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
296 subdirs = set() |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
297 for include in includes: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
298 # TODO consider using posix path functions here so Windows |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
299 # \ directory separators don't come into play. |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
300 dirname = os.path.dirname(include) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
301 # basename is used to avoid issues with absolute |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
302 # paths (which on Windows can include the drive). |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
303 while os.path.basename(dirname): |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
304 subdirs.add(dirname) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
305 dirname = os.path.dirname(dirname) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
306 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
307 matcher = matchmod.match(repo.root, '', [], |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
308 include=includes, exclude=excludes, |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
309 default='relpath') |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
310 if subdirs: |
33447
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
311 matcher = forceincludematcher(matcher, subdirs) |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
312 matchers.append(matcher) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
313 except IOError: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
314 pass |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
315 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
316 if not matchers: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
317 result = matchmod.always(repo.root, '') |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
318 elif len(matchers) == 1: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
319 result = matchers[0] |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
320 else: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
321 result = matchmod.unionmatcher(matchers) |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
322 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
323 if includetemp: |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
324 tempincludes = readtemporaryincludes(repo) |
33447
6f4e5e5940a5
match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
33376
diff
changeset
|
325 result = forceincludematcher(result, tempincludes) |
33320
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
326 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
327 repo._sparsematchercache[key] = result |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
328 |
153456f02426
sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33318
diff
changeset
|
329 return result |
33322
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
330 |
33323
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33322
diff
changeset
|
331 def filterupdatesactions(repo, wctx, mctx, branchmerge, actions): |
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33322
diff
changeset
|
332 """Filter updates to only lay out files that match the sparse rules.""" |
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33322
diff
changeset
|
333 if not enabled: |
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33322
diff
changeset
|
334 return actions |
33322
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
335 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
336 oldrevs = [pctx.rev() for pctx in wctx.parents()] |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
337 oldsparsematch = matcher(repo, oldrevs) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
338 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
339 if oldsparsematch.always(): |
33323
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33322
diff
changeset
|
340 return actions |
33322
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
341 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
342 files = set() |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
343 prunedactions = {} |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
344 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
345 if branchmerge: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
346 # If we're merging, use the wctx filter, since we're merging into |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
347 # the wctx. |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
348 sparsematch = matcher(repo, [wctx.parents()[0].rev()]) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
349 else: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
350 # If we're updating, use the target context's filter, since we're |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
351 # moving to the target context. |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
352 sparsematch = matcher(repo, [mctx.rev()]) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
353 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
354 temporaryfiles = [] |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
355 for file, action in actions.iteritems(): |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
356 type, args, msg = action |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
357 files.add(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
358 if sparsematch(file): |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
359 prunedactions[file] = action |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
360 elif type == 'm': |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
361 temporaryfiles.append(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
362 prunedactions[file] = action |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
363 elif branchmerge: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
364 if type != 'k': |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
365 temporaryfiles.append(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
366 prunedactions[file] = action |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
367 elif type == 'f': |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
368 prunedactions[file] = action |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
369 elif file in wctx: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
370 prunedactions[file] = ('r', args, msg) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
371 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
372 if len(temporaryfiles) > 0: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
373 repo.ui.status(_('temporarily included %d file(s) in the sparse ' |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
374 'checkout for merging\n') % len(temporaryfiles)) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
375 addtemporaryincludes(repo, temporaryfiles) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
376 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
377 # Add the new files to the working copy so they can be merged, etc |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
378 actions = [] |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
379 message = 'temporarily adding to sparse checkout' |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
380 wctxmanifest = repo[None].manifest() |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
381 for file in temporaryfiles: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
382 if file in wctxmanifest: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
383 fctx = repo[None][file] |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
384 actions.append((file, (fctx.flags(), False), message)) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
385 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
386 typeactions = collections.defaultdict(list) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
387 typeactions['g'] = actions |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
388 mergemod.applyupdates(repo, typeactions, repo[None], repo['.'], |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
389 False) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
390 |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
391 dirstate = repo.dirstate |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
392 for file, flags, msg in actions: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
393 dirstate.normal(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
394 |
33370
482320104672
sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33356
diff
changeset
|
395 profiles = activeconfig(repo)[2] |
33322
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
396 changedprofiles = profiles & files |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
397 # If an active profile changed during the update, refresh the checkout. |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
398 # Don't do this during a branch merge, since all incoming changes should |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
399 # have been handled by the temporary includes above. |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
400 if changedprofiles and not branchmerge: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
401 mf = mctx.manifest() |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
402 for file in mf: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
403 old = oldsparsematch(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
404 new = sparsematch(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
405 if not old and new: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
406 flags = mf.flags(file) |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
407 prunedactions[file] = ('g', (flags, False), '') |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
408 elif old and not new: |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
409 prunedactions[file] = ('r', [], '') |
fa6c2c3064fd
sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
410 |
33323
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33322
diff
changeset
|
411 return prunedactions |
33324
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
412 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
413 def refreshwdir(repo, origstatus, origsparsematch, force=False): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
414 """Refreshes working directory by taking sparse config into account. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
415 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
416 The old status and sparse matcher is compared against the current sparse |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
417 matcher. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
418 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
419 Will abort if a file with pending changes is being excluded or included |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
420 unless ``force`` is True. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
421 """ |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
422 # Verify there are no pending changes |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
423 pending = set() |
33356
ccb3e5399921
sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents:
33355
diff
changeset
|
424 pending.update(origstatus.modified) |
ccb3e5399921
sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents:
33355
diff
changeset
|
425 pending.update(origstatus.added) |
ccb3e5399921
sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents:
33355
diff
changeset
|
426 pending.update(origstatus.removed) |
33324
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
427 sparsematch = matcher(repo) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
428 abort = False |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
429 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
430 for f in pending: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
431 if not sparsematch(f): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
432 repo.ui.warn(_("pending changes to '%s'\n") % f) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
433 abort = not force |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
434 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
435 if abort: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
436 raise error.Abort(_('could not update sparseness due to pending ' |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
437 'changes')) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
438 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
439 # Calculate actions |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
440 dirstate = repo.dirstate |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
441 ctx = repo['.'] |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
442 added = [] |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
443 lookup = [] |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
444 dropped = [] |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
445 mf = ctx.manifest() |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
446 files = set(mf) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
447 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
448 actions = {} |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
449 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
450 for file in files: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
451 old = origsparsematch(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
452 new = sparsematch(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
453 # Add files that are newly included, or that don't exist in |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
454 # the dirstate yet. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
455 if (new and not old) or (old and new and not file in dirstate): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
456 fl = mf.flags(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
457 if repo.wvfs.exists(file): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
458 actions[file] = ('e', (fl,), '') |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
459 lookup.append(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
460 else: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
461 actions[file] = ('g', (fl, False), '') |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
462 added.append(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
463 # Drop files that are newly excluded, or that still exist in |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
464 # the dirstate. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
465 elif (old and not new) or (not old and not new and file in dirstate): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
466 dropped.append(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
467 if file not in pending: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
468 actions[file] = ('r', [], '') |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
469 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
470 # Verify there are no pending changes in newly included files |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
471 abort = False |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
472 for file in lookup: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
473 repo.ui.warn(_("pending changes to '%s'\n") % file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
474 abort = not force |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
475 if abort: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
476 raise error.Abort(_('cannot change sparseness due to pending ' |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
477 'changes (delete the files or use ' |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
478 '--force to bring them back dirty)')) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
479 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
480 # Check for files that were only in the dirstate. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
481 for file, state in dirstate.iteritems(): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
482 if not file in files: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
483 old = origsparsematch(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
484 new = sparsematch(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
485 if old and not new: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
486 dropped.append(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
487 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
488 # Apply changes to disk |
34547
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
33685
diff
changeset
|
489 typeactions = dict((m, []) |
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
490 for m in 'a f g am cd dc r dm dg m e k p pr'.split()) |
33324
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
491 for f, (m, args, msg) in actions.iteritems(): |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
492 if m not in typeactions: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
493 typeactions[m] = [] |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
494 typeactions[m].append((f, args, msg)) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
495 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
496 mergemod.applyupdates(repo, typeactions, repo[None], repo['.'], False) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
497 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
498 # Fix dirstate |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
499 for file in added: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
500 dirstate.normal(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
501 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
502 for file in dropped: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
503 dirstate.drop(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
504 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
505 for file in lookup: |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
506 # File exists on disk, and we're bringing it back in an unknown state. |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
507 dirstate.normallookup(file) |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
508 |
33d0859c37bd
sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33323
diff
changeset
|
509 return added, dropped, lookup |
33353
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
510 |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
511 def aftercommit(repo, node): |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
512 """Perform actions after a working directory commit.""" |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
513 # This function is called unconditionally, even if sparse isn't |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
514 # enabled. |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
515 ctx = repo[node] |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
516 |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
517 profiles = patternsforrev(repo, ctx.rev())[2] |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
518 |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
519 # profiles will only have data if sparse is enabled. |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
520 if profiles & set(ctx.files()): |
33353
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
521 origstatus = repo.status() |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
522 origsparsematch = matcher(repo) |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
523 refreshwdir(repo, origstatus, origsparsematch, force=True) |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
524 |
160efb559f67
sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33325
diff
changeset
|
525 prunetemporaryincludes(repo) |
33354
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
526 |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
527 def _updateconfigandrefreshwdir(repo, includes, excludes, profiles, |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
528 force=False, removing=False): |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
529 """Update the sparse config and working directory state.""" |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
530 raw = repo.vfs.tryread('sparse') |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
531 oldincludes, oldexcludes, oldprofiles = parseconfig(repo.ui, raw) |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
532 |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
533 oldstatus = repo.status() |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
534 oldmatch = matcher(repo) |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
535 oldrequires = set(repo.requirements) |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
536 |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
537 # TODO remove this try..except once the matcher integrates better |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
538 # with dirstate. We currently have to write the updated config |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
539 # because that will invalidate the matcher cache and force a |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
540 # re-read. We ideally want to update the cached matcher on the |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
541 # repo instance then flush the new config to disk once wdir is |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
542 # updated. But this requires massive rework to matcher() and its |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
543 # consumers. |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
544 |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
545 if 'exp-sparse' in oldrequires and removing: |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
546 repo.requirements.discard('exp-sparse') |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
547 scmutil.writerequires(repo.vfs, repo.requirements) |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
548 elif 'exp-sparse' not in oldrequires: |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
549 repo.requirements.add('exp-sparse') |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
550 scmutil.writerequires(repo.vfs, repo.requirements) |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
551 |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
552 try: |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
553 writeconfig(repo, includes, excludes, profiles) |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
554 return refreshwdir(repo, oldstatus, oldmatch, force=force) |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
555 except Exception: |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
556 if repo.requirements != oldrequires: |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
557 repo.requirements.clear() |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
558 repo.requirements |= oldrequires |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
559 scmutil.writerequires(repo.vfs, repo.requirements) |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
560 writeconfig(repo, oldincludes, oldexcludes, oldprofiles) |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
561 raise |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
562 |
33354
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
563 def clearrules(repo, force=False): |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
564 """Clears include/exclude rules from the sparse config. |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
565 |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
566 The remaining sparse config only has profiles, if defined. The working |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
567 directory is refreshed, as needed. |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
568 """ |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
569 with repo.wlock(): |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
570 raw = repo.vfs.tryread('sparse') |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
571 includes, excludes, profiles = parseconfig(repo.ui, raw) |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
572 |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
573 if not includes and not excludes: |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
574 return |
4695f1829045
sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33353
diff
changeset
|
575 |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
576 _updateconfigandrefreshwdir(repo, set(), set(), profiles, force=force) |
33355
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
577 |
33371
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
578 def importfromfiles(repo, opts, paths, force=False): |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
579 """Import sparse config rules from files. |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
580 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
581 The updated sparse config is written out and the working directory |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
582 is refreshed, as needed. |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
583 """ |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
584 with repo.wlock(): |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
585 # read current configuration |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
586 raw = repo.vfs.tryread('sparse') |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
587 includes, excludes, profiles = parseconfig(repo.ui, raw) |
33371
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
588 aincludes, aexcludes, aprofiles = activeconfig(repo) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
589 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
590 # Import rules on top; only take in rules that are not yet |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
591 # part of the active rules. |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
592 changed = False |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
593 for p in paths: |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
594 with util.posixfile(util.expandpath(p)) as fh: |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
595 raw = fh.read() |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
596 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
597 iincludes, iexcludes, iprofiles = parseconfig(repo.ui, raw) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
598 oldsize = len(includes) + len(excludes) + len(profiles) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
599 includes.update(iincludes - aincludes) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
600 excludes.update(iexcludes - aexcludes) |
33550
32f348d741e5
sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
601 profiles.update(iprofiles - aprofiles) |
33371
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
602 if len(includes) + len(excludes) + len(profiles) > oldsize: |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
603 changed = True |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
604 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
605 profilecount = includecount = excludecount = 0 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
606 fcounts = (0, 0, 0) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
607 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
608 if changed: |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
609 profilecount = len(profiles - aprofiles) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
610 includecount = len(includes - aincludes) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
611 excludecount = len(excludes - aexcludes) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
612 |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
613 fcounts = map(len, _updateconfigandrefreshwdir( |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
614 repo, includes, excludes, profiles, force=force)) |
33371
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
615 |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
616 printchanges(repo.ui, opts, profilecount, includecount, excludecount, |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
617 *fcounts) |
c6415195fa78
sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33370
diff
changeset
|
618 |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
619 def updateconfig(repo, pats, opts, include=False, exclude=False, reset=False, |
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
620 delete=False, enableprofile=False, disableprofile=False, |
33685
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
621 force=False, usereporootpaths=False): |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
622 """Perform a sparse config update. |
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
623 |
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
624 Only one of the actions may be performed. |
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
625 |
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
626 The new config is written out and a working directory refresh is performed. |
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
627 """ |
33375
df6dd6d536bb
sparse: clean up updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33374
diff
changeset
|
628 with repo.wlock(): |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
629 raw = repo.vfs.tryread('sparse') |
33375
df6dd6d536bb
sparse: clean up updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33374
diff
changeset
|
630 oldinclude, oldexclude, oldprofiles = parseconfig(repo.ui, raw) |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
631 |
33376
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
632 if reset: |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
633 newinclude = set() |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
634 newexclude = set() |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
635 newprofiles = set() |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
636 else: |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
637 newinclude = set(oldinclude) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
638 newexclude = set(oldexclude) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
639 newprofiles = set(oldprofiles) |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
640 |
33683
7dcb517122f9
sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents:
33556
diff
changeset
|
641 if any(os.path.isabs(pat) for pat in pats): |
7dcb517122f9
sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents:
33556
diff
changeset
|
642 raise error.Abort(_('paths cannot be absolute')) |
7dcb517122f9
sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents:
33556
diff
changeset
|
643 |
33685
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
644 if not usereporootpaths: |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
645 # let's treat paths as relative to cwd |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
646 root, cwd = repo.root, repo.getcwd() |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
647 abspats = [] |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
648 for kindpat in pats: |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
649 kind, pat = matchmod._patsplit(kindpat, None) |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
650 if kind in matchmod.cwdrelativepatternkinds or kind is None: |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
651 ap = (kind + ':' if kind else '') +\ |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
652 pathutil.canonpath(root, cwd, pat) |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
653 abspats.append(ap) |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
654 else: |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
655 abspats.append(kindpat) |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
656 pats = abspats |
e1c56486d1aa
sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents:
33683
diff
changeset
|
657 |
33683
7dcb517122f9
sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents:
33556
diff
changeset
|
658 if include: |
33376
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
659 newinclude.update(pats) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
660 elif exclude: |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
661 newexclude.update(pats) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
662 elif enableprofile: |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
663 newprofiles.update(pats) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
664 elif disableprofile: |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
665 newprofiles.difference_update(pats) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
666 elif delete: |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
667 newinclude.difference_update(pats) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
668 newexclude.difference_update(pats) |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
669 |
33376
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
670 profilecount = (len(newprofiles - oldprofiles) - |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
671 len(oldprofiles - newprofiles)) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
672 includecount = (len(newinclude - oldinclude) - |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
673 len(oldinclude - newinclude)) |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
674 excludecount = (len(newexclude - oldexclude) - |
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
675 len(oldexclude - newexclude)) |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
676 |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
677 fcounts = map(len, _updateconfigandrefreshwdir( |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
678 repo, newinclude, newexclude, newprofiles, force=force, |
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33555
diff
changeset
|
679 removing=reset)) |
33376
d5a38eae67e5
sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33375
diff
changeset
|
680 |
33555
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
681 printchanges(repo.ui, opts, profilecount, includecount, |
6755b719048c
sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33551
diff
changeset
|
682 excludecount, *fcounts) |
33374
4dc04cdf2520
sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33371
diff
changeset
|
683 |
33355
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
684 def printchanges(ui, opts, profilecount=0, includecount=0, excludecount=0, |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
685 added=0, dropped=0, conflicting=0): |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
686 """Print output summarizing sparse config changes.""" |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
687 with ui.formatter('sparse', opts) as fm: |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
688 fm.startitem() |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
689 fm.condwrite(ui.verbose, 'profiles_added', _('Profiles changed: %d\n'), |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
690 profilecount) |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
691 fm.condwrite(ui.verbose, 'include_rules_added', |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
692 _('Include rules changed: %d\n'), includecount) |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
693 fm.condwrite(ui.verbose, 'exclude_rules_added', |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
694 _('Exclude rules changed: %d\n'), excludecount) |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
695 |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
696 # In 'plain' verbose mode, mergemod.applyupdates already outputs what |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
697 # files are added or removed outside of the templating formatter |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
698 # framework. No point in repeating ourselves in that case. |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
699 if not fm.isplain(): |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
700 fm.condwrite(ui.verbose, 'files_added', _('Files added: %d\n'), |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
701 added) |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
702 fm.condwrite(ui.verbose, 'files_dropped', _('Files dropped: %d\n'), |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
703 dropped) |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
704 fm.condwrite(ui.verbose, 'files_conflicting', |
9087f9997f42
sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33354
diff
changeset
|
705 _('Files conflicting: %d\n'), conflicting) |