Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

improve result of link search for directories #142119

Merged
merged 8 commits into from
Feb 3, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,12 @@ export class TerminalLinkManager extends DisposableStore {

// Setup link openers
const localFileOpener = this._instantiationService.createInstance(TerminalLocalFileLinkOpener, this._processManager.os || OS);
const localFolderInWorkspaceOpener = this._instantiationService.createInstance(TerminalLocalFolderInWorkspaceLinkOpener);
const localFolderOutsideWorkspaceOpener = this._instantiationService.createInstance(TerminalLocalFolderOutsideWorkspaceLinkOpener);
this._openers.set(TerminalBuiltinLinkType.LocalFile, localFileOpener);
this._openers.set(TerminalBuiltinLinkType.LocalFolderInWorkspace, this._instantiationService.createInstance(TerminalLocalFolderInWorkspaceLinkOpener));
this._openers.set(TerminalBuiltinLinkType.LocalFolderOutsideWorkspace, this._instantiationService.createInstance(TerminalLocalFolderOutsideWorkspaceLinkOpener));
this._openers.set(TerminalBuiltinLinkType.Search, this._instantiationService.createInstance(TerminalSearchLinkOpener, capabilities, localFileOpener, this._processManager.os || OS));
this._openers.set(TerminalBuiltinLinkType.LocalFolderInWorkspace, localFolderInWorkspaceOpener);
this._openers.set(TerminalBuiltinLinkType.LocalFolderOutsideWorkspace, localFolderOutsideWorkspaceOpener);
this._openers.set(TerminalBuiltinLinkType.Search, this._instantiationService.createInstance(TerminalSearchLinkOpener, capabilities, localFileOpener, localFolderInWorkspaceOpener, localFolderOutsideWorkspaceOpener, this._processManager.os || OS));
this._openers.set(TerminalBuiltinLinkType.Url, this._instantiationService.createInstance(TerminalUrlLinkOpener, !!this._processManager.remoteAuthority));

this._registerStandardLinkProviders();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ export class TerminalSearchLinkOpener implements ITerminalLinkOpener {
constructor(
private readonly _capabilities: ITerminalCapabilityStore,
private readonly _localFileOpener: TerminalLocalFileLinkOpener,
private readonly _localFolderInWorkspaceOpener: TerminalLocalFolderInWorkspaceLinkOpener,
private readonly _localFolderOutsideWorkspaceOpener: TerminalLocalFolderOutsideWorkspaceLinkOpener,
private readonly _os: OperatingSystem,
@IFileService private readonly _fileService: IFileService,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
Expand Down Expand Up @@ -143,14 +145,30 @@ export class TerminalSearchLinkOpener implements ITerminalLinkOpener {
}
const sanitizedLink = matchLink.replace(/:\d+(:\d+)?$/, '');
try {
const uri = await this._getExactMatch(sanitizedLink);
if (uri) {
const result = await this._getExactMatch(sanitizedLink);
if (result) {
const { uri: resource, type} = result;
if (type === 'file' && resource) {
return this._localFileOpener.open({
text: matchLink,
uri,
uri: resource,
bufferRange: link.bufferRange,
type: link.type
});
} else if (type === 'dir' && resource) {
link = {
text: matchLink,
uri: resource,
bufferRange: link.bufferRange,
type: link.type
};
try {
meganrogge marked this conversation as resolved.
Show resolved Hide resolved
this._localFolderInWorkspaceOpener.open(link);
return;
} catch {
this._localFolderOutsideWorkspaceOpener.open(link);
}
}
}
} catch {
// Fallback to searching quick access
Expand Down Expand Up @@ -187,21 +205,23 @@ export class TerminalSearchLinkOpener implements ITerminalLinkOpener {
return text;
}

private async _getExactMatch(sanitizedLink: string): Promise<URI | undefined> {
let exactResource: URI | undefined;
private async _getExactMatch(sanitizedLink: string): Promise<IResourceMatch | undefined> {
let resourceMatch: IResourceMatch | undefined;
if (osPathModule(this._os).isAbsolute(sanitizedLink)) {
const scheme = this._workbenchEnvironmentService.remoteAuthority ? Schemas.vscodeRemote : Schemas.file;
const resource = URI.from({ scheme, path: sanitizedLink });
const uri = URI.from({ scheme, path: sanitizedLink });
try {
const fileStat = await this._fileService.resolve(resource);
const fileStat = await this._fileService.resolve(uri);
if (fileStat.isFile) {
exactResource = resource;
resourceMatch = { uri, type: 'file'};
meganrogge marked this conversation as resolved.
Show resolved Hide resolved
} else if (fileStat.isDirectory) {
resourceMatch = { uri, type: 'dir' };
meganrogge marked this conversation as resolved.
Show resolved Hide resolved
}
} catch {
// File doesn't exist, continue on
// File or dir doesn't exist, continue on
}
}
if (!exactResource) {
if (!resourceMatch) {
const results = await this._searchService.fileSearch(
this._fileQueryBuilder.file(this._workspaceContextService.getWorkspace().folders, {
// Remove optional :row:col from the link as openEditor supports it
Expand All @@ -210,13 +230,18 @@ export class TerminalSearchLinkOpener implements ITerminalLinkOpener {
})
);
if (results.results.length === 1) {
exactResource = results.results[0].resource;
resourceMatch = { uri: results.results[0].resource, type: 'file'};
}
}
return exactResource;
return resourceMatch;
}
}

interface IResourceMatch {
uri: URI | undefined;
type: 'file' | 'dir' | undefined;
}

export class TerminalUrlLinkOpener implements ITerminalLinkOpener {
constructor(
private readonly _isRemote: boolean,
Expand Down