Skip to content

Commit f025c1a

Browse files
committed
#398 New command "Git Graph: Get Version Information", that displays basic version information of the Git Graph installation, and allows it to be easily copied to the clipboard.
1 parent f10111f commit f025c1a

File tree

5 files changed

+57
-28
lines changed

5 files changed

+57
-28
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@
7979
"category": "Git Graph",
8080
"command": "git-graph.resumeWorkspaceCodeReview",
8181
"title": "Resume a specific Code Review in Workspace..."
82+
},
83+
{
84+
"category": "Git Graph",
85+
"command": "git-graph.version",
86+
"title": "Get Version Information"
8287
}
8388
],
8489
"configuration": {

src/commands.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as os from 'os';
12
import * as vscode from 'vscode';
23
import { AvatarManager } from './avatarManager';
34
import { getConfig } from './config';
@@ -6,15 +7,15 @@ import { CodeReviewData, CodeReviews, ExtensionState } from './extensionState';
67
import { GitGraphView } from './gitGraphView';
78
import { Logger } from './logger';
89
import { RepoManager } from './repoManager';
9-
import { GitExecutable, UNABLE_TO_FIND_GIT_MSG, abbrevCommit, abbrevText, getPathFromUri, getRelativeTimeDiff, getRepoName, isPathInWorkspace, resolveToSymbolicPath, showErrorMessage, showInformationMessage } from './utils';
10+
import { GitExecutable, UNABLE_TO_FIND_GIT_MSG, abbrevCommit, abbrevText, copyToClipboard, getExtensionVersion, getPathFromUri, getRelativeTimeDiff, getRepoName, isPathInWorkspace, resolveToSymbolicPath, showErrorMessage, showInformationMessage } from './utils';
1011
import { Disposable } from './utils/disposable';
1112
import { Event } from './utils/event';
1213

1314
/**
1415
* Manages the registration and execution of Git Graph Commands.
1516
*/
1617
export class CommandManager extends Disposable {
17-
private readonly extensionPath: string;
18+
private readonly context: vscode.ExtensionContext;
1819
private readonly avatarManager: AvatarManager;
1920
private readonly dataSource: DataSource;
2021
private readonly extensionState: ExtensionState;
@@ -33,9 +34,9 @@ export class CommandManager extends Disposable {
3334
* @param onDidChangeGitExecutable The Event emitting the Git executable for Git Graph to use.
3435
* @param logger The Git Graph Logger instance.
3536
*/
36-
constructor(extensionPath: string, avatarManger: AvatarManager, dataSource: DataSource, extensionState: ExtensionState, repoManager: RepoManager, gitExecutable: GitExecutable | null, onDidChangeGitExecutable: Event<GitExecutable>, logger: Logger) {
37+
constructor(context: vscode.ExtensionContext, avatarManger: AvatarManager, dataSource: DataSource, extensionState: ExtensionState, repoManager: RepoManager, gitExecutable: GitExecutable | null, onDidChangeGitExecutable: Event<GitExecutable>, logger: Logger) {
3738
super();
38-
this.extensionPath = extensionPath;
39+
this.context = context;
3940
this.avatarManager = avatarManger;
4041
this.dataSource = dataSource;
4142
this.extensionState = extensionState;
@@ -50,6 +51,7 @@ export class CommandManager extends Disposable {
5051
this.registerCommand('git-graph.endAllWorkspaceCodeReviews', () => this.endAllWorkspaceCodeReviews());
5152
this.registerCommand('git-graph.endSpecificWorkspaceCodeReview', () => this.endSpecificWorkspaceCodeReview());
5253
this.registerCommand('git-graph.resumeWorkspaceCodeReview', () => this.resumeWorkspaceCodeReview());
54+
this.registerCommand('git-graph.version', () => this.version());
5355

5456
this.registerDisposable(
5557
onDidChangeGitExecutable((gitExecutable) => {
@@ -92,7 +94,7 @@ export class CommandManager extends Disposable {
9294
loadRepo = this.repoManager.getRepoContainingFile(getPathFromUri(vscode.window.activeTextEditor.document.uri));
9395
}
9496

95-
GitGraphView.createOrShow(this.extensionPath, this.dataSource, this.extensionState, this.avatarManager, this.repoManager, this.logger, loadRepo !== null ? { repo: loadRepo, commitDetails: null } : null);
97+
GitGraphView.createOrShow(this.context.extensionPath, this.dataSource, this.extensionState, this.avatarManager, this.repoManager, this.logger, loadRepo !== null ? { repo: loadRepo, commitDetails: null } : null);
9698
}
9799

98100
/**
@@ -210,7 +212,7 @@ export class CommandManager extends Disposable {
210212
}).then((item) => {
211213
if (item) {
212214
const commitHashes = item.codeReviewId.split('-');
213-
GitGraphView.createOrShow(this.extensionPath, this.dataSource, this.extensionState, this.avatarManager, this.repoManager, this.logger, {
215+
GitGraphView.createOrShow(this.context.extensionPath, this.dataSource, this.extensionState, this.avatarManager, this.repoManager, this.logger, {
214216
repo: item.codeReviewRepo,
215217
commitDetails: {
216218
commitHash: commitHashes[commitHashes.length > 1 ? 1 : 0],
@@ -223,6 +225,27 @@ export class CommandManager extends Disposable {
223225
});
224226
}
225227

228+
/**
229+
* The method run when the `git-graph.version` command is invoked.
230+
*/
231+
private async version() {
232+
try {
233+
const gitGraphVersion = await getExtensionVersion(this.context);
234+
const information = 'Git Graph: ' + gitGraphVersion + '\nVisual Studio Code: ' + vscode.version + '\nOS: ' + os.type() + ' ' + os.arch() + ' ' + os.release() + '\nGit: ' + (this.gitExecutable !== null ? this.gitExecutable.version : '(none)');
235+
vscode.window.showInformationMessage(information, { modal: true }, 'Copy').then((selectedItem) => {
236+
if (selectedItem === 'Copy') {
237+
copyToClipboard(information).then((result) => {
238+
if (result !== null) {
239+
showErrorMessage(result);
240+
}
241+
});
242+
}
243+
}, () => { });
244+
} catch (_) {
245+
showErrorMessage('An unexpected error occurred while retrieving version information.');
246+
}
247+
}
248+
226249

227250
/* Helper Methods */
228251

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export async function activate(context: vscode.ExtensionContext) {
4343
const avatarManager = new AvatarManager(dataSource, extensionState, logger);
4444
const repoManager = new RepoManager(dataSource, extensionState, onDidChangeConfiguration, logger);
4545
const statusBarItem = new StatusBarItem(repoManager.getNumRepos(), repoManager.onDidChangeRepos, onDidChangeConfiguration, logger);
46-
const commandManager = new CommandManager(context.extensionPath, avatarManager, dataSource, extensionState, repoManager, gitExecutable, onDidChangeGitExecutable, logger);
46+
const commandManager = new CommandManager(context, avatarManager, dataSource, extensionState, repoManager, gitExecutable, onDidChangeGitExecutable, logger);
4747
const diffDocProvider = new DiffDocProvider(dataSource);
4848

4949
context.subscriptions.push(

src/life-cycle/startup.ts

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import * as fs from 'fs';
1111
import * as path from 'path';
1212
import * as vscode from 'vscode';
1313
import { LifeCycleStage, LifeCycleState, generateNonce, getDataDirectory, getLifeCycleStateInDirectory, saveLifeCycleStateInDirectory, sendQueue } from './utils';
14+
import { getExtensionVersion } from '../utils';
1415

1516
/**
1617
* Run on startup to detect if Git Graph has been installed or updated, and if so generate an event.
@@ -89,27 +90,6 @@ function saveLifeCycleState(extensionContext: vscode.ExtensionContext, state: Li
8990
]);
9091
}
9192

92-
/**
93-
* Gets the version of Git Graph.
94-
* @param extensionContext The extension context of Git Graph.
95-
* @returns The Git Graph version.
96-
*/
97-
function getExtensionVersion(extensionContext: vscode.ExtensionContext) {
98-
return new Promise<string>((resolve, reject) => {
99-
fs.readFile(path.join(extensionContext.extensionPath, 'package.json'), (err, data) => {
100-
if (err) {
101-
reject();
102-
} else {
103-
try {
104-
resolve(JSON.parse(data.toString()).version);
105-
} catch (_) {
106-
reject();
107-
}
108-
}
109-
});
110-
});
111-
}
112-
11393
/**
11494
* Get a nonce generated for this installation of Git Graph.
11595
* @returns A 256 bit cryptographically strong pseudo-random nonce.

src/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,27 @@ export function getRelativeTimeDiff(unixTimestamp: number) {
159159
return diff + ' ' + unit + (diff !== 1 ? 's' : '') + ' ago';
160160
}
161161

162+
/**
163+
* Gets the version of Git Graph.
164+
* @param extensionContext The extension context of Git Graph.
165+
* @returns The Git Graph version.
166+
*/
167+
export function getExtensionVersion(extensionContext: vscode.ExtensionContext) {
168+
return new Promise<string>((resolve, reject) => {
169+
fs.readFile(path.join(extensionContext.extensionPath, 'package.json'), (err, data) => {
170+
if (err) {
171+
reject();
172+
} else {
173+
try {
174+
resolve(JSON.parse(data.toString()).version);
175+
} catch (_) {
176+
reject();
177+
}
178+
}
179+
});
180+
});
181+
}
182+
162183
/**
163184
* Randomly generate a nonce.
164185
* @returns The nonce.

0 commit comments

Comments
 (0)