annotate mercurial/dirstate.py @ 4359:2e3c54fb79a3

actually port simplemerge to hg - use bdiff instead of patiencediff; this is a larger change, since bdiff works on 2 multi-line strings, while patiencediff works on 2 lists; - rename the main class from Merge3 to Merge3Text and add a Merge3 class that derives from Merge3Text. This new Merge3 class has the same interface from the original class, so that the tests still work; - Merge3 uses util.binary to detect binary data and raises util.Abort instead of a specific exception; - don't use the @decorator syntax, to keep python2.3 compatibility; - the test uses unittest, which likes to print how long it took to run. This obviously doesn't play too well with hg's test suite, so we override time.time to fool unittest; - one test has a different (but still valid) output because of the different diff algorithm used; - the TestCase class used by bzr has some extras to help debugging. test-merge3.py used 2 of them: - log method to log some data - assertEqualDiff method to ease viewing diffs of diffs We add a dummy log method and use regular assertEquals instead of assertEqualDiff. - make simplemerge executable and add "#!/usr/bin/env python" header
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Mon, 16 Apr 2007 20:17:39 -0300
parents 1cc5fc1d0994
children abeb3edb2b4e
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
2858
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
4 Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
5
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
6 This software may be used and distributed according to the terms
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
7 of the GNU General Public License, incorporated herein by reference.
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
8 """
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
9
1094
221b5252864c Adjust some imports
mpm@selenic.com
parents: 1089
diff changeset
10 from node import *
3893
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3886
diff changeset
11 from i18n import _
3886
abaee83ce0a6 Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents: 3842
diff changeset
12 import 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
13
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1541
diff changeset
14 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
15 format = ">cllll"
5083cba2a777 dirstate: refactor the dirstate binary format, remove magic numbers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2063
diff changeset
16
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
17 def __init__(self, opener, ui, root):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
18 self.opener = opener
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
19 self.root = root
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20 self.dirty = 0
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
21 self.ui = ui
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
22 self.map = None
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
23 self.pl = None
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
24 self.dirs = None
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
25 self.copymap = {}
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
26 self.ignorefunc = None
4207
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
27 self._branch = None
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
28
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
29 def wjoin(self, f):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
30 return os.path.join(self.root, f)
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
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 ''
3628
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:\'
4230
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
36 rootsep = self.root
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
37 if not rootsep.endswith(os.sep):
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
38 rootsep += os.sep
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
39 if cwd.startswith(rootsep):
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
40 return cwd[len(rootsep):]
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
41 else:
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
42 # we're outside the repo. return an absolute path.
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
43 return cwd
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
44
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
45 def hgignore(self):
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
46 '''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
47
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
48 the files parsed for patterns include:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
49 .hgignore in the repository root
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
50 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
51
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
52 trailing white space is dropped.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
53 the escape character is backslash.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
54 comments start with #.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
55 empty lines are skipped.
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
56
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
57 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
58
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
59 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
60 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
61 re:pattern # non-rooted regular expression
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
62 glob:pattern # non-rooted glob
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
63 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
64 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
65 def parselines(fp):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
66 for line in fp:
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
67 escape = False
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
68 for i in xrange(len(line)):
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
69 if escape: escape = False
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
70 elif line[i] == '\\': escape = True
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
71 elif line[i] == '#': break
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
72 line = line[:i].rstrip()
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
73 if line: yield line
2004
7dd6317ab4fd Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents: 2003
diff changeset
74 repoignore = self.wjoin('.hgignore')
7dd6317ab4fd Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents: 2003
diff changeset
75 files = [repoignore]
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
76 files.extend(self.ui.hgignorefiles())
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
77 pats = {}
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
78 for f in files:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
79 try:
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
80 pats[f] = []
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
81 fp = open(f)
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
82 syntax = 'relre:'
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
83 for line in parselines(fp):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
84 if line.startswith('syntax:'):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
85 s = line[7:].strip()
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
86 try:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
87 syntax = syntaxes[s]
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
88 except KeyError:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
89 self.ui.warn(_("%s: ignoring invalid "
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
90 "syntax '%s'\n") % (f, s))
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
91 continue
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
92 pat = syntax + line
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
93 for s in syntaxes.values():
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
94 if line.startswith(s):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
95 pat = line
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
96 break
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
97 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
98 except IOError, inst:
2004
7dd6317ab4fd Add warning if user-configured hgignore file isn't found
mcmillen@cs.cmu.edu
parents: 2003
diff changeset
99 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
100 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
101 " '%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
102 return pats
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
103
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
104 def ignore(self, fn):
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
105 '''default match function used by dirstate and
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
106 localrepository. this honours the repository .hgignore file
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1794
diff changeset
107 and any other files specified in the [ui] section of .hgrc.'''
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
108 if not self.ignorefunc:
1271
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
109 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
110 allpats = []
11ffa1267185 Don't ignore everything if all hgignore files are empty.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2006
diff changeset
111 [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
112 if allpats:
2005
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
113 try:
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=allpats, src='.hgignore'))
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
116 except util.Abort:
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
117 # 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
118 for f, patlist in ignore.items():
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
119 files, self.ignorefunc, anypats = (
bc47af2d3693 On error parsing hgignore file, print the correct filename.
mcmillen@cs.cmu.edu
parents: 2004
diff changeset
120 util.matcher(self.root, inc=patlist, src=f))
1271
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
121 else:
9ab14ca22e37 Fix ignore regression.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1270
diff changeset
122 self.ignorefunc = util.never
1270
fc3b41570082 Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1268
diff changeset
123 return self.ignorefunc(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
124
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
125 def __del__(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
126 if self.dirty:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
127 self.write()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
128
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
129 def __getitem__(self, key):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
130 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
131 return self.map[key]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
132 except TypeError:
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
133 self.lazyread()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
134 return self[key]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
135
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
136 def __contains__(self, key):
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
137 self.lazyread()
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
138 return key in self.map
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
139
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
140 def parents(self):
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
141 self.lazyread()
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
142 return self.pl
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
143
4207
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
144 def branch(self):
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
145 if not self._branch:
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
146 try:
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
147 self._branch = self.opener("branch").read().strip()\
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
148 or "default"
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
149 except IOError:
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
150 self._branch = "default"
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
151 return self._branch
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
152
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
153 def markdirty(self):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
154 if not self.dirty:
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
155 self.dirty = 1
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
156
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1040
diff changeset
157 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
158 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
159 self.markdirty()
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
160 self.pl = p1, p2
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
161
4207
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
162 def setbranch(self, branch):
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
163 self._branch = branch
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
164 self.opener("branch", "w").write(branch + '\n')
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4173
diff changeset
165
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
166 def state(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
167 try:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
168 return self[key][0]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
169 except KeyError:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
170 return "?"
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
171
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
172 def lazyread(self):
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
173 if self.map is None:
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
174 self.read()
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
175
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
176 def parse(self, st):
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
177 self.pl = [st[:20], st[20: 40]]
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
178
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
179 # 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
180 map = self.map
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
181 copymap = self.copymap
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
182 format = self.format
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
183 unpack = struct.unpack
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
184
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
185 pos = 40
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
186 e_size = struct.calcsize(format)
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
187
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
188 while pos < len(st):
2425
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
189 newpos = pos + e_size
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
190 e = unpack(format, st[pos:newpos])
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
191 l = e[4]
2425
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
192 pos = newpos
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
193 newpos = pos + l
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
194 f = st[pos:newpos]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
195 if '\0' in f:
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
196 f, c = f.split('\0')
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
197 copymap[f] = c
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
198 map[f] = e[:4]
2425
be2fd6398d50 dirstate: speed up inner loop of read.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2393
diff changeset
199 pos = newpos
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
200
2427
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
201 def read(self):
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
202 self.map = {}
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
203 self.pl = [nullid, nullid]
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
204 try:
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
205 st = self.opener("dirstate").read()
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
206 if st:
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
207 self.parse(st)
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
208 except IOError, err:
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
209 if err.errno != errno.ENOENT: raise
150cde10ea21 dirstate.read: make 15% faster.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2425
diff changeset
210
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
211 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
212 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
213 self.markdirty()
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
214 self.copymap[dest] = source
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
215
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
216 def copied(self, file):
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
217 return self.copymap.get(file, None)
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
218
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
219 def copies(self):
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
220 return self.copymap
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
221
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
222 def initdirs(self):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
223 if self.dirs is None:
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
224 self.dirs = {}
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
225 for f in self.map:
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
226 self.updatedirs(f, 1)
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3156
diff changeset
227
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
228 def updatedirs(self, path, delta):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
229 if self.dirs is not None:
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
230 for c in strutil.findall(path, '/'):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
231 pc = path[:c]
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
232 self.dirs.setdefault(pc, 0)
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
233 self.dirs[pc] += delta
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
234
3607
f4c9bb4ad7b1 issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3567
diff changeset
235 def checkinterfering(self, files):
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
236 def prefixes(f):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
237 for c in strutil.rfindall(f, '/'):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
238 yield f[:c]
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
239 self.lazyread()
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
240 self.initdirs()
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
241 seendirs = {}
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
242 for f in files:
3607
f4c9bb4ad7b1 issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3567
diff changeset
243 # shadows
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
244 if self.dirs.get(f):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
245 raise util.Abort(_('directory named %r already in dirstate') %
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
246 f)
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
247 for d in prefixes(f):
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
248 if d in seendirs:
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
249 break
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
250 if d in self.map:
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
251 raise util.Abort(_('file named %r already in dirstate') %
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
252 d)
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
253 seendirs[d] = True
3607
f4c9bb4ad7b1 issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3567
diff changeset
254 # disallowed
f4c9bb4ad7b1 issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3567
diff changeset
255 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: 3567
diff changeset
256 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
257
862
d70c1c31fd45 Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 861
diff changeset
258 def update(self, files, state, **kw):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
259 ''' current states:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
260 n normal
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
261 m needs merging
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
262 r marked for removal
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
263 a marked for addition'''
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
264
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
265 if not files: return
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
266 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
267 self.markdirty()
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
268 if state == "a":
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
269 self.initdirs()
3607
f4c9bb4ad7b1 issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3567
diff changeset
270 self.checkinterfering(files)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
271 for f in files:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
272 if state == "r":
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
273 self.map[f] = ('r', 0, 0, 0)
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
274 self.updatedirs(f, -1)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
275 else:
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
276 if state == "a":
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
277 self.updatedirs(f, 1)
1510
755e7ac351ef use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1491
diff changeset
278 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
279 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
280 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
281 self.map[f] = (state, s.st_mode, st_size, st_mtime)
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
282 if self.copymap.has_key(f):
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
283 del self.copymap[f]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
284
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
285 def forget(self, files):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
286 if not files: return
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
287 self.lazyread()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
288 self.markdirty()
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
289 self.initdirs()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
290 for f in files:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
291 try:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
292 del self.map[f]
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
293 self.updatedirs(f, -1)
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
294 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
295 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
296 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
297
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
298 def clear(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
299 self.map = {}
3156
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
300 self.copymap = {}
2953
3d5547845158 fix issue 322.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
301 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
302 self.markdirty()
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
303
a8f7791e3680 add 'debugrebuildstate' to rebuild the dirstate from a given revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1749
diff changeset
304 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
305 self.clear()
2844
e196aa1df169 Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents: 2486
diff changeset
306 for f in files:
e196aa1df169 Start using manifestflags methods
Matt Mackall <mpm@selenic.com>
parents: 2486
diff changeset
307 if files.execf(f):
3842
47c634bf1e92 remove unnecessary call to umask
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3628
diff changeset
308 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
309 else:
3842
47c634bf1e92 remove unnecessary call to umask
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3628
diff changeset
310 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
311 self.pl = (parent, nullid)
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
312 self.markdirty()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
313
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
314 def write(self):
1794
98b6c1cad58b only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1755
diff changeset
315 if not self.dirty:
98b6c1cad58b only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1755
diff changeset
316 return
4330
1b9fc3f48861 use atomictemp files to write the dirstate
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4230
diff changeset
317 st = self.opener("dirstate", "w", atomictemp=True)
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
318 st.write("".join(self.pl))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
319 for f, e in self.map.items():
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
320 c = self.copied(f)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
321 if c:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
322 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
323 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
324 st.write(e + f)
4330
1b9fc3f48861 use atomictemp files to write the dirstate
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4230
diff changeset
325 st.rename()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
326 self.dirty = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
327
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
328 def filterfiles(self, files):
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
329 ret = {}
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
330 unknown = []
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
331
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
332 for x in files:
1541
bf4e7ef08741 fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents: 1529
diff changeset
333 if x == '.':
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
334 return self.map.copy()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
335 if x not in self.map:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
336 unknown.append(x)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
337 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
338 ret[x] = self.map[x]
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
339
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
340 if not unknown:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
341 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
342
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
343 b = self.map.keys()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
344 b.sort()
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
345 blen = len(b)
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
346
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
347 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
348 bs = bisect.bisect(b, "%s%s" % (x, '/'))
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
349 while bs < blen:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
350 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
351 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
352 ret[s] = self.map[s]
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
353 else:
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
354 break
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
355 bs += 1
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
356 return ret
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
357
1527
c13fce7167c2 don't print anything about file of unsupported type unless
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1510
diff changeset
358 def supported_type(self, f, st, verbose=False):
4001
dda03b2d9ef1 symlinks: don't complain about symlinks
Matt Mackall <mpm@selenic.com>
parents: 3893
diff changeset
359 if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode):
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
360 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
361 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
362 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
363 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
364 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
365 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
366 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
367 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
368 self.ui.warn(_('%s: unsupported file type (type is %s)\n') % (
4229
24c22a3f2ef8 pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4207
diff changeset
369 util.pathto(self.root, self.getcwd(), f),
1487
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
370 kind))
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
371 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
372
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
373 def walk(self, files=None, match=util.always, badmatch=None):
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
374 # filter out the stat
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
375 for src, f, st in self.statwalk(files, match, badmatch=badmatch):
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
376 yield src, f
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
377
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
378 def statwalk(self, files=None, match=util.always, ignored=False,
4146
e287d61dd268 Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4081
diff changeset
379 badmatch=None, directories=False):
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
380 '''
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
381 walk recursively through the directory tree, finding all files
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
382 matched by the match function
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
383
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
384 results are yielded in a tuple (src, filename, st), where src
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
385 is one of:
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
386 'f' the file was found in the directory tree
4146
e287d61dd268 Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4081
diff changeset
387 'd' the file is a directory of the tree
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
388 'm' the file was only in the dirstate and not in the tree
3563
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3560
diff changeset
389 'b' file was not found and matched badmatch
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3560
diff changeset
390
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
391 and st is the stat result if the file was found in the directory.
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
392 '''
1529
a208e86bbc34 add dirstate.lazyread, write atomically the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1527
diff changeset
393 self.lazyread()
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
394
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
395 # walk all files by default
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
396 if not files:
4173
b36bd7534c08 statwalk: don't put self.root in the files list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4075
diff changeset
397 files = ['.']
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
398 dc = self.map.copy()
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
399 else:
3567
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3565
diff changeset
400 files = util.unique(files)
879
953ccddd57bd dirstate walking optimizations
mason@suse.com
parents: 871
diff changeset
401 dc = self.filterfiles(files)
919
1458d20df2a8 whitespace cleanup
mpm@selenic.com
parents: 911
diff changeset
402
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
403 def imatch(file_):
3565
549cb7b640fb Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents: 3563
diff changeset
404 if file_ not in dc and self.ignore(file_):
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
405 return False
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
406 return match(file_)
1224
cc61d366bc3b Fix Windows status problem from new dirstate walk code
mpm@selenic.com
parents: 1183
diff changeset
407
4188
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4173
diff changeset
408 ignore = self.ignore
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4173
diff changeset
409 if ignored:
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4173
diff changeset
410 imatch = match
dd0d9bd91e0a dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4173
diff changeset
411 ignore = util.never
3565
549cb7b640fb Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents: 3563
diff changeset
412
2671
82864a2eb709 self.root == '/': prefix length computation out of the loop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2670
diff changeset
413 # 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
414 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
415 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
416 common_prefix_len += 1
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
417 # recursion free walker, faster than os.walk.
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
418 def findfiles(s):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
419 work = [s]
4146
e287d61dd268 Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4081
diff changeset
420 if directories:
e287d61dd268 Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4081
diff changeset
421 yield 'd', util.normpath(s[common_prefix_len:]), os.lstat(s)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
422 while work:
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
423 top = work.pop()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
424 names = os.listdir(top)
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
425 names.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
426 # 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
427 nd = util.normpath(top[common_prefix_len:])
2061
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
428 if nd == '.':
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
429 nd = ''
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
430 else:
2063
f1fda71e134e benoit asked for comment to make avoid of recursive repo clearer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2062
diff changeset
431 # 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
432 # 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
433 # is good on big directory.
2061
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
434 hg = bisect.bisect_left(names, '.hg')
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
435 if hg < len(names) and names[hg] == '.hg':
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
436 if os.path.isdir(os.path.join(top, '.hg')):
5987c1eac2ce support nested repositories.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
437 continue
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
438 for f in names:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
439 np = util.pconvert(os.path.join(nd, f))
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
440 if seen(np):
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
441 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
442 p = os.path.join(top, f)
1228
db950da49539 Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents: 1224
diff changeset
443 # don't trip over symlinks
db950da49539 Fix dangling symlink bug in dirstate walk code
mpm@selenic.com
parents: 1224
diff changeset
444 st = os.lstat(p)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
445 if stat.S_ISDIR(st.st_mode):
4254
a7cae4e22749 Pass normalized directory names to the ignore function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4188
diff changeset
446 if not ignore(np):
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
447 work.append(p)
4146
e287d61dd268 Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4081
diff changeset
448 if directories:
e287d61dd268 Yield directories in dirstate.statwalk()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4081
diff changeset
449 yield 'd', np, st
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
450 if imatch(np) and np in dc:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
451 yield 'm', np, st
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
452 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
453 if self.supported_type(np, st):
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
454 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
455 elif np in dc:
1562
2f97af0b522c Fix walkhelper on windows.
Christian Boos <cboos@neuf.fr>
parents: 1559
diff changeset
456 yield 'm', np, st
1392
32d8068b3e36 add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1276
diff changeset
457
821
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
458 known = {'.hg': 1}
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
459 def seen(fn):
72d9bd4841f3 Ensure that dirstate.walk only yields names once.
Bryan O'Sullivan <bos@serpentine.com>
parents: 820
diff changeset
460 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
461 known[fn] = 1
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
462
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
463 # step one, find all files that match our criteria
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
464 files.sort()
3567
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3565
diff changeset
465 for ff in files:
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3565
diff changeset
466 nf = util.normpath(ff)
1510
755e7ac351ef use self.{w,}join when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1491
diff changeset
467 f = self.wjoin(ff)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
468 try:
1230
6eac821c202c dirstate: two more stat -> lstat changes
mpm@selenic.com
parents: 1228
diff changeset
469 st = os.lstat(f)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
470 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
471 found = False
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
472 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
473 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
474 found = True
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
475 break
34579a67fa71 Re: [PATCH 2 of 3] remove walk warning about nonexistent files
Benoit Boissinot <bboissin@gmail.com>
parents: 1562
diff changeset
476 if not found:
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
477 if inst.errno != errno.ENOENT or not badmatch:
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
478 self.ui.warn('%s: %s\n' % (
4229
24c22a3f2ef8 pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4207
diff changeset
479 util.pathto(self.root, self.getcwd(), ff),
2042
a514c7509fa9 small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2022
diff changeset
480 inst.strerror))
3565
549cb7b640fb Simplify ignore logic in dirstate.walk
Matt Mackall <mpm@selenic.com>
parents: 3563
diff changeset
481 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
482 yield 'b', ff, None
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
483 continue
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
484 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
485 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
486 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
487 sorted_.sort(cmp1)
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
488 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
489 yield e
1392
32d8068b3e36 add a check for filetype when walking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1276
diff changeset
490 else:
3567
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3565
diff changeset
491 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
492 if self.supported_type(ff, st, verbose=True):
3567
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3565
diff changeset
493 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
494 elif ff in dc:
3567
ece5c53577eb small refactoring of path normalization in dirstate.statwalk
Matt Mackall <mpm@selenic.com>
parents: 3565
diff changeset
495 yield 'm', nf, st
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
496
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
497 # step two run through anything left in the dc hash and yield
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
498 # if we haven't already seen it
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
499 ks = dc.keys()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
500 ks.sort()
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
501 for k in ks:
3560
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
502 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
503 yield 'm', k, None
669
8aa2a282eda4 .hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents: 667
diff changeset
504
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
505 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
506 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
507 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
508 removed, deleted, clean = [], [], []
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
509
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
510 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
511 try:
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
512 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
513 except KeyError:
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
514 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
515 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
516 else:
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
517 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
518 continue
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
519 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
520 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
521 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
522 try:
2429
6a8f7c3f7333 dirstate: fix call to os.lstat when st is None
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2427
diff changeset
523 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
524 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
525 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
526 raise
2bc6cd62a29c fix handling of files of unsupported type in the walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1476
diff changeset
527 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
528 # 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
529 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
530 nonexistent = False
1476
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
531 # 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
532 # 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
533 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
534 deleted.append(fn)
17e8c70fb670 fix dirstate.change: it should walk ignored files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1471
diff changeset
535 continue
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
536 # 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
537 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
538 if not st:
2448
b77a2ef61b81 replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2429
diff changeset
539 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
540 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
541 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
542 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
543 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
544 lookup.append(fn)
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
545 elif list_clean:
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
546 clean.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
547 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
548 modified.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
549 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
550 added.append(fn)
1749
d457fec76ab0 fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1617
diff changeset
551 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
552 removed.append(fn)
1183
d9e85a75dbda Optimize dirstate walking
mason@suse.com
parents: 1117
diff changeset
553
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
554 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
555 clean)