Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/dirstate.py @ 4661:a7e9b6b1adeb
Backed out changeset cfa477946181824f4c769580ebf59710090ba08a
Only printenv was changed, not the actual execution of hooks.
And not setting an empty value might cause problems on platforms
which can't always remove variables from the environment.
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Thu, 21 Jun 2007 10:00:59 +0200 |
parents | 27a386b96557 |
children | de8ec7e1753a |
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 |
4613
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
23 self._dirty = 0 |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
24 self._ui = ui |
723 | 25 |
4604
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
26 def __getattr__(self, name): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
27 if name == '_map': |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
28 self._read() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
29 return self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
30 elif name == '_copymap': |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
31 self._read() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
32 return self._copymap |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
33 elif name == '_branch': |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
34 try: |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
35 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
|
36 or "default") |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
37 except IOError: |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
38 self._branch = "default" |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
39 return self._branch |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
40 elif name == '_pl': |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
41 self._pl = [nullid, nullid] |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
42 try: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
43 st = self._opener("dirstate").read(40) |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
44 if len(st) == 40: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
45 self._pl = st[:20], st[20:40] |
4605
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
46 except IOError, err: |
c867c11426ad
dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents:
4604
diff
changeset
|
47 if err.errno != errno.ENOENT: raise |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
48 return self._pl |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
49 elif name == '_dirs': |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
50 self._dirs = {} |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
51 for f in self._map: |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
52 self._incpath(f) |
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
53 return self._dirs |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
54 elif name == '_ignore': |
4621
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4617
diff
changeset
|
55 files = [self.wjoin('.hgignore')] |
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4617
diff
changeset
|
56 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
|
57 if name == 'ignore' or name.startswith('ignore.'): |
d97fd22a0ea9
dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents:
4617
diff
changeset
|
58 files.append(os.path.expanduser(path)) |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
59 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
|
60 return self._ignore |
4612
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
61 elif name == '_slash': |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
62 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
|
63 return self._slash |
4604
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
64 else: |
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
65 raise AttributeError, name |
0f6853c15606
dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents:
4527
diff
changeset
|
66 |
723 | 67 def wjoin(self, f): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
68 return os.path.join(self._root, f) |
723 | 69 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
70 def getcwd(self): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
71 cwd = os.getcwd() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
72 if cwd == self._root: return '' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
73 # 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 else: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
80 # 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
|
81 return cwd |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
82 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
83 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
|
84 if cwd is None: |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
85 cwd = self.getcwd() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
86 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
|
87 if self._slash: |
4612
86e5500a517e
dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
88 return path.replace(os.sep, '/') |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
89 return path |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
90 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
91 def __del__(self): |
4613
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
92 self.write() |
220 | 93 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
94 def __getitem__(self, key): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
95 return self._map[key] |
220 | 96 |
97 def __contains__(self, key): | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
98 return key in self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
99 |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
100 def __iter__(self): |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
101 a = self._map.keys() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
102 a.sort() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
103 for x in a: |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
104 yield x |
220 | 105 |
227 | 106 def parents(self): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
107 return self._pl |
227 | 108 |
4207
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
109 def branch(self): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
110 return self._branch |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
111 |
723 | 112 def markdirty(self): |
4613
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
113 self._dirty = 1 |
723 | 114 |
1062 | 115 def setparents(self, p1, p2=nullid): |
723 | 116 self.markdirty() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
117 self._pl = p1, p2 |
227 | 118 |
4207
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
119 def setbranch(self, branch): |
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4173
diff
changeset
|
120 self._branch = branch |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
121 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
|
122 |
220 | 123 def state(self, key): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
124 return self._map.get(key, ("?",))[0] |
220 | 125 |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
126 def _read(self): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
127 self._map = {} |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
128 self._copymap = {} |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
129 self._pl = [nullid, nullid] |
4608
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
130 try: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
131 st = self._opener("dirstate").read() |
4608
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
132 except IOError, err: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
133 if err.errno != errno.ENOENT: raise |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
134 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
135 if not st: |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
136 return |
49dcac6ede26
dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents:
4607
diff
changeset
|
137 |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
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(): |
4607 | 163 if hasattr(self, a): |
164 self.__delattr__(a) | |
4657
27a386b96557
dirstate.invalidate: clear dirty flag
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4656
diff
changeset
|
165 self._dirty = 0 |
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): |
723 | 168 self.markdirty() |
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: |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
194 raise util.Abort(_('directory named %r already in dirstate') % f) |
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: |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
200 raise util.Abort(_('file named %r already in dirstate') % d) |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
201 self._incpath(f) |
2953 | 202 |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
203 def update(self, files, state, **kw): |
220 | 204 ''' current states: |
205 n normal | |
231 | 206 m needs merging |
220 | 207 r marked for removal |
208 a marked for addition''' | |
209 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
210 if not files: return |
723 | 211 self.markdirty() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
212 for f in files: |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
213 if self._copymap.has_key(f): |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
214 del self._copymap[f] |
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
215 |
220 | 216 if state == "r": |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
217 self._map[f] = ('r', 0, 0, 0) |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
218 self._decpath(f) |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
219 continue |
220 | 220 else: |
2953 | 221 if state == "a": |
4617
70352337934e
dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents:
4616
diff
changeset
|
222 self._incpathcheck(f) |
1510
755e7ac351ef
use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1491
diff
changeset
|
223 s = os.lstat(self.wjoin(f)) |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
224 st_size = kw.get('st_size', s.st_size) |
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
225 st_mtime = kw.get('st_mtime', s.st_mtime) |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
226 self._map[f] = (state, s.st_mode, st_size, st_mtime) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
227 |
220 | 228 def forget(self, files): |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
229 if not files: return |
723 | 230 self.markdirty() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
231 for f in files: |
20 | 232 try: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
233 del self._map[f] |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
234 self._decpath(f) |
20 | 235 except KeyError: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
236 self._ui.warn(_("not in dirstate: %s!\n") % f) |
20 | 237 pass |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
238 |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
239 def rebuild(self, parent, files): |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
240 self.invalidate() |
2844
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
241 for f in files: |
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
242 if files.execf(f): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
243 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
|
244 else: |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
245 self._map[f] = ('n', 0666, -1, 0) |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
246 self._pl = (parent, nullid) |
723 | 247 self.markdirty() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
248 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
249 def write(self): |
4613
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
250 if not self._dirty: |
1794
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
251 return |
4372
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
252 cs = cStringIO.StringIO() |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
253 cs.write("".join(self._pl)) |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
254 for f, e in self._map.iteritems(): |
363 | 255 c = self.copied(f) |
256 if c: | |
257 f = f + "\0" + c | |
4611 | 258 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
|
259 cs.write(e) |
9edc2d6f7c10
dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4371
diff
changeset
|
260 cs.write(f) |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
261 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
|
262 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
|
263 st.rename() |
4613
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
264 self._dirty = 0 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
265 |
879 | 266 def filterfiles(self, files): |
267 ret = {} | |
268 unknown = [] | |
269 | |
270 for x in files: | |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1529
diff
changeset
|
271 if x == '.': |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
272 return self._map.copy() |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
273 if x not in self._map: |
879 | 274 unknown.append(x) |
275 else: | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
276 ret[x] = self._map[x] |
919 | 277 |
879 | 278 if not unknown: |
279 return ret | |
280 | |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
281 b = self._map.keys() |
879 | 282 b.sort() |
283 blen = len(b) | |
284 | |
285 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
|
286 bs = bisect.bisect(b, "%s%s" % (x, '/')) |
879 | 287 while bs < blen: |
288 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
|
289 if len(s) > len(x) and s.startswith(x): |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
290 ret[s] = self._map[s] |
879 | 291 else: |
292 break | |
293 bs += 1 | |
294 return ret | |
295 | |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
296 def _supported(self, f, st, verbose=False): |
4001
dda03b2d9ef1
symlinks: don't complain about symlinks
Matt Mackall <mpm@selenic.com>
parents:
3893
diff
changeset
|
297 if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(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
|
298 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
|
299 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
|
300 kind = 'unknown' |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
301 if stat.S_ISCHR(st.st_mode): kind = _('character device') |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
302 elif stat.S_ISBLK(st.st_mode): kind = _('block device') |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
303 elif stat.S_ISFIFO(st.st_mode): kind = _('fifo') |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
304 elif stat.S_ISSOCK(st.st_mode): kind = _('socket') |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
305 elif stat.S_ISDIR(st.st_mode): kind = _('directory') |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
306 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
|
307 % (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
|
308 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
|
309 |
3560 | 310 def walk(self, files=None, match=util.always, badmatch=None): |
311 # filter out the stat | |
312 for src, f, st in self.statwalk(files, match, badmatch=badmatch): | |
313 yield src, f | |
314 | |
315 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
|
316 badmatch=None, directories=False): |
3560 | 317 ''' |
318 walk recursively through the directory tree, finding all files | |
319 matched by the match function | |
320 | |
321 results are yielded in a tuple (src, filename, st), where src | |
322 is one of: | |
323 '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
|
324 'd' the file is a directory of the tree |
3560 | 325 'm' the file was only in the dirstate and not in the tree |
3563 | 326 'b' file was not found and matched badmatch |
327 | |
3560 | 328 and st is the stat result if the file was found in the directory. |
329 ''' | |
879 | 330 |
723 | 331 # walk all files by default |
879 | 332 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
|
333 files = ['.'] |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
334 dc = self._map.copy() |
3560 | 335 else: |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
336 files = util.unique(files) |
879 | 337 dc = self.filterfiles(files) |
919 | 338 |
3560 | 339 def imatch(file_): |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
340 if file_ not in dc and self._ignore(file_): |
1183 | 341 return False |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
342 return match(file_) |
1224
cc61d366bc3b
Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents:
1183
diff
changeset
|
343 |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
344 ignore = self._ignore |
4188
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4173
diff
changeset
|
345 if ignored: |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4173
diff
changeset
|
346 imatch = match |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4173
diff
changeset
|
347 ignore = util.never |
3565
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3563
diff
changeset
|
348 |
4615
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
349 # 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
|
350 common_prefix_len = len(self._root) |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
351 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
|
352 common_prefix_len += 1 |
1183 | 353 # recursion free walker, faster than os.walk. |
354 def findfiles(s): | |
355 work = [s] | |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
356 if directories: |
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
357 yield 'd', util.normpath(s[common_prefix_len:]), os.lstat(s) |
1183 | 358 while work: |
359 top = work.pop() | |
360 names = os.listdir(top) | |
361 names.sort() | |
362 # nd is the top of the repository dir tree | |
2671
82864a2eb709
self.root == '/': prefix length computation out of the loop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2670
diff
changeset
|
363 nd = util.normpath(top[common_prefix_len:]) |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
364 if nd == '.': |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
365 nd = '' |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
366 else: |
2063
f1fda71e134e
benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2062
diff
changeset
|
367 # 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
|
368 # 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
|
369 # is good on big directory. |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
370 hg = bisect.bisect_left(names, '.hg') |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
371 if hg < len(names) and names[hg] == '.hg': |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
372 if os.path.isdir(os.path.join(top, '.hg')): |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
373 continue |
1183 | 374 for f in names: |
1562 | 375 np = util.pconvert(os.path.join(nd, f)) |
1183 | 376 if seen(np): |
377 continue | |
378 p = os.path.join(top, f) | |
1228
db950da49539
Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents:
1224
diff
changeset
|
379 # don't trip over symlinks |
db950da49539
Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents:
1224
diff
changeset
|
380 st = os.lstat(p) |
1183 | 381 if stat.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
|
382 if not ignore(np): |
1183 | 383 work.append(p) |
4146
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
384 if directories: |
e287d61dd268
Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4081
diff
changeset
|
385 yield 'd', np, st |
3560 | 386 if imatch(np) and np in dc: |
1562 | 387 yield 'm', np, st |
3560 | 388 elif imatch(np): |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
389 if self._supported(np, st): |
1562 | 390 yield 'f', np, 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
|
391 elif np in dc: |
1562 | 392 yield 'm', np, st |
1392
32d8068b3e36
add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1276
diff
changeset
|
393 |
821
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
394 known = {'.hg': 1} |
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
395 def seen(fn): |
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
396 if fn in known: return True |
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
397 known[fn] = 1 |
1183 | 398 |
399 # step one, find all files that match our criteria | |
400 files.sort() | |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
401 for ff in files: |
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
402 nf = util.normpath(ff) |
1510
755e7ac351ef
use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1491
diff
changeset
|
403 f = self.wjoin(ff) |
1183 | 404 try: |
1230 | 405 st = os.lstat(f) |
1183 | 406 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
|
407 found = False |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
408 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
|
409 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
|
410 found = True |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
411 break |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
412 if not found: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
413 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
|
414 self._ui.warn('%s: %s\n' % |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4621
diff
changeset
|
415 (self.pathto(ff), inst.strerror)) |
3565
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3563
diff
changeset
|
416 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
|
417 yield 'b', ff, None |
1183 | 418 continue |
419 if stat.S_ISDIR(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
|
420 cmp1 = (lambda x, y: cmp(x[1], y[1])) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
421 sorted_ = [ x for x in findfiles(f) ] |
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
422 sorted_.sort(cmp1) |
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
423 for e in sorted_: |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
424 yield e |
1392
32d8068b3e36
add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1276
diff
changeset
|
425 else: |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
426 if not seen(nf) and match(nf): |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
427 if self._supported(ff, st, verbose=True): |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
428 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
|
429 elif ff in dc: |
3567
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3565
diff
changeset
|
430 yield 'm', nf, st |
536 | 431 |
1183 | 432 # step two run through anything left in the dc hash and yield |
433 # if we haven't already seen it | |
434 ks = dc.keys() | |
435 ks.sort() | |
436 for k in ks: | |
3560 | 437 if not seen(k) and 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
|
438 yield 'm', k, None |
669
8aa2a282eda4
.hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents:
667
diff
changeset
|
439 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
440 def status(self, files=None, match=util.always, list_ignored=False, |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
441 list_clean=False): |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
442 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
|
443 removed, deleted, clean = [], [], [] |
723 | 444 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
445 for src, fn, st in self.statwalk(files, match, ignored=list_ignored): |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
446 try: |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
447 type_, mode, size, time = self[fn] |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
448 except KeyError: |
4610
b43f17691ae6
dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents:
4609
diff
changeset
|
449 if list_ignored and self._ignore(fn): |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
450 ignored.append(fn) |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
451 else: |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
452 unknown.append(fn) |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
453 continue |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
454 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
|
455 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
|
456 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
|
457 try: |
2429
6a8f7c3f7333
dirstate: fix call to os.lstat when st is None
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2427
diff
changeset
|
458 st = os.lstat(self.wjoin(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
|
459 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
|
460 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
|
461 raise |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
462 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
|
463 # We need to re-check that it is a valid file |
4616
9b00b73a5286
dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents:
4615
diff
changeset
|
464 if st and self._supported(fn, 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
|
465 nonexistent = False |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
466 # 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
|
467 # 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
|
468 if nonexistent and type_ in "nm": |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
469 deleted.append(fn) |
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
470 continue |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
471 # 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
|
472 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
|
473 if not st: |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2429
diff
changeset
|
474 st = os.lstat(self.wjoin(fn)) |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
475 if size >= 0 and (size != st.st_size |
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
476 or (mode ^ st.st_mode) & 0100): |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
477 modified.append(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
|
478 elif time != int(st.st_mtime): |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
479 lookup.append(fn) |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
480 elif list_clean: |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
481 clean.append(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
482 elif type_ == 'm': |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
483 modified.append(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
484 elif type_ == 'a': |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
485 added.append(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
486 elif type_ == 'r': |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
487 removed.append(fn) |
1183 | 488 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
489 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
|
490 clean) |