Mercurial > hg-git
annotate hggit/gitdirstate.py @ 909:67b27ec080ae
ignore: evaluate ignore.readpats to see if ignore module really exists
Otherwise ImportError wouldn't be raised thanks to demandimport.
Perhaps tests passed at e5b10a710036 because we are likely to have ignore.pyc
in our mercurial tree.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 31 May 2015 13:51:42 +0900 |
parents | e5b10a710036 |
children | 83c847b0b3ab |
rev | line source |
---|---|
893 | 1 import os |
2 import stat | |
3 import re | |
4 import errno | |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
5 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
6 from mercurial import dirstate |
907
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
7 try: |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
8 from mercurial import ignore |
909
67b27ec080ae
ignore: evaluate ignore.readpats to see if ignore module really exists
Yuya Nishihara <yuya@tcha.org>
parents:
907
diff
changeset
|
9 ignore.readpats |
907
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
10 ignoremod = True |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
11 except: |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
12 # ignore module was removed in Mercurial 3.5 |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
13 ignoremod = False |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
14 from mercurial import match as matchmod |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
15 from mercurial import osutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
16 from mercurial import scmutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
17 # 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
|
18 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
19 from mercurial import pathutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
20 pathutil.pathauditor |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
21 except: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
22 pathutil = scmutil |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
23 from mercurial import util |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
24 from mercurial.i18n import _ |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
25 |
893 | 26 def gignorepats(orig, lines, root=None): |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
27 '''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
|
28 (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
|
29 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
|
30 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
|
31 syntax = 'glob:' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
32 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
33 patterns = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
34 warnings = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
35 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
36 for line in lines: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
37 if "#" in line: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
38 _commentre = re.compile(r'((^|[^\\])(\\\\)*)#.*') |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
39 # 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
|
40 line = _commentre.sub(r'\1', line) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
41 # 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
|
42 line = line.replace("\\#", "#") |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
43 line = line.rstrip() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
44 if not line: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
45 continue |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
46 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
47 if line.startswith('!'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
48 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
|
49 continue |
718
9c6f083eecad
gignore: remove illegal components (issue92)
Takumi IINO <trot.thunder@gmail.com>
parents:
632
diff
changeset
|
50 if re.match(r'(:?.*/)?\.hg(:?/|$)', line): |
9c6f083eecad
gignore: remove illegal components (issue92)
Takumi IINO <trot.thunder@gmail.com>
parents:
632
diff
changeset
|
51 continue |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
52 rootprefix = '%s/' % root if root else '' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
53 if line.startswith('/'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
54 line = line[1:] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
55 rootsuffixes = [''] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
56 else: |
893 | 57 rootsuffixes = ['', '**/'] |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
58 for rootsuffix in rootsuffixes: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
59 pat = syntax + rootprefix + rootsuffix + line |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
60 for s, rels in syntaxes.iteritems(): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
61 if line.startswith(rels): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
62 pat = line |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
63 break |
893 | 64 elif line.startswith(s + ':'): |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
65 pat = rels + line[len(s) + 1:] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
66 break |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
67 patterns.append(pat) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
68 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
69 return patterns, warnings |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
70 |
907
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
71 def gignore(root, files, warn, extrapatterns=None): |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
72 allpats = [] |
907
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
73 pats = [] |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
74 if ignoremod: |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
75 pats = ignore.readpats(root, files, warn) |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
76 for f, patlist in pats: |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
77 allpats.extend(patlist) |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
78 else: |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
79 allpats.extend(['include:%s' % f for f in files]) |
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
80 |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
81 if extrapatterns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
82 allpats.extend(extrapatterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
83 if not allpats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
84 return util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
85 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
86 ignorefunc = matchmod.match(root, '', [], allpats) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
87 except util.Abort: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
88 for f, patlist in pats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
89 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
90 matchmod.match(root, '', [], patlist) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
91 except util.Abort, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
92 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
|
93 if extrapatterns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
94 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
95 matchmod.match(root, '', [], extrapatterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
96 except util.Abort, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
97 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
|
98 return ignorefunc |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
99 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
100 class gitdirstate(dirstate.dirstate): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
101 @dirstate.rootcache('.hgignore') |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
102 def _ignore(self): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
103 files = [self._join('.hgignore')] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
104 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
|
105 if name == 'ignore' or name.startswith('ignore.'): |
893 | 106 files.append(util.expandpath(path)) |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
107 patterns = [] |
871
c1c2af8aecb3
gitdirstate: fix whitespace
Siddharth Agarwal <sid0@fb.com>
parents:
860
diff
changeset
|
108 # 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
|
109 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
110 fp = open(files[0]) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
111 fp.close() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
112 except: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
113 fns = self._finddotgitignores() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
114 for fn in fns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
115 d = os.path.dirname(fn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
116 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
|
117 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
|
118 continue |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
119 fp = open(fn) |
893 | 120 pats, warnings = gignorepats(None, fp, root=d) |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
121 for warning in warnings: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
122 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
|
123 patterns.extend(pats) |
907
e5b10a710036
ignore: update ignore logic to match upstream
Durham Goode <durham@fb.com>
parents:
893
diff
changeset
|
124 return gignore(self._root, files, self._ui.warn, |
893 | 125 extrapatterns=patterns) |
871
c1c2af8aecb3
gitdirstate: fix whitespace
Siddharth Agarwal <sid0@fb.com>
parents:
860
diff
changeset
|
126 |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
127 def _finddotgitignores(self): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
128 """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
|
129 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
|
130 except _finddotgitignores calls the superclass _ignore directly.""" |
893 | 131 match = matchmod.match(self._root, self.getcwd(), |
132 ['relglob:.gitignore']) | |
133 # TODO: need subrepos? | |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
134 subrepos = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
135 unknown = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
136 ignored = False |
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 def fwarn(f, msg): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
139 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
|
140 return False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
141 |
893 | 142 ignore = super(gitdirstate, self)._ignore |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
143 dirignore = self._dirignore |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
144 if ignored: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
145 ignore = util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
146 dirignore = util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
147 elif not unknown: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
148 # 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
|
149 ignore = util.always |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
150 dirignore = util.always |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
151 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
152 matchfn = match.matchfn |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
153 matchalways = match.always() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
154 matchtdir = match.traversedir |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
155 dmap = self._map |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
156 listdir = osutil.listdir |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
157 lstat = os.lstat |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
158 dirkind = stat.S_IFDIR |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
159 regkind = stat.S_IFREG |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
160 lnkkind = stat.S_IFLNK |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
161 join = self._join |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
162 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
163 exact = skipstep3 = False |
893 | 164 if matchfn == match.exact: # match.exact |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
165 exact = True |
893 | 166 dirignore = util.always # skip step 2 |
167 elif match.files() and not match.anypats(): # match.match, no patterns | |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
168 skipstep3 = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
169 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
170 if not exact and self._checkcase: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
171 normalize = self._normalize |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
172 skipstep3 = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
173 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
174 normalize = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
175 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
176 # step 1: find all explicit files |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
177 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
|
178 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
179 skipstep3 = skipstep3 and not (work or dirsnotfound) |
872
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
180 if work and isinstance(work[0], tuple): |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
181 # Mercurial >= 3.3.3 |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
182 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
|
183 else: |
da01212cd53a
gitdirstate: use normalized path from _walkexplicit
Siddharth Agarwal <sid0@fb.com>
parents:
871
diff
changeset
|
184 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
|
185 wadd = work.append |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
186 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
187 # step 2: visit subdirectories |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
188 while work: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
189 nd = work.pop() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
190 skip = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
191 if nd == '.': |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
192 nd = '' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
193 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
194 skip = '.hg' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
195 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
196 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
|
197 except OSError, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
198 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
|
199 fwarn(nd, inst.strerror) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
200 continue |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
201 raise |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
202 for f, kind, st in entries: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
203 if normalize: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
204 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
|
205 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
206 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
|
207 if nf not in results: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
208 if kind == dirkind: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
209 if not ignore(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
210 if matchtdir: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
211 matchtdir(nf) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
212 wadd(nf) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
213 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
|
214 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
215 elif kind == regkind or kind == lnkkind: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
216 if nf in dmap: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
217 if matchalways or matchfn(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
218 results[nf] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
219 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
|
220 results[nf] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
221 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
|
222 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
223 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
224 for s in subrepos: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
225 del results[s] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
226 del results['.hg'] |
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 # 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
|
229 if not skipstep3 and not exact: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
230 if not results and matchalways: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
231 visit = dmap.keys() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
232 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
233 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
|
234 visit.sort() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
235 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
236 if unknown: |
893 | 237 # unknown == True means we walked the full directory tree |
238 # above. So if a file is not seen it was either a) not matching | |
239 # matchfn b) ignored, c) missing, or d) under a symlink | |
240 # directory. | |
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
241 audit_path = pathutil.pathauditor(self._root) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
242 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
243 for nf in iter(visit): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
244 # 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
|
245 # under a symlink directory. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
246 if audit_path.check(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
247 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
248 results[nf] = lstat(join(nf)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
249 except OSError: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
250 # file doesn't exist |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
251 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
252 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
253 # 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
|
254 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
255 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
256 # 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
|
257 # so stat everything we missed. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
258 nf = iter(visit).next |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
259 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
|
260 results[nf()] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
261 return results.keys() |