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

Commit 3b43063

Browse files
committed
feat: add support to change git revision
1 parent 5a99931 commit 3b43063

5 files changed

Lines changed: 126 additions & 1 deletion

File tree

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@
9494
"category": "Sourcegraph",
9595
"title": "Go to Repository"
9696
},
97+
{
98+
"command": "extension.switchGitRevision",
99+
"category": "Sourcegraph",
100+
"title": "Switch git revision"
101+
},
97102
{
98103
"command": "extension.newNotebook",
99104
"category": "Sourcegraph",
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { SourcegraphTreeDataProvider } from '../file-system/SourcegraphTreeDataProvider'
2+
import { log } from '../log'
3+
import { GitReference, gitReferencesQuery } from '../queries/gitReferencesQuery'
4+
import { openSourcegraphUriCommand } from './openSourcegraphUriCommand'
5+
import { SourcegraphQuickPick } from './SourcegraphQuickPick'
6+
7+
export async function switchGitRevisionCommand(tree: SourcegraphTreeDataProvider): Promise<void> {
8+
const quick = new SourcegraphQuickPick(tree.fs)
9+
quick.pick.title = 'Search for a git branch, git tag or a git commit'
10+
const activeTextDocument = tree.activeTextDocument()
11+
if (!activeTextDocument || !activeTextDocument.path) {
12+
return
13+
}
14+
const activeTextDocumentPath = activeTextDocument.path
15+
const metadata = await tree.fs.repositoryMetadata(activeTextDocument.repositoryName)
16+
quick.onDidChangeValue(async query => {
17+
quick.pick.busy = true
18+
log.appendLine(`gitReferences: ${query.text}`)
19+
const references = await gitReferencesQuery(
20+
{ query: query.text, repositoryId: metadata?.id || '' },
21+
query.token
22+
)
23+
log.appendLine(`gitReferences: ${query.text} ${JSON.stringify(references)}`)
24+
quick.pick.busy = false
25+
quick.pick.items = references.map(reference => ({
26+
label: gitReferenceTag(reference) + reference.displayName,
27+
uri: `sourcegraph://${activeTextDocument.host}${reference.url}/-/blob/${activeTextDocumentPath}`,
28+
}))
29+
})
30+
const uri = await quick.showQuickPickAndGetUserInput()
31+
await openSourcegraphUriCommand(tree.fs, uri)
32+
}
33+
34+
function gitReferenceTag(reference: GitReference): string {
35+
switch (reference.type) {
36+
case 'GIT_TAG':
37+
return ' $(tag)'
38+
case 'GIT_BRANCH':
39+
return ' $(git-branch)'
40+
case 'GIT_COMMIT':
41+
return ' $(git-commit)'
42+
default:
43+
return ''
44+
}
45+
}

src/extension.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { SourcegraphHoverProvider } from './code-intel/SourcegraphHoverProvider'
1616
import { SourcegraphDefinitionProvider } from './code-intel/SourcegraphDefinitionProvider'
1717
import { SourcegraphReferenceProvider } from './code-intel/SourcegraphReferenceProvider'
1818
import { SourcegraphTreeDataProvider } from './file-system/SourcegraphTreeDataProvider'
19+
import { switchGitRevisionCommand } from './commands/switchGitRevisionCommand'
1920

2021
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
2122
const { version } = require('../package.json')
@@ -101,6 +102,12 @@ export function activate(context: vscode.ExtensionContext): void {
101102
handleCommandErrors('extension.goToRepository', () => goToRepositoryCommand(fs))
102103
)
103104
)
105+
context.subscriptions.push(
106+
vscode.commands.registerCommand(
107+
'extension.switchGitRevision',
108+
handleCommandErrors('extension.switchGitRevision', () => switchGitRevisionCommand(treeDataProvider))
109+
)
110+
)
104111
context.subscriptions.push(
105112
vscode.commands.registerCommand(
106113
'extension.newNotebook',

src/file-system/SourcegraphTreeDataProvider.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { SourcegraphFileSystemProvider } from './SourcegraphFileSystemProvider'
44
import { SourcegraphUri } from './SourcegraphUri'
55

66
export class SourcegraphTreeDataProvider implements vscode.TreeDataProvider<string> {
7-
constructor(private readonly fs: SourcegraphFileSystemProvider) {
7+
constructor(public readonly fs: SourcegraphFileSystemProvider) {
88
fs.onDidDownloadRepositoryFilenames(() => this.didChangeTreeData.fire(undefined))
99
}
1010

@@ -17,6 +17,11 @@ export class SourcegraphTreeDataProvider implements vscode.TreeDataProvider<stri
1717
private readonly didChangeTreeData = new vscode.EventEmitter<string | undefined>()
1818
public readonly onDidChangeTreeData: vscode.Event<string | undefined> = this.didChangeTreeData.event
1919

20+
public activeTextDocument(): SourcegraphUri | undefined {
21+
return this.activeUri && this.activeUri.scheme === 'sourcegraph'
22+
? this.fs.sourcegraphUri(this.activeUri)
23+
: undefined
24+
}
2025
public setTreeView(treeView: vscode.TreeView<string>): void {
2126
this.treeView = treeView
2227
treeView.onDidChangeVisibility(event => {

src/queries/gitReferencesQuery.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import * as vscode from 'vscode'
2+
import { graphqlQuery } from './graphqlQuery'
3+
import gql from 'tagged-template-noop'
4+
5+
export interface GitReference {
6+
displayName: string
7+
name: string
8+
url: string
9+
type: string
10+
}
11+
12+
export async function gitReferencesQuery(
13+
parameters: GitReferencesParameters,
14+
token: vscode.CancellationToken
15+
): Promise<GitReference[]> {
16+
const result = await graphqlQuery<GitReferencesParameters, GitReferencesResult>(
17+
gql`
18+
query RepositoryGitRefs($repositoryId: ID!, $query: String) {
19+
node(id: $repositoryId) {
20+
__typename
21+
... on Repository {
22+
gitRefs(first: 100, query: $query, orderBy: AUTHORED_OR_COMMITTED_AT) {
23+
__typename
24+
...GitRefConnectionFields
25+
}
26+
__typename
27+
}
28+
}
29+
}
30+
31+
fragment GitRefConnectionFields on GitRefConnection {
32+
nodes {
33+
__typename
34+
...GitRefFields
35+
}
36+
}
37+
38+
fragment GitRefFields on GitRef {
39+
displayName
40+
name
41+
url
42+
type
43+
}
44+
`,
45+
parameters,
46+
token
47+
)
48+
return result?.data?.node?.gitRefs?.nodes || []
49+
}
50+
51+
interface GitReferencesParameters {
52+
repositoryId: string
53+
query: string
54+
}
55+
interface GitReferencesResult {
56+
data?: {
57+
node?: {
58+
gitRefs?: {
59+
nodes?: GitReference[]
60+
}
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)