annotate mercurial/dirstate.py @ 2439:e8c4f3d3df8c

extend network protocol to stop clients from locking servers now all repositories have capabilities slot, tuple with list of names. if 'unbundle' capability present, repo supports push where client does not need to lock server. repository classes that have unbundle capability also have unbundle method. implemented for ssh now, will be base for push over http. unbundle protocol acts this way. server tells client what heads it has during normal negotiate step. client starts unbundle by repeat server's heads back to it. if server has new heads, abort immediately. otherwise, transfer changes to server. once data transferred, server locks and checks heads again. if heads same, changes can be added. else someone else added heads, and server aborts. if client wants to force server to add heads, sends special heads list of 'force'.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Thu, 15 Jun 2006 16:37:23 -0700
parents 6a8f7c3f7333
children b77a2ef61b81
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
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1541
diff changeset
16 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
17 format = ">cllll"
5083cba2a777 dirstate: refactor the dirstate binary format, remove magic numbers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2063
diff changeset
18
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
19 def __init__(self, opener, ui, root):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20 self.opener = opener
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
21 self.root = root
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
22 self.dirty = 0
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
23 self.ui = ui
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
24 self.map = None
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
25 self.pl = None
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
26 self.copies = {}
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
27 self.ignorefunc = None
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
28 self.blockignore = False
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
29
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
30 def wjoin(self, f):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
31 return os.path.join(self.root, f)
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
32
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
33 def getcwd(self):
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
34 cwd = os.getcwd()
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
35 if cwd == self.root: return ''
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
36 return cwd[len(self.root) + 1:]
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
37
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
38 def hgignore(self):
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
39 '''return the contents of .hgignore files as a list of patterns.
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
40
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
41 the files parsed for patterns include:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
42 .hgignore in the repository root
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
43 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
44
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
45 trailing white space is dropped.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
46 the escape character is backslash.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
47 comments start with #.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
48 empty lines are skipped.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
49
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
50 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
51
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
52 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
53 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
54 re:pattern # non-rooted regular expression
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
55 glob:pattern # non-rooted glob
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
56 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
57 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
58 def parselines(fp):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
59 for line in fp:
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
60 escape = False
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
61 for i in xrange(len(line)):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
62 if escape: escape = False
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
63 elif line[i] == '\\': escape = True
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
64 elif line[i] == '#': break
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
65 line = line[:i].rstrip()
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
66 if line: yield line
2004
7dd6317ab4fd Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents: 2003
diff changeset
67 repoignore = self.wjoin('.hgignore')
7dd6317ab4fd Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents: 2003
diff changeset
68 files = [repoignore]
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
69 files.extend(self.ui.hgignorefiles())
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
70 pats = {}
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
71 for f in files:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
72 try:
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
73 pats[f] = []
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
74 fp = open(f)
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
75 syntax = 'relre:'
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
76 for line in parselines(fp):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
77 if line.startswith('syntax:'):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
78 s = line[7:].strip()
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
79 try:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
80 syntax = syntaxes[s]
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
81 except KeyError:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
82 self.ui.warn(_("%s: ignoring invalid "
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
83 "syntax '%s'\n") % (f, s))
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
84 continue
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
85 pat = syntax + line
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
86 for s in syntaxes.values():
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
87 if line.startswith(s):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
88 pat = line
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
89 break
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
90 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
91 except IOError, inst:
2004
7dd6317ab4fd Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents: 2003
diff changeset
92 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
93 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
94 " '%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
95 return pats
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
96
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
97 def ignore(self, fn):
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
98 '''default match function used by dirstate and
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
99 localrepository. this honours the repository .hgignore file
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
100 and any other files specified in the [ui] section of .hgrc.'''
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
101 if self.blockignore:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
102 return False
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
103 if not self.ignorefunc:
1271
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
104 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
105 allpats = []
11ffa1267185 Don't ignore everything if all hgignore files are empty.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2006
diff changeset
106 [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
107 if allpats:
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
108 try:
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
109 files, self.ignorefunc, anypats = (
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
110 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
111 except util.Abort:
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
112 # 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
113 for f, patlist in ignore.items():
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
114 files, self.ignorefunc, anypats = (
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
115 util.matcher(self.root, inc=patlist, src=f))
1271
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
116 else:
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
117 self.ignorefunc = util.never
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
118 return self.ignorefunc(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
119
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
120 def __del__(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
121 if self.dirty:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
122 self.write()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
123
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
124 def __getitem__(self, key):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
125 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
126 return self.map[key]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
127 except TypeError:
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
128 self.lazyread()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
129 return self[key]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
130
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
131 def __contains__(self, key):
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
132 self.lazyread()
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
133 return key in self.map
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
134
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
135 def parents(self):
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
136 self.lazyread()
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
137 return self.pl
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
138
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
139 def markdirty(self):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
140 if not self.dirty:
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
141 self.dirty = 1
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
142
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1040
diff changeset
143 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
144 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
145 self.markdirty()
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
146 self.pl = p1, p2
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
147
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
148 def state(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
149 try:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
150 return self[key][0]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
151 except KeyError:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
152 return "?"
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
153
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
154 def lazyread(self):
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
155 if self.map is None:
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
156 self.read()
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
157
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
158 def parse(self, st):
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
159 self.pl = [st[:20], st[20: 40]]
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
160
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
161 # 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
162 map = self.map
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
163 copies = self.copies
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
164 format = self.format
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
165 unpack = struct.unpack
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
166
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
167 pos = 40
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
168 e_size = struct.calcsize(format)
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
169
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
170 while pos < len(st):
2425
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
171 newpos = pos + e_size
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
172 e = unpack(format, st[pos:newpos])
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
173 l = e[4]
2425
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
174 pos = newpos
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
175 newpos = pos + l
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
176 f = st[pos:newpos]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
177 if '\0' in f:
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
178 f, c = f.split('\0')
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
179 copies[f] = c
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
180 map[f] = e[:4]
2425
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
181 pos = newpos
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
182
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
183 def read(self):
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
184 self.map = {}
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
185 self.pl = [nullid, nullid]
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
186 try:
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
187 st = self.opener("dirstate").read()
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
188 if st:
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
189 self.parse(st)
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
190 except IOError, err:
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
191 if err.errno != errno.ENOENT: raise
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
192
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
193 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
194 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
195 self.markdirty()
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
196 self.copies[dest] = source
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
197
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
198 def copied(self, file):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
199 return self.copies.get(file, None)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
200
862
d70c1c31fd45 Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 861
diff changeset
201 def update(self, files, state, **kw):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
202 ''' current states:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
203 n normal
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
204 m needs merging
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
205 r marked for removal
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
206 a marked for addition'''
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
207
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
208 if not files: return
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
209 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
210 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
211 for f in files:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
212 if state == "r":
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
213 self.map[f] = ('r', 0, 0, 0)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
214 else:
1510
755e7ac351ef use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1491
diff changeset
215 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
216 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
217 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
218 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
219 if self.copies.has_key(f):
30ab5b8ee8ec fix some rename/copy bugs
mpm@selenic.com
parents: 1104
diff changeset
220 del self.copies[f]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
221
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
222 def forget(self, files):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
223 if not files: return
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
224 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
225 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
226 for f in files:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
227 try:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
228 del self.map[f]
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
229 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
230 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
231 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
232
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
233 def clear(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
234 self.map = {}
1755
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
235 self.copies = {}
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
236 self.markdirty()
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
237
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
238 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
239 self.clear()
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
240 umask = os.umask(0)
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
241 os.umask(umask)
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
242 for f, mode in files:
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
243 if mode:
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
244 self.map[f] = ('n', ~umask, -1, 0)
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
245 else:
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
246 self.map[f] = ('n', ~umask & 0666, -1, 0)
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
247 self.pl = (parent, nullid)
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
248 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
249
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
250 def write(self):
1794
98b6c1cad58b only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1755
diff changeset
251 if not self.dirty:
98b6c1cad58b only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1755
diff changeset
252 return
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
253 st = self.opener("dirstate", "w", atomic=True)
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
254 st.write("".join(self.pl))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
255 for f, e in self.map.items():
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
256 c = self.copied(f)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
257 if c:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
258 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
259 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
260 st.write(e + f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
261 self.dirty = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
262
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
263 def filterfiles(self, files):
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
264 ret = {}
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
265 unknown = []
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
266
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
267 for x in files:
1541
bf4e7ef08741 fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents: 1529
diff changeset
268 if x == '.':
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
269 return self.map.copy()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
270 if x not in self.map:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
271 unknown.append(x)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
272 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
273 ret[x] = self.map[x]
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
274
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
275 if not unknown:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
276 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
277
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
278 b = self.map.keys()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
279 b.sort()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
280 blen = len(b)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
281
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
282 for x in unknown:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
283 bs = bisect.bisect(b, x)
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
284 if bs != 0 and b[bs-1] == x:
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
285 ret[x] = self.map[x]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
286 continue
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
287 while bs < blen:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
288 s = b[bs]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
289 if len(s) > len(x) and s.startswith(x) and s[len(x)] == '/':
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
290 ret[s] = self.map[s]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
291 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
292 break
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
293 bs += 1
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
294 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
295
1527
c13fce7167c2 don't print anything about file of unsupported type unless
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1510
diff changeset
296 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
297 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
298 return True
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
299 if verbose:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
300 kind = 'unknown'
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
301 if stat.S_ISCHR(st.st_mode): kind = _('character device')
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
302 elif stat.S_ISBLK(st.st_mode): kind = _('block device')
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
303 elif stat.S_ISFIFO(st.st_mode): kind = _('fifo')
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
304 elif stat.S_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
305 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
306 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
307 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
308 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
309 kind))
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
310 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
311
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
312 def statwalk(self, files=None, match=util.always, dc=None, ignored=False,
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
313 badmatch=None):
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
314 self.lazyread()
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
315
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
316 # walk all files by default
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
317 if not files:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
318 files = [self.root]
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
319 if not dc:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
320 dc = self.map.copy()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
321 elif not dc:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
322 dc = self.filterfiles(files)
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
323
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
324 def statmatch(file_, stat):
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
325 file_ = util.pconvert(file_)
2022
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
326 if not ignored and file_ not in dc and self.ignore(file_):
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
327 return False
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
328 return match(file_)
1224
cc61d366bc3b Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents: 1183
diff changeset
329
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
330 return self.walkhelper(files=files, statmatch=statmatch, dc=dc,
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
331 badmatch=badmatch)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
332
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
333 def walk(self, files=None, match=util.always, dc=None, badmatch=None):
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
334 # filter out the stat
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
335 for src, f, st in self.statwalk(files, match, dc, badmatch=badmatch):
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
336 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
337
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
338 # walk recursively through the directory tree, finding all files
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
339 # matched by the statmatch function
1224
cc61d366bc3b Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents: 1183
diff changeset
340 #
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
341 # 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
342 # is one of:
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
343 # 'f' the file was found in the directory tree
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
344 # '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
345 # 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
346 #
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
347 # dc is an optional arg for the current dirstate. dc is not modified
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
348 # directly by this function, but might be modified by your statmatch call.
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
349 #
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
350 def walkhelper(self, files, statmatch, dc, badmatch=None):
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
351 # recursion free walker, faster than os.walk.
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
352 def findfiles(s):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
353 work = [s]
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
354 while work:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
355 top = work.pop()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
356 names = os.listdir(top)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
357 names.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
358 # nd is the top of the repository dir tree
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
359 nd = util.normpath(top[len(self.root) + 1:])
2061
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
360 if nd == '.':
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
361 nd = ''
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
362 else:
2063
f1fda71e134e benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2062
diff changeset
363 # 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
364 # 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
365 # is good on big directory.
2061
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
366 hg = bisect.bisect_left(names, '.hg')
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
367 if hg < len(names) and names[hg] == '.hg':
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
368 if os.path.isdir(os.path.join(top, '.hg')):
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
369 continue
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
370 for f in names:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
371 np = util.pconvert(os.path.join(nd, f))
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
372 if seen(np):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
373 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
374 p = os.path.join(top, f)
1228
db950da49539 Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents: 1224
diff changeset
375 # don't trip over symlinks
db950da49539 Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents: 1224
diff changeset
376 st = os.lstat(p)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
377 if stat.S_ISDIR(st.st_mode):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
378 ds = os.path.join(nd, f +'/')
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
379 if statmatch(ds, st):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
380 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
381 if statmatch(np, st) and np in dc:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
382 yield 'm', 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
383 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
384 if self.supported_type(np, st):
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
385 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
386 elif np in dc:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
387 yield 'm', np, st
1392
32d8068b3e36 add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1276
diff changeset
388
821
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
389 known = {'.hg': 1}
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
390 def seen(fn):
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
391 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
392 known[fn] = 1
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
393
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
394 # step one, find all files that match our criteria
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
395 files.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
396 for ff in util.unique(files):
1510
755e7ac351ef use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1491
diff changeset
397 f = self.wjoin(ff)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
398 try:
1230
6eac821c202c dirstate: two more stat -> lstat changes
mpm@selenic.com
parents: 1228
diff changeset
399 st = os.lstat(f)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
400 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
401 nf = util.normpath(ff)
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
402 found = False
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
403 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
404 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
405 found = True
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
406 break
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
407 if not found:
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
408 if inst.errno != errno.ENOENT or not badmatch:
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
409 self.ui.warn('%s: %s\n' % (
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
410 util.pathto(self.getcwd(), ff),
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
411 inst.strerror))
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
412 elif badmatch and badmatch(ff) and statmatch(ff, None):
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
413 yield 'b', ff, None
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
414 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
415 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
416 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
417 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
418 sorted_.sort(cmp1)
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
419 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
420 yield e
1392
32d8068b3e36 add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1276
diff changeset
421 else:
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
422 ff = util.normpath(ff)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
423 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
424 continue
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
425 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
426 if statmatch(ff, st):
1527
c13fce7167c2 don't print anything about file of unsupported type unless
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1510
diff changeset
427 if self.supported_type(ff, st, verbose=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
428 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
429 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
430 yield 'm', ff, st
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
431 self.blockignore = False
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
432
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
433 # step two run through anything left in the dc hash and yield
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
434 # if we haven't already seen it
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
435 ks = dc.keys()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
436 ks.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
437 for k in ks:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
438 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
439 yield 'm', k, None
669
8aa2a282eda4 .hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents: 667
diff changeset
440
2022
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
441 def changes(self, files=None, match=util.always, show_ignored=None):
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
442 lookup, modified, added, unknown, ignored = [], [], [], [], []
861
cbe5c4d016b7 dirstate.changes() now distinguishes 'hg remove'd or just deleted files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 856
diff changeset
443 removed, deleted = [], []
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
444
2022
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
445 for src, fn, st in self.statwalk(files, match, ignored=show_ignored):
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
446 try:
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
447 type_, mode, size, time = self[fn]
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
448 except KeyError:
2022
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
449 if show_ignored and self.ignore(fn):
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
450 ignored.append(fn)
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
451 else:
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
452 unknown.append(fn)
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
453 continue
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
454 if src == 'm':
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
455 nonexistent = True
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
456 if not st:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
457 try:
2429
6a8f7c3f7333 dirstate: fix call to os.lstat when st is None
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2427
diff changeset
458 st = os.lstat(self.wjoin(fn))
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
459 except OSError, inst:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
460 if inst.errno != errno.ENOENT:
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
461 raise
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
462 st = None
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
463 # We need to re-check that it is a valid file
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
464 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
465 nonexistent = False
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
466 # XXX: what to do with file no longer present in the fs
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
467 # who are not removed in the dirstate ?
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
468 if nonexistent and type_ in "nm":
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
469 deleted.append(fn)
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
470 continue
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
471 # check the common case first
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
472 if type_ == 'n':
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
473 if not st:
2429
6a8f7c3f7333 dirstate: fix call to os.lstat when st is None
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2427
diff changeset
474 st = os.stat(self.wjoin(fn))
1755
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
475 if size >= 0 and (size != st.st_size
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
476 or (mode ^ st.st_mode) & 0100):
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
477 modified.append(fn)
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
478 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
479 lookup.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
480 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
481 modified.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
482 elif type_ == 'a':
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
483 added.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
484 elif type_ == 'r':
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
485 removed.append(fn)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
486
2022
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
487 return (lookup, modified, added, removed, deleted, unknown, ignored)