From f99ba89a4b5843f24dab685aeafc8f3b8db212fd Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Fri, 14 Apr 2017 00:29:57 -0400 Subject: [PATCH] Stops Git from leaking out of GitService --- src/commands/showCommitSearch.ts | 4 ++-- src/extension.ts | 10 +++++----- src/git/git.ts | 3 ++- src/git/gitUri.ts | 10 +++++----- src/gitService.ts | 32 +++++++++++++++++++++++++++++--- src/quickPicks/commitDetails.ts | 4 ++-- src/quickPicks/repoStatus.ts | 4 ++-- 7 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/commands/showCommitSearch.ts b/src/commands/showCommitSearch.ts index ed116c6..56b6e33 100644 --- a/src/commands/showCommitSearch.ts +++ b/src/commands/showCommitSearch.ts @@ -1,7 +1,7 @@ 'use strict'; import { commands, InputBoxOptions, TextEditor, Uri, window } from 'vscode'; import { ActiveEditorCachedCommand, Commands } from './common'; -import { Git, GitRepoSearchBy, GitService, GitUri } from '../gitService'; +import { GitRepoSearchBy, GitService, GitUri } from '../gitService'; import { Logger } from '../logger'; import { CommandQuickPickItem, CommitsQuickPick } from '../quickPicks'; @@ -39,7 +39,7 @@ export class ShowCommitSearchCommand extends ActiveEditorCachedCommand { searchBy = searchByMap.get(match[1]); search = search.substring((search[1] === ' ') ? 2 : 1); } - else if (Git.isSha(search)) { + else if (GitService.isSha(search)) { searchBy = GitRepoSearchBy.Sha; } else { diff --git a/src/extension.ts b/src/extension.ts index 2200a50..c1100ba 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -20,7 +20,7 @@ import { Keyboard } from './commands'; import { IConfig } from './configuration'; import { ApplicationInsightsKey, BuiltInCommands, ExtensionId, WorkspaceState } from './constants'; import { GitContentProvider } from './gitContentProvider'; -import { Git, GitContextTracker, GitService } from './gitService'; +import { GitContextTracker, GitService } from './gitService'; import { GitRevisionCodeLensProvider } from './gitRevisionCodeLensProvider'; import { Logger } from './logger'; import { Telemetry } from './telemetry'; @@ -40,7 +40,7 @@ export async function activate(context: ExtensionContext) { const gitPath = config.advanced.git; try { - await Git.getGitPath(gitPath); + await GitService.getGitPath(gitPath); } catch (ex) { Logger.error(ex, 'Extension.activate'); @@ -51,9 +51,9 @@ export async function activate(context: ExtensionContext) { return; } - const repoPath = await Git.getRepoPath(rootPath); + const repoPath = await GitService.getRepoPath(rootPath); - const gitVersion = Git.gitInfo().version; + const gitVersion = GitService.getGitVersion(); Logger.log(`Git version: ${gitVersion}`); const telemetryContext: { [id: string]: any } = Object.create(null); @@ -146,7 +146,7 @@ async function notifyOnUnsupportedGitVersion(context: ExtensionContext, version: if (context.globalState.get(WorkspaceState.SuppressGitVersionWarning, false)) return; // If git is less than v2.2.0 - if (!Git.validateVersion(2, 2)) { + if (!GitService.validateGitVersion(2, 2)) { const result = await window.showErrorMessage(`GitLens requires a newer version of Git (>= 2.2.0) than is currently installed (${version}). Please install a more recent version of Git.`, `Don't Show Again`); if (result === `Don't Show Again`) { context.globalState.update(WorkspaceState.SuppressGitVersionWarning, true); diff --git a/src/git/git.ts b/src/git/git.ts index 2ce5823..6087902 100644 --- a/src/git/git.ts +++ b/src/git/git.ts @@ -6,6 +6,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as tmp from 'tmp'; +export { IGit }; export * from './models/models'; export * from './parsers/blameParser'; export * from './parsers/logParser'; @@ -47,7 +48,7 @@ export class Git { return git; } - static async getGitPath(gitPath?: string) { + static async getGitPath(gitPath?: string): Promise { git = await findGitPath(gitPath); Logger.log(`Git found: ${git.version} @ ${git.path === 'git' ? 'PATH' : git.path}`); return git; diff --git a/src/git/gitUri.ts b/src/git/gitUri.ts index 194414c..afd0a5e 100644 --- a/src/git/gitUri.ts +++ b/src/git/gitUri.ts @@ -1,7 +1,7 @@ 'use strict'; import { Uri } from 'vscode'; import { DocumentSchemes } from '../constants'; -import { Git, GitCommit, GitService, IGitStatusFile } from '../gitService'; +import { GitCommit, GitService, IGitStatusFile } from '../gitService'; import * as path from 'path'; export class GitUri extends Uri { @@ -30,7 +30,7 @@ export class GitUri extends Uri { base._fsPath = path.resolve(data.repoPath, data.originalFileName || data.fileName); this.offset = (data.decoration && data.decoration.split('\n').length) || 0; - if (!Git.isUncommitted(data.sha)) { + if (!GitService.isUncommitted(data.sha)) { this.sha = data.sha; this.repoPath = data.repoPath; } @@ -43,7 +43,7 @@ export class GitUri extends Uri { const commit = commitOrRepoPath; base._fsPath = path.resolve(commit.repoPath, commit.originalFileName || commit.fileName); - if (!Git.isUncommitted(commit.sha)) { + if (!GitService.isUncommitted(commit.sha)) { this.sha = commit.sha; this.repoPath = commit.repoPath; } @@ -64,7 +64,7 @@ export class GitUri extends Uri { if (this.repoPath) { directory = path.relative(this.repoPath, directory); } - directory = Git.normalizePath(directory); + directory = GitService.normalizePath(directory); return (!directory || directory === '.') ? path.basename(this.fsPath) @@ -72,7 +72,7 @@ export class GitUri extends Uri { } getRelativePath(): string { - return Git.normalizePath(path.relative(this.repoPath, this.fsPath)); + return GitService.normalizePath(path.relative(this.repoPath, this.fsPath)); } static async fromUri(uri: Uri, git: GitService) { diff --git a/src/gitService.ts b/src/gitService.ts index 583690d..99f87fe 100644 --- a/src/gitService.ts +++ b/src/gitService.ts @@ -4,7 +4,7 @@ import { Disposable, Event, EventEmitter, ExtensionContext, FileSystemWatcher, l import { CommandContext, setCommandContext } from './commands'; import { CodeLensVisibility, IConfig } from './configuration'; import { DocumentSchemes } from './constants'; -import { Git, GitBlameParser, GitBranch, GitCommit, GitLogCommit, GitLogParser, GitRemote, GitStashParser, GitStatusFile, GitStatusParser, IGitAuthor, IGitBlame, IGitBlameLine, IGitBlameLines, IGitLog, IGitStash, IGitStatus } from './git/git'; +import { Git, GitBlameParser, GitBranch, GitCommit, GitLogCommit, GitLogParser, GitRemote, GitStashParser, GitStatusFile, GitStatusParser, IGit, IGitAuthor, IGitBlame, IGitBlameLine, IGitBlameLines, IGitLog, IGitStash, IGitStatus } from './git/git'; import { IGitUriData, GitUri } from './git/gitUri'; import { GitCodeLensProvider } from './gitCodeLensProvider'; import { Logger } from './logger'; @@ -14,7 +14,8 @@ import * as moment from 'moment'; import * as path from 'path'; export { GitUri }; -export * from './git/git'; +export * from './git/models/models'; +export { getNameFromRemoteOpenType, RemoteOpenType } from './git/remotes/provider'; export * from './git/gitContextTracker'; class UriCacheEntry { @@ -840,6 +841,18 @@ export class GitService extends Disposable { this._codeLensProviderDisposable = languages.registerCodeLensProvider(GitCodeLensProvider.selector, new GitCodeLensProvider(this.context, this)); } + static getGitPath(gitPath?: string): Promise { + return Git.getGitPath(gitPath); + } + + static getGitVersion(): string { + return Git.gitInfo().version; + } + + static getRepoPath(cwd: string): Promise { + return Git.getRepoPath(cwd); + } + static fromGitContentUri(uri: Uri): IGitUriData { if (uri.scheme !== DocumentSchemes.GitLensGit) throw new Error(`fromGitUri(uri=${uri}) invalid scheme`); return GitService._fromGitContentUri(uri); @@ -849,10 +862,18 @@ export class GitService extends Disposable { return JSON.parse(uri.query) as T; } - static isUncommitted(sha: string) { + static isSha(sha: string): boolean { + return Git.isSha(sha); + } + + static isUncommitted(sha: string): boolean { return Git.isUncommitted(sha); } + static normalizePath(fileName: string, repoPath?: string): string { + return Git.normalizePath(fileName, repoPath); + } + static toGitContentUri(sha: string, shortSha: string, fileName: string, repoPath: string, originalFileName: string): Uri; static toGitContentUri(commit: GitCommit): Uri; static toGitContentUri(shaOrcommit: string | GitCommit, shortSha?: string, fileName?: string, repoPath?: string, originalFileName?: string): Uri { @@ -904,4 +925,9 @@ export class GitService extends Disposable { } return data; } + + static validateGitVersion(major: number, minor: number): boolean { + const [gitMajor, gitMinor] = this.getGitVersion().split('.'); + return (parseInt(gitMajor, 10) >= major && parseInt(gitMinor, 10) >= minor); + } } \ No newline at end of file diff --git a/src/quickPicks/commitDetails.ts b/src/quickPicks/commitDetails.ts index b93d6d6..2bf03cc 100644 --- a/src/quickPicks/commitDetails.ts +++ b/src/quickPicks/commitDetails.ts @@ -3,7 +3,7 @@ import { Arrays, Iterables } from '../system'; import { QuickPickItem, QuickPickOptions, Uri, window } from 'vscode'; import { Commands, Keyboard, KeyNoopCommand } from '../commands'; import { CommandQuickPickItem, getQuickPickIgnoreFocusOut, KeyCommandQuickPickItem, OpenFileCommandQuickPickItem, OpenFilesCommandQuickPickItem } from './common'; -import { getGitStatusIcon, Git, GitCommit, GitLogCommit, GitService, GitStashCommit, GitStatusFileStatus, GitUri, IGitLog, IGitStatusFile } from '../gitService'; +import { getGitStatusIcon, GitCommit, GitLogCommit, GitService, GitStashCommit, GitStatusFileStatus, GitUri, IGitLog, IGitStatusFile } from '../gitService'; import { OpenRemotesCommandQuickPickItem } from './remotes'; import * as moment from 'moment'; import * as path from 'path'; @@ -19,7 +19,7 @@ export class CommitWithFileStatusQuickPickItem extends OpenFileCommandQuickPickI constructor(commit: GitCommit, status: IGitStatusFile) { const icon = getGitStatusIcon(status.status); - let directory = Git.normalizePath(path.dirname(status.fileName)); + let directory = GitService.normalizePath(path.dirname(status.fileName)); if (!directory || directory === '.') { directory = undefined; } diff --git a/src/quickPicks/repoStatus.ts b/src/quickPicks/repoStatus.ts index 3488cb8..678df5e 100644 --- a/src/quickPicks/repoStatus.ts +++ b/src/quickPicks/repoStatus.ts @@ -3,7 +3,7 @@ import { Iterables } from '../system'; import { QuickPickItem, QuickPickOptions, Uri, window } from 'vscode'; import { Commands, Keyboard } from '../commands'; import { CommandQuickPickItem, getQuickPickIgnoreFocusOut, OpenFileCommandQuickPickItem } from './common'; -import { Git, GitStatusFile, GitUri, IGitStatus } from '../gitService'; +import { GitService, GitStatusFile, GitUri, IGitStatus } from '../gitService'; import * as path from 'path'; export class OpenStatusFileCommandQuickPickItem extends OpenFileCommandQuickPickItem { @@ -11,7 +11,7 @@ export class OpenStatusFileCommandQuickPickItem extends OpenFileCommandQuickPick constructor(status: GitStatusFile, item?: QuickPickItem) { const icon = status.getIcon(); - let directory = Git.normalizePath(path.dirname(status.fileName)); + let directory = GitService.normalizePath(path.dirname(status.fileName)); if (!directory || directory === '.') { directory = undefined; }