Skip to content

Commit

Permalink
Make rg search in EH usable for local files - #47058
Browse files Browse the repository at this point in the history
  • Loading branch information
roblourens committed Apr 20, 2018
1 parent 1bd4e1e commit 9383f2f
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 37 deletions.
4 changes: 3 additions & 1 deletion extensions/search-rg/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import * as vscode from 'vscode';
import { RipgrepTextSearchEngine } from './ripgrepTextSearch';

export function activate(): void {
vscode.workspace.registerSearchProvider('vscode-remote', new RipgrepSearchProvider());
const provider = new RipgrepSearchProvider();
vscode.workspace.registerSearchProvider('vscode-remote', provider);
vscode.workspace.registerSearchProvider('file', provider);
}

class RipgrepSearchProvider implements vscode.SearchProvider {
Expand Down
20 changes: 10 additions & 10 deletions extensions/search-rg/src/ripgrepTextSearch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ export class RipgrepTextSearchEngine {
}

cancel(): void {
this.isDone = true;
this.ripgrepParser.cancel();
this.rgProc.kill();
}
Expand All @@ -50,6 +49,10 @@ export class RipgrepTextSearchEngine {
// let rgCmd = `rg ${escapedArgs}\n - cwd: ${cwd}`;

this.rgProc = cp.spawn(rgDiskPath, rgArgs, { cwd });
this.rgProc.on('error', e => {
console.log(e);
reject(e);
});

this.ripgrepParser = new RipgrepParser(cwd);
this.ripgrepParser.on('result', (match: vscode.TextSearchResult) => {
Expand All @@ -71,17 +74,14 @@ export class RipgrepTextSearchEngine {
});

this.rgProc.on('close', code => {
// Trigger last result, then wait on async result handling
// Trigger last result
this.ripgrepParser.flush();
this.rgProc = null;
if (!this.isDone) {
this.isDone = true;
let displayMsg: string;
if (stderr && !gotData && (displayMsg = rgErrorMsgForDisplay(stderr))) {
reject(new Error(displayMsg));
} else {
resolve();
}
let displayMsg: string;
if (stderr && !gotData && (displayMsg = rgErrorMsgForDisplay(stderr))) {
reject(new Error(displayMsg));
} else {
resolve();
}
});
});
Expand Down
19 changes: 11 additions & 8 deletions src/vs/platform/search/common/search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
'use strict';

import { PPromise, TPromise } from 'vs/base/common/winjs.base';
import uri from 'vs/base/common/uri';
import uri, { UriComponents } from 'vs/base/common/uri';
import * as objects from 'vs/base/common/objects';
import * as paths from 'vs/base/common/paths';
import * as glob from 'vs/base/common/glob';
Expand Down Expand Up @@ -33,16 +33,16 @@ export interface ISearchResultProvider {
search(query: ISearchQuery): PPromise<ISearchComplete, ISearchProgressItem>;
}

export interface IFolderQuery {
folder: uri;
export interface IFolderQuery<U=uri> {
folder: U;
excludePattern?: glob.IExpression;
includePattern?: glob.IExpression;
fileEncoding?: string;
disregardIgnoreFiles?: boolean;
}

export interface ICommonQueryOptions {
extraFileResources?: uri[];
export interface ICommonQueryOptions<U> {
extraFileResources?: U[];
filePattern?: string; // file search only
fileEncoding?: string;
maxResults?: number;
Expand All @@ -60,21 +60,24 @@ export interface ICommonQueryOptions {
ignoreSymlinks?: boolean;
}

export interface IQueryOptions extends ICommonQueryOptions {
export interface IQueryOptions extends ICommonQueryOptions<uri> {
excludePattern?: string;
includePattern?: string;
}

export interface ISearchQuery extends ICommonQueryOptions {
export interface ISearchQueryProps<U> extends ICommonQueryOptions<U> {
type: QueryType;

excludePattern?: glob.IExpression;
includePattern?: glob.IExpression;
contentPattern?: IPatternInfo;
folderQueries?: IFolderQuery[];
folderQueries?: IFolderQuery<U>[];
usingSearchPaths?: boolean;
}

export type ISearchQuery = ISearchQueryProps<uri>;
export type IRawSearchQuery = ISearchQueryProps<UriComponents>;

export enum QueryType {
File = 1,
Text = 2
Expand Down
33 changes: 23 additions & 10 deletions src/vs/workbench/api/electron-browser/mainThreadSearch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ class RemoteSearchProvider implements ISearchResultProvider {
private readonly _registrations: IDisposable[];
private readonly _searches = new Map<number, SearchOperation>();


constructor(
searchService: ISearchService,
private readonly _scheme: string,
Expand All @@ -93,15 +92,12 @@ class RemoteSearchProvider implements ISearchResultProvider {
return PPromise.as(undefined);
}

let includes = { ...query.includePattern };
let excludes = { ...query.excludePattern };
const folderQueriesForScheme = query.folderQueries.filter(fq => fq.folder.scheme === this._scheme);

for (const folderQuery of query.folderQueries) {
if (folderQuery.folder.scheme === this._scheme) {
includes = { ...includes, ...folderQuery.includePattern };
excludes = { ...excludes, ...folderQuery.excludePattern };
}
}
query = {
...query,
folderQueries: folderQueriesForScheme
};

let outer: TPromise;

Expand All @@ -112,7 +108,7 @@ class RemoteSearchProvider implements ISearchResultProvider {

outer = query.type === QueryType.File
? this._proxy.$provideFileSearchResults(this._handle, search.id, query.filePattern)
: this._proxy.$provideTextSearchResults(this._handle, search.id, query.contentPattern, query, { excludes: Object.keys(excludes), includes: Object.keys(includes) });
: this._proxy.$provideTextSearchResults(this._handle, search.id, query.contentPattern, query);

outer.then(() => {
this._searches.delete(search.id);
Expand Down Expand Up @@ -146,3 +142,20 @@ class RemoteSearchProvider implements ISearchResultProvider {
this._searches.get(session).addMatch(resource, match);
}
}

// function createRawSearchQuery(query: ISearchQuery): IRawSearchQuery {
// return {
// contentPattern: query.contentPattern,
// disregardExcludeSettings: query.disregardExcludeSettings,
// disregardIgnoreFiles: query.disregardIgnoreFiles,
// excludePattern: query.excludePattern,
// extraFileResources: query.extraFileResources,
// fileEncoding: query.fileEncoding,
// folderQueries: query.folderQueries.map(fq => {
// const rawFq: IFolderQuery<UriComponents> = { ...fq };
// rawFq.folder = fq.folder.toJSON();
// return rawFq;
// }),
// type: query.type
// }
// }
4 changes: 2 additions & 2 deletions src/vs/workbench/api/node/extHost.protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import { IStat, FileChangeType, FileOpenFlags, IWatchOptions, FileSystemProvider
import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration';
import { ISingleEditOperation } from 'vs/editor/common/model';
import { ILineMatch, IPatternInfo, ISearchQuery } from 'vs/platform/search/common/search';
import { ILineMatch, IPatternInfo, IRawSearchQuery } from 'vs/platform/search/common/search';
import { LogLevel } from 'vs/platform/log/common/log';
import { TaskExecutionDTO, TaskDTO, TaskHandleDTO } from 'vs/workbench/api/shared/tasks';

Expand Down Expand Up @@ -592,7 +592,7 @@ export interface ExtHostFileSystemShape {

export interface ExtHostSearchShape {
$provideFileSearchResults(handle: number, session: number, query: string): TPromise<void>;
$provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, query: ISearchQuery, options: { includes: string[], excludes: string[] }): TPromise<void>;
$provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, query: IRawSearchQuery): TPromise<void>;
}

export interface ExtHostExtensionServiceShape {
Expand Down
31 changes: 26 additions & 5 deletions src/vs/workbench/api/node/extHostSearch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@

import { asWinJsPromise } from 'vs/base/common/async';
import { TPromise } from 'vs/base/common/winjs.base';
import { IPatternInfo, ISearchQuery } from 'vs/platform/search/common/search';
import { IPatternInfo, IFolderQuery, IRawSearchQuery } from 'vs/platform/search/common/search';
import * as vscode from 'vscode';
import { ExtHostSearchShape, IMainContext, MainContext, MainThreadSearchShape } from './extHost.protocol';
import URI, { UriComponents } from 'vs/base/common/uri';

export class ExtHostSearch implements ExtHostSearchShape {

Expand Down Expand Up @@ -45,16 +46,36 @@ export class ExtHostSearch implements ExtHostSearchShape {
return asWinJsPromise(token => provider.provideFileSearchResults(query, progress, token));
}

$provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, query: ISearchQuery, options: { includes: string[], excludes: string[] }): TPromise<void> {
$provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, query: IRawSearchQuery): TPromise<void> {
return TPromise.join(
query.folderQueries.map(fq => this.provideTextSearchResultsForFolder(handle, session, pattern, query, fq))
).then(
() => { },
(err: Error[]) => {
return TPromise.wrapError(err[0]);
});
}

private provideTextSearchResultsForFolder(handle: number, session: number, pattern: IPatternInfo, query: IRawSearchQuery, folderQuery: IFolderQuery<UriComponents>): TPromise<void> {
const provider = this._searchProvider.get(handle);
if (!provider.provideTextSearchResults) {
return TPromise.as(undefined);
}

const includes: string[] = query.includePattern ? Object.keys(query.includePattern) : [];
if (folderQuery.includePattern) {
includes.push(...Object.keys(folderQuery.includePattern));
}

const excludes: string[] = query.excludePattern ? Object.keys(query.excludePattern) : [];
if (folderQuery.excludePattern) {
excludes.push(...Object.keys(folderQuery.excludePattern));
}

const searchOptions: vscode.TextSearchOptions = {
folder: query.folderQueries[0].folder,
excludes: options.excludes,
includes: options.includes,
folder: URI.from(folderQuery.folder),
excludes,
includes,
disregardIgnoreFiles: query.disregardIgnoreFiles,
ignoreSymlinks: query.ignoreSymlinks,
encoding: query.fileEncoding
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/services/search/node/rawSearchService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export class SearchService implements IRawSearchService {

public textSearch(config: IRawSearch): PPromise<ISerializedSearchComplete, ISerializedSearchProgressItem> {
return config.useRipgrep ?
this.ripgrepTextSearch(config) :
PPromise.wrap({ limitHit: false, stats: null }) :
this.legacyTextSearch(config);
}

Expand Down

0 comments on commit 9383f2f

Please sign in to comment.