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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
893
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
1 import os
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
2 import stat
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
3 import re
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
131 match = matchmod.match(self._root, self.getcwd(),
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
132 ['relglob:.gitignore'])
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
166 dirignore = util.always # skip step 2
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
237 # unknown == True means we walked the full directory tree
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
238 # above. So if a file is not seen it was either a) not matching
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
239 # matchfn b) ignored, c) missing, or d) under a symlink
0d258c2d0e91 gitdirstate: flake8 cleanup
Sean Farley <sean@farley.io>
parents: 872
diff changeset
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()