mirror of
https://github.com/ckaczor/vscode-gitlens.git
synced 2026-01-15 01:25:42 -05:00
Adds all-new, beautiful, highly customizable and themeable, file blame annotations Adds all-new configurability and themeability to the current line blame annotations Adds all-new configurability to the status bar blame information Adds all-new configurability over which commands are added to which menus via the `gitlens.advanced.menus` setting Adds better configurability over where Git code lens will be shown -- both by default and per language Adds an all-new `changes` (diff) hover annotation to the current line - provides instant access to the line's previous version Adds `Toggle Line Blame Annotations` command (`gitlens.toggleLineBlame`) - toggles the current line blame annotations on and off Adds `Show Line Blame Annotations` command (`gitlens.showLineBlame`) - shows the current line blame annotations Adds `Toggle File Blame Annotations` command (`gitlens.toggleFileBlame`) - toggles the file blame annotations on and off Adds `Show File Blame Annotations` command (`gitlens.showFileBlame`) - shows the file blame annotations Adds `Open File in Remote` command (`gitlens.openFileInRemote`) to the `editor/title` context menu Adds `Open Repo in Remote` command (`gitlens.openRepoInRemote`) to the `editor/title` context menu Changes the position of the `Open File in Remote` command (`gitlens.openFileInRemote`) in the context menus - now in the `navigation` group Changes the `Toggle Git Code Lens` command (`gitlens.toggleCodeLens`) to always toggle the Git code lens on and off Removes the on-demand `trailing` file blame annotations -- didn't work out and just ended up with a ton of visual noise Removes `Toggle Blame Annotations` command (`gitlens.toggleBlame`) - replaced by the `Toggle File Blame Annotations` command (`gitlens.toggleFileBlame`) Removes `Show Blame Annotations` command (`gitlens.showBlame`) - replaced by the `Show File Blame Annotations` command (`gitlens.showFileBlame`)
76 lines
2.9 KiB
TypeScript
76 lines
2.9 KiB
TypeScript
'use strict';
|
|
import { Strings } from '../system';
|
|
import { DecorationOptions, Range } from 'vscode';
|
|
import { BlameAnnotationProviderBase } from './blameAnnotationProvider';
|
|
import { Annotations, endOfLineIndex } from './annotations';
|
|
import { FileAnnotationType } from '../configuration';
|
|
import { ICommitFormatOptions } from '../gitService';
|
|
import * as moment from 'moment';
|
|
|
|
export class GutterBlameAnnotationProvider extends BlameAnnotationProviderBase {
|
|
|
|
async provideAnnotation(shaOrLine?: string | number, type?: FileAnnotationType): Promise<boolean> {
|
|
this.annotationType = FileAnnotationType.Gutter;
|
|
|
|
const blame = await this.getBlame(true);
|
|
if (blame === undefined) return false;
|
|
|
|
const cfg = this._config.annotations.file.gutter;
|
|
|
|
// Precalculate the formatting options so we don't need to do it on each iteration
|
|
const tokenOptions = Strings.getTokensFromTemplate(cfg.format)
|
|
.reduce((map, token) => {
|
|
map[token.key] = token.options;
|
|
return map;
|
|
}, {} as { [token: string]: ICommitFormatOptions });
|
|
|
|
const options: ICommitFormatOptions = {
|
|
dateFormat: cfg.dateFormat,
|
|
tokenOptions: tokenOptions
|
|
};
|
|
|
|
const now = moment();
|
|
const offset = this.uri.offset;
|
|
let previousLine: string | undefined = undefined;
|
|
const renderOptions = Annotations.gutterRenderOptions(this._config.theme, cfg.heatmap);
|
|
|
|
const decorations: DecorationOptions[] = [];
|
|
|
|
for (const l of blame.lines) {
|
|
const commit = blame.commits.get(l.sha);
|
|
if (commit === undefined) continue;
|
|
|
|
const line = l.line + offset;
|
|
|
|
const gutter = Annotations.gutter(commit, cfg.format, options, renderOptions, cfg.compact && previousLine === l.sha);
|
|
|
|
if (cfg.compact) {
|
|
const isEmptyOrWhitespace = this.document.lineAt(line).isEmptyOrWhitespace;
|
|
previousLine = isEmptyOrWhitespace ? undefined : l.sha;
|
|
}
|
|
|
|
if (cfg.heatmap.enabled) {
|
|
Annotations.applyHeatmap(gutter, commit.date, now);
|
|
}
|
|
|
|
const firstNonWhitespace = this.editor.document.lineAt(line).firstNonWhitespaceCharacterIndex;
|
|
gutter.range = this.editor.document.validateRange(new Range(line, 0, line, firstNonWhitespace));
|
|
decorations.push(gutter);
|
|
|
|
if (cfg.hover.details) {
|
|
const details = Annotations.detailsHover(commit);
|
|
details.range = cfg.hover.wholeLine
|
|
? this.editor.document.validateRange(new Range(line, 0, line, endOfLineIndex))
|
|
: gutter.range;
|
|
decorations.push(details);
|
|
}
|
|
}
|
|
|
|
if (decorations.length) {
|
|
this.editor.setDecorations(this.decoration, decorations);
|
|
}
|
|
|
|
this.selection(shaOrLine, blame);
|
|
return true;
|
|
}
|
|
} |