From d3af67b21ba2670dfda813ce9a28ff5489aa3bc5 Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Sat, 1 Apr 2017 00:58:09 -0400 Subject: [PATCH] Attempts to fix #58 - work with sub-modules Also fixes issue with nested repos --- src/commands/closeUnchangedFiles.ts | 2 +- src/commands/copyMessageToClipboard.ts | 2 ++ src/commands/copyShaToClipboard.ts | 2 ++ src/commands/diffDirectory.ts | 2 +- src/commands/openChangedFiles.ts | 2 +- src/commands/openCommitInRemote.ts | 6 ++++-- src/commands/openFileInRemote.ts | 8 ++++++-- src/commands/showQuickBranchHistory.ts | 2 +- src/commands/showQuickCommitDetails.ts | 2 +- src/commands/showQuickCurrentBranchHistory.ts | 5 ++++- src/commands/showQuickRepoStatus.ts | 2 +- src/commands/showQuickStashList.ts | 2 +- src/commands/stashApply.ts | 1 + src/commands/stashDelete.ts | 1 + src/commands/stashSave.ts | 1 + src/git/gitUri.ts | 2 +- src/gitService.ts | 9 +++------ src/quickPicks/branchHistory.ts | 4 ++-- src/quickPicks/commitDetails.ts | 2 +- src/quickPicks/commitFileDetails.ts | 2 +- src/quickPicks/fileHistory.ts | 4 ++-- 21 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/commands/closeUnchangedFiles.ts b/src/commands/closeUnchangedFiles.ts index 5c755f2..2377237 100644 --- a/src/commands/closeUnchangedFiles.ts +++ b/src/commands/closeUnchangedFiles.ts @@ -19,7 +19,7 @@ export class CloseUnchangedFilesCommand extends ActiveEditorCommand { try { if (!uris) { - const repoPath = await this.git.getRepoPathFromUri(uri, this.git.repoPath); + const repoPath = await this.git.getRepoPathFromUri(uri); if (!repoPath) return window.showWarningMessage(`Unable to close unchanged files`); const status = await this.git.getStatusForRepo(repoPath); diff --git a/src/commands/copyMessageToClipboard.ts b/src/commands/copyMessageToClipboard.ts index 97f5a7c..d7a3a39 100644 --- a/src/commands/copyMessageToClipboard.ts +++ b/src/commands/copyMessageToClipboard.ts @@ -20,6 +20,8 @@ export class CopyMessageToClipboardCommand extends ActiveEditorCommand { try { // If we don't have an editor then get the message of the last commit to the branch if (!uri) { + if (!this.git.repoPath) return undefined; + const log = await this.git.getLogForRepo(this.git.repoPath, undefined, 1); if (!log) return undefined; diff --git a/src/commands/copyShaToClipboard.ts b/src/commands/copyShaToClipboard.ts index b106f8c..69c662f 100644 --- a/src/commands/copyShaToClipboard.ts +++ b/src/commands/copyShaToClipboard.ts @@ -20,6 +20,8 @@ export class CopyShaToClipboardCommand extends ActiveEditorCommand { try { // If we don't have an editor then get the sha of the last commit to the branch if (!uri) { + if (!this.git.repoPath) return undefined; + const log = await this.git.getLogForRepo(this.git.repoPath, undefined, 1); if (!log) return undefined; diff --git a/src/commands/diffDirectory.ts b/src/commands/diffDirectory.ts index 93a1850..9865bda 100644 --- a/src/commands/diffDirectory.ts +++ b/src/commands/diffDirectory.ts @@ -18,7 +18,7 @@ export class DiffDirectoryCommand extends ActiveEditorCommand { } try { - const repoPath = await this.git.getRepoPathFromUri(uri, this.git.repoPath); + const repoPath = await this.git.getRepoPathFromUri(uri); if (!repoPath) return window.showWarningMessage(`Unable to open directory diff`); if (!shaOrBranch1) { diff --git a/src/commands/openChangedFiles.ts b/src/commands/openChangedFiles.ts index 324319d..a825750 100644 --- a/src/commands/openChangedFiles.ts +++ b/src/commands/openChangedFiles.ts @@ -17,7 +17,7 @@ export class OpenChangedFilesCommand extends ActiveEditorCommand { try { if (!uris) { - const repoPath = await this.git.getRepoPathFromUri(uri, this.git.repoPath); + const repoPath = await this.git.getRepoPathFromUri(uri); if (!repoPath) return window.showWarningMessage(`Unable to open changed files`); const status = await this.git.getStatusForRepo(repoPath); diff --git a/src/commands/openCommitInRemote.ts b/src/commands/openCommitInRemote.ts index 05edac9..c3eb44d 100644 --- a/src/commands/openCommitInRemote.ts +++ b/src/commands/openCommitInRemote.ts @@ -17,9 +17,11 @@ export class OpenCommitInRemoteCommand extends ActiveEditorCommand { uri = editor.document.uri; } - if (editor && editor.document && editor.document.isDirty) return undefined; + if ((editor && editor.document && editor.document.isDirty) || uri) return undefined; const gitUri = await GitUri.fromUri(uri, this.git); + if (!gitUri.repoPath) return undefined; + const line = (editor && editor.selection.active.line) || gitUri.offset; try { @@ -35,7 +37,7 @@ export class OpenCommitInRemoteCommand extends ActiveEditorCommand { commit = new GitCommit(commit.type, commit.repoPath, commit.previousSha, commit.previousFileName, commit.author, commit.date, commit.message); } - const remotes = Arrays.uniqueBy(await this.git.getRemotes(this.git.repoPath), _ => _.url, _ => !!_.provider); + const remotes = Arrays.uniqueBy(await this.git.getRemotes(gitUri.repoPath), _ => _.url, _ => !!_.provider); return commands.executeCommand(Commands.OpenInRemote, uri, remotes, 'commit', [commit.sha]); } catch (ex) { diff --git a/src/commands/openFileInRemote.ts b/src/commands/openFileInRemote.ts index efc60b4..5b8e98f 100644 --- a/src/commands/openFileInRemote.ts +++ b/src/commands/openFileInRemote.ts @@ -17,11 +17,15 @@ export class OpenFileInRemoteCommand extends ActiveEditorCommand { uri = editor.document.uri; } + if (!uri) return undefined; + const gitUri = await GitUri.fromUri(uri, this.git); - const branch = await this.git.getBranch(gitUri.repoPath || this.git.repoPath); + if (!gitUri.repoPath) return undefined; + + const branch = await this.git.getBranch(gitUri.repoPath); try { - const remotes = Arrays.uniqueBy(await this.git.getRemotes(this.git.repoPath), _ => _.url, _ => !!_.provider); + const remotes = Arrays.uniqueBy(await this.git.getRemotes(gitUri.repoPath), _ => _.url, _ => !!_.provider); const range = editor && new Range(editor.selection.start.with({ line: editor.selection.start.line + 1 }), editor.selection.end.with({ line: editor.selection.end.line + 1 })); return commands.executeCommand(Commands.OpenInRemote, uri, remotes, 'file', [gitUri.getRelativePath(), branch.name, gitUri.sha, range]); } diff --git a/src/commands/showQuickBranchHistory.ts b/src/commands/showQuickBranchHistory.ts index 9dcf9b0..26c8bfa 100644 --- a/src/commands/showQuickBranchHistory.ts +++ b/src/commands/showQuickBranchHistory.ts @@ -24,7 +24,7 @@ export class ShowQuickBranchHistoryCommand extends ActiveEditorCachedCommand { let progressCancellation = branch && BranchHistoryQuickPick.showProgress(branch); try { - const repoPath = (gitUri && gitUri.repoPath) || await this.git.getRepoPathFromUri(uri, this.git.repoPath); + const repoPath = (gitUri && gitUri.repoPath) || this.git.repoPath; if (!repoPath) return window.showWarningMessage(`Unable to show branch history`); if (!branch) { diff --git a/src/commands/showQuickCommitDetails.ts b/src/commands/showQuickCommitDetails.ts index cdad190..589c3fb 100644 --- a/src/commands/showQuickCommitDetails.ts +++ b/src/commands/showQuickCommitDetails.ts @@ -56,7 +56,7 @@ export class ShowQuickCommitDetailsCommand extends ActiveEditorCachedCommand { } if (!repoLog) { - const log = await this.git.getLogForRepo(repoPath || this.git.repoPath, sha, 2); + const log = await this.git.getLogForRepo(repoPath, sha, 2); if (!log) return window.showWarningMessage(`Unable to show commit details`); commit = log.commits.get(sha); diff --git a/src/commands/showQuickCurrentBranchHistory.ts b/src/commands/showQuickCurrentBranchHistory.ts index e55da0f..c337ff9 100644 --- a/src/commands/showQuickCurrentBranchHistory.ts +++ b/src/commands/showQuickCurrentBranchHistory.ts @@ -17,7 +17,10 @@ export class ShowQuickCurrentBranchHistoryCommand extends ActiveEditorCachedComm } try { - const branch = await this.git.getBranch(this.git.repoPath); + const repoPath = await this.git.getRepoPathFromUri(uri); + if (!repoPath) return window.showWarningMessage(`Unable to show branch history`); + + const branch = await this.git.getBranch(repoPath); if (!branch) return undefined; return commands.executeCommand(Commands.ShowQuickBranchHistory, uri, branch.name, undefined, goBackCommand); diff --git a/src/commands/showQuickRepoStatus.ts b/src/commands/showQuickRepoStatus.ts index ee4df93..8ed3262 100644 --- a/src/commands/showQuickRepoStatus.ts +++ b/src/commands/showQuickRepoStatus.ts @@ -17,7 +17,7 @@ export class ShowQuickRepoStatusCommand extends ActiveEditorCachedCommand { } try { - const repoPath = await this.git.getRepoPathFromUri(uri, this.git.repoPath); + const repoPath = await this.git.getRepoPathFromUri(uri); if (!repoPath) return window.showWarningMessage(`Unable to show repository status`); const status = await this.git.getStatusForRepo(repoPath); diff --git a/src/commands/showQuickStashList.ts b/src/commands/showQuickStashList.ts index 70049e5..d8e5ddd 100644 --- a/src/commands/showQuickStashList.ts +++ b/src/commands/showQuickStashList.ts @@ -17,7 +17,7 @@ export class ShowQuickStashListCommand extends ActiveEditorCachedCommand { } try { - const repoPath = await this.git.getRepoPathFromUri(uri, this.git.repoPath); + const repoPath = await this.git.getRepoPathFromUri(uri); if (!repoPath) return window.showWarningMessage(`Unable to show stashed changes`); const stash = await this.git.getStashList(repoPath); diff --git a/src/commands/stashApply.ts b/src/commands/stashApply.ts index fecfef9..d5ff84d 100644 --- a/src/commands/stashApply.ts +++ b/src/commands/stashApply.ts @@ -13,6 +13,7 @@ export class StashApplyCommand extends Command { async execute(stashItem: { stashName: string, message: string }, confirm: boolean = true, deleteAfter: boolean = false) { if (!this.git.config.insiders) return undefined; + if (!this.git.repoPath) return undefined; if (!stashItem || !stashItem.stashName) { const stash = await this.git.getStashList(this.git.repoPath); diff --git a/src/commands/stashDelete.ts b/src/commands/stashDelete.ts index a6e9a5f..168e460 100644 --- a/src/commands/stashDelete.ts +++ b/src/commands/stashDelete.ts @@ -12,6 +12,7 @@ export class StashDeleteCommand extends Command { async execute(stashItem: { stashName: string, message: string }, confirm: boolean = true) { if (!this.git.config.insiders) return undefined; + if (!this.git.repoPath) return undefined; if (!stashItem || !stashItem.stashName) return undefined; try { diff --git a/src/commands/stashSave.ts b/src/commands/stashSave.ts index d5f85d2..cd596a0 100644 --- a/src/commands/stashSave.ts +++ b/src/commands/stashSave.ts @@ -12,6 +12,7 @@ export class StashSaveCommand extends Command { async execute(message?: string, unstagedOnly: boolean = false) { if (!this.git.config.insiders) return undefined; + if (!this.git.repoPath) return undefined; try { if (message == null) { diff --git a/src/git/gitUri.ts b/src/git/gitUri.ts index b97458b..194414c 100644 --- a/src/git/gitUri.ts +++ b/src/git/gitUri.ts @@ -87,7 +87,7 @@ export class GitUri extends Uri { if (commit) return new GitUri(uri, commit); } - return new GitUri(uri, git && git.repoPath); + return new GitUri(uri, (await git.getRepoPathFromFile(uri.fsPath)) || git.repoPath); } static fromFileStatus(status: IGitStatusFile, repoPath: string, original?: boolean): GitUri; diff --git a/src/gitService.ts b/src/gitService.ts index 93596a2..0695adb 100644 --- a/src/gitService.ts +++ b/src/gitService.ts @@ -668,13 +668,10 @@ export class GitService extends Disposable { return log && log.repoPath; } - async getRepoPathFromUri(uri?: Uri, fallbackRepoPath?: string): Promise { - if (!(uri instanceof Uri)) return fallbackRepoPath; + async getRepoPathFromUri(uri: Uri | undefined): Promise { + if (!(uri instanceof Uri)) return this.repoPath; - const gitUri = await GitUri.fromUri(uri, this); - if (gitUri.repoPath) return gitUri.repoPath; - - return (await this.getRepoPathFromFile(gitUri.fsPath)) || fallbackRepoPath; + return (await GitUri.fromUri(uri, this)).repoPath || this.repoPath; } async getStashList(repoPath: string): Promise { diff --git a/src/quickPicks/branchHistory.ts b/src/quickPicks/branchHistory.ts index ff34c63..55edb3a 100644 --- a/src/quickPicks/branchHistory.ts +++ b/src/quickPicks/branchHistory.ts @@ -17,7 +17,7 @@ export class BranchHistoryQuickPick { }); } - static async show(git: GitService, log: IGitLog, uri: GitUri, branch: string, progressCancellation: CancellationTokenSource, goBackCommand?: CommandQuickPickItem, nextPageCommand?: CommandQuickPickItem): Promise { + static async show(git: GitService, log: IGitLog, uri: GitUri | undefined, branch: string, progressCancellation: CancellationTokenSource, goBackCommand?: CommandQuickPickItem, nextPageCommand?: CommandQuickPickItem): Promise { const items = Array.from(Iterables.map(log.commits.values(), c => new CommitQuickPickItem(c))) as (CommitQuickPickItem | CommandQuickPickItem)[]; const currentCommand = new CommandQuickPickItem({ @@ -25,7 +25,7 @@ export class BranchHistoryQuickPick { description: `\u00a0 \u2014 \u00a0\u00a0 to \u00a0$(git-branch) ${branch} history` }, Commands.ShowQuickBranchHistory, [uri, branch, log.maxCount, goBackCommand, log]); - const remotes = Arrays.uniqueBy(await git.getRemotes(git.repoPath), _ => _.url, _ => !!_.provider); + const remotes = Arrays.uniqueBy(await git.getRemotes((uri && uri.repoPath) || git.repoPath), _ => _.url, _ => !!_.provider); if (remotes.length) { items.splice(0, 0, new OpenRemotesCommandQuickPickItem(remotes, 'branch', branch, currentCommand)); } diff --git a/src/quickPicks/commitDetails.ts b/src/quickPicks/commitDetails.ts index e6e3f2a..36d9de0 100644 --- a/src/quickPicks/commitDetails.ts +++ b/src/quickPicks/commitDetails.ts @@ -101,7 +101,7 @@ export class CommitDetailsQuickPick { }, Commands.CopyMessageToClipboard, [uri, commit.sha, commit.message])); if (!stash) { - const remotes = Arrays.uniqueBy(await git.getRemotes(git.repoPath), _ => _.url, _ => !!_.provider); + const remotes = Arrays.uniqueBy(await git.getRemotes(commit.repoPath), _ => _.url, _ => !!_.provider); if (remotes.length) { items.splice(index++, 0, new OpenRemotesCommandQuickPickItem(remotes, 'commit', commit.sha, currentCommand)); } diff --git a/src/quickPicks/commitFileDetails.ts b/src/quickPicks/commitFileDetails.ts index ef58c55..c3ef29a 100644 --- a/src/quickPicks/commitFileDetails.ts +++ b/src/quickPicks/commitFileDetails.ts @@ -84,7 +84,7 @@ export class CommitFileDetailsQuickPick { items.push(new OpenCommitWorkingTreeFileCommandQuickPickItem(commit)); } - const remotes = Arrays.uniqueBy(await git.getRemotes(git.repoPath), _ => _.url, _ => !!_.provider); + const remotes = Arrays.uniqueBy(await git.getRemotes(commit.repoPath), _ => _.url, _ => !!_.provider); if (remotes.length) { if (!stash) { items.push(new OpenRemotesCommandQuickPickItem(remotes, 'file', commit.fileName, undefined, commit.sha, currentCommand)); diff --git a/src/quickPicks/fileHistory.ts b/src/quickPicks/fileHistory.ts index 35fd0c3..fd2dee3 100644 --- a/src/quickPicks/fileHistory.ts +++ b/src/quickPicks/fileHistory.ts @@ -74,7 +74,7 @@ export class FileHistoryQuickPick { } } - const branch = await git.getBranch(uri.repoPath || git.repoPath); + const branch = await git.getBranch(uri.repoPath); const currentCommand = new CommandQuickPickItem({ label: `go back \u21A9`, @@ -93,7 +93,7 @@ export class FileHistoryQuickPick { ])); } - const remotes = Arrays.uniqueBy(await git.getRemotes(git.repoPath), _ => _.url, _ => !!_.provider); + const remotes = Arrays.uniqueBy(await git.getRemotes(uri.repoPath), _ => _.url, _ => !!_.provider); if (remotes.length) { items.splice(index++, 0, new OpenRemotesCommandQuickPickItem(remotes, 'file', uri.getRelativePath(), branch.name, uri.sha, currentCommand)); }