提交 7c664b10 编写于 作者: R Rob Lourens

Correctly apply search excludes to local file matches

上级 6ed964d8
......@@ -6,7 +6,8 @@
import { PPromise, TPromise } from 'vs/base/common/winjs.base';
import uri from 'vs/base/common/uri';
import { mixin } from 'vs/base/common/objects';
import * as paths from 'vs/base/common/paths';
import * as objects from 'vs/base/common/objects';
import { IExpression } from 'vs/base/common/glob';
import { IFilesConfiguration } from 'vs/platform/files/common/files';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
......@@ -163,8 +164,30 @@ export function getExcludes(configuration: ISearchConfiguration): IExpression {
}
let allExcludes: IExpression = Object.create(null);
allExcludes = mixin(allExcludes, fileExcludes);
allExcludes = mixin(allExcludes, searchExcludes, true);
allExcludes = objects.mixin(allExcludes, fileExcludes);
allExcludes = objects.mixin(allExcludes, searchExcludes, true);
return allExcludes;
}
export function getMergedExcludes(query: ISearchQuery, absolutePaths?: boolean): IExpression {
const globalExcludePattern: IExpression = query.excludePattern || {};
return query.folderQueries
.map(folderQuery => {
const mergedFolderExclude = objects.assign({}, globalExcludePattern, folderQuery.excludePattern || {});
return absolutePaths ?
makeExcludesAbsolute(mergedFolderExclude, folderQuery.folder) :
mergedFolderExclude;
});
}
function makeExcludesAbsolute(excludePattern: IExpression, rootFolder: uri) {
return Object.keys(excludePattern)
.reduce((absolutePattern: IExpression, key: string) => {
const value = excludePattern[key];
key = paths.join(rootFolder.fsPath, key);
absolutePattern[key] = value;
return absolutePattern;
}, {});
}
\ No newline at end of file
......@@ -12,7 +12,7 @@ import scorer = require('vs/base/common/scorer');
import strings = require('vs/base/common/strings');
import { getNextTickChannel } from 'vs/base/parts/ipc/common/ipc';
import { Client } from 'vs/base/parts/ipc/node/ipc.cp';
import { IProgress, LineMatch, FileMatch, ISearchComplete, ISearchProgressItem, QueryType, IFileMatch, ISearchQuery, ISearchConfiguration, ISearchService } from 'vs/platform/search/common/search';
import { IProgress, LineMatch, FileMatch, ISearchComplete, ISearchProgressItem, QueryType, IFileMatch, ISearchQuery, ISearchConfiguration, ISearchService, getMergedExcludes } from 'vs/platform/search/common/search';
import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
import { IModelService } from 'vs/editor/common/services/modelService';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
......@@ -130,7 +130,7 @@ export class SearchService implements ISearchService {
return;
}
if (!this.matches(resource, query.filePattern, query.includePattern, query.excludePattern)) {
if (!this.matches(resource, query)) {
return; // respect user filters
}
......@@ -152,8 +152,11 @@ export class SearchService implements ISearchService {
return localResults;
}
private matches(resource: uri, filePattern: string, includePattern: glob.IExpression, excludePattern: glob.IExpression): boolean {
let workspaceRelativePath = this.contextService.toWorkspaceRelativePath(resource);
private matches(resource: uri, query: ISearchQuery): boolean {
const {
filePattern,
includePattern,
} = query;
// file pattern
if (filePattern) {
......@@ -172,20 +175,20 @@ export class SearchService implements ISearchService {
return false; // if we match on file patterns, we have to ignore non file resources
}
if (!glob.match(includePattern, workspaceRelativePath || resource.fsPath)) {
if (!glob.match(includePattern, resource.fsPath)) {
return false;
}
}
// excludes
if (excludePattern) {
if (resource.scheme !== 'file') {
return true; // e.g. untitled files can never be excluded with file patterns
}
if (glob.match(excludePattern, workspaceRelativePath || resource.fsPath)) {
return false;
}
const allFolderExcludes = getMergedExcludes(query, /*absolutePaths=*/true);
if (resource.scheme !== 'file') {
return true; // e.g. untitled files can never be excluded with file patterns
}
if (glob.match(allFolderExcludes, resource.fsPath)) {
return false;
}
return true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册