Mercurial > hg
annotate mercurial/dirstate.py @ 12761:11c3c77da62a
discovery: use set instead of dict
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Sun, 17 Oct 2010 19:25:35 +0200 |
parents | 4cdaf1adafc8 |
children | e255a5dc29e6 |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # dirstate.py - working directory tracking for mercurial |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 |
6211
f89fd07fc51d
Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents:
6201
diff
changeset
|
8 from node import nullid |
3891 | 9 from i18n import _ |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8310
diff
changeset
|
10 import util, ignore, osutil, parsers |
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8310
diff
changeset
|
11 import struct, os, stat, errno |
9678
e2b1de5fee04
remove unused imports
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9610
diff
changeset
|
12 import cStringIO |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
13 |
4610 | 14 _format = ">cllll" |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
15 propertycache = util.propertycache |
4610 | 16 |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
17 def _finddirs(path): |
7032
7dfac37cfabf
dirstate: improve performance for building _dirs
Matt Mackall <mpm@selenic.com>
parents:
7023
diff
changeset
|
18 pos = path.rfind('/') |
7dfac37cfabf
dirstate: improve performance for building _dirs
Matt Mackall <mpm@selenic.com>
parents:
7023
diff
changeset
|
19 while pos != -1: |
7dfac37cfabf
dirstate: improve performance for building _dirs
Matt Mackall <mpm@selenic.com>
parents:
7023
diff
changeset
|
20 yield path[:pos] |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
21 pos = path.rfind('/', 0, pos) |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
22 |
7096
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
23 def _incdirs(dirs, path): |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
24 for base in _finddirs(path): |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
25 if base in dirs: |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
26 dirs[base] += 1 |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
27 return |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
28 dirs[base] = 1 |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
29 |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
30 def _decdirs(dirs, path): |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
31 for base in _finddirs(path): |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
32 if dirs[base] > 1: |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
33 dirs[base] -= 1 |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
34 return |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
35 del dirs[base] |
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
36 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1541
diff
changeset
|
37 class dirstate(object): |
2393
5083cba2a777
dirstate: refactor the dirstate binary format, remove magic numbers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2063
diff
changeset
|
38 |
244 | 39 def __init__(self, opener, ui, root): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
40 '''Create a new dirstate object. |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
41 |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
42 opener is an open()-like callable that can be used to open the |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
43 dirstate file; root is the root of the directory tracked by |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
44 the dirstate. |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
45 ''' |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
46 self._opener = opener |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
47 self._root = root |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
48 self._rootdir = os.path.join(root, '') |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
49 self._dirty = False |
4965 | 50 self._dirtypl = False |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
51 self._ui = ui |
723 | 52 |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
53 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
54 def _map(self): |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
55 '''Return the dirstate contents as a map from filename to |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
56 (state, mode, size, time).''' |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
57 self._read() |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
58 return self._map |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
59 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
60 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
61 def _copymap(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
62 self._read() |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
63 return self._copymap |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
64 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
65 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
66 def _foldmap(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
67 f = {} |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
68 for name in self._map: |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
69 f[os.path.normcase(name)] = name |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
70 return f |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
71 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
72 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
73 def _branch(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
74 try: |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
75 return self._opener("branch").read().strip() or "default" |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
76 except IOError: |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
77 return "default" |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
78 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
79 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
80 def _pl(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
81 try: |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
82 st = self._opener("dirstate").read(40) |
8716
f3322bb29a0e
dirstate: don't complain about 0-length files
Matt Mackall <mpm@selenic.com>
parents:
8708
diff
changeset
|
83 l = len(st) |
f3322bb29a0e
dirstate: don't complain about 0-length files
Matt Mackall <mpm@selenic.com>
parents:
8708
diff
changeset
|
84 if l == 40: |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
85 return st[:20], st[20:40] |
8716
f3322bb29a0e
dirstate: don't complain about 0-length files
Matt Mackall <mpm@selenic.com>
parents:
8708
diff
changeset
|
86 elif l > 0 and l < 40: |
8640
8536119f2f94
dirstate: notice truncated parents read
Matt Mackall <mpm@selenic.com>
parents:
8589
diff
changeset
|
87 raise util.Abort(_('working directory state appears damaged!')) |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
88 except IOError, err: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
89 if err.errno != errno.ENOENT: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
90 raise |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
91 return [nullid, nullid] |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
92 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
93 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
94 def _dirs(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
95 dirs = {} |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
96 for f, s in self._map.iteritems(): |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
97 if s[0] != 'r': |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
98 _incdirs(dirs, f) |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
99 return dirs |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
100 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
101 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
102 def _ignore(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
103 files = [self._join('.hgignore')] |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
104 for name, path in self._ui.configitems("ui"): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
105 if name == 'ignore' or name.startswith('ignore.'): |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9518
diff
changeset
|
106 files.append(util.expandpath(path)) |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
107 return ignore.ignore(self._root, files, self._ui.warn) |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
108 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
109 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
110 def _slash(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
111 return self._ui.configbool('ui', 'slash') and os.sep != '/' |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
112 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
113 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
114 def _checklink(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
115 return util.checklink(self._root) |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
116 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
117 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
118 def _checkexec(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
119 return util.checkexec(self._root) |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
120 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
121 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
122 def _checkcase(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
123 return not util.checkcase(self._join('.hg')) |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
124 |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
125 def _join(self, f): |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
126 # much faster than os.path.join() |
6973
8c136043867b
dirstate: explain why appending instead of os.path.join() is safe
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6972
diff
changeset
|
127 # it's safe because f is always a relative path |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
128 return self._rootdir + f |
723 | 129 |
6743 | 130 def flagfunc(self, fallback): |
131 if self._checklink: | |
132 if self._checkexec: | |
133 def f(x): | |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
134 p = self._join(x) |
6743 | 135 if os.path.islink(p): |
136 return 'l' | |
137 if util.is_exec(p): | |
138 return 'x' | |
139 return '' | |
140 return f | |
141 def f(x): | |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
142 if os.path.islink(self._join(x)): |
6743 | 143 return 'l' |
144 if 'x' in fallback(x): | |
145 return 'x' | |
146 return '' | |
147 return f | |
148 if self._checkexec: | |
149 def f(x): | |
150 if 'l' in fallback(x): | |
151 return 'l' | |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
152 if util.is_exec(self._join(x)): |
6743 | 153 return 'x' |
154 return '' | |
155 return f | |
156 return fallback | |
157 | |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
158 def getcwd(self): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
159 cwd = os.getcwd() |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
160 if cwd == self._root: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
161 return '' |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
162 # self._root ends with a path separator if self._root is '/' or 'C:\' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
163 rootsep = self._root |
5843
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5842
diff
changeset
|
164 if not util.endswithsep(rootsep): |
4230
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
165 rootsep += os.sep |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
166 if cwd.startswith(rootsep): |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
167 return cwd[len(rootsep):] |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
168 else: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
169 # we're outside the repo. return an absolute path. |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
170 return cwd |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
171 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
172 def pathto(self, f, cwd=None): |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
173 if cwd is None: |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
174 cwd = self.getcwd() |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
175 path = util.pathto(self._root, cwd, f) |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
176 if self._slash: |
5842
111ed8c871bf
Use util.normpath() instead of direct path string operation.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5516
diff
changeset
|
177 return util.normpath(path) |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
178 return path |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
179 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
180 def __getitem__(self, key): |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
181 '''Return the current state of key (a filename) in the dirstate. |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
182 |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
183 States are: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
184 n normal |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
185 m needs merging |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
186 r marked for removal |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
187 a marked for addition |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
188 ? not tracked |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
189 ''' |
4906
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
190 return self._map.get(key, ("?",))[0] |
220 | 191 |
192 def __contains__(self, key): | |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
193 return key in self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
194 |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
195 def __iter__(self): |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8151
diff
changeset
|
196 for x in sorted(self._map): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
197 yield x |
220 | 198 |
227 | 199 def parents(self): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
200 return self._pl |
227 | 201 |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
202 def branch(self): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
203 return self._branch |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
204 |
1062 | 205 def setparents(self, p1, p2=nullid): |
4965 | 206 self._dirty = self._dirtypl = True |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
207 self._pl = p1, p2 |
227 | 208 |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
209 def setbranch(self, branch): |
10417
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
210 if branch in ['tip', '.', 'null']: |
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
211 raise util.Abort(_('the name \'%s\' is reserved') % branch) |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
212 self._branch = branch |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
213 self._opener("branch", "w").write(branch + '\n') |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
214 |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
215 def _read(self): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
216 self._map = {} |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
217 self._copymap = {} |
4607
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
218 try: |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
219 st = self._opener("dirstate").read() |
4607
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
220 except IOError, err: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
221 if err.errno != errno.ENOENT: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
222 raise |
4607
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
223 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
224 if not st: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
225 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
226 |
7128
2b8a2248312a
get rid of semi-colon introduced in 16bafcebd3d1
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7119
diff
changeset
|
227 p = parsers.parse_dirstate(self._map, self._copymap, st) |
4952
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
228 if not self._dirtypl: |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
229 self._pl = p |
363 | 230 |
4613
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
231 def invalidate(self): |
6677
9865e15febd0
Add a normalize() method to dirstate
Paul Moore <p.f.moore@gmail.com>
parents:
6675
diff
changeset
|
232 for a in "_map _copymap _foldmap _branch _pl _dirs _ignore".split(): |
4953
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4952
diff
changeset
|
233 if a in self.__dict__: |
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4952
diff
changeset
|
234 delattr(self, a) |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
235 self._dirty = False |
4375
109077e7048d
When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4374
diff
changeset
|
236 |
363 | 237 def copy(self, source, dest): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
238 """Mark dest as a copy of source. Unmark dest if source is None.""" |
6680
deda205a00e1
Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6479
diff
changeset
|
239 if source == dest: |
deda205a00e1
Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6479
diff
changeset
|
240 return |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
241 self._dirty = True |
7566
5f7e3f17aece
mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents:
7280
diff
changeset
|
242 if source is not None: |
5f7e3f17aece
mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents:
7280
diff
changeset
|
243 self._copymap[dest] = source |
5f7e3f17aece
mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents:
7280
diff
changeset
|
244 elif dest in self._copymap: |
5f7e3f17aece
mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents:
7280
diff
changeset
|
245 del self._copymap[dest] |
363 | 246 |
247 def copied(self, file): | |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
248 return self._copymap.get(file, None) |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
249 |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
250 def copies(self): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
251 return self._copymap |
515 | 252 |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
253 def _droppath(self, f): |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
254 if self[f] not in "?r" and "_dirs" in self.__dict__: |
7096
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
255 _decdirs(self._dirs, f) |
2953 | 256 |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
257 def _addpath(self, f, check=False): |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
258 oldstate = self[f] |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
259 if check or oldstate == "r": |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
260 if '\r' in f or '\n' in f: |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
261 raise util.Abort( |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
262 _("'\\n' and '\\r' disallowed in filenames: %r") % f) |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
263 if f in self._dirs: |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
264 raise util.Abort(_('directory %r already in dirstate') % f) |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
265 # shadows |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
266 for d in _finddirs(f): |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
267 if d in self._dirs: |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
268 break |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
269 if d in self._map and self[d] != 'r': |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
270 raise util.Abort( |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
271 _('file %r in dirstate clashes with %r') % (d, f)) |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
272 if oldstate in "?r" and "_dirs" in self.__dict__: |
7096
6dab29f6df37
dirstate._dirs: fix refcounting broken by 7dfac37cfabf
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7093
diff
changeset
|
273 _incdirs(self._dirs, f) |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
274 |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
275 def normal(self, f): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
276 '''Mark a file normal and clean.''' |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
277 self._dirty = True |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
278 self._addpath(f) |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
279 s = os.lstat(self._join(f)) |
7119
50f4e866d693
dirstate: always add times to map as integers
Matt Mackall <mpm@selenic.com>
parents:
7118
diff
changeset
|
280 self._map[f] = ('n', s.st_mode, s.st_size, int(s.st_mtime)) |
5915
d0576d065993
Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents:
5843
diff
changeset
|
281 if f in self._copymap: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
282 del self._copymap[f] |
220 | 283 |
5210
90d9ec0dc69d
merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5123
diff
changeset
|
284 def normallookup(self, f): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
285 '''Mark a file normal, but possibly dirty.''' |
6298
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
286 if self._pl[1] != nullid and f in self._map: |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
287 # if there is a merge going on and the file was either |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
288 # in state 'm' (-1) or coming from other parent (-2) before |
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
289 # being removed, restore that state. |
6298
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
290 entry = self._map[f] |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
291 if entry[0] == 'r' and entry[2] in (-1, -2): |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
292 source = self._copymap.get(f) |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
293 if entry[2] == -1: |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
294 self.merge(f) |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
295 elif entry[2] == -2: |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
296 self.otherparent(f) |
6298
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
297 if source: |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
298 self.copy(source, f) |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
299 return |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
300 if entry[0] == 'm' or entry[0] == 'n' and entry[2] == -2: |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
301 return |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
302 self._dirty = True |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
303 self._addpath(f) |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
304 self._map[f] = ('n', 0, -1, -1) |
5210
90d9ec0dc69d
merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5123
diff
changeset
|
305 if f in self._copymap: |
90d9ec0dc69d
merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5123
diff
changeset
|
306 del self._copymap[f] |
90d9ec0dc69d
merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5123
diff
changeset
|
307 |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
308 def otherparent(self, f): |
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
309 '''Mark as coming from the other parent, always dirty.''' |
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
310 if self._pl[1] == nullid: |
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
311 raise util.Abort(_("setting %r to other parent " |
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
312 "only allowed in merges") % f) |
5210
90d9ec0dc69d
merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5123
diff
changeset
|
313 self._dirty = True |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
314 self._addpath(f) |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
315 self._map[f] = ('n', 0, -2, -1) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
316 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
317 del self._copymap[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
318 |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
319 def add(self, f): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
320 '''Mark a file added.''' |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
321 self._dirty = True |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
322 self._addpath(f, True) |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
323 self._map[f] = ('a', 0, -1, -1) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
324 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
325 del self._copymap[f] |
4616
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
326 |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
327 def remove(self, f): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
328 '''Mark a file removed.''' |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
329 self._dirty = True |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
330 self._droppath(f) |
6297
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
331 size = 0 |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
332 if self._pl[1] != nullid and f in self._map: |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
333 # backup the previous state |
6297
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
334 entry = self._map[f] |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
335 if entry[0] == 'm': # merge |
6297
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
336 size = -1 |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
337 elif entry[0] == 'n' and entry[2] == -2: # other parent |
6297
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
338 size = -2 |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
339 self._map[f] = ('r', 0, size, 0) |
6297
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
340 if size == 0 and f in self._copymap: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
341 del self._copymap[f] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
342 |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
343 def merge(self, f): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
344 '''Mark a file merged.''' |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
345 self._dirty = True |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
346 s = os.lstat(self._join(f)) |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
347 self._addpath(f) |
7119
50f4e866d693
dirstate: always add times to map as integers
Matt Mackall <mpm@selenic.com>
parents:
7118
diff
changeset
|
348 self._map[f] = ('m', s.st_mode, s.st_size, int(s.st_mtime)) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
349 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
350 del self._copymap[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
351 |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
352 def forget(self, f): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
353 '''Forget a file.''' |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
354 self._dirty = True |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
355 try: |
6807
6d68edc3217f
dirstate: fix _droppath() typo from 80605a8127e0
Patrick Mezard <pmezard@gmail.com>
parents:
6767
diff
changeset
|
356 self._droppath(f) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
357 del self._map[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
358 except KeyError: |
6057
218d5b9aa466
Remove trailing ! from two error messages as this was confusing.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6048
diff
changeset
|
359 self._ui.warn(_("not in dirstate: %s\n") % f) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
360 |
8732
3507f6c7715c
dirstate: eliminate reference cycle from normalize
Matt Mackall <mpm@selenic.com>
parents:
8716
diff
changeset
|
361 def _normalize(self, path, knownpath): |
7069
852f39691a0a
Eliminate normpath from foldmap calls.
Petr Kodl <petrkodl@gmail.com>
parents:
7068
diff
changeset
|
362 norm_path = os.path.normcase(path) |
7068
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
363 fold_path = self._foldmap.get(norm_path, None) |
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
364 if fold_path is None: |
12344
b6173aee4a47
Use lexists() instead of exists() where appropriate
Patrick Mezard <pmezard@gmail.com>
parents:
11769
diff
changeset
|
365 if knownpath or not os.path.lexists(os.path.join(self._root, path)): |
7068
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
366 fold_path = path |
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
367 else: |
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
368 fold_path = self._foldmap.setdefault(norm_path, |
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
369 util.fspath(path, self._root)) |
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
370 return fold_path |
6677
9865e15febd0
Add a normalize() method to dirstate
Paul Moore <p.f.moore@gmail.com>
parents:
6675
diff
changeset
|
371 |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
372 def clear(self): |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
373 self._map = {} |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
374 if "_dirs" in self.__dict__: |
10394
4612cded5176
fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
375 delattr(self, "_dirs") |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
376 self._copymap = {} |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
377 self._pl = [nullid, nullid] |
5123 | 378 self._dirty = True |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
379 |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
380 def rebuild(self, parent, files): |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
381 self.clear() |
2832
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
382 for f in files: |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6749
diff
changeset
|
383 if 'x' in files.flags(f): |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
384 self._map[f] = ('n', 0777, -1, 0) |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
385 else: |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
386 self._map[f] = ('n', 0666, -1, 0) |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
387 self._pl = (parent, nullid) |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
388 self._dirty = True |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
389 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
390 def write(self): |
4612
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
391 if not self._dirty: |
1794
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
392 return |
6326
af3f26b6bba4
dirstate: ignore stat data for files that were updated too recently
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6298
diff
changeset
|
393 st = self._opener("dirstate", "w", atomictemp=True) |
6327
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
394 |
9509
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
395 # use the modification time of the newly created temporary file as the |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
396 # filesystem's notion of 'now' |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
397 now = int(util.fstat(st).st_mtime) |
10865
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
398 |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
399 cs = cStringIO.StringIO() |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
400 copymap = self._copymap |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
401 pack = struct.pack |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
402 write = cs.write |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
403 write("".join(self._pl)) |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
404 for f, e in self._map.iteritems(): |
9509
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
405 if e[0] == 'n' and e[3] == now: |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
406 # The file was last modified "simultaneously" with the current |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
407 # write to dirstate (i.e. within the same second for file- |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
408 # systems with a granularity of 1 sec). This commonly happens |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
409 # for at least a couple of files on 'update'. |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
410 # The user could change the file without changing its size |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
411 # within the same second. Invalidate the file's stat data in |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
412 # dirstate, forcing future 'status' calls to compare the |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
413 # contents of the file. This prevents mistakenly treating such |
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
414 # files as clean. |
10865
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
415 e = (e[0], 0, -1, -1) # mark entry as 'unset' |
3492f443f579
dirstate: no need to iterate twice, a dict can be updated in place
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10836
diff
changeset
|
416 self._map[f] = e |
9509
e4ca8c258d9b
dirstate: kill dirstate.granularity config option
Adrian Buehlmann <adrian@cadifra.com>
parents:
9379
diff
changeset
|
417 |
10836
e5aaa4543289
dirstate: fix in memory dirstate entries for 1-second race
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10420
diff
changeset
|
418 if f in copymap: |
e5aaa4543289
dirstate: fix in memory dirstate entries for 1-second race
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10420
diff
changeset
|
419 f = "%s\0%s" % (f, copymap[f]) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
420 e = pack(_format, e[0], e[1], e[2], e[3], len(f)) |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
421 write(e) |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
422 write(f) |
4374
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4373
diff
changeset
|
423 st.write(cs.getvalue()) |
4507
289ec1f36b11
Use atomictemp files to write the dirstate.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4446
diff
changeset
|
424 st.rename() |
4965 | 425 self._dirty = self._dirtypl = False |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
426 |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
427 def _dirignore(self, f): |
6479
31abcae33b4f
dirstate: do not ignore current directory '.' (issue 1078)
Patrick Mezard <pmezard@gmail.com>
parents:
6327
diff
changeset
|
428 if f == '.': |
31abcae33b4f
dirstate: do not ignore current directory '.' (issue 1078)
Patrick Mezard <pmezard@gmail.com>
parents:
6327
diff
changeset
|
429 return False |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
430 if self._ignore(f): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
431 return True |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
432 for p in _finddirs(f): |
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
433 if self._ignore(p): |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
434 return True |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
435 return False |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
436 |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
437 def walk(self, match, subrepos, unknown, ignored): |
3529 | 438 ''' |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
439 Walk recursively through the directory tree, finding all files |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
440 matched by match. |
3529 | 441 |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
442 Return a dict mapping filename to stat-like object (either |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
443 mercurial.osutil.stat instance or return value of os.stat()). |
3529 | 444 ''' |
879 | 445 |
6578
f242d3684f83
walk: begin refactoring badmatch handling
Matt Mackall <mpm@selenic.com>
parents:
6577
diff
changeset
|
446 def fwarn(f, msg): |
7023
74be9d0c665c
dirstate: use the right variable (f, not ff)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7008
diff
changeset
|
447 self._ui.warn('%s: %s\n' % (self.pathto(f), msg)) |
6578
f242d3684f83
walk: begin refactoring badmatch handling
Matt Mackall <mpm@selenic.com>
parents:
6577
diff
changeset
|
448 return False |
f242d3684f83
walk: begin refactoring badmatch handling
Matt Mackall <mpm@selenic.com>
parents:
6577
diff
changeset
|
449 |
8681
26f133267cd7
walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
450 def badtype(mode): |
8310
8417d82d3969
dirstate: translate forgotten string
Simon Heimberg <simohe@besonet.ch>
parents:
8261
diff
changeset
|
451 kind = _('unknown') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
452 if stat.S_ISCHR(mode): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
453 kind = _('character device') |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
454 elif stat.S_ISBLK(mode): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
455 kind = _('block device') |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
456 elif stat.S_ISFIFO(mode): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
457 kind = _('fifo') |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
458 elif stat.S_ISSOCK(mode): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
459 kind = _('socket') |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
460 elif stat.S_ISDIR(mode): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
461 kind = _('directory') |
8681
26f133267cd7
walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
462 return _('unsupported file type (type is %s)') % kind |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
463 |
4609
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4608
diff
changeset
|
464 ignore = self._ignore |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
465 dirignore = self._dirignore |
4193
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
466 if ignored: |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
467 ignore = util.never |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
468 dirignore = util.never |
6971
b3bc518a73c3
performance: do not stat() things when not required
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6834
diff
changeset
|
469 elif not unknown: |
b3bc518a73c3
performance: do not stat() things when not required
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6834
diff
changeset
|
470 # if unknown and ignored are False, skip step 2 |
b3bc518a73c3
performance: do not stat() things when not required
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6834
diff
changeset
|
471 ignore = util.always |
b3bc518a73c3
performance: do not stat() things when not required
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6834
diff
changeset
|
472 dirignore = util.always |
3534
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3532
diff
changeset
|
473 |
6834
cbdfd08eabc9
dirstate.walk: speed up calling match function
Matt Mackall <mpm@selenic.com>
parents:
6833
diff
changeset
|
474 matchfn = match.matchfn |
8676
acd69fc201a5
walk: we always have a badfn
Matt Mackall <mpm@selenic.com>
parents:
8675
diff
changeset
|
475 badfn = match.bad |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
476 dmap = self._map |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
477 normpath = util.normpath |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5327
diff
changeset
|
478 listdir = osutil.listdir |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
479 lstat = os.lstat |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
480 getkind = stat.S_IFMT |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
481 dirkind = stat.S_IFDIR |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
482 regkind = stat.S_IFREG |
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
483 lnkkind = stat.S_IFLNK |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
484 join = self._join |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
485 work = [] |
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
486 wadd = work.append |
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
487 |
8732
3507f6c7715c
dirstate: eliminate reference cycle from normalize
Matt Mackall <mpm@selenic.com>
parents:
8716
diff
changeset
|
488 if self._checkcase: |
3507f6c7715c
dirstate: eliminate reference cycle from normalize
Matt Mackall <mpm@selenic.com>
parents:
8716
diff
changeset
|
489 normalize = self._normalize |
3507f6c7715c
dirstate: eliminate reference cycle from normalize
Matt Mackall <mpm@selenic.com>
parents:
8716
diff
changeset
|
490 else: |
3507f6c7715c
dirstate: eliminate reference cycle from normalize
Matt Mackall <mpm@selenic.com>
parents:
8716
diff
changeset
|
491 normalize = lambda x, y: x |
3507f6c7715c
dirstate: eliminate reference cycle from normalize
Matt Mackall <mpm@selenic.com>
parents:
8716
diff
changeset
|
492 |
8684
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
493 exact = skipstep3 = False |
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
494 if matchfn == match.exact: # match.exact |
8683 | 495 exact = True |
8684
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
496 dirignore = util.always # skip step 2 |
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
497 elif match.files() and not match.anypats(): # match.match, no patterns |
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
498 skipstep3 = True |
8589
3edf133dcb5a
dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg <simohe@besonet.ch>
parents:
8588
diff
changeset
|
499 |
12211
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
500 files = sorted(match.files()) |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
501 subrepos.sort() |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
502 i, j = 0, 0 |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
503 while i < len(files) and j < len(subrepos): |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
504 subpath = subrepos[j] + "/" |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
505 if not files[i].startswith(subpath): |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
506 i += 1 |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
507 continue |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
508 while files and files[i].startswith(subpath): |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
509 del files[i] |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
510 j += 1 |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
511 |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
512 if not files or '.' in files: |
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
513 files = [''] |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
514 results = dict.fromkeys(subrepos) |
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
515 results['.hg'] = None |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
516 |
6826
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
517 # step 1: find all explicit files |
12211
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
518 for ff in files: |
8804
820723a4bd17
dirstate: fix typo introduced by 3507f6c7715c
Patrick Mezard <pmezard@gmail.com>
parents:
8732
diff
changeset
|
519 nf = normalize(normpath(ff), False) |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
520 if nf in results: |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
521 continue |
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
522 |
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
523 try: |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
524 st = lstat(join(nf)) |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
525 kind = getkind(st.st_mode) |
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
526 if kind == dirkind: |
8684
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
527 skipstep3 = False |
8588
2624f485b9bc
dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents:
8521
diff
changeset
|
528 if nf in dmap: |
8645
27638a233577
dirstate: fixed typo in comment
Martin Geisler <mg@lazybytes.net>
parents:
8640
diff
changeset
|
529 #file deleted on disk but still in dirstate |
8588
2624f485b9bc
dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents:
8521
diff
changeset
|
530 results[nf] = None |
8708
a645904c88c4
dirstate: more accurate use of match.dir callback
Matt Mackall <mpm@selenic.com>
parents:
8684
diff
changeset
|
531 match.dir(nf) |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
532 if not dirignore(nf): |
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
533 wadd(nf) |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
534 elif kind == regkind or kind == lnkkind: |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
535 results[nf] = st |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
536 else: |
8681
26f133267cd7
walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
537 badfn(ff, badtype(kind)) |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
538 if nf in dmap: |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
539 results[nf] = None |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
540 except OSError, inst: |
8675
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
541 if nf in dmap: # does it exactly match a file? |
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
542 results[nf] = None |
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
543 else: # does it match a directory? |
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
544 prefix = nf + "/" |
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
545 for fn in dmap: |
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
546 if fn.startswith(prefix): |
8708
a645904c88c4
dirstate: more accurate use of match.dir callback
Matt Mackall <mpm@selenic.com>
parents:
8684
diff
changeset
|
547 match.dir(nf) |
8684
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
548 skipstep3 = False |
8675
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
549 break |
8677
34df078b8b1b
walk: simplify logic for badfn clause
Matt Mackall <mpm@selenic.com>
parents:
8676
diff
changeset
|
550 else: |
8680
b6511055d37b
match: ignore return of match.bad
Matt Mackall <mpm@selenic.com>
parents:
8677
diff
changeset
|
551 badfn(ff, inst.strerror) |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
552 |
6826
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
553 # step 2: visit subdirectories |
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
554 while work: |
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
555 nd = work.pop() |
7099
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
556 skip = None |
6826
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
557 if nd == '.': |
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
558 nd = '' |
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
559 else: |
7099
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
560 skip = '.hg' |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
561 try: |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
562 entries = listdir(join(nd), stat=True, skip=skip) |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
563 except OSError, inst: |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
564 if inst.errno == errno.EACCES: |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
565 fwarn(nd, inst.strerror) |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
566 continue |
6f750e76fb46
dirstate.walk: skip unreadable directories (issue1213)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7096
diff
changeset
|
567 raise |
6826
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
568 for f, kind, st in entries: |
7068
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
569 nf = normalize(nd and (nd + "/" + f) or f, True) |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
570 if nf not in results: |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
571 if kind == dirkind: |
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
572 if not ignore(nf): |
8708
a645904c88c4
dirstate: more accurate use of match.dir callback
Matt Mackall <mpm@selenic.com>
parents:
8684
diff
changeset
|
573 match.dir(nf) |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
574 wadd(nf) |
6834
cbdfd08eabc9
dirstate.walk: speed up calling match function
Matt Mackall <mpm@selenic.com>
parents:
6833
diff
changeset
|
575 if nf in dmap and matchfn(nf): |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
576 results[nf] = None |
6832
643ff33812f8
dirstate.walk: inline imatch
Matt Mackall <mpm@selenic.com>
parents:
6831
diff
changeset
|
577 elif kind == regkind or kind == lnkkind: |
643ff33812f8
dirstate.walk: inline imatch
Matt Mackall <mpm@selenic.com>
parents:
6831
diff
changeset
|
578 if nf in dmap: |
6834
cbdfd08eabc9
dirstate.walk: speed up calling match function
Matt Mackall <mpm@selenic.com>
parents:
6833
diff
changeset
|
579 if matchfn(nf): |
6832
643ff33812f8
dirstate.walk: inline imatch
Matt Mackall <mpm@selenic.com>
parents:
6831
diff
changeset
|
580 results[nf] = st |
6834
cbdfd08eabc9
dirstate.walk: speed up calling match function
Matt Mackall <mpm@selenic.com>
parents:
6833
diff
changeset
|
581 elif matchfn(nf) and not ignore(nf): |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
582 results[nf] = st |
6834
cbdfd08eabc9
dirstate.walk: speed up calling match function
Matt Mackall <mpm@selenic.com>
parents:
6833
diff
changeset
|
583 elif nf in dmap and matchfn(nf): |
6832
643ff33812f8
dirstate.walk: inline imatch
Matt Mackall <mpm@selenic.com>
parents:
6831
diff
changeset
|
584 results[nf] = None |
536 | 585 |
6826
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
586 # step 3: report unseen items in the dmap hash |
8684
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
587 if not skipstep3 and not exact: |
8589
3edf133dcb5a
dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg <simohe@besonet.ch>
parents:
8588
diff
changeset
|
588 visit = sorted([f for f in dmap if f not in results and matchfn(f)]) |
3edf133dcb5a
dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg <simohe@besonet.ch>
parents:
8588
diff
changeset
|
589 for nf, st in zip(visit, util.statfiles([join(i) for i in visit])): |
3edf133dcb5a
dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg <simohe@besonet.ch>
parents:
8588
diff
changeset
|
590 if not st is None and not getkind(st.st_mode) in (regkind, lnkkind): |
3edf133dcb5a
dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg <simohe@besonet.ch>
parents:
8588
diff
changeset
|
591 st = None |
3edf133dcb5a
dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg <simohe@besonet.ch>
parents:
8588
diff
changeset
|
592 results[nf] = st |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
593 for s in subrepos: |
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
594 del results[s] |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
595 del results['.hg'] |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
596 return results |
669
8aa2a282eda4
.hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents:
667
diff
changeset
|
597 |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
598 def status(self, match, subrepos, ignored, clean, unknown): |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
599 '''Determine the status of the working copy relative to the |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
600 dirstate and return a tuple of lists (unsure, modified, added, |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
601 removed, deleted, unknown, ignored, clean), where: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
602 |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
603 unsure: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
604 files that might have been modified since the dirstate was |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
605 written, but need to be read to be sure (size is the same |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
606 but mtime differs) |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
607 modified: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
608 files that have definitely been modified since the dirstate |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
609 was written (different size or mode) |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
610 added: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
611 files that have been explicitly added with hg add |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
612 removed: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
613 files that have been explicitly removed with hg remove |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
614 deleted: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
615 files that have been deleted through other means ("missing") |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
616 unknown: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
617 files not in the dirstate that are not ignored |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
618 ignored: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
619 files not in the dirstate that are ignored |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
620 (by _dirignore()) |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
621 clean: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
622 files that have definitely not been modified since the |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
623 dirstate was written |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
624 ''' |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
625 listignored, listclean, listunknown = ignored, clean, unknown |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
626 lookup, modified, added, unknown, ignored = [], [], [], [], [] |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
627 removed, deleted, clean = [], [], [] |
723 | 628 |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
629 dmap = self._map |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
630 ladd = lookup.append # aka "unsure" |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
631 madd = modified.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
632 aadd = added.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
633 uadd = unknown.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
634 iadd = ignored.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
635 radd = removed.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
636 dadd = deleted.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
637 cadd = clean.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
638 |
11769
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
639 lnkkind = stat.S_IFLNK |
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
640 |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
641 for fn, st in self.walk(match, subrepos, listunknown, |
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
642 listignored).iteritems(): |
6591
eda3fd322a7f
dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents:
6590
diff
changeset
|
643 if fn not in dmap: |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
644 if (listignored or match.exact(fn)) and self._dirignore(fn): |
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
645 if listignored: |
6033
a1ebd5cd7e55
dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6032
diff
changeset
|
646 iadd(fn) |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
647 elif listunknown: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
648 uadd(fn) |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
649 continue |
6591
eda3fd322a7f
dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents:
6590
diff
changeset
|
650 |
7093
16bafcebd3d1
dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents:
7069
diff
changeset
|
651 state, mode, size, time = dmap[fn] |
6591
eda3fd322a7f
dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents:
6590
diff
changeset
|
652 |
6818
6e93fbd847ef
dirstate.walk: eliminate src from yield
Matt Mackall <mpm@selenic.com>
parents:
6811
diff
changeset
|
653 if not st and state in "nma": |
6e93fbd847ef
dirstate.walk: eliminate src from yield
Matt Mackall <mpm@selenic.com>
parents:
6811
diff
changeset
|
654 dadd(fn) |
6e93fbd847ef
dirstate.walk: eliminate src from yield
Matt Mackall <mpm@selenic.com>
parents:
6811
diff
changeset
|
655 elif state == 'n': |
11769
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
656 # The "mode & lnkkind != lnkkind or self._checklink" |
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
657 # lines are an expansion of "islink => checklink" |
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
658 # where islink means "is this a link?" and checklink |
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
659 # means "can we check links?". |
6257
bfd49ce0db64
dirstate: ignore mode changes if the fs does not supports the exec bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6212
diff
changeset
|
660 if (size >= 0 and |
bfd49ce0db64
dirstate: ignore mode changes if the fs does not supports the exec bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6212
diff
changeset
|
661 (size != st.st_size |
bfd49ce0db64
dirstate: ignore mode changes if the fs does not supports the exec bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6212
diff
changeset
|
662 or ((mode ^ st.st_mode) & 0100 and self._checkexec)) |
11769
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
663 and (mode & lnkkind != lnkkind or self._checklink) |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10935
diff
changeset
|
664 or size == -2 # other parent |
4677
de8ec7e1753a
dirstate.status: if a file is marked as copied, consider it modified
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4657
diff
changeset
|
665 or fn in self._copymap): |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
666 madd(fn) |
11769
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
667 elif (time != int(st.st_mtime) |
ca6cebd8734e
dirstate: ignore symlinks when fs cannot handle them (issue1888)
Martin Geisler <mg@aragost.com>
parents:
10968
diff
changeset
|
668 and (mode & lnkkind != lnkkind or self._checklink)): |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
669 ladd(fn) |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
670 elif listclean: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
671 cadd(fn) |
6590
9f80e062d71c
status: rename type_ to state
Matt Mackall <mpm@selenic.com>
parents:
6589
diff
changeset
|
672 elif state == 'm': |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
673 madd(fn) |
6590
9f80e062d71c
status: rename type_ to state
Matt Mackall <mpm@selenic.com>
parents:
6589
diff
changeset
|
674 elif state == 'a': |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
675 aadd(fn) |
6590
9f80e062d71c
status: rename type_ to state
Matt Mackall <mpm@selenic.com>
parents:
6589
diff
changeset
|
676 elif state == 'r': |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
677 radd(fn) |
1183 | 678 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
679 return (lookup, modified, added, removed, deleted, unknown, ignored, |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
680 clean) |