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