Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/dirstate.py @ 5173:7e05bdeee7de
convert: raise Abort instead of NoRepo when CVS pserver auth fails.
At this point we know the source is CVS, so we should not go through
the rest of the converters.
author | Brendan Cully <brendan@kublai.com> |
---|---|
date | Wed, 15 Aug 2007 14:38:18 -0700 |
parents | 79373ec3f27d |
children | 90d9ec0dc69d |
rev | line source |
---|---|
1089 | 1 """ |
2 dirstate.py - working directory tracking for mercurial | |
3 | |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
4 Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
1089 | 5 |
6 This software may be used and distributed according to the terms | |
7 of the GNU General Public License, incorporated herein by reference. | |
8 """ | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
9 |
1094 | 10 from node import * |
3893 | 11 from i18n import _ |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
12 import struct, os, time, bisect, stat, strutil, util, re, errno, ignore |
4372
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
13 import cStringIO |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
14 |
4611 | 15 _unknown = ('?', 0, 0, 0) |
16 _format = ">cllll" | |
17 | |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1541
diff
changeset
|
18 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
|
19 |
244 | 20 def __init__(self, opener, ui, root): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
21 self._opener = opener |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
22 self._root = root |
4947
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
23 self._dirty = False |
4965 | 24 self._dirtypl = False |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
25 self._ui = ui |
723 | 26 |
4604
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
27 def __getattr__(self, name): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
28 if name == '_map': |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
29 self._read() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
30 return self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
31 elif name == '_copymap': |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
32 self._read() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
33 return self._copymap |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
34 elif name == '_branch': |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
35 try: |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
36 self._branch = (self._opener("branch").read().strip() |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
37 or "default") |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
38 except IOError: |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
39 self._branch = "default" |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
40 return self._branch |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
41 elif name == '_pl': |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
42 self._pl = [nullid, nullid] |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
43 try: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
44 st = self._opener("dirstate").read(40) |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
45 if len(st) == 40: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
46 self._pl = st[:20], st[20:40] |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
47 except IOError, err: |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
48 if err.errno != errno.ENOENT: raise |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
49 return self._pl |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
50 elif name == '_dirs': |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
51 self._dirs = {} |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
52 for f in self._map: |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
53 self._incpath(f) |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
54 return self._dirs |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
55 elif name == '_ignore': |
4949
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4948
diff
changeset
|
56 files = [self._join('.hgignore')] |
4621
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4617
diff
changeset
|
57 for name, path in self._ui.configitems("ui"): |
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4617
diff
changeset
|
58 if name == 'ignore' or name.startswith('ignore.'): |
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4617
diff
changeset
|
59 files.append(os.path.expanduser(path)) |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
60 self._ignore = ignore.ignore(self._root, files, self._ui.warn) |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
61 return self._ignore |
4612
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
62 elif name == '_slash': |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
63 self._slash = self._ui.configbool('ui', 'slash') and os.sep != '/' |
4612
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
64 return self._slash |
4604
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
65 else: |
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
66 raise AttributeError, name |
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
67 |
4949
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4948
diff
changeset
|
68 def _join(self, f): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
69 return os.path.join(self._root, f) |
723 | 70 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
71 def getcwd(self): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
72 cwd = os.getcwd() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
73 if cwd == self._root: return '' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
74 # self._root ends with a path separator if self._root is '/' or 'C:\' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
75 rootsep = self._root |
4230
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
76 if not rootsep.endswith(os.sep): |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 else: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
81 # 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
|
82 return cwd |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
83 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
84 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
|
85 if cwd is None: |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
86 cwd = self.getcwd() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
87 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
|
88 if self._slash: |
4612
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
89 return path.replace(os.sep, '/') |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
90 return path |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
91 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
92 def __getitem__(self, key): |
4950
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
93 ''' current states: |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
94 n normal |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
95 m needs merging |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
96 r marked for removal |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
97 a marked for addition |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
98 ? not tracked''' |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4949
diff
changeset
|
99 return self._map.get(key, ("?",))[0] |
220 | 100 |
101 def __contains__(self, key): | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
102 return key in self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
103 |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
104 def __iter__(self): |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
105 a = self._map.keys() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
106 a.sort() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
107 for x in a: |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
108 yield x |
220 | 109 |
227 | 110 def parents(self): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
111 return self._pl |
227 | 112 |
4207
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
113 def branch(self): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
114 return self._branch |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
115 |
1062 | 116 def setparents(self, p1, p2=nullid): |
4965 | 117 self._dirty = self._dirtypl = True |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
118 self._pl = p1, p2 |
227 | 119 |
4207
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
120 def setbranch(self, branch): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
121 self._branch = branch |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
122 self._opener("branch", "w").write(branch + '\n') |
4207
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
123 |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
124 def _read(self): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
125 self._map = {} |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
126 self._copymap = {} |
4934
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
127 if not self._dirtypl: |
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
128 self._pl = [nullid, nullid] |
4608
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
129 try: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
130 st = self._opener("dirstate").read() |
4608
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
131 except IOError, err: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
132 if err.errno != errno.ENOENT: raise |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
133 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
134 if not st: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
135 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
136 |
4934
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
137 if not self._dirtypl: |
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
138 self._pl = [st[:20], st[20: 40]] |
227 | 139 |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
140 # deref fields so they will be local in loop |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
141 dmap = self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
142 copymap = self._copymap |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
143 unpack = struct.unpack |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
144 |
227 | 145 pos = 40 |
4611 | 146 e_size = struct.calcsize(_format) |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
147 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
148 while pos < len(st): |
2425
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
149 newpos = pos + e_size |
4611 | 150 e = unpack(_format, st[pos:newpos]) |
220 | 151 l = e[4] |
2425
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
152 pos = newpos |
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
153 newpos = pos + l |
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
154 f = st[pos:newpos] |
515 | 155 if '\0' in f: |
363 | 156 f, c = f.split('\0') |
3156
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
157 copymap[f] = c |
4608
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
158 dmap[f] = e[:4] |
2425
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
159 pos = newpos |
363 | 160 |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
161 def invalidate(self): |
4656
4eeb91870d3b
dirstate: fix typo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4635
diff
changeset
|
162 for a in "_map _copymap _branch _pl _dirs _ignore".split(): |
4935
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4934
diff
changeset
|
163 if a in self.__dict__: |
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4934
diff
changeset
|
164 delattr(self, a) |
4947
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
165 self._dirty = False |
4373
109077e7048d
When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4372
diff
changeset
|
166 |
363 | 167 def copy(self, source, dest): |
4947
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
168 self._dirty = True |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
169 self._copymap[dest] = source |
363 | 170 |
171 def copied(self, file): | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
172 return self._copymap.get(file, None) |
3156
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
173 |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
174 def copies(self): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
175 return self._copymap |
515 | 176 |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
177 def _incpath(self, path): |
4606 | 178 for c in strutil.findall(path, '/'): |
179 pc = path[:c] | |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
180 self._dirs.setdefault(pc, 0) |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
181 self._dirs[pc] += 1 |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
182 |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
183 def _decpath(self, path): |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
184 for c in strutil.findall(path, '/'): |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
185 pc = path[:c] |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
186 self._dirs.setdefault(pc, 0) |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
187 self._dirs[pc] -= 1 |
2953 | 188 |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
189 def _incpathcheck(self, f): |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
190 if '\r' in f or '\n' in f: |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
191 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames")) |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
192 # shadows |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
193 if f in self._dirs: |
5043
8b1ee1f59b3c
dirstate: improve error message on file/directory clash
Bryan O'Sullivan <bos@serpentine.com>
parents:
5004
diff
changeset
|
194 raise util.Abort(_('directory %r already in dirstate') % f) |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
195 for c in strutil.rfindall(f, '/'): |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
196 d = f[:c] |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
197 if d in self._dirs: |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
198 break |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
199 if d in self._map: |
5043
8b1ee1f59b3c
dirstate: improve error message on file/directory clash
Bryan O'Sullivan <bos@serpentine.com>
parents:
5004
diff
changeset
|
200 raise util.Abort(_('file %r in dirstate clashes with %r') % |
8b1ee1f59b3c
dirstate: improve error message on file/directory clash
Bryan O'Sullivan <bos@serpentine.com>
parents:
5004
diff
changeset
|
201 (d, f)) |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
202 self._incpath(f) |
2953 | 203 |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
204 def normal(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
205 'mark a file normal' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
206 self._dirty = True |
4949
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4948
diff
changeset
|
207 s = os.lstat(self._join(f)) |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
208 self._map[f] = ('n', s.st_mode, s.st_size, s.st_mtime) |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
209 if self._copymap.has_key(f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
210 del self._copymap[f] |
220 | 211 |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
212 def normaldirty(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
213 'mark a file normal, but possibly dirty' |
4947
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
214 self._dirty = True |
4949
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4948
diff
changeset
|
215 s = os.lstat(self._join(f)) |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
216 self._map[f] = ('n', s.st_mode, -1, -1) |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
217 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
218 del self._copymap[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
219 |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
220 def add(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
221 'mark a file added' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
222 self._dirty = True |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
223 self._incpathcheck(f) |
4955
8b6efc8fc23c
dirstate: add doesn't need to call stat
Matt Mackall <mpm@selenic.com>
parents:
4952
diff
changeset
|
224 self._map[f] = ('a', 0, -1, -1) |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
225 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
226 del self._copymap[f] |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
227 |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
228 def remove(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
229 'mark a file removed' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
230 self._dirty = True |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
231 self._map[f] = ('r', 0, 0, 0) |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
232 self._decpath(f) |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
233 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
234 del self._copymap[f] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
235 |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
236 def merge(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
237 'mark a file merged' |
4947
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
238 self._dirty = True |
4949
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4948
diff
changeset
|
239 s = os.lstat(self._join(f)) |
4948
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
240 self._map[f] = ('m', s.st_mode, s.st_size, s.st_mtime) |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
241 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
242 del self._copymap[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
243 |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
244 def forget(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
245 'forget a file' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
246 self._dirty = True |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
247 try: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
248 del self._map[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
249 self._decpath(f) |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
250 except KeyError: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4947
diff
changeset
|
251 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
|
252 |
5080
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4935
diff
changeset
|
253 def clear(self): |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4935
diff
changeset
|
254 self._map = {} |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4935
diff
changeset
|
255 self._copymap = {} |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4935
diff
changeset
|
256 self._pl = [nullid, nullid] |
5082 | 257 self._dirty = True |
5080
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4935
diff
changeset
|
258 |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
259 def rebuild(self, parent, files): |
5080
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4935
diff
changeset
|
260 self.clear() |
2844
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
261 for f in files: |
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
262 if files.execf(f): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
263 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
|
264 else: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
265 self._map[f] = ('n', 0666, -1, 0) |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
266 self._pl = (parent, nullid) |
4947
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
267 self._dirty = True |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
268 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
269 def write(self): |
4613
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
270 if not self._dirty: |
1794
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
271 return |
4372
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
272 cs = cStringIO.StringIO() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
273 cs.write("".join(self._pl)) |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
274 for f, e in self._map.iteritems(): |
363 | 275 c = self.copied(f) |
276 if c: | |
277 f = f + "\0" + c | |
4611 | 278 e = struct.pack(_format, e[0], e[1], e[2], e[3], len(f)) |
4372
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
279 cs.write(e) |
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
280 cs.write(f) |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
281 st = self._opener("dirstate", "w", atomictemp=True) |
4372
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
282 st.write(cs.getvalue()) |
4507
289ec1f36b11
Use atomictemp files to write the dirstate.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4445
diff
changeset
|
283 st.rename() |
4965 | 284 self._dirty = self._dirtypl = False |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
285 |
4951
6a7659a0c07c
dirstate: make filterfiles private
Matt Mackall <mpm@selenic.com>
parents:
4950
diff
changeset
|
286 def _filter(self, files): |
879 | 287 ret = {} |
288 unknown = [] | |
289 | |
290 for x in files: | |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1529
diff
changeset
|
291 if x == '.': |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
292 return self._map.copy() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
293 if x not in self._map: |
879 | 294 unknown.append(x) |
295 else: | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
296 ret[x] = self._map[x] |
919 | 297 |
879 | 298 if not unknown: |
299 return ret | |
300 | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
301 b = self._map.keys() |
879 | 302 b.sort() |
303 blen = len(b) | |
304 | |
305 for x in unknown: | |
2486
3ea8111ead90
simplify filterfiles when filtering based on a directory
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2485
diff
changeset
|
306 bs = bisect.bisect(b, "%s%s" % (x, '/')) |
879 | 307 while bs < blen: |
308 s = b[bs] | |
2485
885de96eb542
filterfiles: Search as long as the target is a prefix of current.
Brendan Cully <brendan@kublai.com>
parents:
2470
diff
changeset
|
309 if len(s) > len(x) and s.startswith(x): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
310 ret[s] = self._map[s] |
879 | 311 else: |
312 break | |
313 bs += 1 | |
314 return ret | |
315 | |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
316 def _supported(self, f, mode, verbose=False): |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
317 if stat.S_ISREG(mode) or stat.S_ISLNK(mode): |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
318 return True |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
319 if verbose: |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
320 kind = 'unknown' |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
321 if stat.S_ISCHR(mode): kind = _('character device') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
322 elif stat.S_ISBLK(mode): kind = _('block device') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
323 elif stat.S_ISFIFO(mode): kind = _('fifo') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
324 elif stat.S_ISSOCK(mode): kind = _('socket') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
325 elif stat.S_ISDIR(mode): kind = _('directory') |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
326 self._ui.warn(_('%s: unsupported file type (type is %s)\n') |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
327 % (self.pathto(f), kind)) |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
328 return False |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
329 |
3560 | 330 def walk(self, files=None, match=util.always, badmatch=None): |
331 # filter out the stat | |
332 for src, f, st in self.statwalk(files, match, badmatch=badmatch): | |
333 yield src, f | |
334 | |
335 def statwalk(self, files=None, match=util.always, ignored=False, | |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
336 badmatch=None, directories=False): |
3560 | 337 ''' |
338 walk recursively through the directory tree, finding all files | |
339 matched by the match function | |
340 | |
341 results are yielded in a tuple (src, filename, st), where src | |
342 is one of: | |
343 'f' the file was found in the directory tree | |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
344 'd' the file is a directory of the tree |
3560 | 345 'm' the file was only in the dirstate and not in the tree |
3563 | 346 'b' file was not found and matched badmatch |
347 | |
3560 | 348 and st is the stat result if the file was found in the directory. |
349 ''' | |
879 | 350 |
723 | 351 # walk all files by default |
879 | 352 if not files: |
4173
b36bd7534c08
statwalk: don't put self.root in the files list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4075
diff
changeset
|
353 files = ['.'] |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
354 dc = self._map.copy() |
3560 | 355 else: |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
356 files = util.unique(files) |
4951
6a7659a0c07c
dirstate: make filterfiles private
Matt Mackall <mpm@selenic.com>
parents:
4950
diff
changeset
|
357 dc = self._filter(files) |
919 | 358 |
3560 | 359 def imatch(file_): |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
360 if file_ not in dc and self._ignore(file_): |
1183 | 361 return False |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
362 return match(file_) |
1224
cc61d366bc3b
Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents:
1183
diff
changeset
|
363 |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
364 ignore = self._ignore |
4188
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4173
diff
changeset
|
365 if ignored: |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4173
diff
changeset
|
366 imatch = match |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4173
diff
changeset
|
367 ignore = util.never |
3565
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3563
diff
changeset
|
368 |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
369 # self._root may end with a path separator when self._root == '/' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
370 common_prefix_len = len(self._root) |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
371 if not self._root.endswith(os.sep): |
2671
82864a2eb709
self.root == '/': prefix length computation out of the loop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2670
diff
changeset
|
372 common_prefix_len += 1 |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
373 |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
374 normpath = util.normpath |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
375 listdir = os.listdir |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
376 lstat = os.lstat |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
377 bisect_left = bisect.bisect_left |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
378 isdir = os.path.isdir |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
379 pconvert = util.pconvert |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
380 join = os.path.join |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
381 s_isdir = stat.S_ISDIR |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
382 supported = self._supported |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
383 _join = self._join |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
384 known = {'.hg': 1} |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
385 |
1183 | 386 # recursion free walker, faster than os.walk. |
387 def findfiles(s): | |
388 work = [s] | |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
389 wadd = work.append |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
390 found = [] |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
391 add = found.append |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
392 if directories: |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
393 add((normpath(s[common_prefix_len:]), 'd', lstat(s))) |
1183 | 394 while work: |
395 top = work.pop() | |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
396 names = listdir(top) |
1183 | 397 names.sort() |
398 # nd is the top of the repository dir tree | |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
399 nd = normpath(top[common_prefix_len:]) |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
400 if nd == '.': |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
401 nd = '' |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
402 else: |
2063
f1fda71e134e
benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2062
diff
changeset
|
403 # do not recurse into a repo contained in this |
f1fda71e134e
benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2062
diff
changeset
|
404 # one. use bisect to find .hg directory so speed |
f1fda71e134e
benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2062
diff
changeset
|
405 # is good on big directory. |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
406 hg = bisect_left(names, '.hg') |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
407 if hg < len(names) and names[hg] == '.hg': |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
408 if isdir(join(top, '.hg')): |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
409 continue |
1183 | 410 for f in names: |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
411 np = pconvert(join(nd, f)) |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
412 if np in known: |
1183 | 413 continue |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
414 known[np] = 1 |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
415 p = join(top, f) |
1228
db950da49539
Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents:
1224
diff
changeset
|
416 # don't trip over symlinks |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
417 st = lstat(p) |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
418 if s_isdir(st.st_mode): |
4254
a7cae4e22749
Pass normalized directory names to the ignore function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4188
diff
changeset
|
419 if not ignore(np): |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
420 wadd(p) |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
421 if directories: |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
422 add((np, 'd', st)) |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
423 if np in dc and match(np): |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
424 add((np, 'm', st)) |
3560 | 425 elif imatch(np): |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
426 if supported(np, st.st_mode): |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
427 add((np, 'f', st)) |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
428 elif np in dc: |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
429 add((np, 'm', st)) |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
430 found.sort() |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
431 return found |
1183 | 432 |
433 # step one, find all files that match our criteria | |
434 files.sort() | |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
435 for ff in files: |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
436 nf = normpath(ff) |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
437 f = _join(ff) |
1183 | 438 try: |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
439 st = lstat(f) |
1183 | 440 except OSError, inst: |
1564
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
441 found = False |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
442 for fn in dc: |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
443 if nf == fn or (fn.startswith(nf) and fn[len(nf)] == '/'): |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
444 found = True |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
445 break |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
446 if not found: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
447 if inst.errno != errno.ENOENT or not badmatch: |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
448 self._ui.warn('%s: %s\n' % |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
449 (self.pathto(ff), inst.strerror)) |
3565
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3563
diff
changeset
|
450 elif badmatch and badmatch(ff) and imatch(nf): |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
451 yield 'b', ff, None |
1183 | 452 continue |
5001
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
453 if s_isdir(st.st_mode): |
5003
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
454 for f, src, st in findfiles(f): |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
455 yield src, f, st |
1392
32d8068b3e36
add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1276
diff
changeset
|
456 else: |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
457 if nf in known: |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
458 continue |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
459 known[nf] = 1 |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
460 if match(nf): |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
461 if supported(ff, st.st_mode, verbose=True): |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
462 yield 'f', nf, st |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
463 elif ff in dc: |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
464 yield 'm', nf, st |
536 | 465 |
1183 | 466 # step two run through anything left in the dc hash and yield |
467 # if we haven't already seen it | |
468 ks = dc.keys() | |
469 ks.sort() | |
470 for k in ks: | |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
471 if k in known: |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
472 continue |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
473 known[k] = 1 |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
474 if imatch(k): |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
475 yield 'm', k, None |
669
8aa2a282eda4
.hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents:
667
diff
changeset
|
476 |
4952
8c294ee7047e
dirstate: get rid of default args for status
Matt Mackall <mpm@selenic.com>
parents:
4951
diff
changeset
|
477 def status(self, files, match, list_ignored, list_clean): |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
478 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
|
479 removed, deleted, clean = [], [], [] |
723 | 480 |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
481 _join = self._join |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
482 lstat = os.lstat |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
483 cmap = self._copymap |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
484 dmap = self._map |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
485 ladd = lookup.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
486 madd = modified.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
487 aadd = added.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
488 uadd = unknown.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
489 iadd = ignored.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
490 radd = removed.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
491 dadd = deleted.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
492 cadd = clean.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
493 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
494 for src, fn, st in self.statwalk(files, match, ignored=list_ignored): |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
495 if fn in dmap: |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
496 type_, mode, size, time = dmap[fn] |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
497 else: |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
498 if list_ignored and self._ignore(fn): |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
499 iadd(fn) |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
500 else: |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
501 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
|
502 continue |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
503 if src == 'm': |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
504 nonexistent = True |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
505 if not st: |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
506 try: |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
507 st = lstat(_join(fn)) |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
508 except OSError, inst: |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
509 if inst.errno != errno.ENOENT: |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
510 raise |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
511 st = None |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
512 # We need to re-check that it is a valid file |
5002
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
513 if st and self._supported(fn, st.st_mode): |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
514 nonexistent = False |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
515 # XXX: what to do with file no longer present in the fs |
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
516 # who are not removed in the dirstate ? |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
517 if nonexistent and type_ in "nm": |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
518 dadd(fn) |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
519 continue |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
520 # check the common case first |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
521 if type_ == 'n': |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
522 if not st: |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
523 st = lstat(_join(fn)) |
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
|
524 if (size >= 0 and (size != st.st_size |
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
|
525 or (mode ^ st.st_mode) & 0100) |
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
|
526 or fn in self._copymap): |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
527 madd(fn) |
2962
882e703eaa94
dirstate.py: when comparing mtimes, use only the integer part.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2953
diff
changeset
|
528 elif time != int(st.st_mtime): |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
529 ladd(fn) |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
530 elif list_clean: |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
531 cadd(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
532 elif type_ == 'm': |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
533 madd(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
534 elif type_ == 'a': |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
535 aadd(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
536 elif type_ == 'r': |
5004
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5003
diff
changeset
|
537 radd(fn) |
1183 | 538 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
539 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
|
540 clean) |