Mercurial > jhg
comparison src/org/tmatesoft/hg/util/FileWalker.java @ 229:1ec6b327a6ac
Scope for status reworked: explicit files or a general matcher
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 31 May 2011 05:23:07 +0200 |
parents | fffe4f882248 |
children | ed6b74a58c66 |
comparison
equal
deleted
inserted
replaced
228:fffe4f882248 | 229:1ec6b327a6ac |
---|---|
29 | 29 |
30 private final File startDir; | 30 private final File startDir; |
31 private final Path.Source pathHelper; | 31 private final Path.Source pathHelper; |
32 private final LinkedList<File> dirQueue; | 32 private final LinkedList<File> dirQueue; |
33 private final LinkedList<File> fileQueue; | 33 private final LinkedList<File> fileQueue; |
34 private final Path.Matcher scope; | |
34 private File nextFile; | 35 private File nextFile; |
35 private Path nextPath; | 36 private Path nextPath; |
36 | 37 |
37 public FileWalker(File dir, Path.Source pathFactory) { | 38 public FileWalker(File dir, Path.Source pathFactory) { |
39 this(dir, pathFactory, null); | |
40 } | |
41 | |
42 /** | |
43 * | |
44 * @param dir | |
45 * @param pathFactory | |
46 * @param scopeMatcher - this matcher shall be capable to tell not only files of interest, but | |
47 * also whether directories shall be traversed or not (Paths it gets in {@link Path.Matcher#accept(Path)} may | |
48 * point to directories) | |
49 */ | |
50 public FileWalker(File dir, Path.Source pathFactory, Path.Matcher scopeMatcher) { | |
38 startDir = dir; | 51 startDir = dir; |
39 pathHelper = pathFactory; | 52 pathHelper = pathFactory; |
40 dirQueue = new LinkedList<File>(); | 53 dirQueue = new LinkedList<File>(); |
41 fileQueue = new LinkedList<File>(); | 54 fileQueue = new LinkedList<File>(); |
55 scope = scopeMatcher; | |
42 reset(); | 56 reset(); |
43 } | 57 } |
44 | 58 |
45 public void reset() { | 59 public void reset() { |
46 fileQueue.clear(); | 60 fileQueue.clear(); |
69 public File file() { | 83 public File file() { |
70 return nextFile; | 84 return nextFile; |
71 } | 85 } |
72 | 86 |
73 public boolean inScope(Path file) { | 87 public boolean inScope(Path file) { |
74 return true; // no limits, all files are of interest | 88 /* by default, no limits, all files are of interest */ |
89 return scope == null ? true : scope.accept(file); | |
75 } | 90 } |
76 | 91 |
77 // returns non-null | 92 // returns non-null |
78 private File[] listFiles(File f) { | 93 private File[] listFiles(File f) { |
79 // in case we need to solve os-related file issues (mac with some encodings?) | 94 // in case we need to solve os-related file issues (mac with some encodings?) |
89 return false; | 104 return false; |
90 } | 105 } |
91 while (!dirQueue.isEmpty()) { | 106 while (!dirQueue.isEmpty()) { |
92 File dir = dirQueue.removeFirst(); | 107 File dir = dirQueue.removeFirst(); |
93 for (File f : listFiles(dir)) { | 108 for (File f : listFiles(dir)) { |
94 if (f.isDirectory()) { | 109 final boolean isDir = f.isDirectory(); |
95 if (!".hg".equals(f.getName())) { | 110 Path path = pathHelper.path(isDir ? ensureTrailingSlash(f.getPath()) : f.getPath()); |
111 if (!inScope(path)) { | |
112 continue; | |
113 } | |
114 if (isDir) { | |
115 if (!".hg/".equals(path.toString())) { | |
96 dirQueue.addLast(f); | 116 dirQueue.addLast(f); |
97 } | 117 } |
98 } else { | 118 } else { |
99 fileQueue.addLast(f); | 119 fileQueue.addLast(f); |
100 } | 120 } |
102 break; | 122 break; |
103 } | 123 } |
104 } | 124 } |
105 return !fileQueue.isEmpty(); | 125 return !fileQueue.isEmpty(); |
106 } | 126 } |
127 | |
128 private static String ensureTrailingSlash(String dirName) { | |
129 if (dirName.length() > 0) { | |
130 char last = dirName.charAt(dirName.length() - 1); | |
131 if (last == '/' || last == File.separatorChar) { | |
132 return dirName; | |
133 } | |
134 // if path already has platform-specific separator (which, BTW, it shall, according to File#getPath), | |
135 // add similar, otherwise use our default. | |
136 return dirName.indexOf(File.separatorChar) != -1 ? dirName.concat(File.separator) : dirName.concat("/"); | |
137 } | |
138 return dirName; | |
139 } | |
107 } | 140 } |