提交 ac5d1a09 编写于 作者: R Rob Lourens

Validate that search folders exist for all providers, not just the disk provider

Fix #94170
上级 0a3df930
......@@ -116,41 +116,43 @@ export class SearchService extends Disposable implements ISearchService {
schemesInQuery.forEach(scheme => providerActivations.push(this.extensionService.activateByEvent(`onSearch:${scheme}`)));
providerActivations.push(this.extensionService.activateByEvent('onSearch:file'));
const providerPromise = Promise.all(providerActivations)
.then(() => this.extensionService.whenInstalledExtensionsRegistered())
.then(() => {
// Cancel faster if search was canceled while waiting for extensions
if (token && token.isCancellationRequested) {
return Promise.reject(canceled());
}
const providerPromise = (async () => {
await Promise.all(providerActivations);
this.extensionService.whenInstalledExtensionsRegistered();
const progressCallback = (item: ISearchProgressItem) => {
if (token && token.isCancellationRequested) {
return;
}
// Cancel faster if search was canceled while waiting for extensions
if (token && token.isCancellationRequested) {
return Promise.reject(canceled());
}
if (onProgress) {
onProgress(item);
}
};
const progressCallback = (item: ISearchProgressItem) => {
if (token && token.isCancellationRequested) {
return;
}
return this.searchWithProviders(query, progressCallback, token);
})
.then(completes => {
completes = arrays.coalesce(completes);
if (!completes.length) {
return {
limitHit: false,
results: []
};
if (onProgress) {
onProgress(item);
}
};
const exists = await Promise.all(query.folderQueries.map(query => this.fileService.exists(query.folder)));
query.folderQueries = query.folderQueries.filter((_, i) => exists[i]);
return <ISearchComplete>{
limitHit: completes[0] && completes[0].limitHit,
stats: completes[0].stats,
results: arrays.flatten(completes.map((c: ISearchComplete) => c.results))
let completes = await this.searchWithProviders(query, progressCallback, token);
completes = arrays.coalesce(completes);
if (!completes.length) {
return {
limitHit: false,
results: []
};
});
}
return <ISearchComplete>{
limitHit: completes[0] && completes[0].limitHit,
stats: completes[0].stats,
results: arrays.flatten(completes.map((c: ISearchComplete) => c.results))
};
})();
return new Promise((resolve, reject) => {
if (token) {
......
......@@ -51,7 +51,6 @@ export class DiskSearch implements ISearchResultProvider {
searchDebug: IDebugParams | undefined,
@ILogService private readonly logService: ILogService,
@IConfigurationService private readonly configService: IConfigurationService,
@IFileService private readonly fileService: IFileService
) {
const timeout = this.configService.getValue<ISearchConfiguration>().search.maintainFileSearchCache ?
Number.MAX_VALUE :
......@@ -91,41 +90,31 @@ export class DiskSearch implements ISearchResultProvider {
}
textSearch(query: ITextQuery, onProgress?: (p: ISearchProgressItem) => void, token?: CancellationToken): Promise<ISearchComplete> {
const folderQueries = query.folderQueries || [];
return Promise.all(folderQueries.map(q => this.fileService.exists(q.folder)))
.then(exists => {
if (token && token.isCancellationRequested) {
throw canceled();
}
if (token && token.isCancellationRequested) {
throw canceled();
}
query.folderQueries = folderQueries.filter((q, index) => exists[index]);
const event: Event<ISerializedSearchProgressItem | ISerializedSearchComplete> = this.raw.textSearch(query);
const event: Event<ISerializedSearchProgressItem | ISerializedSearchComplete> = this.raw.textSearch(query);
return DiskSearch.collectResultsFromEvent(event, onProgress, token);
});
return DiskSearch.collectResultsFromEvent(event, onProgress, token);
}
fileSearch(query: IFileQuery, token?: CancellationToken): Promise<ISearchComplete> {
const folderQueries = query.folderQueries || [];
return Promise.all(folderQueries.map(q => this.fileService.exists(q.folder)))
.then(exists => {
if (token && token.isCancellationRequested) {
throw canceled();
}
if (token && token.isCancellationRequested) {
throw canceled();
}
query.folderQueries = folderQueries.filter((q, index) => exists[index]);
let event: Event<ISerializedSearchProgressItem | ISerializedSearchComplete>;
event = this.raw.fileSearch(query);
let event: Event<ISerializedSearchProgressItem | ISerializedSearchComplete>;
event = this.raw.fileSearch(query);
const onProgress = (p: ISearchProgressItem) => {
if (!isFileMatch(p)) {
// Should only be for logs
this.logService.debug('SearchService#search', p.message);
}
};
const onProgress = (p: ISearchProgressItem) => {
if (!isFileMatch(p)) {
// Should only be for logs
this.logService.debug('SearchService#search', p.message);
}
};
return DiskSearch.collectResultsFromEvent(event, onProgress, token);
});
return DiskSearch.collectResultsFromEvent(event, onProgress, token);
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册