import { LogLevel } from './constants'; import type { DateTimeFormat } from './system/date'; export interface Config { autolinks: AutolinkReference[] | null; blame: { avatars: boolean; compact: boolean; dateFormat: DateTimeFormat | string | null; format: string; heatmap: { enabled: boolean; location: 'left' | 'right'; }; highlight: { enabled: boolean; locations: BlameHighlightLocations[]; }; ignoreWhitespace: boolean; separateLines: boolean; toggleMode: AnnotationsToggleMode; }; changes: { locations: ChangesLocations[]; toggleMode: AnnotationsToggleMode; }; codeLens: CodeLensConfig; currentLine: { dateFormat: string | null; enabled: boolean; format: string; uncommittedChangesFormat: string | null; pullRequests: { enabled: boolean; }; scrollable: boolean; }; debug: boolean; deepLinks: { schemeOverride: boolean | string | null; }; defaultDateFormat: DateTimeFormat | string | null; defaultDateLocale: string | null; defaultDateShortFormat: DateTimeFormat | string | null; defaultDateSource: DateSource; defaultDateStyle: DateStyle; defaultGravatarsStyle: GravatarDefaultStyle; defaultTimeFormat: DateTimeFormat | string | null; detectNestedRepositories: boolean; fileAnnotations: { command: string | null; }; gitCommands: { closeOnFocusOut: boolean; search: { matchAll: boolean; matchCase: boolean; matchRegex: boolean; showResultsInSideBar: boolean | null; }; skipConfirmations: string[]; sortBy: GitCommandSorting; }; graph: GraphConfig; heatmap: { ageThreshold: number; coldColor: string; hotColor: string; fadeLines: boolean; locations: HeatmapLocations[]; toggleMode: AnnotationsToggleMode; }; hovers: { annotations: { changes: boolean; details: boolean; enabled: boolean; over: 'line' | 'annotation'; }; autolinks: { enabled: boolean; enhanced: boolean; }; currentLine: { changes: boolean; details: boolean; enabled: boolean; over: 'line' | 'annotation'; }; avatars: boolean; avatarSize: number; changesDiff: 'line' | 'hunk'; detailsMarkdownFormat: string; enabled: boolean; pullRequests: { enabled: boolean; }; }; integrations: { enabled: boolean; }; keymap: KeyMap; liveshare: { allowGuestAccess: boolean; }; menus: boolean | MenuConfig; mode: { active: string; statusBar: { enabled: boolean; alignment: 'left' | 'right'; }; }; modes: Record | null; outputLevel: OutputLevel; partners: Record< string, { enabled: boolean; [key: string]: any; } > | null; plusFeatures: { enabled: boolean; }; proxy: { url: string | null; strictSSL: boolean; } | null; rebaseEditor: { ordering: 'asc' | 'desc'; showDetailsView: 'open' | 'selection' | false; }; remotes: RemotesConfig[] | null; showWelcomeOnInstall: boolean; showWhatsNewAfterUpgrades: boolean; sortBranchesBy: BranchSorting; sortContributorsBy: ContributorSorting; sortTagsBy: TagSorting; statusBar: { alignment: 'left' | 'right'; command: StatusBarCommand; dateFormat: DateTimeFormat | string | null; enabled: boolean; format: string; reduceFlicker: boolean; pullRequests: { enabled: boolean; }; tooltipFormat: string; }; strings: { codeLens: { unsavedChanges: { recentChangeAndAuthors: string; recentChangeOnly: string; authorsOnly: string; }; }; }; telemetry: { enabled: boolean; }; terminal: { overrideGitEditor: boolean; }; terminalLinks: { enabled: boolean; showDetailsView: boolean; }; views: ViewsConfig; virtualRepositories: { enabled: boolean; }; visualHistory: { queryLimit: number; }; worktrees: { defaultLocation: string | null; openAfterCreate: 'always' | 'alwaysNewWindow' | 'onlyWhenEmpty' | 'never' | 'prompt'; promptForLocation: boolean; }; advanced: AdvancedConfig; } export const enum AnnotationsToggleMode { File = 'file', Window = 'window', } export const enum AutolinkType { Issue = 'Issue', PullRequest = 'PullRequest', } export interface AutolinkReference { prefix: string; url: string; title?: string; alphanumeric?: boolean; ignoreCase?: boolean; type?: AutolinkType; description?: string; } export const enum BlameHighlightLocations { Gutter = 'gutter', Line = 'line', Scrollbar = 'overview', } export const enum BranchSorting { DateDesc = 'date:desc', DateAsc = 'date:asc', NameAsc = 'name:asc', NameDesc = 'name:desc', } export const enum ChangesLocations { Gutter = 'gutter', Line = 'line', Scrollbar = 'overview', } export const enum CodeLensCommand { CopyRemoteCommitUrl = 'gitlens.copyRemoteCommitUrl', CopyRemoteFileUrl = 'gitlens.copyRemoteFileUrl', DiffWithPrevious = 'gitlens.diffWithPrevious', OpenCommitOnRemote = 'gitlens.openCommitOnRemote', OpenFileOnRemote = 'gitlens.openFileOnRemote', RevealCommitInView = 'gitlens.revealCommitInView', ShowCommitsInView = 'gitlens.showCommitsInView', ShowQuickCommitDetails = 'gitlens.showQuickCommitDetails', ShowQuickCommitFileDetails = 'gitlens.showQuickCommitFileDetails', ShowQuickCurrentBranchHistory = 'gitlens.showQuickRepoHistory', ShowQuickFileHistory = 'gitlens.showQuickFileHistory', ToggleFileBlame = 'gitlens.toggleFileBlame', ToggleFileChanges = 'gitlens.toggleFileChanges', ToggleFileChangesOnly = 'gitlens.toggleFileChangesOnly', ToggleFileHeatmap = 'gitlens.toggleFileHeatmap', } export const enum CodeLensScopes { Document = 'document', Containers = 'containers', Blocks = 'blocks', } export const enum ContributorSorting { CountDesc = 'count:desc', CountAsc = 'count:asc', DateDesc = 'date:desc', DateAsc = 'date:asc', NameAsc = 'name:asc', NameDesc = 'name:desc', } export const enum CustomRemoteType { AzureDevOps = 'AzureDevOps', Bitbucket = 'Bitbucket', BitbucketServer = 'BitbucketServer', Custom = 'Custom', Gerrit = 'Gerrit', GoogleSource = 'GoogleSource', Gitea = 'Gitea', GitHub = 'GitHub', GitLab = 'GitLab', } export const enum DateSource { Authored = 'authored', Committed = 'committed', } export const enum DateStyle { Absolute = 'absolute', Relative = 'relative', } export const enum FileAnnotationType { Blame = 'blame', Changes = 'changes', Heatmap = 'heatmap', } export const enum GitCommandSorting { Name = 'name', Usage = 'usage', } export const enum GraphScrollMarkerTypes { Selection = 'selection', Head = 'head', LocalBranches = 'localBranches', RemoteBranches = 'remoteBranches', Highlights = 'highlights', Stashes = 'stashes', Tags = 'tags', } export const enum GraphMinimapTypes { Selection = 'selection', Head = 'head', LocalBranches = 'localBranches', RemoteBranches = 'remoteBranches', Highlights = 'highlights', Stashes = 'stashes', Tags = 'tags', } export const enum GravatarDefaultStyle { Faces = 'wavatar', Geometric = 'identicon', Monster = 'monsterid', MysteryPerson = 'mp', Retro = 'retro', Robot = 'robohash', } export const enum HeatmapLocations { Gutter = 'gutter', Line = 'line', Scrollbar = 'overview', } export const enum KeyMap { Alternate = 'alternate', Chorded = 'chorded', None = 'none', } export const enum OutputLevel { Silent = 'silent', Errors = 'errors', Verbose = 'verbose', Debug = 'debug', } export const enum StatusBarCommand { CopyRemoteCommitUrl = 'gitlens.copyRemoteCommitUrl', CopyRemoteFileUrl = 'gitlens.copyRemoteFileUrl', DiffWithPrevious = 'gitlens.diffWithPrevious', DiffWithWorking = 'gitlens.diffWithWorking', OpenCommitOnRemote = 'gitlens.openCommitOnRemote', OpenFileOnRemote = 'gitlens.openFileOnRemote', RevealCommitInView = 'gitlens.revealCommitInView', ShowCommitsInView = 'gitlens.showCommitsInView', ShowQuickCommitDetails = 'gitlens.showQuickCommitDetails', ShowQuickCommitFileDetails = 'gitlens.showQuickCommitFileDetails', ShowQuickCurrentBranchHistory = 'gitlens.showQuickRepoHistory', ShowQuickFileHistory = 'gitlens.showQuickFileHistory', ToggleCodeLens = 'gitlens.toggleCodeLens', ToggleFileBlame = 'gitlens.toggleFileBlame', ToggleFileChanges = 'gitlens.toggleFileChanges', ToggleFileChangesOnly = 'gitlens.toggleFileChangesOnly', ToggleFileHeatmap = 'gitlens.toggleFileHeatmap', } export const enum TagSorting { DateDesc = 'date:desc', DateAsc = 'date:asc', NameAsc = 'name:asc', NameDesc = 'name:desc', } export const enum ViewBranchesLayout { List = 'list', Tree = 'tree', } export const enum ViewFilesLayout { Auto = 'auto', List = 'list', Tree = 'tree', } export const enum ViewShowBranchComparison { Branch = 'branch', Working = 'working', } export interface AdvancedConfig { abbreviatedShaLength: number; abbreviateShaOnCopy: boolean; blame: { customArguments: string[] | null; delayAfterEdit: number; sizeThresholdAfterEdit: number; }; caching: { enabled: boolean; }; commitOrdering: 'date' | 'author-date' | 'topo' | null; externalDiffTool: string | null; externalDirectoryDiffTool: string | null; fileHistoryFollowsRenames: boolean; fileHistoryShowAllBranches: boolean; maxListItems: number; maxSearchItems: number; messages: { [key in SuppressedMessages]: boolean }; quickPick: { closeOnFocusOut: boolean; }; repositorySearchDepth: number | null; similarityThreshold: number | null; } export interface GraphConfig { avatars: boolean; commitOrdering: 'date' | 'author-date' | 'topo'; dateFormat: DateTimeFormat | string | null; dateStyle: DateStyle | null; defaultItemLimit: number; dimMergeCommits: boolean; experimental: { minimap: { enabled: boolean; additionalTypes: GraphMinimapTypes[]; }; }; highlightRowsOnRefHover: boolean; scrollRowPadding: number; showDetailsView: 'open' | 'selection' | false; showGhostRefsOnRowHover: boolean; scrollMarkers: { enabled: boolean; additionalTypes: GraphScrollMarkerTypes[]; }; pullRequests: { enabled: boolean; }; showRemoteNames: boolean; showUpstreamStatus: boolean; pageItemLimit: number; searchItemLimit: number; statusBar: { enabled: boolean; }; } export interface CodeLensConfig { authors: { enabled: boolean; command: CodeLensCommand | false; }; dateFormat: DateTimeFormat | string | null; enabled: boolean; includeSingleLineSymbols: boolean; recentChange: { enabled: boolean; command: CodeLensCommand | false; }; scopes: CodeLensScopes[]; scopesByLanguage: CodeLensLanguageScope[] | null; symbolScopes: string[]; } export interface CodeLensLanguageScope { language: string | undefined; scopes?: CodeLensScopes[]; symbolScopes?: string[]; } export interface MenuConfig { editor: | false | { blame: boolean; clipboard: boolean; compare: boolean; history: boolean; remote: boolean; }; editorGroup: | false | { blame: boolean; compare: boolean; }; editorTab: | false | { clipboard: boolean; compare: boolean; history: boolean; remote: boolean; }; explorer: | false | { clipboard: boolean; compare: boolean; history: boolean; remote: boolean; }; scm: | false | { graph: boolean; }; scmTitleInline: | false | { graph: boolean; }; scmTitle: | false | { authors: boolean; graph: boolean; }; scmGroupInline: | false | { stash: boolean; }; scmGroup: | false | { compare: boolean; openClose: boolean; stash: boolean; }; scmItemInline: | false | { stash: boolean; }; scmItem: | false | { clipboard: boolean; compare: boolean; history: boolean; remote: boolean; stash: boolean; }; } export interface ModeConfig { name: string; statusBarItemName?: string; description?: string; annotations?: 'blame' | 'changes' | 'heatmap'; codeLens?: boolean; currentLine?: boolean; hovers?: boolean; statusBar?: boolean; } export type RemotesConfig = | { domain: string; regex: null; name?: string; protocol?: string; type: CustomRemoteType; urls?: RemotesUrlsConfig; ignoreSSLErrors?: boolean | 'force'; } | { domain: null; regex: string; name?: string; protocol?: string; type: CustomRemoteType; urls?: RemotesUrlsConfig; ignoreSSLErrors?: boolean | 'force'; }; export interface RemotesUrlsConfig { repository: string; branches: string; branch: string; commit: string; comparison?: string; file: string; fileInBranch: string; fileInCommit: string; fileLine: string; fileRange: string; } // NOTE: Must be kept in sync with `gitlens.advanced.messages` setting in the package.json export const enum SuppressedMessages { CommitHasNoPreviousCommitWarning = 'suppressCommitHasNoPreviousCommitWarning', CommitNotFoundWarning = 'suppressCommitNotFoundWarning', CreatePullRequestPrompt = 'suppressCreatePullRequestPrompt', SuppressDebugLoggingWarning = 'suppressDebugLoggingWarning', FileNotUnderSourceControlWarning = 'suppressFileNotUnderSourceControlWarning', GitDisabledWarning = 'suppressGitDisabledWarning', GitMissingWarning = 'suppressGitMissingWarning', GitVersionWarning = 'suppressGitVersionWarning', LineUncommittedWarning = 'suppressLineUncommittedWarning', NoRepositoryWarning = 'suppressNoRepositoryWarning', RebaseSwitchToTextWarning = 'suppressRebaseSwitchToTextWarning', IntegrationDisconnectedTooManyFailedRequestsWarning = 'suppressIntegrationDisconnectedTooManyFailedRequestsWarning', IntegrationRequestFailed500Warning = 'suppressIntegrationRequestFailed500Warning', IntegrationRequestTimedOutWarning = 'suppressIntegrationRequestTimedOutWarning', } export interface ViewsCommonConfig { defaultItemLimit: number; formats: { commits: { label: string; description: string; tooltip: string; tooltipWithStatus: string; }; files: { label: string; description: string; }; stashes: { label: string; description: string; }; }; pageItemLimit: number; showRelativeDateMarkers: boolean; experimental: { multiSelect: { enabled: boolean | null | undefined; }; }; } export const viewsCommonConfigKeys: (keyof ViewsCommonConfig)[] = [ 'defaultItemLimit', 'formats', 'pageItemLimit', 'showRelativeDateMarkers', ]; interface ViewsConfigs { branches: BranchesViewConfig; commits: CommitsViewConfig; commitDetails: CommitDetailsViewConfig; contributors: ContributorsViewConfig; fileHistory: FileHistoryViewConfig; lineHistory: LineHistoryViewConfig; remotes: RemotesViewConfig; repositories: RepositoriesViewConfig; searchAndCompare: SearchAndCompareViewConfig; stashes: StashesViewConfig; tags: TagsViewConfig; worktrees: WorktreesViewConfig; } export type ViewsConfigKeys = keyof ViewsConfigs; export const viewsConfigKeys: ViewsConfigKeys[] = [ 'commits', 'repositories', 'fileHistory', 'lineHistory', 'branches', 'remotes', 'stashes', 'tags', 'contributors', 'searchAndCompare', 'worktrees', ]; export type ViewsConfig = ViewsCommonConfig & ViewsConfigs; export interface BranchesViewConfig { avatars: boolean; branches: { layout: ViewBranchesLayout; }; files: ViewsFilesConfig; pullRequests: { enabled: boolean; showForBranches: boolean; showForCommits: boolean; }; reveal: boolean; showBranchComparison: false | ViewShowBranchComparison.Branch; } export interface CommitsViewConfig { avatars: boolean; branches: undefined; files: ViewsFilesConfig; pullRequests: { enabled: boolean; showForBranches: boolean; showForCommits: boolean; }; reveal: boolean; showBranchComparison: false | ViewShowBranchComparison; } export interface CommitDetailsViewConfig { avatars: boolean; files: ViewsFilesConfig; autolinks: { enabled: boolean; enhanced: boolean; }; pullRequests: { enabled: boolean; }; } export interface ContributorsViewConfig { avatars: boolean; files: ViewsFilesConfig; pullRequests: { enabled: boolean; showForCommits: boolean; }; reveal: boolean; showAllBranches: boolean; showStatistics: boolean; } export interface FileHistoryViewConfig { avatars: boolean; files: ViewsFilesConfig; } export interface LineHistoryViewConfig { avatars: boolean; } export interface RemotesViewConfig { avatars: boolean; branches: { layout: ViewBranchesLayout; }; files: ViewsFilesConfig; pullRequests: { enabled: boolean; showForBranches: boolean; showForCommits: boolean; }; reveal: boolean; } export interface RepositoriesViewConfig { autoRefresh: boolean; autoReveal: boolean; avatars: boolean; branches: { layout: ViewBranchesLayout; showBranchComparison: false | ViewShowBranchComparison.Branch; }; compact: boolean; files: ViewsFilesConfig; includeWorkingTree: boolean; pullRequests: { enabled: boolean; showForBranches: boolean; showForCommits: boolean; }; showBranchComparison: false | ViewShowBranchComparison; showBranches: boolean; showCommits: boolean; showContributors: boolean; showIncomingActivity: boolean; showRemotes: boolean; showStashes: boolean; showTags: boolean; showUpstreamStatus: boolean; showWorktrees: boolean; } export interface SearchAndCompareViewConfig { avatars: boolean; files: ViewsFilesConfig; pullRequests: { enabled: boolean; showForCommits: boolean; }; } export interface StashesViewConfig { files: ViewsFilesConfig; reveal: boolean; } export interface TagsViewConfig { avatars: boolean; branches: { layout: ViewBranchesLayout; }; files: ViewsFilesConfig; reveal: boolean; } export interface WorktreesViewConfig { avatars: boolean; files: ViewsFilesConfig; pullRequests: { enabled: boolean; showForBranches: boolean; showForCommits: boolean; }; reveal: boolean; showBranchComparison: false | ViewShowBranchComparison.Branch; } export interface ViewsFilesConfig { compact: boolean; layout: ViewFilesLayout; threshold: number; } export function fromOutputLevel(level: LogLevel | OutputLevel): LogLevel { switch (level) { case OutputLevel.Silent: return LogLevel.Off; case OutputLevel.Errors: return LogLevel.Error; case OutputLevel.Verbose: return LogLevel.Info; case OutputLevel.Debug: return LogLevel.Debug; default: return level; } }