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.
 

126 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 { 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();
}
}
}