'use strict'; import { commands, TextEditor, Uri, window } from 'vscode'; import { GlyphChars } from '../constants'; import { Container } from '../container'; import { GitLog, GitUri } from '../git/gitService'; import { Logger } from '../logger'; import { Messages } from '../messages'; import { BranchesQuickPick, BranchHistoryQuickPick, CommandQuickPickItem } from '../quickpicks'; import { Strings } from '../system'; import { ActiveEditorCachedCommand, Commands, getCommandUri, getRepoPathOrActiveOrPrompt } from './common'; import { ShowQuickCommitDetailsCommandArgs } from './showQuickCommitDetails'; export interface ShowQuickBranchHistoryCommandArgs { branch?: string; log?: GitLog; maxCount?: number; repoPath?: string; goBackCommand?: CommandQuickPickItem; nextPageCommand?: CommandQuickPickItem; } export class ShowQuickBranchHistoryCommand extends ActiveEditorCachedCommand { constructor() { super(Commands.ShowQuickBranchHistory); } async execute(editor?: TextEditor, uri?: Uri, args: ShowQuickBranchHistoryCommandArgs = {}) { uri = getCommandUri(uri, editor); const gitUri = uri && (await GitUri.fromUri(uri)); args = { ...args }; let progressCancellation = args.branch === undefined ? undefined : BranchHistoryQuickPick.showProgress(args.branch); try { const repoPath = args.repoPath || (await getRepoPathOrActiveOrPrompt( gitUri, editor, `Show branch history in which repository${GlyphChars.Ellipsis}` )); if (!repoPath) return undefined; if (args.branch === undefined) { const branches = await Container.git.getBranches(repoPath); let goBackCommand; if (!(await Container.git.getRepoPathOrActive(uri, editor))) { goBackCommand = new CommandQuickPickItem( { label: `go back ${GlyphChars.ArrowBack}`, description: `${Strings.pad(GlyphChars.Dash, 2, 3)} to which repository` }, Commands.ShowQuickBranchHistory, [uri, args] ); } const pick = await BranchesQuickPick.show(branches, `Show history for branch${GlyphChars.Ellipsis}`, { goBackCommand: goBackCommand }); if (pick === undefined) return undefined; if (pick instanceof CommandQuickPickItem) return pick.execute(); args.branch = pick.branch.name; if (args.branch === undefined) return undefined; progressCancellation = BranchHistoryQuickPick.showProgress(args.branch); } if (args.log === undefined) { args.log = await Container.git.getLog(repoPath, { maxCount: args.maxCount, ref: (gitUri && gitUri.sha) || args.branch }); if (args.log === undefined) return window.showWarningMessage(`Unable to show branch history`); } if (progressCancellation !== undefined && progressCancellation.token.isCancellationRequested) { return undefined; } const pick = await BranchHistoryQuickPick.show( args.log, gitUri, args.branch, progressCancellation!, args.goBackCommand, args.nextPageCommand ); if (pick === undefined) return undefined; if (pick instanceof CommandQuickPickItem) return pick.execute(); // Create a command to get back to here const currentCommand = new CommandQuickPickItem( { label: `go back ${GlyphChars.ArrowBack}`, description: `${Strings.pad(GlyphChars.Dash, 2, 3)} to ${GlyphChars.Space}$(git-branch) ${ args.branch } history` }, Commands.ShowQuickBranchHistory, [uri, { ...args }] ); return commands.executeCommand(Commands.ShowQuickCommitDetails, pick.commit.toGitUri(), { sha: pick.commit.sha, commit: pick.commit, repoLog: args.log, goBackCommand: currentCommand } as ShowQuickCommitDetailsCommandArgs); } catch (ex) { Logger.error(ex, 'ShowQuickBranchHistoryCommand'); return Messages.showGenericErrorMessage('Unable to show branch history'); } finally { progressCancellation && progressCancellation.cancel(); } } }