Mercurial > hg-git
annotate hggit/gitdirstate.py @ 872:da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Since 2bb13f2b778c in Mercurial, _walkexplicit returns a tuple, so ensure
we are up to date and take the normalized path which is the first part of the
tuple.
Based on a patch by David Soria Parra <davidsp@fb.com>.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Fri, 03 Apr 2015 10:27:04 -0700 |
parents | c1c2af8aecb3 |
children | 0d258c2d0e91 |
rev | line source |
---|---|
632
5998a6ddc704
gitdirstate: import errno for handling OSError
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
615
diff
changeset
|
1 import os, stat, re, errno |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
2 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
3 from mercurial import dirstate |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
4 from mercurial import hg |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
5 from mercurial import ignore |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
6 from mercurial import match as matchmod |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
7 from mercurial import osutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
8 from mercurial import scmutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
9 # pathauditor moved to pathutil in 2.8 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
10 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
11 from mercurial import pathutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
12 pathutil.pathauditor |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
13 except: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
14 pathutil = scmutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
15 from mercurial import util |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
16 from mercurial.i18n import _ |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
17 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
18 def gignorepats(orig, lines, root = None): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
19 '''parse lines (iterable) of .gitignore text, returning a tuple of |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
20 (patterns, parse errors). These patterns should be given to compile() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
21 to be validated and converted into a match function.''' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
22 syntaxes = {'re': 'relre:', 'regexp': 'relre:', 'glob': 'relglob:'} |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
23 syntax = 'glob:' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
24 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
25 patterns = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
26 warnings = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
27 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
28 for line in lines: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
29 if "#" in line: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
30 _commentre = re.compile(r'((^|[^\\])(\\\\)*)#.*') |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
31 # remove comments prefixed by an even number of escapes |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
32 line = _commentre.sub(r'\1', line) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
33 # fixup properly escaped comments that survived the above |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
34 line = line.replace("\\#", "#") |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
35 line = line.rstrip() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
36 if not line: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
37 continue |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
38 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
39 if line.startswith('!'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
40 warnings.append(_("unsupported ignore pattern '%s'") % line) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
41 continue |
718
9c6f083eecad
gignore: remove illegal components (issue92)
Takumi IINO <trot.thunder@gmail.com>
parents:
632
diff
changeset
|
42 if re.match(r'(:?.*/)?\.hg(:?/|$)', line): |
9c6f083eecad
gignore: remove illegal components (issue92)
Takumi IINO <trot.thunder@gmail.com>
parents:
632
diff
changeset
|
43 continue |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
44 rootprefix = '%s/' % root if root else '' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
45 if line.startswith('/'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
46 line = line[1:] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
47 rootsuffixes = [''] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
48 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
49 rootsuffixes = ['','**/'] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
50 for rootsuffix in rootsuffixes: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
51 pat = syntax + rootprefix + rootsuffix + line |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
52 for s, rels in syntaxes.iteritems(): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
53 if line.startswith(rels): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
54 pat = line |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
55 break |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
56 elif line.startswith(s+':'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
57 pat = rels + line[len(s) + 1:] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
58 break |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
59 patterns.append(pat) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
60 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
61 return patterns, warnings |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
62 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
63 def gignore(orig, root, files, warn, extrapatterns=None): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
64 pats = ignore.readpats(root, files, warn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
65 allpats = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
66 if extrapatterns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
67 allpats.extend(extrapatterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
68 for f, patlist in pats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
69 allpats.extend(patlist) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
70 if not allpats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
71 return util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
72 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
73 ignorefunc = matchmod.match(root, '', [], allpats) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
74 except util.Abort: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
75 for f, patlist in pats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
76 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
77 matchmod.match(root, '', [], patlist) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
78 except util.Abort, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
79 raise util.Abort('%s: %s' % (f, inst[0])) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
80 if extrapatterns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
81 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
82 matchmod.match(root, '', [], extrapatterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
83 except util.Abort, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
84 raise util.Abort('%s: %s' % ('extra patterns', inst[0])) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
85 return ignorefunc |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
86 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
87 class gitdirstate(dirstate.dirstate): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
88 @dirstate.rootcache('.hgignore') |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
89 def _ignore(self): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
90 files = [self._join('.hgignore')] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
91 for name, path in self._ui.configitems("ui"): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
92 if name == 'ignore' or name.startswith('ignore.'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
93 files.append(util.expandpath(path)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
94 patterns = [] |
871
c1c2af8aecb3
gitdirstate: fix whitespace
Siddharth Agarwal <sid0@fb.com>
parents:
860
diff
changeset
|
95 # Only use .gitignore if there's no .hgignore |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
96 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
97 fp = open(files[0]) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
98 fp.close() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
99 except: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
100 fns = self._finddotgitignores() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
101 for fn in fns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
102 d = os.path.dirname(fn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
103 fn = self.pathto(fn) |
860
cdf46071a83f
gitdirstate: avoid an abort when a .gitignore is missing
Mathias De Maré <mathias.demare@gmail.com>
parents:
718
diff
changeset
|
104 if not os.path.exists(fn): |
cdf46071a83f
gitdirstate: avoid an abort when a .gitignore is missing
Mathias De Maré <mathias.demare@gmail.com>
parents:
718
diff
changeset
|
105 continue |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
106 fp = open(fn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
107 pats, warnings = gignorepats(None,fp,root=d) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
108 for warning in warnings: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
109 self._ui.warn("%s: %s\n" % (fn, warning)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
110 patterns.extend(pats) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
111 return ignore.ignore(self._root, files, self._ui.warn, extrapatterns=patterns) |
871
c1c2af8aecb3
gitdirstate: fix whitespace
Siddharth Agarwal <sid0@fb.com>
parents:
860
diff
changeset
|
112 |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
113 def _finddotgitignores(self): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
114 """A copy of dirstate.walk. This is called from the new _ignore method, |
871
c1c2af8aecb3
gitdirstate: fix whitespace
Siddharth Agarwal <sid0@fb.com>
parents:
860
diff
changeset
|
115 which is called by dirstate.walk, which would cause infinite recursion, |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
116 except _finddotgitignores calls the superclass _ignore directly.""" |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
117 match = matchmod.match(self._root, self.getcwd(), ['relglob:.gitignore']) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
118 #TODO: need subrepos? |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
119 subrepos = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
120 unknown = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
121 ignored = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
122 full=True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
123 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
124 def fwarn(f, msg): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
125 self._ui.warn('%s: %s\n' % (self.pathto(f), msg)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
126 return False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
127 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
128 ignore = super(gitdirstate,self)._ignore |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
129 dirignore = self._dirignore |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
130 if ignored: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
131 ignore = util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
132 dirignore = util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
133 elif not unknown: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
134 # if unknown and ignored are False, skip step 2 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
135 ignore = util.always |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
136 dirignore = util.always |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
137 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
138 matchfn = match.matchfn |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
139 matchalways = match.always() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
140 matchtdir = match.traversedir |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
141 dmap = self._map |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
142 listdir = osutil.listdir |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
143 lstat = os.lstat |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
144 dirkind = stat.S_IFDIR |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
145 regkind = stat.S_IFREG |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
146 lnkkind = stat.S_IFLNK |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
147 join = self._join |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
148 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
149 exact = skipstep3 = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
150 if matchfn == match.exact: # match.exact |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
151 exact = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
152 dirignore = util.always # skip step 2 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
153 elif match.files() and not match.anypats(): # match.match, no patterns |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
154 skipstep3 = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
155 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
156 if not exact and self._checkcase: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
157 normalize = self._normalize |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
158 skipstep3 = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
159 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
160 normalize = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
161 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
162 # step 1: find all explicit files |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
163 results, work, dirsnotfound = self._walkexplicit(match, subrepos) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
164 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
165 skipstep3 = skipstep3 and not (work or dirsnotfound) |
872
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
166 if work and isinstance(work[0], tuple): |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
167 # Mercurial >= 3.3.3 |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
168 work = [nd for nd, d in work if not dirignore(d)] |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
169 else: |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
170 work = [d for d in work if not dirignore(d)] |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
171 wadd = work.append |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
172 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
173 # step 2: visit subdirectories |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
174 while work: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
175 nd = work.pop() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
176 skip = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
177 if nd == '.': |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
178 nd = '' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
179 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
180 skip = '.hg' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
181 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
182 entries = listdir(join(nd), stat=True, skip=skip) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
183 except OSError, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
184 if inst.errno in (errno.EACCES, errno.ENOENT): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
185 fwarn(nd, inst.strerror) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
186 continue |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
187 raise |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
188 for f, kind, st in entries: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
189 if normalize: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
190 nf = normalize(nd and (nd + "/" + f) or f, True, True) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
191 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
192 nf = nd and (nd + "/" + f) or f |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
193 if nf not in results: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
194 if kind == dirkind: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
195 if not ignore(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
196 if matchtdir: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
197 matchtdir(nf) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
198 wadd(nf) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
199 if nf in dmap and (matchalways or matchfn(nf)): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
200 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
201 elif kind == regkind or kind == lnkkind: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
202 if nf in dmap: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
203 if matchalways or matchfn(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
204 results[nf] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
205 elif (matchalways or matchfn(nf)) and not ignore(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
206 results[nf] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
207 elif nf in dmap and (matchalways or matchfn(nf)): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
208 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
209 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
210 for s in subrepos: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
211 del results[s] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
212 del results['.hg'] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
213 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
214 # step 3: report unseen items in the dmap hash |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
215 if not skipstep3 and not exact: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
216 if not results and matchalways: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
217 visit = dmap.keys() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
218 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
219 visit = [f for f in dmap if f not in results and matchfn(f)] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
220 visit.sort() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
221 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
222 if unknown: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
223 # unknown == True means we walked the full directory tree above. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
224 # So if a file is not seen it was either a) not matching matchfn |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
225 # b) ignored, c) missing, or d) under a symlink directory. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
226 audit_path = pathutil.pathauditor(self._root) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
227 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
228 for nf in iter(visit): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
229 # Report ignored items in the dmap as long as they are not |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
230 # under a symlink directory. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
231 if audit_path.check(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
232 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
233 results[nf] = lstat(join(nf)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
234 except OSError: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
235 # file doesn't exist |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
236 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
237 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
238 # It's either missing or under a symlink directory |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
239 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
240 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
241 # We may not have walked the full directory tree above, |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
242 # so stat everything we missed. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
243 nf = iter(visit).next |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
244 for st in util.statfiles([join(i) for i in visit]): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
245 results[nf()] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
246 return results.keys() |