Mercurial > public > mercurial-scm > hg
annotate mercurial/dirstate.py @ 4193:dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
This removes a hack where we appended '/' to a dirname so that:
- it would not appear on the "dc" dict
- it would always be matched by the match function
This was a contorted way of checking if the directory was matched by
some hgignore pattern, and it would still fail with some uses of
--include/--exclude patterns.
Things would still work fine if we removed the check altogether and
just appended things to "work" directly, but then we would end up
walking ignored directories too, which could be quite a bit of work.
This allows further simplification of the match function returned by
util._matcher, and fixes walking the working directory with a
--include pattern that matches only the end of a name.
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Sat, 10 Mar 2007 23:00:54 -0300 |
parents | b36bd7534c08 |
children | b5d1eaade333 a7cae4e22749 |
rev | line source |
---|---|
1089 | 1 """ |
2 dirstate.py - working directory tracking for mercurial | |
3 | |
2859 | 4 Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> |
1089 | 5 |
6 This software may be used and distributed according to the terms | |
7 of the GNU General Public License, incorporated herein by reference. | |
8 """ | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
9 |
1094 | 10 from node import * |
1400
cf9a1233738a
i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents:
1396
diff
changeset
|
11 from i18n import gettext as _ |
262 | 12 from demandload import * |
2953 | 13 demandload(globals(), "struct os time bisect stat strutil util re errno") |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
14 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1541
diff
changeset
|
15 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
|
16 format = ">cllll" |
5083cba2a777
dirstate: refactor the dirstate binary format, remove magic numbers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2063
diff
changeset
|
17 |
244 | 18 def __init__(self, opener, ui, root): |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
19 self.opener = opener |
244 | 20 self.root = root |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
21 self.dirty = 0 |
20 | 22 self.ui = ui |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
23 self.map = None |
227 | 24 self.pl = None |
2953 | 25 self.dirs = None |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
26 self.copymap = {} |
723 | 27 self.ignorefunc = None |
28 | |
29 def wjoin(self, f): | |
30 return os.path.join(self.root, f) | |
31 | |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
32 def getcwd(self): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
33 cwd = os.getcwd() |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
34 if cwd == self.root: return '' |
3665
63e173a4ffbc
issue228: Fix repositories at the filesystem root (/ or C:\)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3607
diff
changeset
|
35 # self.root ends with a path separator if self.root is '/' or 'C:\' |
63e173a4ffbc
issue228: Fix repositories at the filesystem root (/ or C:\)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3607
diff
changeset
|
36 common_prefix_len = len(self.root) |
63e173a4ffbc
issue228: Fix repositories at the filesystem root (/ or C:\)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3607
diff
changeset
|
37 if not self.root.endswith(os.sep): |
63e173a4ffbc
issue228: Fix repositories at the filesystem root (/ or C:\)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3607
diff
changeset
|
38 common_prefix_len += 1 |
63e173a4ffbc
issue228: Fix repositories at the filesystem root (/ or C:\)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3607
diff
changeset
|
39 return cwd[common_prefix_len:] |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
40 |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
41 def hgignore(self): |
2003 | 42 '''return the contents of .hgignore files as a list of patterns. |
43 | |
44 the files parsed for patterns include: | |
45 .hgignore in the repository root | |
46 any additional files specified in the [ui] section of ~/.hgrc | |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
47 |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
48 trailing white space is dropped. |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
49 the escape character is backslash. |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
50 comments start with #. |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
51 empty lines are skipped. |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
52 |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
53 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
|
54 |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
55 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
|
56 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
|
57 re:pattern # non-rooted regular expression |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
58 glob:pattern # non-rooted glob |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
59 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
|
60 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
|
61 def parselines(fp): |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
62 for line in fp: |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
63 escape = False |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
64 for i in xrange(len(line)): |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
65 if escape: escape = False |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
66 elif line[i] == '\\': escape = True |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
67 elif line[i] == '#': break |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
68 line = line[:i].rstrip() |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
69 if line: yield line |
2004
7dd6317ab4fd
Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents:
2003
diff
changeset
|
70 repoignore = self.wjoin('.hgignore') |
7dd6317ab4fd
Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents:
2003
diff
changeset
|
71 files = [repoignore] |
2003 | 72 files.extend(self.ui.hgignorefiles()) |
2005
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
73 pats = {} |
2003 | 74 for f in files: |
75 try: | |
2005
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
76 pats[f] = [] |
2003 | 77 fp = open(f) |
78 syntax = 'relre:' | |
79 for line in parselines(fp): | |
80 if line.startswith('syntax:'): | |
81 s = line[7:].strip() | |
82 try: | |
83 syntax = syntaxes[s] | |
84 except KeyError: | |
85 self.ui.warn(_("%s: ignoring invalid " | |
86 "syntax '%s'\n") % (f, s)) | |
87 continue | |
88 pat = syntax + line | |
89 for s in syntaxes.values(): | |
90 if line.startswith(s): | |
91 pat = line | |
92 break | |
2005
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
93 pats[f].append(pat) |
2006
ff8b39daa930
Show reason why an ignore file can't be read and state that it is skipped.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2005
diff
changeset
|
94 except IOError, inst: |
2004
7dd6317ab4fd
Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents:
2003
diff
changeset
|
95 if f != repoignore: |
2006
ff8b39daa930
Show reason why an ignore file can't be read and state that it is skipped.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2005
diff
changeset
|
96 self.ui.warn(_("skipping unreadable ignore file" |
ff8b39daa930
Show reason why an ignore file can't be read and state that it is skipped.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2005
diff
changeset
|
97 " '%s': %s\n") % (f, inst.strerror)) |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
98 return pats |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
99 |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
100 def ignore(self, fn): |
2003 | 101 '''default match function used by dirstate and |
102 localrepository. this honours the repository .hgignore file | |
103 and any other files specified in the [ui] section of .hgrc.''' | |
723 | 104 if not self.ignorefunc: |
1271
9ab14ca22e37
Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1270
diff
changeset
|
105 ignore = self.hgignore() |
2008
11ffa1267185
Don't ignore everything if all hgignore files are empty.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2006
diff
changeset
|
106 allpats = [] |
11ffa1267185
Don't ignore everything if all hgignore files are empty.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2006
diff
changeset
|
107 [allpats.extend(patlist) for patlist in ignore.values()] |
11ffa1267185
Don't ignore everything if all hgignore files are empty.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2006
diff
changeset
|
108 if allpats: |
2005
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
109 try: |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
110 files, self.ignorefunc, anypats = ( |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
111 util.matcher(self.root, inc=allpats, src='.hgignore')) |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
112 except util.Abort: |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
113 # Re-raise an exception where the src is the right file |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
114 for f, patlist in ignore.items(): |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
115 files, self.ignorefunc, anypats = ( |
bc47af2d3693
On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents:
2004
diff
changeset
|
116 util.matcher(self.root, inc=patlist, src=f)) |
1271
9ab14ca22e37
Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1270
diff
changeset
|
117 else: |
9ab14ca22e37
Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1270
diff
changeset
|
118 self.ignorefunc = util.never |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1268
diff
changeset
|
119 return self.ignorefunc(fn) |
220 | 120 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
121 def __del__(self): |
220 | 122 if self.dirty: |
123 self.write() | |
124 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
125 def __getitem__(self, key): |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
126 try: |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
127 return self.map[key] |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
128 except TypeError: |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
129 self.lazyread() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
130 return self[key] |
220 | 131 |
132 def __contains__(self, key): | |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
133 self.lazyread() |
220 | 134 return key in self.map |
135 | |
227 | 136 def parents(self): |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
137 self.lazyread() |
227 | 138 return self.pl |
139 | |
723 | 140 def markdirty(self): |
141 if not self.dirty: | |
142 self.dirty = 1 | |
143 | |
1062 | 144 def setparents(self, p1, p2=nullid): |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
145 self.lazyread() |
723 | 146 self.markdirty() |
227 | 147 self.pl = p1, p2 |
148 | |
220 | 149 def state(self, key): |
150 try: | |
151 return self[key][0] | |
152 except KeyError: | |
153 return "?" | |
154 | |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
155 def lazyread(self): |
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
156 if self.map is None: |
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
157 self.read() |
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
158 |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
159 def parse(self, st): |
227 | 160 self.pl = [st[:20], st[20: 40]] |
161 | |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
162 # deref fields so they will be local in loop |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
163 map = self.map |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
164 copymap = self.copymap |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
165 format = self.format |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
166 unpack = struct.unpack |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
167 |
227 | 168 pos = 40 |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
169 e_size = struct.calcsize(format) |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
170 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
171 while pos < len(st): |
2425
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
172 newpos = pos + e_size |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
173 e = unpack(format, st[pos:newpos]) |
220 | 174 l = e[4] |
2425
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
175 pos = newpos |
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
176 newpos = pos + l |
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
177 f = st[pos:newpos] |
515 | 178 if '\0' in f: |
363 | 179 f, c = f.split('\0') |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
180 copymap[f] = c |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
181 map[f] = e[:4] |
2425
be2fd6398d50
dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2393
diff
changeset
|
182 pos = newpos |
363 | 183 |
2427
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
184 def read(self): |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
185 self.map = {} |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
186 self.pl = [nullid, nullid] |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
187 try: |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
188 st = self.opener("dirstate").read() |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
189 if st: |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
190 self.parse(st) |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
191 except IOError, err: |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
192 if err.errno != errno.ENOENT: raise |
150cde10ea21
dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2425
diff
changeset
|
193 |
363 | 194 def copy(self, source, dest): |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
195 self.lazyread() |
723 | 196 self.markdirty() |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
197 self.copymap[dest] = source |
363 | 198 |
199 def copied(self, file): | |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
200 return self.copymap.get(file, None) |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
201 |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
202 def copies(self): |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
203 return self.copymap |
515 | 204 |
2953 | 205 def initdirs(self): |
206 if self.dirs is None: | |
207 self.dirs = {} | |
208 for f in self.map: | |
209 self.updatedirs(f, 1) | |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3154
diff
changeset
|
210 |
2953 | 211 def updatedirs(self, path, delta): |
212 if self.dirs is not None: | |
213 for c in strutil.findall(path, '/'): | |
214 pc = path[:c] | |
215 self.dirs.setdefault(pc, 0) | |
216 self.dirs[pc] += delta | |
217 | |
3607
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3536
diff
changeset
|
218 def checkinterfering(self, files): |
2953 | 219 def prefixes(f): |
220 for c in strutil.rfindall(f, '/'): | |
221 yield f[:c] | |
222 self.lazyread() | |
223 self.initdirs() | |
224 seendirs = {} | |
225 for f in files: | |
3607
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3536
diff
changeset
|
226 # shadows |
2953 | 227 if self.dirs.get(f): |
228 raise util.Abort(_('directory named %r already in dirstate') % | |
229 f) | |
230 for d in prefixes(f): | |
231 if d in seendirs: | |
232 break | |
233 if d in self.map: | |
234 raise util.Abort(_('file named %r already in dirstate') % | |
235 d) | |
236 seendirs[d] = True | |
3607
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3536
diff
changeset
|
237 # disallowed |
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3536
diff
changeset
|
238 if '\r' in f or '\n' in f: |
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3536
diff
changeset
|
239 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames")) |
2953 | 240 |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
241 def update(self, files, state, **kw): |
220 | 242 ''' current states: |
243 n normal | |
231 | 244 m needs merging |
220 | 245 r marked for removal |
246 a marked for addition''' | |
247 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
248 if not files: return |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
249 self.lazyread() |
723 | 250 self.markdirty() |
2953 | 251 if state == "a": |
252 self.initdirs() | |
3607
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3536
diff
changeset
|
253 self.checkinterfering(files) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
254 for f in files: |
220 | 255 if state == "r": |
256 self.map[f] = ('r', 0, 0, 0) | |
2953 | 257 self.updatedirs(f, -1) |
220 | 258 else: |
2953 | 259 if state == "a": |
260 self.updatedirs(f, 1) | |
1510
755e7ac351ef
use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1491
diff
changeset
|
261 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
|
262 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
|
263 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
|
264 self.map[f] = (state, s.st_mode, st_size, st_mtime) |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
265 if self.copymap.has_key(f): |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
266 del self.copymap[f] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
267 |
220 | 268 def forget(self, files): |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
269 if not files: return |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
270 self.lazyread() |
723 | 271 self.markdirty() |
2953 | 272 self.initdirs() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
273 for f in files: |
20 | 274 try: |
275 del self.map[f] | |
2953 | 276 self.updatedirs(f, -1) |
20 | 277 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
|
278 self.ui.warn(_("not in dirstate: %s!\n") % f) |
20 | 279 pass |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
280 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
281 def clear(self): |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
282 self.map = {} |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
283 self.copymap = {} |
2953 | 284 self.dirs = None |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
285 self.markdirty() |
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
286 |
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
287 def rebuild(self, parent, files): |
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
288 self.clear() |
2832
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
289 for f in files: |
e196aa1df169
Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents:
2486
diff
changeset
|
290 if files.execf(f): |
3842
47c634bf1e92
remove unnecessary call to umask
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3665
diff
changeset
|
291 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
|
292 else: |
3842
47c634bf1e92
remove unnecessary call to umask
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3665
diff
changeset
|
293 self.map[f] = ('n', 0666, -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
|
294 self.pl = (parent, nullid) |
723 | 295 self.markdirty() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
296 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
297 def write(self): |
1794
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
298 if not self.dirty: |
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
299 return |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
300 st = self.opener("dirstate", "w", atomic=True) |
227 | 301 st.write("".join(self.pl)) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
302 for f, e in self.map.items(): |
363 | 303 c = self.copied(f) |
304 if c: | |
305 f = f + "\0" + c | |
2393
5083cba2a777
dirstate: refactor the dirstate binary format, remove magic numbers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2063
diff
changeset
|
306 e = struct.pack(self.format, 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
|
307 st.write(e + f) |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
308 self.dirty = 0 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
309 |
879 | 310 def filterfiles(self, files): |
311 ret = {} | |
312 unknown = [] | |
313 | |
314 for x in files: | |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1529
diff
changeset
|
315 if x == '.': |
879 | 316 return self.map.copy() |
317 if x not in self.map: | |
318 unknown.append(x) | |
319 else: | |
320 ret[x] = self.map[x] | |
919 | 321 |
879 | 322 if not unknown: |
323 return ret | |
324 | |
325 b = self.map.keys() | |
326 b.sort() | |
327 blen = len(b) | |
328 | |
329 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
|
330 bs = bisect.bisect(b, "%s%s" % (x, '/')) |
879 | 331 while bs < blen: |
332 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
|
333 if len(s) > len(x) and s.startswith(x): |
2486
3ea8111ead90
simplify filterfiles when filtering based on a directory
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2485
diff
changeset
|
334 ret[s] = self.map[s] |
879 | 335 else: |
336 break | |
337 bs += 1 | |
338 return ret | |
339 | |
1527
c13fce7167c2
don't print anything about file of unsupported type unless
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1510
diff
changeset
|
340 def supported_type(self, f, st, verbose=False): |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 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
|
347 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
|
348 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
|
349 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
|
350 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
|
351 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
|
352 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
|
353 kind)) |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
354 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
|
355 |
3529 | 356 def walk(self, files=None, match=util.always, badmatch=None): |
357 # filter out the stat | |
358 for src, f, st in self.statwalk(files, match, badmatch=badmatch): | |
359 yield src, f | |
360 | |
361 def statwalk(self, files=None, match=util.always, ignored=False, | |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
362 badmatch=None): |
3529 | 363 ''' |
364 walk recursively through the directory tree, finding all files | |
365 matched by the match function | |
366 | |
367 results are yielded in a tuple (src, filename, st), where src | |
368 is one of: | |
369 'f' the file was found in the directory tree | |
370 'm' the file was only in the dirstate and not in the tree | |
3532 | 371 'b' file was not found and matched badmatch |
372 | |
3529 | 373 and st is the stat result if the file was found in the directory. |
374 ''' | |
1529
a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1527
diff
changeset
|
375 self.lazyread() |
879 | 376 |
723 | 377 # walk all files by default |
879 | 378 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
|
379 files = ['.'] |
3529 | 380 dc = self.map.copy() |
381 else: | |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
382 files = util.unique(files) |
879 | 383 dc = self.filterfiles(files) |
919 | 384 |
3529 | 385 def imatch(file_): |
3534
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3532
diff
changeset
|
386 if file_ not in dc and self.ignore(file_): |
1183 | 387 return False |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
388 return match(file_) |
1224
cc61d366bc3b
Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents:
1183
diff
changeset
|
389 |
4193
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
390 ignore = self.ignore |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
391 if ignored: |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
392 imatch = match |
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
393 ignore = util.never |
3534
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3532
diff
changeset
|
394 |
2671
82864a2eb709
self.root == '/': prefix length computation out of the loop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2670
diff
changeset
|
395 # self.root may end with a path separator when self.root == '/' |
82864a2eb709
self.root == '/': prefix length computation out of the loop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2670
diff
changeset
|
396 common_prefix_len = len(self.root) |
4075
31a679ae7eef
Fix dirstate fail at drive root on Windows
Andrei Vermel <avermel@mail.ru>
parents:
3842
diff
changeset
|
397 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
|
398 common_prefix_len += 1 |
1183 | 399 # recursion free walker, faster than os.walk. |
400 def findfiles(s): | |
401 work = [s] | |
402 while work: | |
403 top = work.pop() | |
404 names = os.listdir(top) | |
405 names.sort() | |
406 # 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
|
407 nd = util.normpath(top[common_prefix_len:]) |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
408 if nd == '.': |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
409 nd = '' |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
410 else: |
2063
f1fda71e134e
benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2062
diff
changeset
|
411 # 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
|
412 # 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
|
413 # is good on big directory. |
2061
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
414 hg = bisect.bisect_left(names, '.hg') |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
415 if hg < len(names) and names[hg] == '.hg': |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
416 if os.path.isdir(os.path.join(top, '.hg')): |
5987c1eac2ce
support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
417 continue |
1183 | 418 for f in names: |
1562 | 419 np = util.pconvert(os.path.join(nd, f)) |
1183 | 420 if seen(np): |
421 continue | |
422 p = os.path.join(top, f) | |
1228
db950da49539
Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents:
1224
diff
changeset
|
423 # don't trip over symlinks |
db950da49539
Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents:
1224
diff
changeset
|
424 st = os.lstat(p) |
1183 | 425 if stat.S_ISDIR(st.st_mode): |
4193
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4172
diff
changeset
|
426 if not ignore(p): |
1183 | 427 work.append(p) |
3529 | 428 if imatch(np) and np in dc: |
1562 | 429 yield 'm', np, st |
3529 | 430 elif imatch(np): |
1487
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
431 if self.supported_type(np, st): |
1562 | 432 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
|
433 elif np in dc: |
1562 | 434 yield 'm', np, st |
1392
32d8068b3e36
add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1276
diff
changeset
|
435 |
821
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
436 known = {'.hg': 1} |
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
437 def seen(fn): |
72d9bd4841f3
Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents:
820
diff
changeset
|
438 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
|
439 known[fn] = 1 |
1183 | 440 |
441 # step one, find all files that match our criteria | |
442 files.sort() | |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
443 for ff in files: |
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
444 nf = util.normpath(ff) |
1510
755e7ac351ef
use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1491
diff
changeset
|
445 f = self.wjoin(ff) |
1183 | 446 try: |
1230 | 447 st = os.lstat(f) |
1183 | 448 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
|
449 found = False |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
450 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
|
451 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
|
452 found = True |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
453 break |
34579a67fa71
Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents:
1562
diff
changeset
|
454 if not found: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
455 if inst.errno != errno.ENOENT or not badmatch: |
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
456 self.ui.warn('%s: %s\n' % ( |
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
457 util.pathto(self.getcwd(), ff), |
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
458 inst.strerror)) |
3534
549cb7b640fb
Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents:
3532
diff
changeset
|
459 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
|
460 yield 'b', ff, None |
1183 | 461 continue |
462 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
|
463 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
|
464 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
|
465 sorted_.sort(cmp1) |
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
466 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
|
467 yield e |
1392
32d8068b3e36
add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1276
diff
changeset
|
468 else: |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
469 if not seen(nf) and match(nf): |
1527
c13fce7167c2
don't print anything about file of unsupported type unless
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1510
diff
changeset
|
470 if self.supported_type(ff, st, verbose=True): |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
471 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
|
472 elif ff in dc: |
3536
ece5c53577eb
small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents:
3534
diff
changeset
|
473 yield 'm', nf, st |
536 | 474 |
1183 | 475 # step two run through anything left in the dc hash and yield |
476 # if we haven't already seen it | |
477 ks = dc.keys() | |
478 ks.sort() | |
479 for k in ks: | |
3529 | 480 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
|
481 yield 'm', k, None |
669
8aa2a282eda4
.hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents:
667
diff
changeset
|
482 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
483 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
|
484 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
|
485 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
|
486 removed, deleted, clean = [], [], [] |
723 | 487 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
488 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
|
489 try: |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
490 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
|
491 except KeyError: |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
492 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
|
493 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
|
494 else: |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
495 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
|
496 continue |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
497 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
|
498 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
|
499 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
|
500 try: |
2429
6a8f7c3f7333
dirstate: fix call to os.lstat when st is None
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2427
diff
changeset
|
501 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
|
502 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
|
503 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
|
504 raise |
2bc6cd62a29c
fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1476
diff
changeset
|
505 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
|
506 # 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
|
507 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
|
508 nonexistent = False |
1476
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
509 # 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
|
510 # 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
|
511 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
|
512 deleted.append(fn) |
17e8c70fb670
fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1471
diff
changeset
|
513 continue |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
514 # 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
|
515 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
|
516 if not st: |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2429
diff
changeset
|
517 st = os.lstat(self.wjoin(fn)) |
1755
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
518 if size >= 0 and (size != st.st_size |
a8f7791e3680
add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1749
diff
changeset
|
519 or (mode ^ st.st_mode) & 0100): |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
520 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
|
521 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
|
522 lookup.append(fn) |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
523 elif list_clean: |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
524 clean.append(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
525 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
|
526 modified.append(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
527 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
|
528 added.append(fn) |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1617
diff
changeset
|
529 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
|
530 removed.append(fn) |
1183 | 531 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
532 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
|
533 clean) |