提交 1f152ab5 编写于 作者: B Benjamin Pasero

File picker: bypass exclude rules when picking a full file path (fixes #1445)

上级 b20452d3
...@@ -67,49 +67,72 @@ export class FileWalker { ...@@ -67,49 +67,72 @@ export class FileWalker {
// Reset state // Reset state
this.resetState(); this.resetState();
// For each source // Support that the file pattern is a full path to a file that exists
flow.parallel(rootPaths, (absolutePath, perEntryCallback) => { this.checkFilePatternMatch(rootPaths, (exists) => {
// Try to Read as folder // Report result from file pattern if matching
extfs.readdir(absolutePath, (error: Error, files: string[]) => { if (exists) {
if (this.isCanceled || this.isLimitHit) { onResult({ path: this.filePattern });
return perEntryCallback(null, null); }
}
// Handle Directory
if (!error) {
return this.doWalk(absolutePath, '', files, onResult, perEntryCallback);
}
// Not a folder - deal with file result then // For each source
if ((<any>error).code === FileWalker.ENOTDIR && !this.isCanceled && !this.isLimitHit) { flow.parallel(rootPaths, (absolutePath, perEntryCallback) => {
// Check exclude pattern // Try to Read as folder
if (glob.match(this.excludePattern, absolutePath)) { extfs.readdir(absolutePath, (error: Error, files: string[]) => {
if (this.isCanceled || this.isLimitHit) {
return perEntryCallback(null, null); return perEntryCallback(null, null);
} }
// Check for match on file pattern and include pattern // Handle Directory
if (this.isFilePatternMatch(paths.basename(absolutePath), absolutePath) && (!this.includePattern || glob.match(this.includePattern, absolutePath))) { if (!error) {
this.resultCount++; return this.doWalk(absolutePath, '', files, onResult, perEntryCallback);
}
if (this.maxResults && this.resultCount > this.maxResults) { // Not a folder - deal with file result then
this.isLimitHit = true; if ((<any>error).code === FileWalker.ENOTDIR && !this.isCanceled && !this.isLimitHit) {
// Check exclude pattern
if (glob.match(this.excludePattern, absolutePath)) {
return perEntryCallback(null, null);
} }
if (!this.isLimitHit) { // Check for match on file pattern and include pattern
onResult({ if (this.isFilePatternMatch(paths.basename(absolutePath), absolutePath) && (!this.includePattern || glob.match(this.includePattern, absolutePath))) {
path: absolutePath this.resultCount++;
});
if (this.maxResults && this.resultCount > this.maxResults) {
this.isLimitHit = true;
}
if (!this.isLimitHit) {
onResult({
path: absolutePath
});
}
} }
} }
}
// Unwind // Unwind
return perEntryCallback(null, null); return perEntryCallback(null, null);
});
}, (err, result) => {
done(err ? err[0] : null, this.isLimitHit);
}); });
}, (err, result) => { });
done(err ? err[0] : null, this.isLimitHit); }
private checkFilePatternMatch(rootPaths: string[], clb: (exists: boolean) => void): void {
if (!this.filePattern || !paths.isAbsolute(this.filePattern)) {
return clb(false);
}
if (rootPaths && rootPaths.some(r => r === this.filePattern)) {
return clb(false); // root paths matches are handled already (prevents duplicates)
}
return fs.stat(this.filePattern, (error, stat) => {
return clb(!error && !stat.isDirectory()); // only existing files
}); });
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册