'use strict'; import { commands, ConfigurationChangeEvent } from 'vscode'; import { configuration, FileHistoryViewConfig } from '../configuration'; import { CommandContext, setCommandContext } from '../constants'; import { Container } from '../container'; import { GitUri } from '../git/gitUri'; import { FileHistoryTrackerNode, LineHistoryTrackerNode } from './nodes'; import { ViewBase } from './viewBase'; const pinnedSuffix = ' (pinned)'; export class FileHistoryView extends ViewBase { protected readonly configKey = 'fileHistory'; protected readonly showCollapseAll = false; constructor() { super('gitlens.views.fileHistory', 'File History'); } getRoot(): LineHistoryTrackerNode | FileHistoryTrackerNode { return this._followCursor ? new LineHistoryTrackerNode(this) : new FileHistoryTrackerNode(this); } protected registerCommands() { void Container.viewCommands; commands.registerCommand( this.getQualifiedCommand('copy'), () => commands.executeCommand('gitlens.views.copy', this.selection), this, ); commands.registerCommand(this.getQualifiedCommand('refresh'), () => this.refresh(true), this); commands.registerCommand(this.getQualifiedCommand('changeBase'), () => this.changeBase(), this); commands.registerCommand( this.getQualifiedCommand('setCursorFollowingOn'), () => this.setCursorFollowing(true), this, ); commands.registerCommand( this.getQualifiedCommand('setCursorFollowingOff'), () => this.setCursorFollowing(false), this, ); commands.registerCommand( this.getQualifiedCommand('setEditorFollowingOn'), () => this.setEditorFollowing(true), this, ); commands.registerCommand( this.getQualifiedCommand('setEditorFollowingOff'), () => this.setEditorFollowing(false), this, ); commands.registerCommand( this.getQualifiedCommand('setRenameFollowingOn'), () => this.setRenameFollowing(true), this, ); commands.registerCommand( this.getQualifiedCommand('setRenameFollowingOff'), () => this.setRenameFollowing(false), this, ); commands.registerCommand( this.getQualifiedCommand('setShowAllBranchesOn'), () => this.setShowAllBranches(true), this, ); commands.registerCommand( this.getQualifiedCommand('setShowAllBranchesOff'), () => this.setShowAllBranches(false), this, ); commands.registerCommand(this.getQualifiedCommand('setShowAvatarsOn'), () => this.setShowAvatars(true), this); commands.registerCommand(this.getQualifiedCommand('setShowAvatarsOff'), () => this.setShowAvatars(false), this); } protected filterConfigurationChanged(e: ConfigurationChangeEvent) { const changed = super.filterConfigurationChanged(e); if ( !changed && !configuration.changed(e, 'defaultDateFormat') && !configuration.changed(e, 'defaultDateSource') && !configuration.changed(e, 'defaultDateStyle') && !configuration.changed(e, 'defaultGravatarsStyle') && !configuration.changed(e, 'advanced', 'fileHistoryFollowsRenames') && !configuration.changed(e, 'advanced', 'fileHistoryShowAllBranches') ) { return false; } return true; } protected initialize(options: { showCollapseAll?: boolean } = {}) { super.initialize(options); void setCommandContext(CommandContext.ViewsFileHistoryEditorFollowing, this._followEditor); void setCommandContext(CommandContext.ViewsFileHistoryCursorFollowing, this._followCursor); } async showHistoryForUri(uri: GitUri, baseRef?: string) { this.setCursorFollowing(false); this.setEditorFollowing(false); const root = this.ensureRoot(true); if (root instanceof FileHistoryTrackerNode) { await root.showHistoryForUri(uri, baseRef); } return this.show(); } private changeBase() { void this.root?.changeBase(); } private _followCursor: boolean = false; private setCursorFollowing(enabled: boolean) { this._followCursor = enabled; void setCommandContext(CommandContext.ViewsFileHistoryCursorFollowing, enabled); this.title = this._followCursor ? 'Line History' : 'File History'; const root = this.ensureRoot(true); root.setEditorFollowing(this._followEditor); void root.ensureSubscription(); void this.refresh(true); } private _followEditor: boolean = true; private setEditorFollowing(enabled: boolean) { this._followEditor = enabled; void setCommandContext(CommandContext.ViewsFileHistoryEditorFollowing, enabled); this.root?.setEditorFollowing(enabled); if (this.description?.endsWith(pinnedSuffix)) { if (enabled) { this.description = this.description.substr(0, this.description.length - pinnedSuffix.length); } } else if (!enabled) { this.description += pinnedSuffix; } } private setRenameFollowing(enabled: boolean) { return configuration.updateEffective('advanced', 'fileHistoryFollowsRenames', enabled); } private setShowAllBranches(enabled: boolean) { return configuration.updateEffective('advanced', 'fileHistoryShowAllBranches', enabled); } private setShowAvatars(enabled: boolean) { return configuration.updateEffective('views', this.configKey, 'avatars', enabled); } }