Mercurial > hg-git
annotate hggit/gitdirstate.py @ 615:503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
author | Ben Kehoe <benk@berkeley.edu> |
---|---|
date | Wed, 27 Nov 2013 09:27:59 -0500 |
parents | |
children | 5998a6ddc704 |
rev | line source |
---|---|
615
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
1 import os, stat, re |
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 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
42 rootprefix = '%s/' % root if root else '' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
43 if line.startswith('/'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
44 line = line[1:] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
45 rootsuffixes = [''] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
46 else: |
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 for rootsuffix in rootsuffixes: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
49 pat = syntax + rootprefix + rootsuffix + line |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
50 for s, rels in syntaxes.iteritems(): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
51 if line.startswith(rels): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
52 pat = line |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
53 break |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
54 elif line.startswith(s+':'): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
55 pat = rels + line[len(s) + 1:] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
56 break |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
57 patterns.append(pat) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
58 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
59 return patterns, warnings |
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 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
|
62 pats = ignore.readpats(root, files, warn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
63 allpats = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
64 if extrapatterns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
65 allpats.extend(extrapatterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
66 for f, patlist in pats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
67 allpats.extend(patlist) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
68 if not allpats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
69 return util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
70 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
71 ignorefunc = matchmod.match(root, '', [], allpats) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
72 except util.Abort: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
73 for f, patlist in pats: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
74 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
75 matchmod.match(root, '', [], patlist) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
76 except util.Abort, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
77 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
|
78 if extrapatterns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
79 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
80 matchmod.match(root, '', [], extrapatterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
81 except util.Abort, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
82 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
|
83 return ignorefunc |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
84 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
85 class gitdirstate(dirstate.dirstate): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
86 @dirstate.rootcache('.hgignore') |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
87 def _ignore(self): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
88 files = [self._join('.hgignore')] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
89 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
|
90 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
|
91 files.append(util.expandpath(path)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
92 patterns = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
93 # Only use .gitignore if there's no .hgignore |
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 fp = open(files[0]) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
96 fp.close() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
97 except: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
98 fns = self._finddotgitignores() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
99 for fn in fns: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
100 d = os.path.dirname(fn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
101 fn = self.pathto(fn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
102 fp = open(fn) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
103 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
|
104 for warning in warnings: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
105 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
|
106 patterns.extend(pats) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
107 return ignore.ignore(self._root, files, self._ui.warn, extrapatterns=patterns) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
108 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
109 def _finddotgitignores(self): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
110 """A copy of dirstate.walk. This is called from the new _ignore method, |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
111 which is called by dirstate.walk, which would cause infinite recursion, |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
112 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
|
113 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
|
114 #TODO: need subrepos? |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
115 subrepos = [] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
116 unknown = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
117 ignored = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
118 full=True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
119 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
120 def fwarn(f, msg): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
121 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
|
122 return False |
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 ignore = super(gitdirstate,self)._ignore |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
125 dirignore = self._dirignore |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
126 if ignored: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
127 ignore = util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
128 dirignore = util.never |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
129 elif not unknown: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
130 # 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
|
131 ignore = util.always |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
132 dirignore = util.always |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
133 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
134 matchfn = match.matchfn |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
135 matchalways = match.always() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
136 matchtdir = match.traversedir |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
137 dmap = self._map |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
138 listdir = osutil.listdir |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
139 lstat = os.lstat |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
140 dirkind = stat.S_IFDIR |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
141 regkind = stat.S_IFREG |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
142 lnkkind = stat.S_IFLNK |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
143 join = self._join |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
144 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
145 exact = skipstep3 = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
146 if matchfn == match.exact: # match.exact |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
147 exact = True |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
148 dirignore = util.always # skip step 2 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
149 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
|
150 skipstep3 = True |
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 if not exact and self._checkcase: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
153 normalize = self._normalize |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
154 skipstep3 = False |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
155 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
156 normalize = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
157 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
158 # step 1: find all explicit files |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
159 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
|
160 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
161 skipstep3 = skipstep3 and not (work or dirsnotfound) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
162 work = [d for d in work if not dirignore(d)] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
163 wadd = work.append |
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 # step 2: visit subdirectories |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
166 while work: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
167 nd = work.pop() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
168 skip = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
169 if nd == '.': |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
170 nd = '' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
171 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
172 skip = '.hg' |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
173 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
174 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
|
175 except OSError, inst: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
176 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
|
177 fwarn(nd, inst.strerror) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
178 continue |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
179 raise |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
180 for f, kind, st in entries: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
181 if normalize: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
182 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
|
183 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
184 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
|
185 if nf not in results: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
186 if kind == dirkind: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
187 if not ignore(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
188 if matchtdir: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
189 matchtdir(nf) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
190 wadd(nf) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
191 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
|
192 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
193 elif kind == regkind or kind == lnkkind: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
194 if nf in dmap: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
195 if matchalways or matchfn(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
196 results[nf] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
197 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
|
198 results[nf] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
199 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
|
200 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
201 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
202 for s in subrepos: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
203 del results[s] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
204 del results['.hg'] |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
205 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
206 # 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
|
207 if not skipstep3 and not exact: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
208 if not results and matchalways: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
209 visit = dmap.keys() |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
210 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
211 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
|
212 visit.sort() |
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 if unknown: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
215 # 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
|
216 # 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
|
217 # 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
|
218 audit_path = pathutil.pathauditor(self._root) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
219 |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
220 for nf in iter(visit): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
221 # 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
|
222 # under a symlink directory. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
223 if audit_path.check(nf): |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
224 try: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
225 results[nf] = lstat(join(nf)) |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
226 except OSError: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
227 # file doesn't exist |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
228 results[nf] = None |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
229 else: |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
230 # 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
|
231 results[nf] = None |
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 # 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
|
234 # so stat everything we missed. |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
235 nf = iter(visit).next |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
236 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
|
237 results[nf()] = st |
503d403fc040
Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents:
diff
changeset
|
238 return results.keys() |