Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgIgnore.java @ 339:863356c2847e
Issue 16: respect glob patterns in HgIgnore for sub-directories
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 16 Nov 2011 22:42:21 +0100 |
parents | 3d41dc148d14 |
children | 516b817415ba |
comparison
equal
deleted
inserted
replaced
338:3cfa4d908fc9 | 339:863356c2847e |
---|---|
116 // | 116 // |
117 // TODO consider refactoring to reuse in PathGlobMatcher#glob2regexp | 117 // TODO consider refactoring to reuse in PathGlobMatcher#glob2regexp |
118 private static String glob2regex(String line) { | 118 private static String glob2regex(String line) { |
119 assert line.length() > 0; | 119 assert line.length() > 0; |
120 StringBuilder sb = new StringBuilder(line.length() + 10); | 120 StringBuilder sb = new StringBuilder(line.length() + 10); |
121 if (line.charAt(0) != '*') { | |
122 sb.append('^'); // help avoid matcher.find() to match 'bin' pattern in the middle of the filename | |
123 } | |
124 int start = 0, end = line.length() - 1; | 121 int start = 0, end = line.length() - 1; |
125 // '*' at the beginning and end of a line are useless for Pattern | |
126 // XXX although how about **.txt - such globs can be seen in a config, are they valid for HgIgnore? | |
127 while (start <= end && line.charAt(start) == '*') start++; | |
128 while (end > start && line.charAt(end) == '*') end--; | |
129 | 122 |
130 int inCurly = 0; | 123 int inCurly = 0; |
131 for (int i = start; i <= end; i++) { | 124 for (int i = start; i <= end; i++) { |
132 char ch = line.charAt(i); | 125 char ch = line.charAt(i); |
133 if (ch == '.' || ch == '\\') { | 126 if (ch == '.' || ch == '\\') { |
168 /** | 161 /** |
169 * @param path file or directory name in question | 162 * @param path file or directory name in question |
170 * @return <code>true</code> if matches repository configuration of ignored files. | 163 * @return <code>true</code> if matches repository configuration of ignored files. |
171 */ | 164 */ |
172 public boolean isIgnored(Path path) { | 165 public boolean isIgnored(Path path) { |
166 boolean isDeep = path.toString().indexOf('/') != -1; | |
173 for (Pattern p : entries) { | 167 for (Pattern p : entries) { |
174 if (p.matcher(path).find()) { | 168 if (p.matcher(path).matches()) { |
175 return true; | 169 return true; |
170 } | |
171 if (isDeep) { | |
172 for (String segment : path.segments()) { | |
173 if (p.matcher(segment).matches()) { | |
174 return true; | |
175 } | |
176 } | |
176 } | 177 } |
177 } | 178 } |
178 return false; | 179 return false; |
179 } | 180 } |
180 | 181 |