Mercurial > hg
annotate mercurial/dirstate.py @ 6858:8f256bf98219
Add support for multiple possible bisect results (issue1228, issue1182)
The real reason for both issue is that bisect can not handle cases where there
are multiple possibilities for the result.
Example (from issue1228):
rev 0 -> good
rev 1 -> skipped
rev 2 -> skipped
rev 3 -> skipped
rev 4 -> bad
Note that this patch does not only fix the reported Assertion Error but also
the problem of a non converging bisect:
hg init
for i in `seq 3`; do echo $i > $i; hg add $i; hg ci -m$i; done
hg bisect -b 2
hg bisect -g 0
hg bisect -s
From this state on, you can:
a) mark as bad forever (non converging!)
b) mark as good to get an inconsistent state
c) skip for the Assertion Error
Minor description and code edits by pmezard.
author | Bernhard Leiner <bleiner@gmail.com> |
---|---|
date | Sat, 02 Aug 2008 22:10:10 +0200 |
parents | deda205a00e1 |
children | 76021ec849c8 |
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 |
6211
f89fd07fc51d
Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents:
6201
diff
changeset
|
10 from node import nullid |
3891 | 11 from i18n import _ |
6212 | 12 import struct, os, bisect, stat, strutil, util, errno, ignore |
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
|
13 import cStringIO, osutil, sys |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
14 |
4610 | 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): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
21 self._opener = opener |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
22 self._root = root |
4903
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 |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
25 self._ui = ui |
723 | 26 |
4603
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
27 def __getattr__(self, name): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
28 if name == '_map': |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
29 self._read() |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
30 return self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
31 elif name == '_copymap': |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
32 self._read() |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
33 return self._copymap |
4604
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
34 elif name == '_branch': |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
35 try: |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4620
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:
4620
diff
changeset
|
37 or "default") |
4604
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
38 except IOError: |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
39 self._branch = "default" |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
40 return self._branch |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
41 elif name == '_pl': |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
42 self._pl = [nullid, nullid] |
4604
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
43 try: |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
44 st = self._opener("dirstate").read(40) |
4604
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
45 if len(st) == 40: |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
46 self._pl = st[:20], st[20:40] |
4604
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
47 except IOError, err: |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4603
diff
changeset
|
48 if err.errno != errno.ENOENT: raise |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
49 return self._pl |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
50 elif name == '_dirs': |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
51 self._dirs = {} |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
52 for f in self._map: |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
53 if self[f] != 'r': |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
54 self._incpath(f) |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
55 return self._dirs |
4609
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4608
diff
changeset
|
56 elif name == '_ignore': |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
57 files = [self._join('.hgignore')] |
4620
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
58 for name, path in self._ui.configitems("ui"): |
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
59 if name == 'ignore' or name.startswith('ignore.'): |
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
60 files.append(os.path.expanduser(path)) |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
61 self._ignore = ignore.ignore(self._root, files, self._ui.warn) |
4609
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4608
diff
changeset
|
62 return self._ignore |
4611
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4610
diff
changeset
|
63 elif name == '_slash': |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
64 self._slash = self._ui.configbool('ui', 'slash') and os.sep != '/' |
4611
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4610
diff
changeset
|
65 return self._slash |
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
|
66 elif name == '_checkexec': |
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
|
67 self._checkexec = util.checkexec(self._root) |
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
|
68 return self._checkexec |
4603
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
69 else: |
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
70 raise AttributeError, name |
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
71 |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
72 def _join(self, f): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
73 return os.path.join(self._root, f) |
723 | 74 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
75 def getcwd(self): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
76 cwd = os.getcwd() |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
77 if cwd == self._root: return '' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
78 # 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
|
79 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
|
80 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
|
81 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
|
82 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
|
83 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
|
84 else: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
85 # 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
|
86 return cwd |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
87 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
88 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
|
89 if cwd is None: |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
90 cwd = self.getcwd() |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
91 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
|
92 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
|
93 return util.normpath(path) |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
94 return path |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
95 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
96 def __getitem__(self, key): |
4906
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
97 ''' current states: |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
98 n normal |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
99 m needs merging |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
100 r marked for removal |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
101 a marked for addition |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
102 ? not tracked''' |
30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
Matt Mackall <mpm@selenic.com>
parents:
4905
diff
changeset
|
103 return self._map.get(key, ("?",))[0] |
220 | 104 |
105 def __contains__(self, key): | |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
106 return key in self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
107 |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
108 def __iter__(self): |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
109 a = self._map.keys() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
110 a.sort() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
111 for x in a: |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
112 yield x |
220 | 113 |
227 | 114 def parents(self): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
115 return self._pl |
227 | 116 |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
117 def branch(self): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
118 return self._branch |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
119 |
1062 | 120 def setparents(self, p1, p2=nullid): |
4965 | 121 self._dirty = self._dirtypl = True |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
122 self._pl = p1, p2 |
227 | 123 |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
124 def setbranch(self, branch): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
125 self._branch = branch |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
126 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
|
127 |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
128 def _read(self): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
129 self._map = {} |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
130 self._copymap = {} |
4952
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
131 if not self._dirtypl: |
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
132 self._pl = [nullid, nullid] |
4607
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
133 try: |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
134 st = self._opener("dirstate").read() |
4607
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
135 except IOError, err: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
136 if err.errno != errno.ENOENT: raise |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
137 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
138 if not st: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
139 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4606
diff
changeset
|
140 |
4952
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
141 if not self._dirtypl: |
a11921d24ec4
add dirstate._dirtypl variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4677
diff
changeset
|
142 self._pl = [st[:20], st[20: 40]] |
227 | 143 |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
144 # deref fields so they will be local in loop |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
145 dmap = self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
146 copymap = self._copymap |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
147 unpack = struct.unpack |
4610 | 148 e_size = struct.calcsize(_format) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
149 pos1 = 40 |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
150 l = len(st) |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
151 |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
152 # the inner loop |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
153 while pos1 < l: |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
154 pos2 = pos1 + e_size |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
155 e = unpack(">cllll", st[pos1:pos2]) # a literal here is faster |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
156 pos1 = pos2 + e[4] |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
157 f = st[pos2:pos1] |
515 | 158 if '\0' in f: |
363 | 159 f, c = f.split('\0') |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
160 copymap[f] = c |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
161 dmap[f] = e # we hold onto e[4] because making a subtuple is slow |
363 | 162 |
4613
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
163 def invalidate(self): |
4656
4eeb91870d3b
dirstate: fix typo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4635
diff
changeset
|
164 for a in "_map _copymap _branch _pl _dirs _ignore".split(): |
4953
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4952
diff
changeset
|
165 if a in self.__dict__: |
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4952
diff
changeset
|
166 delattr(self, a) |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
167 self._dirty = False |
4375
109077e7048d
When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4374
diff
changeset
|
168 |
363 | 169 def copy(self, source, dest): |
6680
deda205a00e1
Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6479
diff
changeset
|
170 if source == dest: |
deda205a00e1
Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6479
diff
changeset
|
171 return |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
172 self._dirty = True |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
173 self._copymap[dest] = source |
363 | 174 |
175 def copied(self, file): | |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
176 return self._copymap.get(file, None) |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
177 |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
178 def copies(self): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
179 return self._copymap |
515 | 180 |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
181 def _incpath(self, path): |
5326
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
182 c = path.rfind('/') |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
183 if c >= 0: |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
184 dirs = self._dirs |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
185 base = path[:c] |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
186 if base not in dirs: |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
187 self._incpath(base) |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
188 dirs[base] = 1 |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
189 else: |
319c09685f30
dirstate: make dir collision logic faster
Matt Mackall <mpm@selenic.com>
parents:
5210
diff
changeset
|
190 dirs[base] += 1 |
4615
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
191 |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
192 def _decpath(self, path): |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
193 c = path.rfind('/') |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
194 if c >= 0: |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
195 base = path[:c] |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
196 dirs = self._dirs |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
197 if dirs[base] == 1: |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
198 del dirs[base] |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
199 self._decpath(base) |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
200 else: |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
201 dirs[base] -= 1 |
2953 | 202 |
4616
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
203 def _incpathcheck(self, f): |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
204 if '\r' in f or '\n' in f: |
6138
09847b90beae
Report filenames with disallowed characters as suggested by Mika Eloranta
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6110
diff
changeset
|
205 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r") |
09847b90beae
Report filenames with disallowed characters as suggested by Mika Eloranta
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6110
diff
changeset
|
206 % f) |
4616
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
207 # shadows |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
208 if f in self._dirs: |
5045
8b1ee1f59b3c
dirstate: improve error message on file/directory clash
Bryan O'Sullivan <bos@serpentine.com>
parents:
5003
diff
changeset
|
209 raise util.Abort(_('directory %r already in dirstate') % f) |
4616
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
210 for c in strutil.rfindall(f, '/'): |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
211 d = f[:c] |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
212 if d in self._dirs: |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
213 break |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
214 if d in self._map and self[d] != 'r': |
5045
8b1ee1f59b3c
dirstate: improve error message on file/directory clash
Bryan O'Sullivan <bos@serpentine.com>
parents:
5003
diff
changeset
|
215 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:
5003
diff
changeset
|
216 (d, f)) |
4616
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
217 self._incpath(f) |
2953 | 218 |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
219 def _changepath(self, f, newstate, relaxed=False): |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
220 # handle upcoming path changes |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
221 oldstate = self[f] |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
222 if oldstate not in "?r" and newstate in "?r": |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
223 if "_dirs" in self.__dict__: |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
224 self._decpath(f) |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
225 return |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
226 if oldstate in "?r" and newstate not in "?r": |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
227 if relaxed and oldstate == '?': |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
228 # XXX |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
229 # in relaxed mode we assume the caller knows |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
230 # what it is doing, workaround for updating |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
231 # dir-to-file revisions |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
232 if "_dirs" in self.__dict__: |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
233 self._incpath(f) |
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
234 return |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
235 self._incpathcheck(f) |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
236 return |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
237 |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
238 def normal(self, 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
|
239 'mark a file normal and clean' |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
240 self._dirty = True |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
241 self._changepath(f, 'n', True) |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
242 s = os.lstat(self._join(f)) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
243 self._map[f] = ('n', s.st_mode, s.st_size, s.st_mtime, 0) |
5915
d0576d065993
Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents:
5843
diff
changeset
|
244 if f in self._copymap: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
245 del self._copymap[f] |
220 | 246 |
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
|
247 def normallookup(self, f): |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
248 '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
|
249 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
|
250 # if there is a merge going on and the file was either |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
251 # in state 'm' or dirty before being removed, restore that state. |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
252 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
|
253 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
|
254 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
|
255 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
|
256 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
|
257 elif 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
|
258 self.normaldirty(f) |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
259 if source: |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
260 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
|
261 return |
53cbb33e1269
normallookup: during merges, restore the state saved by remove
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6297
diff
changeset
|
262 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
|
263 return |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
264 self._dirty = True |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
265 self._changepath(f, 'n', True) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
266 self._map[f] = ('n', 0, -1, -1, 0) |
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
|
267 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
|
268 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
|
269 |
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
|
270 def normaldirty(self, 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
|
271 'mark a file normal, but dirty' |
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
|
272 self._dirty = True |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
273 self._changepath(f, 'n', True) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
274 self._map[f] = ('n', 0, -2, -1, 0) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
275 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
276 del self._copymap[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
277 |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
278 def add(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
279 'mark a file added' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
280 self._dirty = True |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
281 self._changepath(f, 'a') |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
282 self._map[f] = ('a', 0, -1, -1, 0) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
283 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
284 del self._copymap[f] |
4616
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
285 |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
286 def remove(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
287 'mark a file removed' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
288 self._dirty = True |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
289 self._changepath(f, 'r') |
6297
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
290 size = 0 |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
291 if self._pl[1] != nullid and f in self._map: |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
292 entry = self._map[f] |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
293 if entry[0] == 'm': |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
294 size = -1 |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
295 elif entry[0] == 'n' and entry[2] == -2: |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
296 size = -2 |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
297 self._map[f] = ('r', 0, size, 0, 0) |
fed1a9c22076
dirstate.remove: during merges, remember the previous file state
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6257
diff
changeset
|
298 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
|
299 del self._copymap[f] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
300 |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
301 def merge(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
302 'mark a file merged' |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
303 self._dirty = True |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
304 s = os.lstat(self._join(f)) |
5516
f252ba975925
Fix dir-changed-to-file updates on clean workdir.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5487
diff
changeset
|
305 self._changepath(f, 'm', True) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
306 self._map[f] = ('m', s.st_mode, s.st_size, s.st_mtime, 0) |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
307 if f in self._copymap: |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
308 del self._copymap[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
309 |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
310 def forget(self, f): |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
311 'forget a file' |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
312 self._dirty = True |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
313 try: |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
314 self._changepath(f, '?') |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
315 del self._map[f] |
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4903
diff
changeset
|
316 except KeyError: |
6057
218d5b9aa466
Remove trailing ! from two error messages as this was confusing.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6048
diff
changeset
|
317 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
|
318 |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
319 def clear(self): |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
320 self._map = {} |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
321 if "_dirs" in self.__dict__: |
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
322 delattr(self, "_dirs"); |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
323 self._copymap = {} |
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
324 self._pl = [nullid, nullid] |
5123 | 325 self._dirty = True |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
326 |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
327 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
|
328 self.clear() |
2832
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
329 for f in files: |
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
330 if files.execf(f): |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
331 self._map[f] = ('n', 0777, -1, 0, 0) |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
332 else: |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
333 self._map[f] = ('n', 0666, -1, 0, 0) |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
334 self._pl = (parent, nullid) |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
335 self._dirty = True |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
336 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
337 def write(self): |
4612
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
338 if not self._dirty: |
1794
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
339 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
|
340 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
|
341 |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
342 try: |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
343 gran = int(self._ui.config('dirstate', 'granularity', 1)) |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
344 except ValueError: |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
345 gran = 1 |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
346 limit = sys.maxint |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
347 if gran > 0: |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
348 limit = util.fstat(st).st_mtime - gran |
6d952dc2abc9
dirstate: refactor granularity code, add a test
Matt Mackall <mpm@selenic.com>
parents:
6326
diff
changeset
|
349 |
4374
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4373
diff
changeset
|
350 cs = cStringIO.StringIO() |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
351 copymap = self._copymap |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
352 pack = struct.pack |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
353 write = cs.write |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
354 write("".join(self._pl)) |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
355 for f, e in self._map.iteritems(): |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
356 if f in copymap: |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
357 f = "%s\0%s" % (f, copymap[f]) |
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
|
358 if e[3] > limit and e[0] == 'n': |
af3f26b6bba4
dirstate: ignore stat data for files that were updated too recently
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6298
diff
changeset
|
359 e = (e[0], 0, -1, -1, 0) |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
360 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
|
361 write(e) |
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
362 write(f) |
4374
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4373
diff
changeset
|
363 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
|
364 st.rename() |
4965 | 365 self._dirty = self._dirtypl = False |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
366 |
4907
6a7659a0c07c
dirstate: make filterfiles private
Matt Mackall <mpm@selenic.com>
parents:
4906
diff
changeset
|
367 def _filter(self, files): |
879 | 368 ret = {} |
369 unknown = [] | |
370 | |
371 for x in files: | |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1529
diff
changeset
|
372 if x == '.': |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
373 return self._map.copy() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
374 if x not in self._map: |
879 | 375 unknown.append(x) |
376 else: | |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
377 ret[x] = self._map[x] |
919 | 378 |
879 | 379 if not unknown: |
380 return ret | |
381 | |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
382 b = self._map.keys() |
879 | 383 b.sort() |
384 blen = len(b) | |
385 | |
386 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
|
387 bs = bisect.bisect(b, "%s%s" % (x, '/')) |
879 | 388 while bs < blen: |
389 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
|
390 if len(s) > len(x) and s.startswith(x): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
391 ret[s] = self._map[s] |
879 | 392 else: |
393 break | |
394 bs += 1 | |
395 return ret | |
396 | |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
397 def _supported(self, f, mode, verbose=False): |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
398 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
|
399 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
|
400 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
|
401 kind = 'unknown' |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
402 if stat.S_ISCHR(mode): kind = _('character device') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
403 elif stat.S_ISBLK(mode): kind = _('block device') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
404 elif stat.S_ISFIFO(mode): kind = _('fifo') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
405 elif stat.S_ISSOCK(mode): kind = _('socket') |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
406 elif stat.S_ISDIR(mode): kind = _('directory') |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
407 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:
4620
diff
changeset
|
408 % (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
|
409 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
|
410 |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
411 def _dirignore(self, f): |
6479
31abcae33b4f
dirstate: do not ignore current directory '.' (issue 1078)
Patrick Mezard <pmezard@gmail.com>
parents:
6327
diff
changeset
|
412 if f == '.': |
31abcae33b4f
dirstate: do not ignore current directory '.' (issue 1078)
Patrick Mezard <pmezard@gmail.com>
parents:
6327
diff
changeset
|
413 return False |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
414 if self._ignore(f): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
415 return True |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
416 for c in strutil.findall(f, '/'): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
417 if self._ignore(f[:c]): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
418 return True |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
419 return False |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
420 |
3529 | 421 def walk(self, files=None, match=util.always, badmatch=None): |
422 # filter out the stat | |
423 for src, f, st in self.statwalk(files, match, badmatch=badmatch): | |
424 yield src, f | |
425 | |
6201
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
426 def statwalk(self, files=None, match=util.always, unknown=True, |
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
427 ignored=False, badmatch=None, directories=False): |
3529 | 428 ''' |
429 walk recursively through the directory tree, finding all files | |
430 matched by the match function | |
431 | |
432 results are yielded in a tuple (src, filename, st), where src | |
433 is one of: | |
434 '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
|
435 'd' the file is a directory of the tree |
3529 | 436 'm' the file was only in the dirstate and not in the tree |
3532 | 437 'b' file was not found and matched badmatch |
438 | |
3529 | 439 and st is the stat result if the file was found in the directory. |
440 ''' | |
879 | 441 |
723 | 442 # walk all files by default |
879 | 443 if not files: |
4172
b36bd7534c08
statwalk: don't put self.root in the files list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4075
diff
changeset
|
444 files = ['.'] |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
445 dc = self._map.copy() |
3529 | 446 else: |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
447 files = util.unique(files) |
4907
6a7659a0c07c
dirstate: make filterfiles private
Matt Mackall <mpm@selenic.com>
parents:
4906
diff
changeset
|
448 dc = self._filter(files) |
919 | 449 |
3529 | 450 def imatch(file_): |
4609
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4608
diff
changeset
|
451 if file_ not in dc and self._ignore(file_): |
1183 | 452 return False |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
453 return match(file_) |
1224
cc61d366bc3b
Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents:
1183
diff
changeset
|
454 |
6201
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
455 # TODO: don't walk unknown directories if unknown and ignored are False |
4609
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4608
diff
changeset
|
456 ignore = self._ignore |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
457 dirignore = self._dirignore |
4193
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
458 if ignored: |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
459 imatch = match |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
460 ignore = util.never |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
461 dirignore = util.never |
3534
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3532
diff
changeset
|
462 |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
463 # self._root may end with a path separator when self._root == '/' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
464 common_prefix_len = len(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
|
465 if not util.endswithsep(self._root): |
2671
82864a2eb709
self.root == '/': prefix length computation out of the loop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2670
diff
changeset
|
466 common_prefix_len += 1 |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
467 |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
468 normpath = util.normpath |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5327
diff
changeset
|
469 listdir = osutil.listdir |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
470 lstat = os.lstat |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
471 bisect_left = bisect.bisect_left |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
472 isdir = os.path.isdir |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
473 pconvert = util.pconvert |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
474 join = os.path.join |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
475 s_isdir = stat.S_ISDIR |
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
476 supported = self._supported |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
477 _join = self._join |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
478 known = {'.hg': 1} |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
479 |
1183 | 480 # recursion free walker, faster than os.walk. |
481 def findfiles(s): | |
482 work = [s] | |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
483 wadd = work.append |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
484 found = [] |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
485 add = found.append |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
486 if directories: |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
487 add((normpath(s[common_prefix_len:]), 'd', lstat(s))) |
1183 | 488 while work: |
489 top = work.pop() | |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5327
diff
changeset
|
490 entries = listdir(top, stat=True) |
1183 | 491 # nd is the top of the repository dir tree |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
492 nd = normpath(top[common_prefix_len:]) |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
493 if nd == '.': |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
494 nd = '' |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
495 else: |
2063
f1fda71e134e
benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2062
diff
changeset
|
496 # 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
|
497 # 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
|
498 # is good on big directory. |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5327
diff
changeset
|
499 names = [e[0] for e in entries] |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
500 hg = bisect_left(names, '.hg') |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
501 if hg < len(names) and names[hg] == '.hg': |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
502 if isdir(join(top, '.hg')): |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
503 continue |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5327
diff
changeset
|
504 for f, kind, st in entries: |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
505 np = pconvert(join(nd, f)) |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
506 if np in known: |
1183 | 507 continue |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
508 known[np] = 1 |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
509 p = join(top, f) |
1228
db950da49539
Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents:
1224
diff
changeset
|
510 # don't trip over symlinks |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5327
diff
changeset
|
511 if kind == stat.S_IFDIR: |
4254
a7cae4e22749
Pass normalized directory names to the ignore function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
512 if not ignore(np): |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
513 wadd(p) |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
514 if directories: |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
515 add((np, 'd', st)) |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
516 if np in dc and match(np): |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
517 add((np, 'm', st)) |
3529 | 518 elif imatch(np): |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
519 if supported(np, st.st_mode): |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
520 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
|
521 elif np in dc: |
5002
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
522 add((np, 'm', st)) |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
523 found.sort() |
4d079df2871a
dirstate: speed up sorting in findfiles
Matt Mackall <mpm@selenic.com>
parents:
5001
diff
changeset
|
524 return found |
1183 | 525 |
526 # step one, find all files that match our criteria | |
527 files.sort() | |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
528 for ff in files: |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
529 nf = normpath(ff) |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
530 f = _join(ff) |
1183 | 531 try: |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
532 st = lstat(f) |
1183 | 533 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
|
534 found = False |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
535 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
|
536 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
|
537 found = True |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
538 break |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
539 if not found: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
540 if inst.errno != errno.ENOENT or not badmatch: |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4620
diff
changeset
|
541 self._ui.warn('%s: %s\n' % |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4620
diff
changeset
|
542 (self.pathto(ff), inst.strerror)) |
3534
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3532
diff
changeset
|
543 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
|
544 yield 'b', ff, None |
1183 | 545 continue |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
546 if s_isdir(st.st_mode): |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
547 if not dirignore(nf): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
548 for f, src, st in findfiles(f): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
549 yield src, f, st |
1392
32d8068b3e36
add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1276
diff
changeset
|
550 else: |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
551 if nf in known: |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
552 continue |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
553 known[nf] = 1 |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
554 if match(nf): |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
555 if supported(ff, st.st_mode, verbose=True): |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
556 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
|
557 elif ff in dc: |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
558 yield 'm', nf, st |
536 | 559 |
1183 | 560 # step two run through anything left in the dc hash and yield |
561 # if we haven't already seen it | |
562 ks = dc.keys() | |
563 ks.sort() | |
564 for k in ks: | |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
565 if k in known: |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
566 continue |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
567 known[k] = 1 |
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
568 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
|
569 yield 'm', k, None |
669
8aa2a282eda4
.hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents:
667
diff
changeset
|
570 |
6201
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
571 def status(self, files, match, list_ignored, list_clean, list_unknown=True): |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
572 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
|
573 removed, deleted, clean = [], [], [] |
723 | 574 |
6033
a1ebd5cd7e55
dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6032
diff
changeset
|
575 files = files or [] |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
576 _join = self._join |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
577 lstat = os.lstat |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
578 cmap = self._copymap |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
579 dmap = self._map |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
580 ladd = lookup.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
581 madd = modified.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
582 aadd = added.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
583 uadd = unknown.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
584 iadd = ignored.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
585 radd = removed.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
586 dadd = deleted.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
587 cadd = clean.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
588 |
6201
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
589 for src, fn, st in self.statwalk(files, match, unknown=list_unknown, |
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
590 ignored=list_ignored): |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
591 if fn in dmap: |
5327
f46ab9cacd3c
dirstate: speed up read and write
Matt Mackall <mpm@selenic.com>
parents:
5326
diff
changeset
|
592 type_, mode, size, time, foo = dmap[fn] |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
593 else: |
6033
a1ebd5cd7e55
dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6032
diff
changeset
|
594 if (list_ignored or fn in files) and self._dirignore(fn): |
a1ebd5cd7e55
dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6032
diff
changeset
|
595 if list_ignored: |
a1ebd5cd7e55
dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6032
diff
changeset
|
596 iadd(fn) |
6201
305d4450036a
Extend/correct acc40572da5b regarding -qA and ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6138
diff
changeset
|
597 elif list_unknown: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
598 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
|
599 continue |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
600 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
|
601 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
|
602 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
|
603 try: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
604 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
|
605 except OSError, inst: |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5396
diff
changeset
|
606 if inst.errno not in (errno.ENOENT, errno.ENOTDIR): |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
607 raise |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
608 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
|
609 # We need to re-check that it is a valid file |
5001
62e3fd2baca4
revlog: pass mode to _supported directly
Matt Mackall <mpm@selenic.com>
parents:
5000
diff
changeset
|
610 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
|
611 nonexistent = False |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
612 # 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
|
613 # who are not removed in the dirstate ? |
6110
81e20e01d465
status: put added files that have disappeared in the deleted list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6057
diff
changeset
|
614 if nonexistent and type_ in "nma": |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
615 dadd(fn) |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
616 continue |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
617 # 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
|
618 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
|
619 if not st: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
620 st = lstat(_join(fn)) |
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
|
621 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
|
622 (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
|
623 or ((mode ^ st.st_mode) & 0100 and self._checkexec)) |
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
|
624 or size == -2 |
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
|
625 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
|
626 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
|
627 elif time != int(st.st_mtime): |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
628 ladd(fn) |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
629 elif list_clean: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
630 cadd(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
631 elif type_ == 'm': |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
632 madd(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
633 elif type_ == 'a': |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
634 aadd(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
635 elif type_ == 'r': |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
636 radd(fn) |
1183 | 637 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
638 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
|
639 clean) |