From c812a56eac3e53308fead25bc484bea95444954a Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Mon, 12 Jun 2017 12:25:09 -0400 Subject: [PATCH] Adds an experimental custom view (wip) --- images/dark/icon-commit.svg | 4 + images/dark/icon-refresh.svg | 0 images/light/icon-commit.svg | 4 + package.json | 2829 ++++++++++++++++++------------------ src/commands.ts | 1 + src/commands/common.ts | 15 +- src/commands/openCommitInRemote.ts | 44 +- src/commands/showFileHistory.ts | 8 +- src/commands/showStashList.ts | 30 + src/configuration.ts | 7 + src/extension.ts | 14 +- src/views/commitFileNode.ts | 41 + src/views/commitNode.ts | 54 + src/views/explorerNode.ts | 15 + src/views/fileHistoryNode.ts | 29 + src/views/gitExplorer.ts | 62 + src/views/gitExplorerNodes.ts | 9 + src/views/repositoryNode.ts | 105 ++ src/views/stashCommitNode.ts | 40 + src/views/stashNode.ts | 29 + 20 files changed, 1939 insertions(+), 1401 deletions(-) create mode 100644 images/dark/icon-commit.svg create mode 100644 images/dark/icon-refresh.svg create mode 100644 images/light/icon-commit.svg create mode 100644 src/commands/showStashList.ts create mode 100644 src/views/commitFileNode.ts create mode 100644 src/views/commitNode.ts create mode 100644 src/views/explorerNode.ts create mode 100644 src/views/fileHistoryNode.ts create mode 100644 src/views/gitExplorer.ts create mode 100644 src/views/gitExplorerNodes.ts create mode 100644 src/views/repositoryNode.ts create mode 100644 src/views/stashCommitNode.ts create mode 100644 src/views/stashNode.ts diff --git a/images/dark/icon-commit.svg b/images/dark/icon-commit.svg new file mode 100644 index 0000000..33f77ba --- /dev/null +++ b/images/dark/icon-commit.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/images/dark/icon-refresh.svg b/images/dark/icon-refresh.svg new file mode 100644 index 0000000..e69de29 diff --git a/images/light/icon-commit.svg b/images/light/icon-commit.svg new file mode 100644 index 0000000..ac914a4 --- /dev/null +++ b/images/light/icon-commit.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/package.json b/package.json index a5fe99a..db68bf2 100644 --- a/package.json +++ b/package.json @@ -1,1384 +1,1445 @@ -{ - "name": "gitlens", - "version": "4.2.0", - "author": { - "name": "Eric Amodio", - "email": "eamodio@gmail.com" - }, - "publisher": "eamodio", - "engines": { - "vscode": "^1.12.0" - }, - "license": "SEE LICENSE IN LICENSE", - "displayName": "Git Lens \u2014 git blame annotations, code lens, and more", - "description": "Supercharge Visual Studio Code's Git capabilities \u2014 Visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore the history of a file or branch, gain valuable insights via powerful comparison commands, and so much more", - "badges": [ - { - "url": "https://badges.gitter.im/vscode-gitlens/Lobby.svg", - "href": "https://gitter.im/vscode-gitlens/Lobby", - "description": "Chat at https://gitter.im/vscode-gitlens/Lobby" - } - ], - "categories": [ - "Other" - ], - "keywords": [ - "git", - "code lens", - "blame", - "history", - "annotation", - "log", - "inline blame", - "compare", - "diff" - ], - "galleryBanner": { - "color": "#56098c", - "theme": "dark" - }, - "icon": "images/gitlens-icon.png", - "preview": false, - "homepage": "https://github.com/eamodio/vscode-gitlens/blob/master/README.md", - "bugs": { - "url": "https://github.com/eamodio/vscode-gitlens/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/eamodio/vscode-gitlens.git" - }, - "main": "./out/src/extension", - "contributes": { - "configuration": { - "type": "object", - "title": "GitLens configuration", - "properties": { - "gitlens.debug": { - "type": "boolean", - "default": false, - "description": "Specifies debug mode" - }, - "gitlens.insiders": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to enable new experimental features (expect there to be issues)" - }, - "gitlens.outputLevel": { - "type": "string", - "default": "silent", - "enum": [ - "silent", - "errors", - "verbose" - ], - "description": "Specifies how much (if any) output will be sent to the GitLens output channel" - }, - "gitlens.annotations.file.gutter.format": { - "type": "string", - "default": "${message|40?} ${ago|14-}", - "description": "Specifies the format of the gutter blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.file.gutter.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" - }, - "gitlens.annotations.file.gutter.dateFormat": { - "type": "string", - "default": null, - "description": "Specifies how to format absolute dates (using the `${date}` token) in gutter blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.annotations.file.gutter.compact": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to compact (deduplicate) matching adjacent gutter blame annotations" - }, - "gitlens.annotations.file.gutter.heatmap.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a heatmap indicator in the gutter blame annotations" - }, - "gitlens.annotations.file.gutter.heatmap.location": { - "type": "string", - "default": "right", - "enum": [ - "left", - "right" - ], - "description": "Specifies where the heatmap indicators will be shown in the gutter blame annotations\n `left` - adds a heatmap indicator on the left edge of the gutter blame annotations\n `right` - adds a heatmap indicator on the right edge of the gutter blame annotations" - }, - "gitlens.annotations.file.gutter.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation over the gutter blame annotations" - }, - "gitlens.annotations.file.gutter.hover.wholeLine": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.annotations.file.hover.heatmap.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide heatmap indicators on the left edge of each line" - }, - "gitlens.annotations.file.hover.wholeLine": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.annotations.file.recentChanges.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation" - }, - "gitlens.annotations.file.recentChanges.hover.changes": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a changes (diff) hover annotation" - }, - "gitlens.annotations.file.recentChanges.hover.wholeLine": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.annotations.line.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation for the current line" - }, - "gitlens.annotations.line.hover.changes": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a changes (diff) hover annotation for the current line" - }, - "gitlens.annotations.line.trailing.format": { - "type": "string", - "default": "${authorAgo} \u2022 ${message}", - "description": "Specifies the format of the trailing blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.line.trailing.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" - }, - "gitlens.annotations.line.trailing.dateFormat": { - "type": "string", - "default": null, - "description": "Specifies how to format absolute dates (using the `${date}` token) in trailing blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.annotations.line.trailing.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation over the trailing blame annotations" - }, - "gitlens.annotations.line.trailing.hover.changes": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a changes (diff) hover annotation over the trailing blame annotations" - }, - "gitlens.annotations.line.trailing.hover.wholeLine": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.blame.file.annotationType": { - "type": "string", - "default": "gutter", - "enum": [ - "gutter", - "hover" - ], - "description": "Specifies the type of blame annotations that will be shown for the current file\n `gutter` - adds an annotation to the beginning of each line\n `hover` - shows annotations when hovering over each line" - }, - "gitlens.blame.file.lineHighlight.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to highlight lines associated with the current line" - }, - "gitlens.blame.file.lineHighlight.locations": { - "type": "array", - "default": [ - "gutter", - "line", - "overviewRuler" - ], - "items": { - "type": "string", - "enum": [ - "gutter", - "line", - "overviewRuler" - ] - }, - "minItems": 1, - "maxItems": 3, - "uniqueItems": true, - "description": "Specifies where the associated line highlights will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" - }, - "gitlens.blame.line.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a blame annotation for the current line, by default\nUse the `gitlens.toggleLineBlame` command to toggle the annotations on and off for the current session" - }, - "gitlens.blame.line.annotationType": { - "type": "string", - "default": "trailing", - "enum": [ - "trailing", - "hover" - ], - "description": "Specifies the type of blame annotations that will be shown for the current line\n `trailing` - adds an annotation to the end of the current line\n `hover` - shows annotations when hovering over the current line" - }, - "gitlens.recentChanges.file.lineHighlight.locations": { - "type": "array", - "default": [ - "gutter", - "line", - "overviewRuler" - ], - "items": { - "type": "string", - "enum": [ - "gutter", - "line", - "overviewRuler" - ] - }, - "minItems": 1, - "maxItems": 3, - "uniqueItems": true, - "description": "Specifies where the highlights of the recently changed lines will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" - }, - "gitlens.codeLens.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide any Git code lens, by default\nUse the `gitlens.toggleCodeLens` command to toggle the Git code lens on and off for the current session" - }, - "gitlens.codeLens.recentChange.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to show a `recent change` code lens showing the author and date of the most recent commit for the file or code block" - }, - "gitlens.codeLens.recentChange.command": { - "type": "string", - "default": "gitlens.showQuickCommitFileDetails", - "enum": [ - "gitlens.toggleFileBlame", - "gitlens.showBlameHistory", - "gitlens.showFileHistory", - "gitlens.diffWithPrevious", - "gitlens.showQuickCommitDetails", - "gitlens.showQuickCommitFileDetails", - "gitlens.showQuickFileHistory", - "gitlens.showQuickRepoHistory" - ], - "description": "Specifies the command to be executed when the `recent change` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" - }, - "gitlens.codeLens.authors.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to show an `authors` code lens showing number of authors of the file or code block and the most prominent author (if there is more than one)" - }, - "gitlens.codeLens.authors.command": { - "type": "string", - "default": "gitlens.toggleFileBlame", - "enum": [ - "gitlens.toggleFileBlame", - "gitlens.showBlameHistory", - "gitlens.showFileHistory", - "gitlens.diffWithPrevious", - "gitlens.showQuickCommitDetails", - "gitlens.showQuickCommitFileDetails", - "gitlens.showQuickFileHistory", - "gitlens.showQuickRepoHistory" - ], - "description": "Specifies the command to be executed when the `authors` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" - }, - "gitlens.codeLens.locations": { - "type": "array", - "default": [ - "document", - "containers" - ], - "items": { - "type": "string", - "enum": [ - "document", - "containers", - "blocks", - "custom" - ] - }, - "minItems": 1, - "maxItems": 4, - "uniqueItems": true, - "description": "Specifies where Git code lens will be shown in the document\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `gitlens.codeLens.locationCustomSymbols`" - }, - "gitlens.codeLens.customLocationSymbols": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true, - "description": "Specifies the set of document symbols where Git code lens will be shown in the document\nMust be a member of `SymbolKind`" - }, - "gitlens.codeLens.perLanguageLocations": { - "type": "array", - "default": [ - { - "language": "css", - "locations": [ - "document" - ] - }, - { - "language": "html", - "locations": [ - "document" - ] - }, - { - "language": "json", - "locations": [ - "document" - ] - }, - { - "language": "less", - "locations": [ - "document" - ] - }, - { - "language": "scss", - "locations": [ - "document" - ] - }, - { - "language": "vue", - "locations": [ - "document" - ] - } - ], - "items": { - "type": "object", - "required": [ - "language", - "locations" - ], - "properties": { - "language": { - "type": "string", - "description": "Specifies the language to which this code lens override applies" - }, - "locations": { - "type": "array", - "default": [ - "document", - "containers" - ], - "items": { - "type": "string", - "enum": [ - "document", - "containers", - "blocks", - "custom" - ] - }, - "minItems": 1, - "maxItems": 4, - "uniqueItems": true, - "description": "Specifies where Git code lens will be shown in the document for the specified language\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `customSymbols`" - }, - "customSymbols": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true, - "description": "Specifies the set of document symbols where Git code lens will be shown in the document for the specified language\nMust be a member of `SymbolKind`" - } - } - }, - "uniqueItems": true, - "description": "Specifies where Git code lens will be shown in the document for the specified languages" - }, - "gitlens.codeLens.debug": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to show debug information in code lens" - }, - "gitlens.defaultDateFormat": { - "type": "string", - "default": null, - "description": "Specifies how all absolute dates will be formatted by default\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.statusBar.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide blame information on the status bar" - }, - "gitlens.statusBar.alignment": { - "type": "string", - "default": "right", - "enum": [ - "left", - "right" - ], - "description": "Specifies the blame alignment in the status bar\n `left` - align to the left\n `right` - align to the right" - }, - "gitlens.statusBar.command": { - "type": "string", - "default": "gitlens.showQuickCommitDetails", - "enum": [ - "gitlens.toggleFileBlame", - "gitlens.showBlameHistory", - "gitlens.showFileHistory", - "gitlens.diffWithPrevious", - "gitlens.diffWithWorking", - "gitlens.toggleCodeLens", - "gitlens.showQuickCommitDetails", - "gitlens.showQuickCommitFileDetails", - "gitlens.showQuickFileHistory", - "gitlens.showQuickRepoHistory" - ], - "description": "Specifies the command to be executed when the blame status bar item is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current line commit with the previous\n `gitlens.diffWithWorking` - compares the current line commit with the working tree\n `gitlens.toggleCodeLens` - toggles Git code lens\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" - }, - "gitlens.statusBar.format": { - "type": "string", - "default": "${authorAgo}", - "description": "Specifies the format of the status bar blame information\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" - }, - "gitlens.statusBar.dateFormat": { - "type": "string", - "default": null, - "description": "Specifies the date format of absolute dates shown in the blame information on the status bar. See https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.strings.codeLens.unsavedChanges.recentChangeAndAuthors": { - "type": "string", - "default": "Cannot determine recent change or authors (unsaved changes)", - "description": "Specifies the string to be shown in place of both the `recent change` and `authors` code lens when there are unsaved changes" - }, - "gitlens.strings.codeLens.unsavedChanges.recentChangeOnly": { - "type": "string", - "default": "Cannot determine recent change (unsaved changes)", - "description": "Specifies the string to be shown in place of the `recent change` code lens when there are unsaved changes" - }, - "gitlens.strings.codeLens.unsavedChanges.authorsOnly": { - "type": "string", - "default": "Cannot determine authors (unsaved changes)", - "description": "Specifies the string to be shown in place of the `authors` code lens when there are unsaved changes" - }, - "gitlens.theme.annotations.file.gutter.separateLines": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not gutter blame annotations will be separated by a small gap" - }, - "gitlens.theme.annotations.file.gutter.dark.backgroundColor": { - "type": "string", - "default": "rgba(255, 255, 255, 0.075)", - "description": "Specifies the dark theme background color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.light.backgroundColor": { - "type": "string", - "default": "rgba(0, 0, 0, 0.05)", - "description": "Specifies the light theme background color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.dark.foregroundColor": { - "type": "string", - "default": "rgb(190, 190, 190)", - "description": "Specifies the dark theme foreground color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.light.foregroundColor": { - "type": "string", - "default": "rgb(116, 116, 116)", - "description": "Specifies the light theme foreground color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.dark.uncommittedForegroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the dark theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.light.uncommittedForegroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the light theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.hover.separateLines": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not hover blame annotations will be separated by a small gap (if heatmap is enabled)" - }, - "gitlens.theme.annotations.line.trailing.dark.backgroundColor": { - "type": "string", - "default": null, - "description": "Specifies the dark theme background color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.annotations.line.trailing.light.backgroundColor": { - "type": "string", - "default": null, - "description": "Specifies the light theme background color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.annotations.line.trailing.dark.foregroundColor": { - "type": "string", - "default": "rgba(153, 153, 153, 0.35)", - "description": "Specifies the dark theme foreground color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.annotations.line.trailing.light.foregroundColor": { - "type": "string", - "default": "rgba(153, 153, 153, 0.35)", - "description": "Specifies the light theme foreground color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.dark.backgroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.2)", - "description": "Specifies the dark theme background color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.light.backgroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.2)", - "description": "Specifies the light theme background color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.dark.overviewRulerColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the dark theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.light.overviewRulerColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the light theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.advanced.caching.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether git output will be cached" - }, - "gitlens.advanced.caching.maxLines": { - "type": "number", - "default": 0, - "description": "Specifies the threshold for caching larger documents" - }, - "gitlens.advanced.git": { - "type": "string", - "default": null, - "description": "Specifies the git path to use" - }, - "gitlens.advanced.gitignore.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to parse the root .gitignore file for better performance (i.e. avoids blaming excluded files)" - }, - "gitlens.advanced.maxQuickHistory": { - "type": "number", - "default": 200, - "description": "Specifies the maximum number of QuickPick history entries to show" - }, - "gitlens.advanced.menus": { - "type": "object", - "default": { - "editorContext": { - "blame": true, - "copy": true, - "details": true, - "fileDiff": true, - "history": true, - "lineDiff": true, - "remote": true - }, - "editorTitle": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true, - "status": true - }, - "editorTitleContext": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true - }, - "explorerContext": { - "fileDiff": true, - "history": true, - "remote": true - } - }, - "description": "Specifies which commands will be added to which menus", - "properties": { - "editorContext": { - "type": "object", - "default": { - "blame": true, - "copy": true, - "details": true, - "fileDiff": true, - "history": true, - "lineDiff": true, - "remote": true - }, - "properties": { - "blame": { - "type": "boolean", - "default": true - }, - "copy": { - "type": "boolean", - "default": true - }, - "details": { - "type": "boolean", - "default": true - }, - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "lineDiff": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - } - } - }, - "editorTitle": { - "type": "object", - "default": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true, - "status": true - }, - "properties": { - "blame": { - "type": "boolean", - "default": true - }, - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - }, - "status": { - "type": "boolean", - "default": true - } - } - }, - "editorTitleContext": { - "type": "object", - "default": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true - }, - "properties": { - "blame": { - "type": "boolean", - "default": true - }, - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - } - } - }, - "explorerContext": { - "type": "object", - "default": { - "fileDiff": true, - "history": true, - "remote": true - }, - "properties": { - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - } - } - } - } - }, - "gitlens.advanced.quickPick.closeOnFocusOut": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to close the QuickPick menu when focus is lost" - }, - "gitlens.advanced.telemetry.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to enable GitLens telemetry (even if enabled still abides by the overall `telemetry.enableTelemetry` setting" - }, - "gitlens.advanced.toggleWhitespace.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to toggle whitespace off then showing blame annotations (*may* be required by certain fonts/themes)" - } - } - }, - "commands": [ - { - "command": "gitlens.diffDirectory", - "title": "Directory Compare", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithBranch", - "title": "Compare File with Branch...", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithNext", - "title": "Compare File with Next Commit", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithPrevious", - "title": "Compare File with Previous", - "category": "GitLens" - }, - { - "command": "gitlens.diffLineWithPrevious", - "title": "Compare Line Commit with Previous", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithRevision", - "title": "Compare File with Revision...", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithWorking", - "title": "Compare File with Working Tree", - "category": "GitLens" - }, - { - "command": "gitlens.diffLineWithWorking", - "title": "Compare Line Commit with Working Tree", - "category": "GitLens" - }, - { - "command": "gitlens.showFileBlame", - "title": "Show File Blame Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.showLineBlame", - "title": "Show Line Blame Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.toggleFileBlame", - "title": "Toggle File Blame Annotations", - "category": "GitLens", - "icon": { - "dark": "images/dark/git-icon.svg", - "light": "images/light/git-icon.svg" - } - }, - { - "command": "gitlens.toggleFileRecentChanges", - "title": "Toggle Recent File Changes Annotations", - "category": "GitLens", - "icon": { - "dark": "images/dark/git-icon.svg", - "light": "images/light/git-icon.svg" - } - }, - { - "command": "gitlens.toggleLineBlame", - "title": "Toggle Line Blame Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.toggleCodeLens", - "title": "Toggle Git Code Lens", - "category": "GitLens" - }, - { - "command": "gitlens.showBlameHistory", - "title": "Open Blame History Explorer", - "category": "GitLens" - }, - { - "command": "gitlens.showCommitSearch", - "title": "Search Commits", - "category": "GitLens" - }, - { - "command": "gitlens.showFileHistory", - "title": "Open File History Explorer", - "category": "GitLens" - }, - { - "command": "gitlens.showLastQuickPick", - "title": "Show Last Opened Quick Pick", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickCommitDetails", - "title": "Show Commit Details", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "title": "Show Commit File Details", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickFileHistory", - "title": "Show File History", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickBranchHistory", - "title": "Show Branch History", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickRepoHistory", - "title": "Show Current Branch History", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickRepoStatus", - "title": "Show Repository Status", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickStashList", - "title": "Show Stashed Changes", - "category": "GitLens" - }, - { - "command": "gitlens.copyShaToClipboard", - "title": "Copy Commit ID to Clipboard", - "category": "GitLens" - }, - { - "command": "gitlens.copyMessageToClipboard", - "title": "Copy Commit Message to Clipboard", - "category": "GitLens" - }, - { - "command": "gitlens.closeUnchangedFiles", - "title": "Close Unchanged Files", - "category": "GitLens" - }, - { - "command": "gitlens.openChangedFiles", - "title": "Open Changed Files", - "category": "GitLens" - }, - { - "command": "gitlens.openBranchInRemote", - "title": "Open Branch in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.openCommitInRemote", - "title": "Open Commit in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.openFileInRemote", - "title": "Open File in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.openRepoInRemote", - "title": "Open Repository in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.stashApply", - "title": "Apply Stashed Changes", - "category": "GitLens" - }, - { - "command": "gitlens.stashSave", - "title": "Stash Changes", - "category": "GitLens" - }, - { - "command": "gitlens.resetSuppressedWarnings", - "title": "Reset Suppressed Warnings", - "category": "GitLens" - } - ], - "menus": { - "commandPalette": [ - { - "command": "gitlens.diffDirectory", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.diffWithBranch", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffWithNext", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithPrevious", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.diffWithRevision", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffWithWorking", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithWorking", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showFileBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showLineBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.toggleFileBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.toggleFileRecentChanges", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.toggleLineBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.toggleCodeLens", - "when": "gitlens:isTracked && gitlens:canToggleCodeLens" - }, - { - "command": "gitlens.showBlameHistory", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showFileHistory", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.showLastQuickPick", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickCommitDetails", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.showQuickBranchHistory", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoHistory", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoStatus", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickStashList", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.copyShaToClipboard", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.copyMessageToClipboard", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.closeUnchangedFiles", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.openChangedFiles", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.openBranchInRemote", - "when": "gitlens:hasRemotes" - }, - { - "command": "gitlens.openCommitInRemote", - "when": "gitlens:isBlameable && gitlens:hasRemotes" - }, - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:isTracked && gitlens:hasRemotes" - }, - { - "command": "gitlens.openRepoInRemote", - "when": "gitlens:hasRemotes" - }, - { - "command": "gitlens.stashApply", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.stashSave", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.resetSuppressedWarnings", - "when": "gitlens:enabled" - } - ], - "editor/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "editorTextFocus && gitlens:isTracked && gitlens:hasRemotes && config.gitlens.advanced.menus.editorContext.remote", - "group": "navigation@100" - }, - { - "command": "gitlens.diffLineWithPrevious", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", - "group": "1_gitlens@1" - }, - { - "command": "gitlens.diffLineWithWorking", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", - "group": "1_gitlens@2" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.details", - "group": "1_gitlens@3" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", - "group": "1_gitlens_1@1" - }, - { - "command": "gitlens.diffWithWorking", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", - "group": "1_gitlens_1@2" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:isTracked && config.gitlens.advanced.menus.editorContext.history", - "group": "3_gitlens@1" - }, - { - "command": "gitlens.toggleFileBlame", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.blame", - "group": "3_gitlens@2" - }, - { - "command": "gitlens.copyShaToClipboard", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", - "group": "9_gitlens@1" - }, - { - "command": "gitlens.copyMessageToClipboard", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", - "group": "9_gitlens@2" - } - ], - "editor/title": [ - { - "command": "gitlens.toggleFileBlame", - "alt": "gitlens.toggleFileRecentChanges", - "when": "gitlens:isBlameable && config.gitlens.advanced.menus.editorTitle.blame", - "group": "navigation@100" - }, - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", - "group": "1_gitlens" - }, - { - "command": "gitlens.openRepoInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", - "group": "1_gitlens" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", - "group": "2_gitlens" - }, - { - "command": "gitlens.diffWithWorking", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", - "group": "2_gitlens" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "editorFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.history", - "group": "2_gitlens_1" - }, - { - "command": "gitlens.showQuickRepoHistory", - "when": "!editorFocus && gitlens:enabled && config.gitlens.advanced.menus.editorTitle.history", - "group": "2_gitlens_1" - }, - { - "command": "gitlens.showQuickRepoStatus", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitle.status", - "group": "2_gitlens_1" - } - ], - "editor/title/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", - "group": "1_gitlens" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", - "group": "1_gitlens_1@1" - }, - { - "command": "gitlens.diffWithWorking", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", - "group": "1_gitlens_1@2" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.history", - "group": "1_gitlens_2@1" - }, - { - "command": "gitlens.toggleFileBlame", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.blame", - "group": "1_gitlens_2@2" - } - ], - "explorer/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.remote", - "group": "navigation@100" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", - "group": "1_gitlens@1" - }, - { - "command": "gitlens.diffWithWorking", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", - "group": "1_gitlens@2" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.history", - "group": "1_gitlens_1@1" - } - ], - "scm/resourceGroup/context": [ - { - "command": "gitlens.openChangedFiles", - "when": "gitlens:enabled", - "group": "1_gitlens@1" - }, - { - "command": "gitlens.closeUnchangedFiles", - "when": "gitlens:enabled", - "group": "1_gitlens@2" - } - ], - "scm/resourceState/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && gitlens:hasRemotes", - "group": "navigation" - }, - { - "command": "gitlens.diffWithRevision", - "when": "gitlens:enabled", - "group": "1_gitlens@1" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:enabled", - "group": "1_gitlens_1@1" - } - ] - }, - "keybindings": [ - { - "command": "gitlens.key.left", - "key": "alt+left", - "when": "gitlens:key:left" - }, - { - "command": "gitlens.key.right", - "key": "alt+right", - "when": "gitlens:key:right" - }, - { - "command": "gitlens.key.,", - "key": "alt+,", - "when": "gitlens:key:," - }, - { - "command": "gitlens.key..", - "key": "alt+.", - "when": "gitlens:key:." - }, - { - "command": "gitlens.key.escape", - "key": "escape", - "when": "gitlens:key:escape" - }, - { - "command": "gitlens.toggleFileBlame", - "key": "alt+b", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.toggleCodeLens", - "key": "shift+alt+b", - "when": "editorTextFocus && gitlens:isTracked && gitlens:canToggleCodeLens" - }, - { - "command": "gitlens.showLastQuickPick", - "key": "alt+-", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showCommitSearch", - "key": "alt+/", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickFileHistory", - "key": "alt+h", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoHistory", - "key": "shift+alt+h", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoStatus", - "key": "alt+s", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "key": "alt+c", - "when": "editorTextFocus && gitlens:enabled" - }, - { - "command": "gitlens.diffWithNext", - "key": "alt+.", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithPrevious", - "key": "shift+alt+,", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffWithPrevious", - "key": "alt+,", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithWorking", - "key": "alt+w", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffWithWorking", - "key": "shift+alt+w", - "when": "editorTextFocus && gitlens:isTracked" - } - ] - }, - "activationEvents": [ - "*" - ], - "scripts": { - "clean": "git clean -xdf", - "compile": "tslint --project tslint.json && tsc -p ./", - "watch": "tsc -watch -p ./", - "lint": "tslint --project tslint.json", - "pack": "git clean -xdf && vsce package", - "postinstall": "node ./node_modules/vscode/bin/install", - "pub": "git clean -xdf && vsce publish", - "reset": "git clean -xdf && npm install", - "vscode:prepublish": "npm install --no-save && npm run compile" - }, - "dependencies": { - "applicationinsights": "0.21.0", - "copy-paste": "1.3.0", - "iconv-lite": "0.4.18", - "ignore": "3.3.3", - "lodash.debounce": "4.0.8", - "lodash.escaperegexp": "4.1.2", - "lodash.isequal": "4.5.0", - "lodash.once": "4.1.1", - "moment": "2.18.1", - "spawn-rx": "2.0.11", - "tmp": "0.0.31" - }, - "devDependencies": { - "@types/copy-paste": "1.1.30", - "@types/iconv-lite": "0.0.1", - "@types/mocha": "2.2.41", - "@types/node": "8.0.7", - "@types/tmp": "0.0.33", - "mocha": "3.4.2", - "tslint": "5.4.3", - "typescript": "2.4.1", - "vscode": "1.1.1" - } -} +{ + "name": "gitlens", + "version": "4.2.0", + "author": { + "name": "Eric Amodio", + "email": "eamodio@gmail.com" + }, + "publisher": "eamodio", + "engines": { + "vscode": "^1.13.0" + }, + "license": "SEE LICENSE IN LICENSE", + "displayName": "Git Lens \u2014 git blame annotations, code lens, and more", + "description": "Supercharge Visual Studio Code's Git capabilities \u2014 Visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore the history of a file or branch, gain valuable insights via powerful comparison commands, and so much more", + "badges": [ + { + "url": "https://badges.gitter.im/vscode-gitlens/Lobby.svg", + "href": "https://gitter.im/vscode-gitlens/Lobby", + "description": "Chat at https://gitter.im/vscode-gitlens/Lobby" + } + ], + "categories": [ + "Other" + ], + "keywords": [ + "git", + "code lens", + "blame", + "history", + "annotation", + "log", + "inline blame", + "compare", + "diff" + ], + "galleryBanner": { + "color": "#56098c", + "theme": "dark" + }, + "icon": "images/gitlens-icon.png", + "preview": false, + "homepage": "https://github.com/eamodio/vscode-gitlens/blob/master/README.md", + "bugs": { + "url": "https://github.com/eamodio/vscode-gitlens/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/eamodio/vscode-gitlens.git" + }, + "main": "./out/src/extension", + "contributes": { + "configuration": { + "type": "object", + "title": "GitLens configuration", + "properties": { + "gitlens.debug": { + "type": "boolean", + "default": false, + "description": "Specifies debug mode" + }, + "gitlens.insiders": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to enable new experimental features (expect there to be issues)" + }, + "gitlens.outputLevel": { + "type": "string", + "default": "silent", + "enum": [ + "silent", + "errors", + "verbose" + ], + "description": "Specifies how much (if any) output will be sent to the GitLens output channel" + }, + "gitlens.annotations.file.gutter.format": { + "type": "string", + "default": "${message|40?} ${ago|14-}", + "description": "Specifies the format of the gutter blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.file.gutter.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.annotations.file.gutter.dateFormat": { + "type": "string", + "default": null, + "description": "Specifies how to format absolute dates (using the `${date}` token) in gutter blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.annotations.file.gutter.compact": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to compact (deduplicate) matching adjacent gutter blame annotations" + }, + "gitlens.annotations.file.gutter.heatmap.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a heatmap indicator in the gutter blame annotations" + }, + "gitlens.annotations.file.gutter.heatmap.location": { + "type": "string", + "default": "right", + "enum": [ + "left", + "right" + ], + "description": "Specifies where the heatmap indicators will be shown in the gutter blame annotations\n `left` - adds a heatmap indicator on the left edge of the gutter blame annotations\n `right` - adds a heatmap indicator on the right edge of the gutter blame annotations" + }, + "gitlens.annotations.file.gutter.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation over the gutter blame annotations" + }, + "gitlens.annotations.file.gutter.hover.wholeLine": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.annotations.file.hover.heatmap.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide heatmap indicators on the left edge of each line" + }, + "gitlens.annotations.file.hover.wholeLine": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.annotations.file.recentChanges.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation" + }, + "gitlens.annotations.file.recentChanges.hover.changes": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a changes (diff) hover annotation" + }, + "gitlens.annotations.file.recentChanges.hover.wholeLine": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.annotations.line.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation for the current line" + }, + "gitlens.annotations.line.hover.changes": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a changes (diff) hover annotation for the current line" + }, + "gitlens.annotations.line.trailing.format": { + "type": "string", + "default": "${authorAgo} \u2022 ${message}", + "description": "Specifies the format of the trailing blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.line.trailing.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.annotations.line.trailing.dateFormat": { + "type": "string", + "default": null, + "description": "Specifies how to format absolute dates (using the `${date}` token) in trailing blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.annotations.line.trailing.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation over the trailing blame annotations" + }, + "gitlens.annotations.line.trailing.hover.changes": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a changes (diff) hover annotation over the trailing blame annotations" + }, + "gitlens.annotations.line.trailing.hover.wholeLine": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.blame.file.annotationType": { + "type": "string", + "default": "gutter", + "enum": [ + "gutter", + "hover" + ], + "description": "Specifies the type of blame annotations that will be shown for the current file\n `gutter` - adds an annotation to the beginning of each line\n `hover` - shows annotations when hovering over each line" + }, + "gitlens.blame.file.lineHighlight.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to highlight lines associated with the current line" + }, + "gitlens.blame.file.lineHighlight.locations": { + "type": "array", + "default": [ + "gutter", + "line", + "overviewRuler" + ], + "items": { + "type": "string", + "enum": [ + "gutter", + "line", + "overviewRuler" + ] + }, + "minItems": 1, + "maxItems": 3, + "uniqueItems": true, + "description": "Specifies where the associated line highlights will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" + }, + "gitlens.blame.line.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a blame annotation for the current line, by default\nUse the `gitlens.toggleLineBlame` command to toggle the annotations on and off for the current session" + }, + "gitlens.blame.line.annotationType": { + "type": "string", + "default": "trailing", + "enum": [ + "trailing", + "hover" + ], + "description": "Specifies the type of blame annotations that will be shown for the current line\n `trailing` - adds an annotation to the end of the current line\n `hover` - shows annotations when hovering over the current line" + }, + "gitlens.recentChanges.file.lineHighlight.locations": { + "type": "array", + "default": [ + "gutter", + "line", + "overviewRuler" + ], + "items": { + "type": "string", + "enum": [ + "gutter", + "line", + "overviewRuler" + ] + }, + "minItems": 1, + "maxItems": 3, + "uniqueItems": true, + "description": "Specifies where the highlights of the recently changed lines will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" + }, + "gitlens.codeLens.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide any Git code lens, by default\nUse the `gitlens.toggleCodeLens` command to toggle the Git code lens on and off for the current session" + }, + "gitlens.codeLens.recentChange.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to show a `recent change` code lens showing the author and date of the most recent commit for the file or code block" + }, + "gitlens.codeLens.recentChange.command": { + "type": "string", + "default": "gitlens.showQuickCommitFileDetails", + "enum": [ + "gitlens.toggleFileBlame", + "gitlens.showBlameHistory", + "gitlens.showFileHistory", + "gitlens.diffWithPrevious", + "gitlens.showQuickCommitDetails", + "gitlens.showQuickCommitFileDetails", + "gitlens.showQuickFileHistory", + "gitlens.showQuickRepoHistory" + ], + "description": "Specifies the command to be executed when the `recent change` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" + }, + "gitlens.codeLens.authors.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to show an `authors` code lens showing number of authors of the file or code block and the most prominent author (if there is more than one)" + }, + "gitlens.codeLens.authors.command": { + "type": "string", + "default": "gitlens.toggleFileBlame", + "enum": [ + "gitlens.toggleFileBlame", + "gitlens.showBlameHistory", + "gitlens.showFileHistory", + "gitlens.diffWithPrevious", + "gitlens.showQuickCommitDetails", + "gitlens.showQuickCommitFileDetails", + "gitlens.showQuickFileHistory", + "gitlens.showQuickRepoHistory" + ], + "description": "Specifies the command to be executed when the `authors` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" + }, + "gitlens.codeLens.locations": { + "type": "array", + "default": [ + "document", + "containers" + ], + "items": { + "type": "string", + "enum": [ + "document", + "containers", + "blocks", + "custom" + ] + }, + "minItems": 1, + "maxItems": 4, + "uniqueItems": true, + "description": "Specifies where Git code lens will be shown in the document\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `gitlens.codeLens.locationCustomSymbols`" + }, + "gitlens.codeLens.customLocationSymbols": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "description": "Specifies the set of document symbols where Git code lens will be shown in the document\nMust be a member of `SymbolKind`" + }, + "gitlens.codeLens.perLanguageLocations": { + "type": "array", + "default": [ + { + "language": "css", + "locations": [ + "document" + ] + }, + { + "language": "html", + "locations": [ + "document" + ] + }, + { + "language": "json", + "locations": [ + "document" + ] + }, + { + "language": "less", + "locations": [ + "document" + ] + }, + { + "language": "scss", + "locations": [ + "document" + ] + }, + { + "language": "vue", + "locations": [ + "document" + ] + } + ], + "items": { + "type": "object", + "required": [ + "language", + "locations" + ], + "properties": { + "language": { + "type": "string", + "description": "Specifies the language to which this code lens override applies" + }, + "locations": { + "type": "array", + "default": [ + "document", + "containers" + ], + "items": { + "type": "string", + "enum": [ + "document", + "containers", + "blocks", + "custom" + ] + }, + "minItems": 1, + "maxItems": 4, + "uniqueItems": true, + "description": "Specifies where Git code lens will be shown in the document for the specified language\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `customSymbols`" + }, + "customSymbols": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "description": "Specifies the set of document symbols where Git code lens will be shown in the document for the specified language\nMust be a member of `SymbolKind`" + } + } + }, + "uniqueItems": true, + "description": "Specifies where Git code lens will be shown in the document for the specified languages" + }, + "gitlens.codeLens.debug": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to show debug information in code lens" + }, + "gitlens.defaultDateFormat": { + "type": "string", + "default": null, + "description": "Specifies how all absolute dates will be formatted by default\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.explorer.commitFormat": { + "type": "string", + "default": "${authorAgo} \u00a0\u2022\u00a0 ${message} \u00a0\u2022\u00a0 ${id}", + "description": "Specifies the format of a commit in the explorer view\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.explorer.commitFileFormat": { + "type": "string", + "default": "${authorAgo} \u00a0\u2022\u00a0 ${message} \u00a0\u2022\u00a0 ${id}", + "description": "Specifies the format of a file commit in the explorer view\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.explorer.stashFormat": { + "type": "string", + "default": "${authorAgo} \u00a0\u2022\u00a0 ${message} \u00a0\u2022\u00a0 ${id}", + "description": "Specifies the format of a stash in the explorer view\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.statusBar.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide blame information on the status bar" + }, + "gitlens.statusBar.alignment": { + "type": "string", + "default": "right", + "enum": [ + "left", + "right" + ], + "description": "Specifies the blame alignment in the status bar\n `left` - align to the left\n `right` - align to the right" + }, + "gitlens.statusBar.command": { + "type": "string", + "default": "gitlens.showQuickCommitDetails", + "enum": [ + "gitlens.toggleFileBlame", + "gitlens.showBlameHistory", + "gitlens.showFileHistory", + "gitlens.diffWithPrevious", + "gitlens.diffWithWorking", + "gitlens.toggleCodeLens", + "gitlens.showQuickCommitDetails", + "gitlens.showQuickCommitFileDetails", + "gitlens.showQuickFileHistory", + "gitlens.showQuickRepoHistory" + ], + "description": "Specifies the command to be executed when the blame status bar item is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current line commit with the previous\n `gitlens.diffWithWorking` - compares the current line commit with the working tree\n `gitlens.toggleCodeLens` - toggles Git code lens\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" + }, + "gitlens.statusBar.format": { + "type": "string", + "default": "${authorAgo}", + "description": "Specifies the format of the status bar blame information\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.statusBar.dateFormat": { + "type": "string", + "default": null, + "description": "Specifies the date format of absolute dates shown in the blame information on the status bar. See https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.strings.codeLens.unsavedChanges.recentChangeAndAuthors": { + "type": "string", + "default": "Cannot determine recent change or authors (unsaved changes)", + "description": "Specifies the string to be shown in place of both the `recent change` and `authors` code lens when there are unsaved changes" + }, + "gitlens.strings.codeLens.unsavedChanges.recentChangeOnly": { + "type": "string", + "default": "Cannot determine recent change (unsaved changes)", + "description": "Specifies the string to be shown in place of the `recent change` code lens when there are unsaved changes" + }, + "gitlens.strings.codeLens.unsavedChanges.authorsOnly": { + "type": "string", + "default": "Cannot determine authors (unsaved changes)", + "description": "Specifies the string to be shown in place of the `authors` code lens when there are unsaved changes" + }, + "gitlens.theme.annotations.file.gutter.separateLines": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not gutter blame annotations will be separated by a small gap" + }, + "gitlens.theme.annotations.file.gutter.dark.backgroundColor": { + "type": "string", + "default": "rgba(255, 255, 255, 0.075)", + "description": "Specifies the dark theme background color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.light.backgroundColor": { + "type": "string", + "default": "rgba(0, 0, 0, 0.05)", + "description": "Specifies the light theme background color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.dark.foregroundColor": { + "type": "string", + "default": "rgb(190, 190, 190)", + "description": "Specifies the dark theme foreground color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.light.foregroundColor": { + "type": "string", + "default": "rgb(116, 116, 116)", + "description": "Specifies the light theme foreground color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.dark.uncommittedForegroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the dark theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.light.uncommittedForegroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the light theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.hover.separateLines": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not hover blame annotations will be separated by a small gap (if heatmap is enabled)" + }, + "gitlens.theme.annotations.line.trailing.dark.backgroundColor": { + "type": "string", + "default": null, + "description": "Specifies the dark theme background color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.annotations.line.trailing.light.backgroundColor": { + "type": "string", + "default": null, + "description": "Specifies the light theme background color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.annotations.line.trailing.dark.foregroundColor": { + "type": "string", + "default": "rgba(153, 153, 153, 0.35)", + "description": "Specifies the dark theme foreground color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.annotations.line.trailing.light.foregroundColor": { + "type": "string", + "default": "rgba(153, 153, 153, 0.35)", + "description": "Specifies the light theme foreground color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.dark.backgroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.2)", + "description": "Specifies the dark theme background color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.light.backgroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.2)", + "description": "Specifies the light theme background color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.dark.overviewRulerColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the dark theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.light.overviewRulerColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the light theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.advanced.caching.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether git output will be cached" + }, + "gitlens.advanced.caching.maxLines": { + "type": "number", + "default": 0, + "description": "Specifies the threshold for caching larger documents" + }, + "gitlens.advanced.git": { + "type": "string", + "default": null, + "description": "Specifies the git path to use" + }, + "gitlens.advanced.gitignore.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to parse the root .gitignore file for better performance (i.e. avoids blaming excluded files)" + }, + "gitlens.advanced.maxQuickHistory": { + "type": "number", + "default": 200, + "description": "Specifies the maximum number of QuickPick history entries to show" + }, + "gitlens.advanced.menus": { + "type": "object", + "default": { + "editorContext": { + "blame": true, + "copy": true, + "details": true, + "fileDiff": true, + "history": true, + "lineDiff": true, + "remote": true + }, + "editorTitle": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true, + "status": true + }, + "editorTitleContext": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true + }, + "explorerContext": { + "fileDiff": true, + "history": true, + "remote": true + } + }, + "description": "Specifies which commands will be added to which menus", + "properties": { + "editorContext": { + "type": "object", + "default": { + "blame": true, + "copy": true, + "details": true, + "fileDiff": true, + "history": true, + "lineDiff": true, + "remote": true + }, + "properties": { + "blame": { + "type": "boolean", + "default": true + }, + "copy": { + "type": "boolean", + "default": true + }, + "details": { + "type": "boolean", + "default": true + }, + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "lineDiff": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + } + } + }, + "editorTitle": { + "type": "object", + "default": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true, + "status": true + }, + "properties": { + "blame": { + "type": "boolean", + "default": true + }, + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + }, + "status": { + "type": "boolean", + "default": true + } + } + }, + "editorTitleContext": { + "type": "object", + "default": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true + }, + "properties": { + "blame": { + "type": "boolean", + "default": true + }, + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + } + } + }, + "explorerContext": { + "type": "object", + "default": { + "fileDiff": true, + "history": true, + "remote": true + }, + "properties": { + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + } + } + } + } + }, + "gitlens.advanced.quickPick.closeOnFocusOut": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to close the QuickPick menu when focus is lost" + }, + "gitlens.advanced.telemetry.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to enable GitLens telemetry (even if enabled still abides by the overall `telemetry.enableTelemetry` setting" + }, + "gitlens.advanced.toggleWhitespace.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to toggle whitespace off then showing blame annotations (*may* be required by certain fonts/themes)" + } + } + }, + "commands": [ + { + "command": "gitlens.diffDirectory", + "title": "Directory Compare", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithBranch", + "title": "Compare File with Branch...", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithNext", + "title": "Compare File with Next Commit", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithPrevious", + "title": "Compare File with Previous", + "category": "GitLens" + }, + { + "command": "gitlens.diffLineWithPrevious", + "title": "Compare Line Commit with Previous", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithRevision", + "title": "Compare File with Revision...", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithWorking", + "title": "Compare File with Working Tree", + "category": "GitLens" + }, + { + "command": "gitlens.diffLineWithWorking", + "title": "Compare Line Commit with Working Tree", + "category": "GitLens" + }, + { + "command": "gitlens.showFileBlame", + "title": "Show File Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.showLineBlame", + "title": "Show Line Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.toggleFileBlame", + "title": "Toggle File Blame Annotations", + "category": "GitLens", + "icon": { + "dark": "images/dark/git-icon.svg", + "light": "images/light/git-icon.svg" + } + }, + { + "command": "gitlens.toggleFileRecentChanges", + "title": "Toggle Recent File Changes Annotations", + "category": "GitLens", + "icon": { + "dark": "images/dark/git-icon.svg", + "light": "images/light/git-icon.svg" + } + }, + { + "command": "gitlens.toggleLineBlame", + "title": "Toggle Line Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.toggleCodeLens", + "title": "Toggle Git Code Lens", + "category": "GitLens" + }, + { + "command": "gitlens.showBlameHistory", + "title": "Open Blame History Explorer", + "category": "GitLens" + }, + { + "command": "gitlens.showCommitSearch", + "title": "Search Commits", + "category": "GitLens" + }, + { + "command": "gitlens.showFileHistory", + "title": "Show File History in Explorer", + "category": "GitLens" + }, + { + "command": "gitlens.showLastQuickPick", + "title": "Show Last Opened Quick Pick", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickCommitDetails", + "title": "Show Commit Details", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "title": "Show Commit File Details", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickFileHistory", + "title": "Show File History", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickBranchHistory", + "title": "Show Branch History", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickRepoHistory", + "title": "Show Current Branch History", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickRepoStatus", + "title": "Show Repository Status", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickStashList", + "title": "Show Stashed Changes", + "category": "GitLens" + }, + { + "command": "gitlens.showStashList", + "title": "Show Stashed Changes in Explorer", + "category": "GitLens" + }, + { + "command": "gitlens.copyShaToClipboard", + "title": "Copy Commit ID to Clipboard", + "category": "GitLens" + }, + { + "command": "gitlens.copyMessageToClipboard", + "title": "Copy Commit Message to Clipboard", + "category": "GitLens" + }, + { + "command": "gitlens.closeUnchangedFiles", + "title": "Close Unchanged Files", + "category": "GitLens" + }, + { + "command": "gitlens.openChangedFiles", + "title": "Open Changed Files", + "category": "GitLens" + }, + { + "command": "gitlens.openBranchInRemote", + "title": "Open Branch in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.openCommitInRemote", + "title": "Open Commit in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.openFileInRemote", + "title": "Open File in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.openRepoInRemote", + "title": "Open Repository in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.stashApply", + "title": "Apply Stashed Changes", + "category": "GitLens" + }, + { + "command": "gitlens.stashSave", + "title": "Stash Changes", + "category": "GitLens" + }, + { + "command": "gitlens.resetSuppressedWarnings", + "title": "Reset Suppressed Warnings", + "category": "GitLens" + } + ], + "menus": { + "commandPalette": [ + { + "command": "gitlens.diffDirectory", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.diffWithBranch", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffWithNext", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithPrevious", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.diffWithRevision", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithWorking", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showFileBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showLineBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.toggleFileBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.toggleFileRecentChanges", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.toggleLineBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.toggleCodeLens", + "when": "gitlens:isTracked && gitlens:canToggleCodeLens" + }, + { + "command": "gitlens.showBlameHistory", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showFileHistory", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.showLastQuickPick", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickCommitDetails", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.showQuickBranchHistory", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoHistory", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoStatus", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickStashList", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showStashList", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.copyShaToClipboard", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.copyMessageToClipboard", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.closeUnchangedFiles", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.openChangedFiles", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.openBranchInRemote", + "when": "gitlens:hasRemotes" + }, + { + "command": "gitlens.openCommitInRemote", + "when": "gitlens:isBlameable && gitlens:hasRemotes" + }, + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:isTracked && gitlens:hasRemotes" + }, + { + "command": "gitlens.openRepoInRemote", + "when": "gitlens:hasRemotes" + }, + { + "command": "gitlens.stashApply", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.stashSave", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.resetSuppressedWarnings", + "when": "gitlens:enabled" + } + ], + "editor/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "editorTextFocus && gitlens:isTracked && gitlens:hasRemotes && config.gitlens.advanced.menus.editorContext.remote", + "group": "navigation@100" + }, + { + "command": "gitlens.diffLineWithPrevious", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.diffLineWithWorking", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", + "group": "1_gitlens@2" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.details", + "group": "1_gitlens@3" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", + "group": "1_gitlens_1@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", + "group": "1_gitlens_1@2" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:isTracked && config.gitlens.advanced.menus.editorContext.history", + "group": "3_gitlens@1" + }, + { + "command": "gitlens.toggleFileBlame", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.blame", + "group": "3_gitlens@2" + }, + { + "command": "gitlens.copyShaToClipboard", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", + "group": "9_gitlens@1" + }, + { + "command": "gitlens.copyMessageToClipboard", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", + "group": "9_gitlens@2" + } + ], + "editor/title": [ + { + "command": "gitlens.toggleFileBlame", + "alt": "gitlens.toggleFileRecentChanges", + "when": "gitlens:isBlameable && config.gitlens.advanced.menus.editorTitle.blame", + "group": "navigation@100" + }, + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", + "group": "1_gitlens" + }, + { + "command": "gitlens.openRepoInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", + "group": "1_gitlens" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", + "group": "2_gitlens" + }, + { + "command": "gitlens.diffWithWorking", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", + "group": "2_gitlens" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "editorFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.history", + "group": "2_gitlens_1" + }, + { + "command": "gitlens.showQuickRepoHistory", + "when": "!editorFocus && gitlens:enabled && config.gitlens.advanced.menus.editorTitle.history", + "group": "2_gitlens_1" + }, + { + "command": "gitlens.showQuickRepoStatus", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitle.status", + "group": "2_gitlens_1" + } + ], + "editor/title/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", + "group": "1_gitlens" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", + "group": "1_gitlens_1@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", + "group": "1_gitlens_1@2" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.history", + "group": "1_gitlens_2@1" + }, + { + "command": "gitlens.toggleFileBlame", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.blame", + "group": "1_gitlens_2@2" + } + ], + "explorer/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.remote", + "group": "navigation@100" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", + "group": "1_gitlens@2" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.history", + "group": "1_gitlens_1@1" + } + ], + "scm/resourceGroup/context": [ + { + "command": "gitlens.openChangedFiles", + "when": "gitlens:enabled", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.closeUnchangedFiles", + "when": "gitlens:enabled", + "group": "1_gitlens@2" + } + ], + "scm/resourceState/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && gitlens:hasRemotes", + "group": "navigation" + }, + { + "command": "gitlens.diffWithRevision", + "when": "gitlens:enabled", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:enabled", + "group": "1_gitlens_1@1" + } + ], + "view/title": [ + { + "command": "gitlens.showQuickRepoHistory", + "when": "gitlens:enabled && view == gitlens-explorer", + "group": "1_gitlens@1" + } + ], + "view/item/context": [ + { + "command": "gitlens.openCommitInRemote", + "when": "gitlens:enabled && view == gitlens-explorer && viewItem == commit", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && view == gitlens-explorer && viewItem == commit-file", + "group": "1_gitlens@2" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:enabled && view == gitlens-explorer && viewItem == commit-file", + "group": "2_gitlens@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:enabled && view == gitlens-explorer && viewItem == commit-file", + "group": "2_gitlens@2" + } + ] + }, + "keybindings": [ + { + "command": "gitlens.key.left", + "key": "alt+left", + "when": "gitlens:key:left" + }, + { + "command": "gitlens.key.right", + "key": "alt+right", + "when": "gitlens:key:right" + }, + { + "command": "gitlens.key.,", + "key": "alt+,", + "when": "gitlens:key:," + }, + { + "command": "gitlens.key..", + "key": "alt+.", + "when": "gitlens:key:." + }, + { + "command": "gitlens.key.escape", + "key": "escape", + "when": "gitlens:key:escape" + }, + { + "command": "gitlens.toggleFileBlame", + "key": "alt+b", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.toggleCodeLens", + "key": "shift+alt+b", + "when": "editorTextFocus && gitlens:isTracked && gitlens:canToggleCodeLens" + }, + { + "command": "gitlens.showLastQuickPick", + "key": "alt+-", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showCommitSearch", + "key": "alt+/", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickFileHistory", + "key": "alt+h", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoHistory", + "key": "shift+alt+h", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoStatus", + "key": "alt+s", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "key": "alt+c", + "when": "editorTextFocus && gitlens:enabled" + }, + { + "command": "gitlens.diffWithNext", + "key": "alt+.", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithPrevious", + "key": "shift+alt+,", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffWithPrevious", + "key": "alt+,", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithWorking", + "key": "alt+w", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffWithWorking", + "key": "shift+alt+w", + "when": "editorTextFocus && gitlens:isTracked" + } + ], + "views": { + "explorer": [ + { + "id": "gitlens-explorer", + "name": "GitLens Explorer" + } + ] + } + }, + "activationEvents": [ + "*" + ], + "scripts": { + "clean": "git clean -xdf", + "compile": "tslint --project tslint.json && tsc -p ./", + "watch": "tsc -watch -p ./", + "lint": "tslint --project tslint.json", + "pack": "git clean -xdf && vsce package", + "postinstall": "node ./node_modules/vscode/bin/install", + "pub": "git clean -xdf && vsce publish", + "reset": "git clean -xdf && npm install", + "vscode:prepublish": "npm install --no-save && npm run compile" + }, + "dependencies": { + "applicationinsights": "0.21.0", + "copy-paste": "1.3.0", + "iconv-lite": "0.4.18", + "ignore": "3.3.3", + "lodash.debounce": "4.0.8", + "lodash.escaperegexp": "4.1.2", + "lodash.isequal": "4.5.0", + "lodash.once": "4.1.1", + "moment": "2.18.1", + "spawn-rx": "2.0.11", + "tmp": "0.0.31" + }, + "devDependencies": { + "@types/copy-paste": "1.1.30", + "@types/iconv-lite": "0.0.1", + "@types/mocha": "2.2.41", + "@types/node": "8.0.7", + "@types/tmp": "0.0.33", + "mocha": "3.4.2", + "tslint": "5.4.3", + "typescript": "2.4.1", + "vscode": "1.1.1" + } +} diff --git a/src/commands.ts b/src/commands.ts index b46c171..90a2cbf 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -32,6 +32,7 @@ export * from './commands/showQuickCurrentBranchHistory'; export * from './commands/showQuickFileHistory'; export * from './commands/showQuickRepoStatus'; export * from './commands/showQuickStashList'; +export * from './commands/showStashList'; export * from './commands/stashApply'; export * from './commands/stashDelete'; export * from './commands/stashSave'; diff --git a/src/commands/common.ts b/src/commands/common.ts index 7970052..391ce6d 100644 --- a/src/commands/common.ts +++ b/src/commands/common.ts @@ -1,5 +1,6 @@ 'use strict'; import { commands, Disposable, SourceControlResourceGroup, SourceControlResourceState, TextDocumentShowOptions, TextEditor, TextEditorEdit, Uri, window, workspace } from 'vscode'; +import { ExplorerNode } from '../views/gitExplorerNodes'; import { Logger } from '../logger'; import { Telemetry } from '../telemetry'; @@ -34,6 +35,7 @@ export type Commands = 'gitlens.closeUnchangedFiles' | 'gitlens.showQuickRepoHistory' | 'gitlens.showQuickRepoStatus' | 'gitlens.showQuickStashList' | + 'gitlens.showStashList' | 'gitlens.stashApply' | 'gitlens.stashDelete' | 'gitlens.stashSave' | @@ -73,6 +75,7 @@ export const Commands = { ShowQuickCurrentBranchHistory: 'gitlens.showQuickRepoHistory' as Commands, ShowQuickRepoStatus: 'gitlens.showQuickRepoStatus' as Commands, ShowQuickStashList: 'gitlens.showQuickStashList' as Commands, + ShowStashList: 'gitlens.showStashList' as Commands, StashApply: 'gitlens.stashApply' as Commands, StashDelete: 'gitlens.stashDelete' as Commands, StashSave: 'gitlens.stashSave' as Commands, @@ -116,7 +119,12 @@ export interface CommandUriContext extends CommandBaseContext { type: 'uri'; } -export type CommandContext = CommandScmGroupsContext | CommandScmStatesContext | CommandUnknownContext | CommandUriContext; +export interface CommandViewContext extends CommandBaseContext { + type: 'view'; + node: ExplorerNode; +} + +export type CommandContext = CommandScmGroupsContext | CommandScmStatesContext | CommandUnknownContext | CommandUriContext | CommandViewContext; function isScmResourceGroup(group: any): group is SourceControlResourceGroup { if (group === undefined) return false; @@ -180,6 +188,11 @@ export abstract class Command extends Disposable { return [{ type: 'uri', editor: editor, uri: uri }, rest]; } + if (firstArg instanceof ExplorerNode) { + const [node, ...rest] = args as [ExplorerNode, any]; + return [{ type: 'view', node: node, uri: node.uri }, rest]; + } + if (isScmResourceState(firstArg)) { const states = []; let count = 0; diff --git a/src/commands/openCommitInRemote.ts b/src/commands/openCommitInRemote.ts index 17a600e..d99d7fe 100644 --- a/src/commands/openCommitInRemote.ts +++ b/src/commands/openCommitInRemote.ts @@ -1,11 +1,16 @@ 'use strict'; import { Arrays } from '../system'; import { commands, TextEditor, Uri, window } from 'vscode'; -import { ActiveEditorCommand, Commands, getCommandUri } from './common'; +import { ActiveEditorCommand, CommandContext, Commands, getCommandUri } from './common'; import { GitBlameCommit, GitService, GitUri } from '../gitService'; import { Logger } from '../logger'; import { Messages } from '../messages'; import { OpenInRemoteCommandArgs } from './openInRemote'; +import { CommitNode } from '../views/gitExplorer'; + +export interface OpenCommitInRemoteCommandArgs { + sha?: string; +} export class OpenCommitInRemoteCommand extends ActiveEditorCommand { @@ -13,7 +18,17 @@ export class OpenCommitInRemoteCommand extends ActiveEditorCommand { super(Commands.OpenCommitInRemote); } - async execute(editor?: TextEditor, uri?: Uri) { + protected async preExecute(context: CommandContext, args: OpenCommitInRemoteCommandArgs = {}): Promise { + if (context.type === 'view' && context.node instanceof CommitNode) { + args = { ...args }; + args.sha = context.node.commit.sha; + return this.execute(context.editor, context.node.commit.uri, args); + } + + return this.execute(context.editor, context.uri, args); + } + + async execute(editor?: TextEditor, uri?: Uri, args: OpenCommitInRemoteCommandArgs = {}) { uri = getCommandUri(uri, editor); if (uri === undefined) return undefined; if (editor !== undefined && editor.document !== undefined && editor.document.isDirty) return undefined; @@ -21,26 +36,29 @@ export class OpenCommitInRemoteCommand extends ActiveEditorCommand { const gitUri = await GitUri.fromUri(uri, this.git); if (!gitUri.repoPath) return undefined; - const line = editor === undefined ? gitUri.offset : editor.selection.active.line; - try { - const blameline = line - gitUri.offset; - if (blameline < 0) return undefined; + if (args.sha === undefined) { + const line = editor === undefined ? gitUri.offset : editor.selection.active.line; + const blameline = line - gitUri.offset; + if (blameline < 0) return undefined; + + const blame = await this.git.getBlameForLine(gitUri, blameline); + if (blame === undefined) return Messages.showFileNotUnderSourceControlWarningMessage('Unable to open commit in remote provider'); - const blame = await this.git.getBlameForLine(gitUri, blameline); - if (blame === undefined) return Messages.showFileNotUnderSourceControlWarningMessage('Unable to open commit in remote provider'); + let commit = blame.commit; + // If the line is uncommitted, find the previous commit + if (commit.isUncommitted) { + commit = new GitBlameCommit(commit.repoPath, commit.previousSha!, commit.previousFileName!, commit.author, commit.date, commit.message, []); + } - let commit = blame.commit; - // If the line is uncommitted, find the previous commit - if (commit.isUncommitted) { - commit = new GitBlameCommit(commit.repoPath, commit.previousSha!, commit.previousFileName!, commit.author, commit.date, commit.message, []); + args.sha = commit.sha; } const remotes = Arrays.uniqueBy(await this.git.getRemotes(gitUri.repoPath), _ => _.url, _ => !!_.provider); return commands.executeCommand(Commands.OpenInRemote, uri, { resource: { type: 'commit', - sha: commit.sha + sha: args.sha }, remotes } as OpenInRemoteCommandArgs); diff --git a/src/commands/showFileHistory.ts b/src/commands/showFileHistory.ts index eeee559..19df42b 100644 --- a/src/commands/showFileHistory.ts +++ b/src/commands/showFileHistory.ts @@ -2,6 +2,7 @@ import { commands, Position, Range, TextEditor, TextEditorEdit, Uri, window } from 'vscode'; import { Commands, EditorCommand, getCommandUri } from './common'; import { BuiltInCommands } from '../constants'; +import { GitExplorer } from '../views/gitExplorer'; import { GitService, GitUri } from '../gitService'; import { Messages } from '../messages'; import { Logger } from '../logger'; @@ -14,7 +15,7 @@ export interface ShowFileHistoryCommandArgs { export class ShowFileHistoryCommand extends EditorCommand { - constructor(private git: GitService) { + constructor(private git: GitService, private explorer?: GitExplorer) { super(Commands.ShowFileHistory); } @@ -32,6 +33,11 @@ export class ShowFileHistoryCommand extends EditorCommand { const gitUri = await GitUri.fromUri(uri, this.git); try { + if (this.explorer !== undefined) { + this.explorer.addHistory(gitUri); + return undefined; + } + const locations = await this.git.getLogLocations(gitUri, args.sha, args.line); if (locations === undefined) return Messages.showFileNotUnderSourceControlWarningMessage('Unable to show file history'); diff --git a/src/commands/showStashList.ts b/src/commands/showStashList.ts new file mode 100644 index 0000000..a46f177 --- /dev/null +++ b/src/commands/showStashList.ts @@ -0,0 +1,30 @@ +'use strict'; +import { TextEditor, TextEditorEdit, Uri, window } from 'vscode'; +import { Commands, EditorCommand, getCommandUri } from './common'; +import { GitExplorer } from '../views/gitExplorer'; +import { GitService, GitUri } from '../gitService'; +import { Messages } from '../messages'; +import { Logger } from '../logger'; + +export class ShowStashListCommand extends EditorCommand { + + constructor(private git: GitService, private explorer: GitExplorer) { + super(Commands.ShowStashList); + } + + async execute(editor: TextEditor, edit: TextEditorEdit, uri?: Uri) { + uri = getCommandUri(uri, editor); + + try { + const repoPath = await this.git.getRepoPathFromUri(uri); + if (!repoPath) return Messages.showNoRepositoryWarningMessage(`Unable to show stashed changes`); + + this.explorer.addStash(new GitUri(uri, { repoPath: repoPath, fileName: uri!.fsPath })); + return undefined; + } + catch (ex) { + Logger.error(ex, 'ShowStashListCommand'); + return window.showErrorMessage(`Unable to show stash list. See output channel for more details`); + } + } +} \ No newline at end of file diff --git a/src/configuration.ts b/src/configuration.ts index fe7acc9..650c27b 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -303,6 +303,13 @@ export interface IConfig { defaultDateFormat: string | null; + explorer: { + commitFormat: string; + commitFileFormat: string; + stashFormat: string; + // dateFormat: string | null; + }; + statusBar: { enabled: boolean; alignment: 'left' | 'right'; diff --git a/src/extension.ts b/src/extension.ts index b8817da..8eedece 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,13 +12,14 @@ import { ShowBlameHistoryCommand, ShowFileHistoryCommand } from './commands'; import { ShowLastQuickPickCommand } from './commands'; import { ShowQuickBranchHistoryCommand, ShowQuickCurrentBranchHistoryCommand, ShowQuickFileHistoryCommand } from './commands'; import { ShowCommitSearchCommand, ShowQuickCommitDetailsCommand, ShowQuickCommitFileDetailsCommand } from './commands'; -import { ShowQuickRepoStatusCommand, ShowQuickStashListCommand } from './commands'; +import { ShowQuickRepoStatusCommand, ShowQuickStashListCommand, ShowStashListCommand } from './commands'; import { StashApplyCommand, StashDeleteCommand, StashSaveCommand } from './commands'; import { ToggleCodeLensCommand } from './commands'; import { CodeLensLocations, IConfig, LineHighlightLocations } from './configuration'; import { ApplicationInsightsKey, CommandContext, ExtensionKey, QualifiedExtensionId, setCommandContext, WorkspaceState } from './constants'; import { CurrentLineController, LineAnnotationType } from './currentLineController'; import { GitContentProvider } from './gitContentProvider'; +import { GitExplorer } from './views/gitExplorer'; import { GitRevisionCodeLensProvider } from './gitRevisionCodeLensProvider'; import { GitContextTracker, GitService } from './gitService'; import { Keyboard } from './keyboard'; @@ -87,6 +88,12 @@ export async function activate(context: ExtensionContext) { context.subscriptions.push(new Keyboard()); + let explorer: GitExplorer | undefined = undefined; + if (cfg.insiders) { + explorer = new GitExplorer(context, git); + context.subscriptions.push(window.registerTreeDataProvider('gitlens-explorer', explorer)); + } + context.subscriptions.push(new CloseUnchangedFilesCommand(git)); context.subscriptions.push(new OpenChangedFilesCommand(git)); context.subscriptions.push(new CopyMessageToClipboardCommand(git)); @@ -111,7 +118,7 @@ export async function activate(context: ExtensionContext) { context.subscriptions.push(new ToggleLineBlameCommand(currentLineController)); context.subscriptions.push(new ResetSuppressedWarningsCommand(context)); context.subscriptions.push(new ShowBlameHistoryCommand(git)); - context.subscriptions.push(new ShowFileHistoryCommand(git)); + context.subscriptions.push(new ShowFileHistoryCommand(git, explorer)); context.subscriptions.push(new ShowLastQuickPickCommand()); context.subscriptions.push(new ShowQuickBranchHistoryCommand(git)); context.subscriptions.push(new ShowQuickCurrentBranchHistoryCommand(git)); @@ -121,6 +128,9 @@ export async function activate(context: ExtensionContext) { context.subscriptions.push(new ShowQuickFileHistoryCommand(git)); context.subscriptions.push(new ShowQuickRepoStatusCommand(git)); context.subscriptions.push(new ShowQuickStashListCommand(git)); + if (cfg.insiders) { + context.subscriptions.push(new ShowStashListCommand(git, explorer!)); + } context.subscriptions.push(new StashApplyCommand(git)); context.subscriptions.push(new StashDeleteCommand(git)); context.subscriptions.push(new StashSaveCommand(git)); diff --git a/src/views/commitFileNode.ts b/src/views/commitFileNode.ts new file mode 100644 index 0000000..1eead62 --- /dev/null +++ b/src/views/commitFileNode.ts @@ -0,0 +1,41 @@ +'use strict'; +import { Command, ExtensionContext, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { Commands, DiffWithPreviousCommandArgs } from '../commands'; +import { ExplorerNode, ResourceType } from './explorerNode'; +import { GitCommit, GitService, GitUri, IGitStatusFile } from '../gitService'; + +export class CommitFileNode extends ExplorerNode { + + readonly resourceType: ResourceType = 'commit-file'; + command: Command; + + constructor(public status: IGitStatusFile, public commit: GitCommit, uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + + this.command = { + title: 'Compare File with Previous', + command: Commands.DiffWithPrevious, + arguments: [ + GitUri.fromFileStatus(this.status, this.commit.repoPath), + { + commit: commit, + showOptions: { + preserveFocus: true, + preview: true + } + } as DiffWithPreviousCommandArgs + ] + }; + } + + getChildren(): Promise { + return Promise.resolve([]); + } + + getTreeItem(): TreeItem { + const item = new TreeItem(`${GitUri.getFormattedPath(this.status.fileName)}`, TreeItemCollapsibleState.None); + item.contextValue = this.resourceType; + item.command = this.command; + return item; + } +} \ No newline at end of file diff --git a/src/views/commitNode.ts b/src/views/commitNode.ts new file mode 100644 index 0000000..ed17d32 --- /dev/null +++ b/src/views/commitNode.ts @@ -0,0 +1,54 @@ +'use strict'; +import { Iterables } from '../system'; +import { Command, ExtensionContext, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { CommitFileNode } from './commitFileNode'; +import { ExplorerNode, ResourceType } from './explorerNode'; +import { CommitFormatter, GitCommit, GitService, GitUri } from '../gitService'; + +export class CommitNode extends ExplorerNode { + + readonly resourceType: ResourceType = 'commit'; + command: Command; + + constructor(public commit: GitCommit, uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + + // this.command = { + // title: 'Compare File with Previous', + // command: Commands.DiffWithPrevious, + // arguments: [ + // Uri.file(commit.uri.fsPath), + // { + // commit: commit, + // showOptions: { + // preserveFocus: true, + // preview: true + // } + // } as DiffWithPreviousCommandArgs + // ] + // }; + } + + async getChildren(): Promise { + const log = await this.git.getLogForRepo(this.commit.repoPath, this.commit.sha, 1); + if (log === undefined) return []; + + const commit = Iterables.first(log.commits.values()); + if (commit === undefined) return []; + + return [...Iterables.map(commit.fileStatuses, s => new CommitFileNode(s, commit, this.uri, this.context, this.git))]; + } + + getTreeItem(): TreeItem { + const label = CommitFormatter.fromTemplate(this.git.config.explorer.commitFormat, this.commit, this.git.config.defaultDateFormat); + + const item = new TreeItem(label, TreeItemCollapsibleState.Collapsed); + item.contextValue = this.resourceType; + item.iconPath = { + dark: this.context.asAbsolutePath('images/dark/icon-commit.svg'), + light: this.context.asAbsolutePath('images/light/icon-commit.svg') + }; + item.command = this.command; + return item; + } +} \ No newline at end of file diff --git a/src/views/explorerNode.ts b/src/views/explorerNode.ts new file mode 100644 index 0000000..e2f1230 --- /dev/null +++ b/src/views/explorerNode.ts @@ -0,0 +1,15 @@ +'use strict'; +import { ExtensionContext, TreeItem } from 'vscode'; +import { GitService, GitUri } from '../gitService'; + +export declare type ResourceType = 'status' | 'branches' | 'repository' | 'branch-history' | 'file-history' | 'stash-history' | 'commit' | 'stash-commit' | 'commit-file'; + +export abstract class ExplorerNode { + + abstract readonly resourceType: ResourceType; + + constructor(public uri: GitUri, protected context: ExtensionContext, protected git: GitService) { } + + abstract getChildren(): ExplorerNode[] | Promise; + abstract getTreeItem(): TreeItem | Promise; +} \ No newline at end of file diff --git a/src/views/fileHistoryNode.ts b/src/views/fileHistoryNode.ts new file mode 100644 index 0000000..a45a03c --- /dev/null +++ b/src/views/fileHistoryNode.ts @@ -0,0 +1,29 @@ +'use strict'; +import { Iterables } from '../system'; +import { ExtensionContext, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { CommitNode } from './commitNode'; +import { ExplorerNode, ResourceType } from './explorerNode'; +import { GitService, GitUri } from '../gitService'; + +export class FileHistoryNode extends ExplorerNode { + + static readonly rootType: ResourceType = 'file-history'; + readonly resourceType: ResourceType = 'file-history'; + + constructor(uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + } + + async getChildren(): Promise { + const log = await this.git.getLogForFile(this.uri.repoPath, this.uri.fsPath, this.uri.sha); + if (log === undefined) return []; + + return [...Iterables.map(log.commits.values(), c => new CommitNode(c, this.uri, this.context, this.git))]; + } + + getTreeItem(): TreeItem { + const item = new TreeItem(`History of ${this.uri.getFormattedPath()}`, TreeItemCollapsibleState.Expanded); + item.contextValue = this.resourceType; + return item; + } +} \ No newline at end of file diff --git a/src/views/gitExplorer.ts b/src/views/gitExplorer.ts new file mode 100644 index 0000000..fbd0220 --- /dev/null +++ b/src/views/gitExplorer.ts @@ -0,0 +1,62 @@ +'use strict'; +import { Event, EventEmitter, ExtensionContext, TreeDataProvider, TreeItem, Uri, window } from 'vscode'; +import { UriComparer } from '../comparers'; +import { ExplorerNode, FileHistoryNode, RepositoryNode, ResourceType, StashNode } from './gitExplorerNodes'; +import { GitService, GitUri } from '../gitService'; + +export * from './gitExplorerNodes'; + +export class GitExplorer implements TreeDataProvider { + + private _onDidChangeTreeData = new EventEmitter(); + public get onDidChangeTreeData(): Event { + return this._onDidChangeTreeData.event; + } + + private _roots: ExplorerNode[] = []; + + constructor(private context: ExtensionContext, private git: GitService) { + const editor = window.activeTextEditor; + + const uri = (editor !== undefined && editor.document !== undefined) + ? new GitUri(editor.document.uri, { repoPath: git.repoPath, fileName: editor.document.uri.fsPath }) + : new GitUri(Uri.file(git.repoPath), { repoPath: git.repoPath, fileName: git.repoPath }); + + this._roots.push(new RepositoryNode(uri, context, git)); + } + + async getTreeItem(node: ExplorerNode): Promise { + return node.getTreeItem(); + } + + async getChildren(node?: ExplorerNode): Promise { + if (this._roots.length === 0) return []; + if (node === undefined) return this._roots; + + return node.getChildren(); + } + + addHistory(uri: GitUri) { + this._add(uri, FileHistoryNode); + } + + addStash(uri: GitUri) { + this._add(uri, StashNode); + } + + private _add(uri: GitUri, type: { new (uri: GitUri, context: ExtensionContext, git: GitService): T, rootType: ResourceType }) { + if (!this._roots.some(_ => _.resourceType === type.rootType && UriComparer.equals(uri, _.uri))) { + this._roots.push(new type(uri, this.context, this.git)); + } + this._onDidChangeTreeData.fire(); + } + + clear() { + this._roots = []; + this._onDidChangeTreeData.fire(); + } + + refresh() { + this._onDidChangeTreeData.fire(); + } +} \ No newline at end of file diff --git a/src/views/gitExplorerNodes.ts b/src/views/gitExplorerNodes.ts new file mode 100644 index 0000000..49a3806 --- /dev/null +++ b/src/views/gitExplorerNodes.ts @@ -0,0 +1,9 @@ +'use strict'; + +export * from './explorerNode'; +export * from './commitFileNode'; +export * from './commitNode'; +export * from './fileHistoryNode'; +export * from './repositoryNode'; +export * from './stashCommitNode'; +export * from './stashNode'; \ No newline at end of file diff --git a/src/views/repositoryNode.ts b/src/views/repositoryNode.ts new file mode 100644 index 0000000..c5655ba --- /dev/null +++ b/src/views/repositoryNode.ts @@ -0,0 +1,105 @@ +'use strict'; +import { Iterables, Strings } from '../system'; +import { ExtensionContext, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { CommitNode } from './commitNode'; +import { GlyphChars } from '../constants'; +import { ExplorerNode, ResourceType } from './explorerNode'; +import { GitBranch, GitService, GitUri } from '../gitService'; +import { StashNode } from './stashNode'; + +export class RepositoryNode extends ExplorerNode { + + static readonly rootType: ResourceType = 'repository'; + readonly resourceType: ResourceType = 'repository'; + + constructor(uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + } + + async getChildren(): Promise { + return [ + new StatusNode(this.uri, this.context, this.git), + new StashNode(this.uri, this.context, this.git), + new BranchesNode(this.uri, this.context, this.git) + ]; + } + + getTreeItem(): TreeItem { + const item = new TreeItem(`Repository ${GlyphChars.Dash} ${this.uri.repoPath}`, TreeItemCollapsibleState.Expanded); + item.contextValue = this.resourceType; + return item; + } +} + +export class BranchesNode extends ExplorerNode { + + readonly resourceType: ResourceType = 'branches'; + + constructor(uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + } + + async getChildren(): Promise { + const branches = await this.git.getBranches(this.uri.repoPath!); + if (branches === undefined) return []; + + return [...Iterables.filterMap(branches.sort(_ => _.current ? 0 : 1), b => b.remote ? undefined : new BranchHistoryNode(b, this.uri, this.context, this.git))]; + } + + getTreeItem(): TreeItem { + const item = new TreeItem(`Branches`, TreeItemCollapsibleState.Collapsed); + item.contextValue = this.resourceType; + return item; + } +} + +export class BranchHistoryNode extends ExplorerNode { + + readonly resourceType: ResourceType = 'branch-history'; + + constructor(public branch: GitBranch, uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + } + + async getChildren(): Promise { + const log = await this.git.getLogForRepo(this.uri.repoPath!, this.branch.name); + if (log === undefined) return []; + + return [...Iterables.map(log.commits.values(), c => new CommitNode(c, this.uri, this.context, this.git))]; + } + + getTreeItem(): TreeItem { + const item = new TreeItem(`${this.branch.name}${this.branch.current ? ` ${GlyphChars.Dash} current` : ''}`, TreeItemCollapsibleState.Collapsed); + item.contextValue = this.resourceType; + return item; + } +} + +export class StatusNode extends ExplorerNode { + + readonly resourceType: ResourceType = 'status'; + + constructor(uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + } + + async getChildren(): Promise { + return []; + // const status = await this.git.getStatusForRepo(this.uri.repoPath!); + // if (status === undefined) return []; + + // return [...Iterables.map(status.files, b => new CommitFile(b, this.uri, this.context, this.git))]; + } + + async getTreeItem(): Promise { + const status = await this.git.getStatusForRepo(this.uri.repoPath!); + let suffix = ''; + if (status !== undefined) { + suffix = ` ${GlyphChars.Dash} ${GlyphChars.ArrowUp} ${status.state.ahead} ${GlyphChars.ArrowDown} ${status.state.behind} ${Strings.pad(GlyphChars.Dot, 1, 1)} ${status.branch} ${GlyphChars.ArrowLeftRight} ${status.upstream}`; + } + + const item = new TreeItem(`Status${suffix}`, TreeItemCollapsibleState.Collapsed); + item.contextValue = this.resourceType; + return item; + } +} diff --git a/src/views/stashCommitNode.ts b/src/views/stashCommitNode.ts new file mode 100644 index 0000000..89b19f9 --- /dev/null +++ b/src/views/stashCommitNode.ts @@ -0,0 +1,40 @@ +'use strict'; +import { Command, ExtensionContext, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { CommitFileNode } from './commitFileNode'; +import { ExplorerNode, ResourceType } from './explorerNode'; +import { CommitFormatter, GitService, GitStashCommit, GitUri } from '../gitService'; + +export class StashCommitNode extends ExplorerNode { + + readonly resourceType: ResourceType = 'stash-commit'; + command: Command; + + constructor(public commit: GitStashCommit, uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + + // this.command = { + // title: 'Show Stash Details', + // command: Commands.ShowQuickCommitDetails, + // arguments: [ + // new GitUri(commit.uri, commit), + // { + // commit: commit, + // sha: commit.sha + // } as ShowQuickCommitDetailsCommandArgs + // ] + // }; + } + + getChildren(): Promise { + return Promise.resolve((this.commit as GitStashCommit).fileStatuses.map(_ => new CommitFileNode(_, this.commit, this.uri, this.context, this.git))); + } + + getTreeItem(): TreeItem { + const label = CommitFormatter.fromTemplate(this.git.config.explorer.stashFormat, this.commit, this.git.config.defaultDateFormat); + + const item = new TreeItem(label, TreeItemCollapsibleState.Collapsed); + item.contextValue = this.resourceType; + item.command = this.command; + return item; + } +} \ No newline at end of file diff --git a/src/views/stashNode.ts b/src/views/stashNode.ts new file mode 100644 index 0000000..c1891a2 --- /dev/null +++ b/src/views/stashNode.ts @@ -0,0 +1,29 @@ +'use strict'; +import { Iterables } from '../system'; +import { ExtensionContext, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { ExplorerNode, ResourceType } from './explorerNode'; +import { GitService, GitUri } from '../gitService'; +import { StashCommitNode } from './stashCommitNode'; + +export class StashNode extends ExplorerNode { + + static readonly rootType: ResourceType = 'stash-history'; + readonly resourceType: ResourceType = 'stash-history'; + + constructor(uri: GitUri, context: ExtensionContext, git: GitService) { + super(uri, context, git); + } + + async getChildren(): Promise { + const stash = await this.git.getStashList(this.uri.repoPath!); + if (stash === undefined) return []; + + return [...Iterables.map(stash.commits.values(), c => new StashCommitNode(c, this.uri, this.context, this.git))]; + } + + getTreeItem(): TreeItem { + const item = new TreeItem(`Stashed Changes`, TreeItemCollapsibleState.Collapsed); + item.contextValue = this.resourceType; + return item; + } +} \ No newline at end of file