annotate mercurial/dirstate.py @ 4739:1da35d1e7ef9

Added full URL to debug output if something doesn't look like an http hg repo. This way it is easier to debug problems with failing subcommands, like changegroupsubset due to permission problems, when generally accessing the repository works fine.
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 29 Jun 2007 11:13:36 +0200
parents de8ec7e1753a
children 81078e177266 a11921d24ec4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
1 """
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
2 dirstate.py - working directory tracking for mercurial
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
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
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
5
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
6 This software may be used and distributed according to the terms
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
7 of the GNU General Public License, incorporated herein by reference.
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
8 """
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
9
1094
221b5252864c Adjust some imports
mpm@selenic.com
parents: 1093 1089
diff changeset
10 from node import *
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
11 from i18n import _
4609
b43f17691ae6 dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents: 4608
diff changeset
12 import struct, os, time, bisect, stat, strutil, util, re, errno, ignore
4374
9edc2d6f7c10 dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4373
diff changeset
13 import cStringIO
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
14
4610
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
15 _unknown = ('?', 0, 0, 0)
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
16 _format = ">cllll"
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
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
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
20 def __init__(self, opener, ui, root):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
21 self._opener = opener
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
22 self._root = root
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
diff changeset
23 self._dirty = 0
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
24 self._ui = ui
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
25
4603
0f6853c15606 dirstate: use getattr rather than lazyread
Matt Mackall <mpm@selenic.com>
parents: 4527
diff changeset
26 def __getattr__(self, name):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
27 if name == '_map':
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
28 self._read()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
29 return self._map
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
30 elif name == '_copymap':
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
31 self._read()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
32 return self._copymap
4604
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
33 elif name == '_branch':
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
34 try:
4633
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4620
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: 4620
diff changeset
36 or "default")
4604
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
37 except IOError:
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
38 self._branch = "default"
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
39 return self._branch
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
40 elif name == '_pl':
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
41 self._pl = [nullid, nullid]
4604
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
42 try:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
43 st = self._opener("dirstate").read(40)
4604
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
44 if len(st) == 40:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
45 self._pl = st[:20], st[20:40]
4604
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
46 except IOError, err:
c867c11426ad dirstate: lazify copymap, _branch, and _pl
Matt Mackall <mpm@selenic.com>
parents: 4603
diff changeset
47 if err.errno != errno.ENOENT: raise
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
48 return self._pl
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
49 elif name == '_dirs':
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
50 self._dirs = {}
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
51 for f in self._map:
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
52 self._incpath(f)
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
53 return self._dirs
4609
b43f17691ae6 dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents: 4608
diff changeset
54 elif name == '_ignore':
4620
d97fd22a0ea9 dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents: 4616
diff changeset
55 files = [self.wjoin('.hgignore')]
d97fd22a0ea9 dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents: 4616
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: 4616
diff changeset
57 if name == 'ignore' or name.startswith('ignore.'):
d97fd22a0ea9 dirstate: pull ignore smarts out of ui
Matt Mackall <mpm@selenic.com>
parents: 4616
diff changeset
58 files.append(os.path.expanduser(path))
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
59 self._ignore = ignore.ignore(self._root, files, self._ui.warn)
4609
b43f17691ae6 dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents: 4608
diff changeset
60 return self._ignore
4611
86e5500a517e dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents: 4610
diff changeset
61 elif name == '_slash':
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
62 self._slash = self._ui.configbool('ui', 'slash') and os.sep != '/'
4611
86e5500a517e dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents: 4610
diff changeset
63 return self._slash
4603
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
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
67 def wjoin(self, f):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
68 return os.path.join(self._root, f)
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
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()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
72 if cwd == self._root: return ''
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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: 4613
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()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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:
4611
86e5500a517e dirstate: lazify and lambdafy _slash
Matt Mackall <mpm@selenic.com>
parents: 4610
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):
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
diff changeset
92 self.write()
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
93
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
94 def __getitem__(self, key):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
95 return self._map[key]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
96
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
97 def __contains__(self, key):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
98 return key in self._map
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
99
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
100 def __iter__(self):
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
101 a = self._map.keys()
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
102 a.sort()
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
103 for x in a:
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
104 yield x
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
105
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
106 def parents(self):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
107 return self._pl
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
108
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
109 def branch(self):
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
110 return self._branch
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
111
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
112 def markdirty(self):
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
diff changeset
113 self._dirty = 1
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
114
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1040
diff changeset
115 def setparents(self, p1, p2=nullid):
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
116 self.markdirty()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
117 self._pl = p1, p2
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
118
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
119 def setbranch(self, branch):
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
120 self._branch = branch
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
121 self._opener("branch", "w").write(branch + '\n')
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
122
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
123 def state(self, key):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
124 return self._map.get(key, ("?",))[0]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
125
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
126 def _read(self):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
127 self._map = {}
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
128 self._copymap = {}
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
129 self._pl = [nullid, nullid]
4607
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
130 try:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
131 st = self._opener("dirstate").read()
4607
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
132 except IOError, err:
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
133 if err.errno != errno.ENOENT: raise
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
134 return
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
135 if not st:
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
136 return
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
diff changeset
137
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
138 self._pl = [st[:20], st[20: 40]]
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
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
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
141 dmap = self._map
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
145 pos = 40
4610
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
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
4610
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
150 e = unpack(_format, st[pos:newpos])
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
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
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
155 if '\0' in f:
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
156 f, c = f.split('\0')
3154
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
157 copymap[f] = c
4607
49dcac6ede26 dirstate: fold parse into read
Matt Mackall <mpm@selenic.com>
parents: 4606
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
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
160
4613
3a645af7fb76 localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents: 4612
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():
4606
2651099c5018 dirstate: make reload lazy
Matt Mackall <mpm@selenic.com>
parents: 4605
diff changeset
163 if hasattr(self, a):
2651099c5018 dirstate: make reload lazy
Matt Mackall <mpm@selenic.com>
parents: 4605
diff changeset
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
4375
109077e7048d When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4374
diff changeset
166
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
167 def copy(self, source, dest):
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
168 self.markdirty()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
169 self._copymap[dest] = source
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
170
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
171 def copied(self, file):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
172 return self._copymap.get(file, None)
3154
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):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
175 return self._copymap
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
176
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
177 def _incpath(self, path):
4605
9da7a4da650f dirstate: lazify initdirs
Matt Mackall <mpm@selenic.com>
parents: 4604
diff changeset
178 for c in strutil.findall(path, '/'):
9da7a4da650f dirstate: lazify initdirs
Matt Mackall <mpm@selenic.com>
parents: 4604
diff changeset
179 pc = path[:c]
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
180 self._dirs.setdefault(pc, 0)
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
181 self._dirs[pc] += 1
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
182
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
183 def _decpath(self, path):
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
184 for c in strutil.findall(path, '/'):
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
185 pc = path[:c]
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
186 self._dirs.setdefault(pc, 0)
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
187 self._dirs[pc] -= 1
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
188
4616
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
189 def _incpathcheck(self, f):
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
190 if '\r' in f or '\n' in f:
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
191 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
192 # shadows
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
193 if f in self._dirs:
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
194 raise util.Abort(_('directory named %r already in dirstate') % f)
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
195 for c in strutil.rfindall(f, '/'):
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
196 d = f[:c]
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
197 if d in self._dirs:
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
198 break
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
199 if d in self._map:
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
200 raise util.Abort(_('file named %r already in dirstate') % d)
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
201 self._incpath(f)
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
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
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
204 ''' current states:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
205 n normal
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
206 m needs merging
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
207 r marked for removal
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
208 a marked for addition'''
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
209
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
210 if not files: return
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
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:
4616
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
213 if self._copymap.has_key(f):
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
214 del self._copymap[f]
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
215
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
216 if state == "r":
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
217 self._map[f] = ('r', 0, 0, 0)
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
218 self._decpath(f)
4616
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
diff changeset
219 continue
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
220 else:
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
221 if state == "a":
4616
70352337934e dirstate: refactor checkinterfering
Matt Mackall <mpm@selenic.com>
parents: 4615
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)
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
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
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
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
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
232 try:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
233 del self._map[f]
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
234 self._decpath(f)
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
235 except KeyError:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
236 self._ui.warn(_("not in dirstate: %s!\n") % f)
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
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):
4613
3a645af7fb76 localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents: 4612
diff changeset
240 self.invalidate()
2832
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):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
245 self._map[f] = ('n', 0666, -1, 0)
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
246 self._pl = (parent, nullid)
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
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):
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
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
4374
9edc2d6f7c10 dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4373
diff changeset
252 cs = cStringIO.StringIO()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
253 cs.write("".join(self._pl))
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
254 for f, e in self._map.iteritems():
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
255 c = self.copied(f)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
256 if c:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
257 f = f + "\0" + c
4610
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
258 e = struct.pack(_format, e[0], e[1], e[2], e[3], len(f))
4374
9edc2d6f7c10 dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4373
diff changeset
259 cs.write(e)
9edc2d6f7c10 dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4373
diff changeset
260 cs.write(f)
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
261 st = self._opener("dirstate", "w", atomictemp=True)
4374
9edc2d6f7c10 dirstate: speed up write by 50%.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4373
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: 4446
diff changeset
263 st.rename()
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
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
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
266 def filterfiles(self, files):
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
267 ret = {}
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
268 unknown = []
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
269
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
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 == '.':
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
272 return self._map.copy()
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
273 if x not in self._map:
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
274 unknown.append(x)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
275 else:
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
276 ret[x] = self._map[x]
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
277
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
278 if not unknown:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
279 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
280
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
281 b = self._map.keys()
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
282 b.sort()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
283 blen = len(b)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
284
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
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
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
287 while bs < blen:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
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):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
290 ret[s] = self._map[s]
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
291 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
292 break
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
293 bs += 1
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
294 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
295
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
296 def _supported(self, f, st, verbose=False):
4001
dda03b2d9ef1 symlinks: don't complain about symlinks
Matt Mackall <mpm@selenic.com>
parents: 3891
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')
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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: 4620
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
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
310 def walk(self, files=None, match=util.always, badmatch=None):
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
311 # filter out the stat
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
312 for src, f, st in self.statwalk(files, match, badmatch=badmatch):
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
313 yield src, f
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
314
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
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):
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
317 '''
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
318 walk recursively through the directory tree, finding all files
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
319 matched by the match function
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
320
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
321 results are yielded in a tuple (src, filename, st), where src
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
322 is one of:
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
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
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
325 'm' the file was only in the dirstate and not in the tree
3532
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3529
diff changeset
326 'b' file was not found and matched badmatch
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3529
diff changeset
327
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
328 and st is the stat result if the file was found in the directory.
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
329 '''
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
330
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
331 # walk all files by default
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
332 if not files:
4172
b36bd7534c08 statwalk: don't put self.root in the files list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4075
diff changeset
333 files = ['.']
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
334 dc = self._map.copy()
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
335 else:
3536
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3534
diff changeset
336 files = util.unique(files)
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
337 dc = self.filterfiles(files)
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
338
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
339 def imatch(file_):
4609
b43f17691ae6 dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents: 4608
diff changeset
340 if file_ not in dc and self._ignore(file_):
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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
4609
b43f17691ae6 dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents: 4608
diff changeset
344 ignore = self._ignore
4193
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4172
diff changeset
345 if ignored:
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4172
diff changeset
346 imatch = match
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4172
diff changeset
347 ignore = util.never
3534
549cb7b640fb Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents: 3532
diff changeset
348
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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: 4613
diff changeset
350 common_prefix_len = len(self._root)
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
353 # recursion free walker, faster than os.walk.
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
354 def findfiles(s):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
358 while work:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
359 top = work.pop()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
360 names = os.listdir(top)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
361 names.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
374 for f in names:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
375 np = util.pconvert(os.path.join(nd, f))
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
376 if seen(np):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
377 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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: 4193
diff changeset
382 if not ignore(np):
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
386 if imatch(np) and np in dc:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
387 yield 'm', np, st
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
388 elif imatch(np):
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
389 if self._supported(np, st):
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
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
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
398
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
399 # step one, find all files that match our criteria
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
400 files.sort()
3536
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3534
diff changeset
401 for ff in files:
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3534
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
404 try:
1230
6eac821c202c dirstate: two more stat -> lstat changes
mpm@selenic.com
parents: 1228
diff changeset
405 st = os.lstat(f)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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: 4620
diff changeset
414 self._ui.warn('%s: %s\n' %
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4620
diff changeset
415 (self.pathto(ff), inst.strerror))
3534
549cb7b640fb Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents: 3532
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
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
418 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
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:
3536
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3534
diff changeset
426 if not seen(nf) and match(nf):
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
diff changeset
427 if self._supported(ff, st, verbose=True):
3536
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3534
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:
3536
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3534
diff changeset
430 yield 'm', nf, st
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
431
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
432 # step two run through anything left in the dc hash and yield
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
433 # if we haven't already seen it
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
434 ks = dc.keys()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
435 ks.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
436 for k in ks:
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
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
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
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:
4609
b43f17691ae6 dirstate: move ignore to its own file
Matt Mackall <mpm@selenic.com>
parents: 4608
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
4615
9b00b73a5286 dirstate: hide some more internals
Matt Mackall <mpm@selenic.com>
parents: 4614
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))
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
475 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
476 or (mode ^ st.st_mode) & 0100)
de8ec7e1753a dirstate.status: if a file is marked as copied, consider it modified
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4657
diff changeset
477 or fn in self._copymap):
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
478 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
479 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
480 lookup.append(fn)
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
481 elif list_clean:
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
482 clean.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
483 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
484 modified.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
485 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
486 added.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
487 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
488 removed.append(fn)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
489
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
490 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
491 clean)