You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

127 lines
4.8 KiB

'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 { BranchHistoryQuickPick, CommandQuickPickItem, ReferencesQuickPick } from '../quickpicks';
import { ActiveEditorCachedCommand, command, Commands, getCommandUri, getRepoPathOrActiveOrPrompt } from './common';
import { ShowQuickCommitDetailsCommandArgs } from './showQuickCommitDetails';
export interface ShowQuickBranchHistoryCommandArgs {
branch?: string;
log?: GitLog;
maxCount?: number;
repoPath?: string;
goBackCommand?: CommandQuickPickItem;
nextPageCommand?: CommandQuickPickItem;
}
@command()
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) {
let goBackCommand;
if (!(await Container.git.getRepoPathOrActive(uri, editor))) {
goBackCommand = new CommandQuickPickItem(
{
label: `go back ${GlyphChars.ArrowBack}`,
description: 'to which repository'
},
Commands.ShowQuickBranchHistory,
[uri, args]
);
}
const pick = await new ReferencesQuickPick(repoPath).show(
`Show history for branch${GlyphChars.Ellipsis}`,
{
checkmarks: false,
goBack: goBackCommand,
include: 'branches'
}
);
if (pick === undefined) return undefined;
if (pick instanceof CommandQuickPickItem) return pick.execute();
args.branch = pick.ref;
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: `to history of ${GlyphChars.Space}$(git-branch) ${args.branch}`
},
Commands.ShowQuickBranchHistory,
[uri, { ...args }]
);
const commandArgs: ShowQuickCommitDetailsCommandArgs = {
sha: pick.item.sha,
commit: pick.item,
repoLog: args.log,
goBackCommand: currentCommand
};
return commands.executeCommand(Commands.ShowQuickCommitDetails, pick.item.toGitUri(), commandArgs);
}
catch (ex) {
Logger.error(ex, 'ShowQuickBranchHistoryCommand');
return Messages.showGenericErrorMessage('Unable to show branch history');
}
finally {
progressCancellation && progressCancellation.cancel();
}
}
}