##// END OF EJS Templates
ignore: refactor file read into a function...
Durham Goode -
r25065:8cf7f0c4 default
parent child Browse files
Show More
@@ -1,113 +1,119 b''
1 1 # ignore.py - ignored file handling for mercurial
2 2 #
3 3 # Copyright 2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from i18n import _
9 9 import util, match
10 10 import re
11 11
12 12 _commentre = None
13 13
14 14 def ignorepats(lines):
15 15 '''parse lines (iterable) of .hgignore text, returning a tuple of
16 16 (patterns, parse errors). These patterns should be given to compile()
17 17 to be validated and converted into a match function.'''
18 18 syntaxes = {'re': 'relre:', 'regexp': 'relre:', 'glob': 'relglob:'}
19 19 syntax = 'relre:'
20 20 patterns = []
21 21 warnings = []
22 22
23 23 for line in lines:
24 24 if "#" in line:
25 25 global _commentre
26 26 if not _commentre:
27 27 _commentre = re.compile(r'((^|[^\\])(\\\\)*)#.*')
28 28 # remove comments prefixed by an even number of escapes
29 29 line = _commentre.sub(r'\1', line)
30 30 # fixup properly escaped comments that survived the above
31 31 line = line.replace("\\#", "#")
32 32 line = line.rstrip()
33 33 if not line:
34 34 continue
35 35
36 36 if line.startswith('syntax:'):
37 37 s = line[7:].strip()
38 38 try:
39 39 syntax = syntaxes[s]
40 40 except KeyError:
41 41 warnings.append(_("ignoring invalid syntax '%s'") % s)
42 42 continue
43 43 pat = syntax + line
44 44 for s, rels in syntaxes.iteritems():
45 45 if line.startswith(rels):
46 46 pat = line
47 47 break
48 48 elif line.startswith(s+':'):
49 49 pat = rels + line[len(s) + 1:]
50 50 break
51 51 patterns.append(pat)
52 52
53 53 return patterns, warnings
54 54
55 def readignorefile(filepath, warn, skipwarning=False):
56 try:
57 pats = []
58 fp = open(filepath)
59 pats, warnings = ignorepats(fp)
60 fp.close()
61 for warning in warnings:
62 warn("%s: %s\n" % (filepath, warning))
63 except IOError, inst:
64 if not skipwarning:
65 warn(_("skipping unreadable ignore file '%s': %s\n") %
66 (filepath, inst.strerror))
67 return pats
68
55 69 def readpats(root, files, warn):
56 70 '''return a dict mapping ignore-file-name to list-of-patterns'''
57 71
58 72 pats = {}
59 73 for f in files:
60 74 if f in pats:
61 75 continue
62 try:
63 pats[f] = []
64 fp = open(f)
65 pats[f], warnings = ignorepats(fp)
66 fp.close()
67 for warning in warnings:
68 warn("%s: %s\n" % (f, warning))
69 except IOError, inst:
70 if f != files[0]:
71 warn(_("skipping unreadable ignore file '%s': %s\n") %
72 (f, inst.strerror))
76 skipwarning = f == files[0]
77 pats[f] = readignorefile(f, warn, skipwarning=skipwarning)
78
73 79 return [(f, pats[f]) for f in files if f in pats]
74 80
75 81 def ignore(root, files, warn):
76 82 '''return matcher covering patterns in 'files'.
77 83
78 84 the files parsed for patterns include:
79 85 .hgignore in the repository root
80 86 any additional files specified in the [ui] section of ~/.hgrc
81 87
82 88 trailing white space is dropped.
83 89 the escape character is backslash.
84 90 comments start with #.
85 91 empty lines are skipped.
86 92
87 93 lines can be of the following formats:
88 94
89 95 syntax: regexp # defaults following lines to non-rooted regexps
90 96 syntax: glob # defaults following lines to non-rooted globs
91 97 re:pattern # non-rooted regular expression
92 98 glob:pattern # non-rooted glob
93 99 pattern # pattern of the current default type'''
94 100
95 101 pats = readpats(root, files, warn)
96 102
97 103 allpats = []
98 104 for f, patlist in pats:
99 105 allpats.extend(patlist)
100 106 if not allpats:
101 107 return util.never
102 108
103 109 try:
104 110 ignorefunc = match.match(root, '', [], allpats)
105 111 except util.Abort:
106 112 # Re-raise an exception where the src is the right file
107 113 for f, patlist in pats:
108 114 try:
109 115 match.match(root, '', [], patlist)
110 116 except util.Abort, inst:
111 117 raise util.Abort('%s: %s' % (f, inst[0]))
112 118
113 119 return ignorefunc
General Comments 0
You need to be logged in to leave comments. Login now