'use strict'; import { TextEditor, Uri } from 'vscode'; import { Container } from '../container'; import { ActiveEditorCommand, command, Commands, getCommandUri } from './common'; import { SearchPattern } from '../git/git'; import { GitUri } from '../git/gitUri'; import { executeGitCommand } from '../commands'; import { Messages } from '../messages'; import { Iterables } from '../system'; import { Logger } from '../logger'; export interface ShowCommitsInViewCommandArgs { refs?: string[]; repoPath?: string; } @command() export class ShowCommitsInViewCommand extends ActiveEditorCommand { constructor() { super([Commands.ShowCommitInView, Commands.ShowCommitsInView]); } async execute(editor?: TextEditor, uri?: Uri, args?: ShowCommitsInViewCommandArgs) { args = { ...args }; if (args.refs === undefined) { uri = getCommandUri(uri, editor); if (uri == null) return undefined; const gitUri = await GitUri.fromUri(uri); args.repoPath = gitUri.repoPath; if (editor != null) { try { // Check for any uncommitted changes in the range const blame = editor.document.isDirty ? await Container.git.getBlameForRangeContents( gitUri, editor.selection, editor.document.getText(), ) : await Container.git.getBlameForRange(gitUri, editor.selection); if (blame === undefined) { return Messages.showFileNotUnderSourceControlWarningMessage('Unable to find commits'); } args.refs = [ ...Iterables.filterMap(blame.commits.values(), c => (c.isUncommitted ? undefined : c.ref)), ]; } catch (ex) { Logger.error(ex, 'ShowCommitsInViewCommand', 'getBlameForRange'); return Messages.showGenericErrorMessage('Unable to find commits'); } } else { if (gitUri.sha == null) return undefined; args.refs = [gitUri.sha]; } } return executeGitCommand({ command: 'search', state: { repo: args?.repoPath, pattern: SearchPattern.fromCommits(args.refs), showResultsInSideBar: true, }, }); } }