Skip to content
This repository was archived by the owner on Mar 10, 2022. It is now read-only.

Commit 5a99931

Browse files
committed
feat: add ability to go to a file in a specific folder
1 parent 3275d92 commit 5a99931

5 files changed

Lines changed: 32 additions & 4 deletions

File tree

package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@
8484
"category": "Sourcegraph",
8585
"title": "Go to File"
8686
},
87+
{
88+
"command": "extension.goToFileInFolder",
89+
"category": "Sourcegraph",
90+
"title": "Go to File in Folder"
91+
},
8792
{
8893
"command": "extension.goToRepository",
8994
"category": "Sourcegraph",
@@ -151,6 +156,9 @@
151156
"group": "navigation",
152157
"when": "view == sourcegraph.files"
153158
}
159+
],
160+
"view/item/context": [
161+
{"command": "extension.goToFileInFolder", "when": "view == sourcegraph.files && viewItem == directory"}
154162
]
155163
},
156164
"keybindings": [

src/commands/goToFileCommand.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,27 @@ import { SourcegraphFileSystemProvider } from '../file-system/SourcegraphFileSys
33
import { SourcegraphQuickPick } from './SourcegraphQuickPick'
44
import { recentlyOpenFilesSetting } from '../settings/recentlyOpenFilesSetting'
55
import { log } from '../log'
6+
import { SourcegraphUri } from '../file-system/SourcegraphUri'
67

7-
export async function goToFileCommand(fs: SourcegraphFileSystemProvider): Promise<void> {
8+
export async function goToFileCommand(fs: SourcegraphFileSystemProvider, folderUri?: string): Promise<void> {
89
const quick = new SourcegraphQuickPick(fs)
910
quick.pick.title = 'Go to a file from the open Sourcegraph repositories'
10-
const recentlyOpenFiles = recentlyOpenFilesSetting.load()
11+
const recentlyOpenFiles = folderUri ? [] : recentlyOpenFilesSetting.load()
1112
const fileItems = [...recentlyOpenFiles]
1213
quick.pick.items = fileItems
1314
quick.pick.busy = true
14-
fs.allFileFromOpenRepositories().then(
15+
const folder = folderUri ? SourcegraphUri.parse(folderUri) : undefined
16+
const folderPath = folder?.path ? folder.path + '/' : undefined
17+
fs.allFileFromOpenRepositories(folder).then(
1518
allFiles => {
1619
for (const repo of allFiles) {
1720
for (const file of repo.fileNames) {
1821
if (file === '') {
1922
continue
2023
}
24+
if (folderPath && !file.startsWith(folderPath)) {
25+
continue
26+
}
2127
// Intentionally avoid using `SourcegraphUri.parse()` for
2228
// performance reasons. This loop is a hot path for large
2329
// repositories like chromium/chromium with ~400k files.

src/extension.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@ export function activate(context: vscode.ExtensionContext): void {
8080
treeDataProvider.setTreeView(treeView)
8181
const semanticTokens = new SourcegraphSemanticTokenProvider()
8282
context.subscriptions.push(treeView)
83+
context.subscriptions.push(
84+
vscode.commands.registerCommand('extension.goToFileInFolder', async (uri: string | undefined) => {
85+
if (typeof uri === 'string') {
86+
await goToFileCommand(fs, uri)
87+
} else {
88+
log.error(`extension.goToFileInFolder - invalid argument ${uri || 'undefined'}`)
89+
}
90+
})
91+
)
8392
context.subscriptions.push(
8493
vscode.commands.registerCommand(
8594
'extension.goToFile',

src/file-system/SourcegraphFileSystemProvider.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,13 @@ export class SourcegraphFileSystemProvider implements vscode.FileSystemProvider
109109
return [...this.fileNamesByRepository.keys()]
110110
}
111111

112-
public async allFileFromOpenRepositories(): Promise<RepositoryFileNames[]> {
112+
public async allFileFromOpenRepositories(folder?: SourcegraphUri): Promise<RepositoryFileNames[]> {
113113
const promises: RepositoryFileNames[] = []
114+
const folderRepositoryUri = folder?.repositoryUri()
114115
for (const [repositoryUri, downloadingFileNames] of this.fileNamesByRepository.entries()) {
116+
if (folderRepositoryUri && repositoryUri !== folderRepositoryUri) {
117+
continue
118+
}
115119
try {
116120
const fileNames = await downloadingFileNames
117121
const uri = SourcegraphUri.parse(repositoryUri)

src/file-system/SourcegraphTreeDataProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ export class SourcegraphTreeDataProvider implements vscode.TreeDataProvider<stri
186186
: vscode.TreeItemCollapsibleState.Collapsed,
187187
command,
188188
resourceUri: vscode.Uri.parse(uri.uri),
189+
contextValue: uri.isFile() ? 'file' : 'directory',
189190
}
190191
}
191192
}

0 commit comments

Comments
 (0)