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

Correctly apply search excludes to local file matches

上级 6ed964d8
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
import { PPromise, TPromise } from 'vs/base/common/winjs.base'; import { PPromise, TPromise } from 'vs/base/common/winjs.base';
import uri from 'vs/base/common/uri'; 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 { IExpression } from 'vs/base/common/glob';
import { IFilesConfiguration } from 'vs/platform/files/common/files'; import { IFilesConfiguration } from 'vs/platform/files/common/files';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
...@@ -163,8 +164,30 @@ export function getExcludes(configuration: ISearchConfiguration): IExpression { ...@@ -163,8 +164,30 @@ export function getExcludes(configuration: ISearchConfiguration): IExpression {
} }
let allExcludes: IExpression = Object.create(null); let allExcludes: IExpression = Object.create(null);
allExcludes = mixin(allExcludes, fileExcludes); allExcludes = objects.mixin(allExcludes, fileExcludes);
allExcludes = mixin(allExcludes, searchExcludes, true); allExcludes = objects.mixin(allExcludes, searchExcludes, true);
return allExcludes; 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'); ...@@ -12,7 +12,7 @@ import scorer = require('vs/base/common/scorer');
import strings = require('vs/base/common/strings'); import strings = require('vs/base/common/strings');
import { getNextTickChannel } from 'vs/base/parts/ipc/common/ipc'; import { getNextTickChannel } from 'vs/base/parts/ipc/common/ipc';
import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; 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 { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
import { IModelService } from 'vs/editor/common/services/modelService'; import { IModelService } from 'vs/editor/common/services/modelService';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
...@@ -130,7 +130,7 @@ export class SearchService implements ISearchService { ...@@ -130,7 +130,7 @@ export class SearchService implements ISearchService {
return; return;
} }
if (!this.matches(resource, query.filePattern, query.includePattern, query.excludePattern)) { if (!this.matches(resource, query)) {
return; // respect user filters return; // respect user filters
} }
...@@ -152,8 +152,11 @@ export class SearchService implements ISearchService { ...@@ -152,8 +152,11 @@ export class SearchService implements ISearchService {
return localResults; return localResults;
} }
private matches(resource: uri, filePattern: string, includePattern: glob.IExpression, excludePattern: glob.IExpression): boolean { private matches(resource: uri, query: ISearchQuery): boolean {
let workspaceRelativePath = this.contextService.toWorkspaceRelativePath(resource); const {
filePattern,
includePattern,
} = query;
// file pattern // file pattern
if (filePattern) { if (filePattern) {
...@@ -172,20 +175,20 @@ export class SearchService implements ISearchService { ...@@ -172,20 +175,20 @@ export class SearchService implements ISearchService {
return false; // if we match on file patterns, we have to ignore non file resources 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; return false;
} }
} }
// excludes // 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)) { const allFolderExcludes = getMergedExcludes(query, /*absolutePaths=*/true);
return false; 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; return true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册