annotate mercurial/dirstate.py @ 1487:2bc6cd62a29c

fix handling of files of unsupported type in the walk code if a file was of unsupported type, it was considered as 'seen' while walking. this way it was possible to have file in the dirstate not yielded by the walk function.
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Wed, 02 Nov 2005 15:46:31 -0800
parents 17e8c70fb670
children 08c7851969cc
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
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
4 Copyright 2005 Matt Mackall <mpm@selenic.com>
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: 1089
diff changeset
10 import struct, os
221b5252864c Adjust some imports
mpm@selenic.com
parents: 1089
diff changeset
11 from node import *
1400
cf9a1233738a i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents: 1396
diff changeset
12 from i18n import gettext as _
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
13 from demandload import *
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
14 demandload(globals(), "time bisect stat util re errno")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
15
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
16 class dirstate:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
17 def __init__(self, opener, ui, root):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
18 self.opener = opener
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
19 self.root = root
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20 self.dirty = 0
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
21 self.ui = ui
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
22 self.map = None
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
23 self.pl = None
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
24 self.copies = {}
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
25 self.ignorefunc = None
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
26 self.blockignore = False
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
27
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
28 def wjoin(self, f):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
29 return os.path.join(self.root, f)
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
30
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
31 def getcwd(self):
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
32 cwd = os.getcwd()
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
33 if cwd == self.root: return ''
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
34 return cwd[len(self.root) + 1:]
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
35
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
36 def hgignore(self):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
37 '''return the contents of .hgignore as a list of patterns.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
38
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
39 trailing white space is dropped.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
40 the escape character is backslash.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
41 comments start with #.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
42 empty lines are skipped.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
43
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
44 lines can be of the following formats:
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
45
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
46 syntax: regexp # defaults following lines to non-rooted regexps
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
47 syntax: glob # defaults following lines to non-rooted globs
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
48 re:pattern # non-rooted regular expression
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
49 glob:pattern # non-rooted glob
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
50 pattern # pattern of the current default type'''
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
51 syntaxes = {'re': 'relre:', 'regexp': 'relre:', 'glob': 'relglob:'}
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
52 def parselines(fp):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
53 for line in fp:
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
54 escape = False
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
55 for i in xrange(len(line)):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
56 if escape: escape = False
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
57 elif line[i] == '\\': escape = True
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
58 elif line[i] == '#': break
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
59 line = line[:i].rstrip()
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
60 if line: yield line
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
61 pats = []
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
62 try:
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
63 fp = open(self.wjoin('.hgignore'))
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
64 syntax = 'relre:'
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
65 for line in parselines(fp):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
66 if line.startswith('syntax:'):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
67 s = line[7:].strip()
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
68 try:
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
69 syntax = syntaxes[s]
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
70 except KeyError:
1402
9d2c2e6b32b5 i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1400
diff changeset
71 self.ui.warn(_("ignoring invalid syntax '%s'\n") % s)
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
72 continue
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
73 pat = syntax + line
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
74 for s in syntaxes.values():
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
75 if line.startswith(s):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
76 pat = line
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
77 break
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
78 pats.append(pat)
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
79 except IOError: pass
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
80 return pats
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
81
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
82 def ignore(self, fn):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
83 '''default match function used by dirstate and localrepository.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
84 this honours the .hgignore file, and nothing more.'''
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
85 if self.blockignore:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
86 return False
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
87 if not self.ignorefunc:
1271
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
88 ignore = self.hgignore()
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
89 if ignore:
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
90 files, self.ignorefunc, anypats = util.matcher(self.root,
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
91 inc=ignore)
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
92 else:
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
93 self.ignorefunc = util.never
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
94 return self.ignorefunc(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
95
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
96 def __del__(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
97 if self.dirty:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
98 self.write()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
99
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
100 def __getitem__(self, key):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
101 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
102 return self.map[key]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
103 except TypeError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
104 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
105 return self[key]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
106
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
107 def __contains__(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
108 if not self.map: self.read()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
109 return key in self.map
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
110
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
111 def parents(self):
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
112 if not self.pl:
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
113 self.read()
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
114 return self.pl
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
115
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
116 def markdirty(self):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
117 if not self.dirty:
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
118 self.dirty = 1
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
119
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1040
diff changeset
120 def setparents(self, p1, p2=nullid):
1394
b20b683e8d95 dirstate: make sure we read the dirstate before setting parents
Matt Mackall <mpm@selenic.com>
parents: 1392
diff changeset
121 if not self.pl:
b20b683e8d95 dirstate: make sure we read the dirstate before setting parents
Matt Mackall <mpm@selenic.com>
parents: 1392
diff changeset
122 self.read()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
123 self.markdirty()
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
124 self.pl = p1, p2
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
125
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
126 def state(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
127 try:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
128 return self[key][0]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
129 except KeyError:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
130 return "?"
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
131
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
132 def read(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
133 if self.map is not None: return self.map
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
134
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
135 self.map = {}
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
136 self.pl = [nullid, nullid]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
137 try:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
138 st = self.opener("dirstate").read()
311
3b17056b72dc fix KeyErrors from reading empty dirstate
mpm@selenic.com
parents: 308
diff changeset
139 if not st: return
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
140 except: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
141
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
142 self.pl = [st[:20], st[20: 40]]
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
143
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
144 pos = 40
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
145 while pos < len(st):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
146 e = struct.unpack(">cllll", st[pos:pos+17])
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
147 l = e[4]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
148 pos += 17
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
149 f = st[pos:pos + l]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
150 if '\0' in f:
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
151 f, c = f.split('\0')
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
152 self.copies[f] = c
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
153 self.map[f] = e[:4]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
154 pos += l
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
155
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
156 def copy(self, source, dest):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
157 self.read()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
158 self.markdirty()
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
159 self.copies[dest] = source
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
160
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
161 def copied(self, file):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
162 return self.copies.get(file, None)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
163
862
d70c1c31fd45 Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 861
diff changeset
164 def update(self, files, state, **kw):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
165 ''' current states:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
166 n normal
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
167 m needs merging
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
168 r marked for removal
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
169 a marked for addition'''
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
170
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
171 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
172 self.read()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
173 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
174 for f in files:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
175 if state == "r":
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
176 self.map[f] = ('r', 0, 0, 0)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
177 else:
1230
6eac821c202c dirstate: two more stat -> lstat changes
mpm@selenic.com
parents: 1228
diff changeset
178 s = os.lstat(os.path.join(self.root, f))
862
d70c1c31fd45 Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 861
diff changeset
179 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
180 st_mtime = kw.get('st_mtime', s.st_mtime)
865
2d2fee33ec68 Cleanup after previous changes:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 863
diff changeset
181 self.map[f] = (state, s.st_mode, st_size, st_mtime)
1117
30ab5b8ee8ec fix some rename/copy bugs
mpm@selenic.com
parents: 1104
diff changeset
182 if self.copies.has_key(f):
30ab5b8ee8ec fix some rename/copy bugs
mpm@selenic.com
parents: 1104
diff changeset
183 del self.copies[f]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
184
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
185 def forget(self, files):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
186 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
187 self.read()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
188 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
189 for f in files:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
190 try:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
191 del self.map[f]
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
192 except KeyError:
1402
9d2c2e6b32b5 i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1400
diff changeset
193 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
194 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
195
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
196 def clear(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
197 self.map = {}
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
198 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
199
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
200 def write(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
201 st = self.opener("dirstate", "w")
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
202 st.write("".join(self.pl))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
203 for f, e in self.map.items():
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
204 c = self.copied(f)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
205 if c:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
206 f = f + "\0" + c
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
207 e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
208 st.write(e + f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
209 self.dirty = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
210
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
211 def filterfiles(self, files):
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
212 ret = {}
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
213 unknown = []
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
214
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
215 for x in files:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
216 if x is '.':
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
217 return self.map.copy()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
218 if x not in self.map:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
219 unknown.append(x)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
220 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
221 ret[x] = self.map[x]
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
222
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
223 if not unknown:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
224 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
225
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
226 b = self.map.keys()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
227 b.sort()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
228 blen = len(b)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
229
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
230 for x in unknown:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
231 bs = bisect.bisect(b, x)
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
232 if bs != 0 and b[bs-1] == x:
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
233 ret[x] = self.map[x]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
234 continue
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
235 while bs < blen:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
236 s = b[bs]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
237 if len(s) > len(x) and s.startswith(x) and s[len(x)] == '/':
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
238 ret[s] = self.map[s]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
239 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
240 break
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
241 bs += 1
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
242 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
243
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
244 def supported_type(self, f, st, verbose=True):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
245 if stat.S_ISREG(st.st_mode):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
246 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
247 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
248 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
249 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
250 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
251 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
252 elif stat.S_ISLNK(st.st_mode): kind = _('symbolic link')
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
253 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
254 elif stat.S_ISDIR(st.st_mode): kind = _('directory')
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
255 self.ui.warn(_('%s: unsupported file type (type is %s)\n') % (
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
256 util.pathto(self.getcwd(), f),
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
257 kind))
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
258 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
259
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
260 def statwalk(self, files=None, match=util.always, dc=None):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
261 self.read()
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
262
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
263 # walk all files by default
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
264 if not files:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
265 files = [self.root]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
266 if not dc:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
267 dc = self.map.copy()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
268 elif not dc:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
269 dc = self.filterfiles(files)
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
270
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
271 def statmatch(file, stat):
1224
cc61d366bc3b Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents: 1183
diff changeset
272 file = util.pconvert(file)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
273 if file not in dc and self.ignore(file):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
274 return False
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
275 return match(file)
1224
cc61d366bc3b Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents: 1183
diff changeset
276
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
277 return self.walkhelper(files=files, statmatch=statmatch, dc=dc)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
278
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
279 def walk(self, files=None, match=util.always, dc=None):
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
280 # filter out the stat
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
281 for src, f, st in self.statwalk(files, match, dc):
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
282 yield src, f
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
283
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
284 # walk recursively through the directory tree, finding all files
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
285 # matched by the statmatch function
1224
cc61d366bc3b Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents: 1183
diff changeset
286 #
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
287 # results are yielded in a tuple (src, filename, st), where src
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
288 # is one of:
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
289 # 'f' the file was found in the directory tree
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
290 # 'm' the file was only in the dirstate and not in the tree
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
291 # and st is the stat result if the file was found in the directory.
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
292 #
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
293 # dc is an optional arg for the current dirstate. dc is not modified
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
294 # directly by this function, but might be modified by your statmatch call.
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
295 #
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
296 def walkhelper(self, files, statmatch, dc):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
297 # recursion free walker, faster than os.walk.
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
298 def findfiles(s):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
299 retfiles = []
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
300 work = [s]
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
301 while work:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
302 top = work.pop()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
303 names = os.listdir(top)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
304 names.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
305 # nd is the top of the repository dir tree
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
306 nd = util.normpath(top[len(self.root) + 1:])
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
307 if nd == '.': nd = ''
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
308 for f in names:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
309 np = os.path.join(nd, f)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
310 if seen(np):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
311 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
312 p = os.path.join(top, f)
1228
db950da49539 Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents: 1224
diff changeset
313 # don't trip over symlinks
db950da49539 Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents: 1224
diff changeset
314 st = os.lstat(p)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
315 if stat.S_ISDIR(st.st_mode):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
316 ds = os.path.join(nd, f +'/')
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
317 if statmatch(ds, st):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
318 work.append(p)
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
319 if statmatch(np, st) and np in dc:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
320 yield 'm', util.pconvert(np), st
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
321 elif statmatch(np, st):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
322 if self.supported_type(np, st):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
323 yield 'f', util.pconvert(np), st
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
324 elif np in dc:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
325 yield 'm', util.pconvert(np), st
1392
32d8068b3e36 add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1276
diff changeset
326
821
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
327 known = {'.hg': 1}
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
328 def seen(fn):
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
329 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
330 known[fn] = 1
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
331
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
332 # step one, find all files that match our criteria
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
333 files.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
334 for ff in util.unique(files):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
335 f = os.path.join(self.root, ff)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
336 try:
1230
6eac821c202c dirstate: two more stat -> lstat changes
mpm@selenic.com
parents: 1228
diff changeset
337 st = os.lstat(f)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
338 except OSError, inst:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
339 if ff not in dc: self.ui.warn('%s: %s\n' % (
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
340 util.pathto(self.getcwd(), ff),
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
341 inst.strerror))
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
342 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
343 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
344 cmp1 = (lambda x, y: cmp(x[1], y[1]))
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
345 sorted = [ x for x in findfiles(f) ]
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
346 sorted.sort(cmp1)
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
347 for e in sorted:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
348 yield e
1392
32d8068b3e36 add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1276
diff changeset
349 else:
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
350 ff = util.normpath(ff)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
351 if seen(ff):
884
087771ebe2e6 Fix walk code for files that do not exist anywhere, and unhandled types.
Bryan O'Sullivan <bos@serpentine.com>
parents: 883
diff changeset
352 continue
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
353 self.blockignore = True
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
354 if statmatch(ff, st):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
355 if self.supported_type(ff, st):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
356 yield 'f', ff, st
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
357 elif ff in dc:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
358 yield 'm', ff, st
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
359 self.blockignore = False
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
360
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
361 # step two run through anything left in the dc hash and yield
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
362 # if we haven't already seen it
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
363 ks = dc.keys()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
364 ks.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
365 for k in ks:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
366 if not seen(k) and (statmatch(k, None)):
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
367 yield 'm', k, None
669
8aa2a282eda4 .hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents: 667
diff changeset
368
861
cbe5c4d016b7 dirstate.changes() now distinguishes 'hg remove'd or just deleted files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 856
diff changeset
369 def changes(self, files=None, match=util.always):
cbe5c4d016b7 dirstate.changes() now distinguishes 'hg remove'd or just deleted files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 856
diff changeset
370 lookup, modified, added, unknown = [], [], [], []
cbe5c4d016b7 dirstate.changes() now distinguishes 'hg remove'd or just deleted files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 856
diff changeset
371 removed, deleted = [], []
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
372
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
373 for src, fn, st in self.statwalk(files, match):
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
374 try:
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
375 type, mode, size, time = self[fn]
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
376 except KeyError:
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
377 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
378 continue
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
379 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
380 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
381 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
382 try:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
383 st = os.lstat(fn)
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
384 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
385 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
386 raise
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
387 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
388 # We need to re-check that it is a valid file
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
389 if st and self.supported_type(fn, st):
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
390 nonexistent = False
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
391 # 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
392 # who are not removed in the dirstate ?
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
393 if nonexistent:
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
394 deleted.append(fn)
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
395 continue
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
396 # check the common case first
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
397 if type == 'n':
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
398 if not st:
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
399 st = os.stat(fn)
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
400 if size != st.st_size or (mode ^ st.st_mode) & 0100:
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
401 modified.append(fn)
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
402 elif time != st.st_mtime:
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
403 lookup.append(fn)
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
404 elif type == 'm':
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
405 modified.append(fn)
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
406 elif type == 'a':
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
407 added.append(fn)
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
408 elif type == 'r':
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
409 removed.append(fn)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
410
861
cbe5c4d016b7 dirstate.changes() now distinguishes 'hg remove'd or just deleted files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 856
diff changeset
411 return (lookup, modified, added, removed + deleted, unknown)