'use strict'; import { CancellationToken, CodeLens, CodeLensProvider, DocumentSelector, Range, TextDocument, Uri } from 'vscode'; import { Commands, DiffWithPreviousCommandArgs, DiffWithWorkingCommandArgs } from './commands'; import { DocumentSchemes } from './constants'; import { Container } from './container'; import { GitCommit, GitUri } from './gitService'; export class GitDiffWithWorkingCodeLens extends CodeLens { constructor( public readonly fileName: string, public readonly commit: GitCommit, range: Range ) { super(range); } } export class GitDiffWithPreviousCodeLens extends CodeLens { constructor( public readonly fileName: string, public readonly commit: GitCommit, range: Range ) { super(range); } } export class GitRevisionCodeLensProvider implements CodeLensProvider { static selector: DocumentSelector = { scheme: DocumentSchemes.GitLensGit }; async provideCodeLenses(document: TextDocument, token: CancellationToken): Promise { const gitUri = GitUri.fromRevisionUri(document.uri); const lenses: CodeLens[] = []; const commit = await Container.git.getLogCommitForFile(gitUri.repoPath, gitUri.fsPath, { ref: gitUri.sha, firstIfNotFound: true }); if (commit === undefined) return lenses; if (commit.previousSha) { lenses.push(new GitDiffWithPreviousCodeLens(commit.previousUri.fsPath, commit, new Range(0, 0, 0, 1))); } lenses.push(new GitDiffWithWorkingCodeLens(commit.uri.fsPath, commit, new Range(0, 1, 0, 2))); return lenses; } resolveCodeLens(lens: CodeLens, token: CancellationToken): Thenable { if (lens instanceof GitDiffWithWorkingCodeLens) return this._resolveDiffWithWorkingTreeCodeLens(lens, token); if (lens instanceof GitDiffWithPreviousCodeLens) return this._resolveGitDiffWithPreviousCodeLens(lens, token); return Promise.reject(undefined); } _resolveDiffWithWorkingTreeCodeLens(lens: GitDiffWithWorkingCodeLens, token: CancellationToken): Thenable { lens.command = { title: `Compare Revision (${lens.commit.shortSha}) with Working`, command: Commands.DiffWithWorking, arguments: [ Uri.file(lens.fileName), { commit: lens.commit, line: lens.range.start.line } as DiffWithWorkingCommandArgs ] }; return Promise.resolve(lens); } _resolveGitDiffWithPreviousCodeLens(lens: GitDiffWithPreviousCodeLens, token: CancellationToken): Thenable { lens.command = { title: `Compare Revision (${lens.commit.shortSha}) with Previous (${lens.commit.previousShortSha})`, command: Commands.DiffWithPrevious, arguments: [ Uri.file(lens.fileName), { commit: lens.commit, line: lens.range.start.line } as DiffWithPreviousCommandArgs ] }; return Promise.resolve(lens); } }