Compare commits
7 Commits
v5.3.0
...
v4.5.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ed0778a02 | ||
|
|
68c17206e5 | ||
|
|
d6c84061f9 | ||
|
|
208d549c1c | ||
|
|
6518279937 | ||
|
|
c03634fafc | ||
|
|
3ba1fe18ee |
192
CHANGELOG.md
@@ -4,170 +4,17 @@ All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [5.3.0] - 2017-09-26
|
||||
## [4.5.0-beta] - 2017-08-27
|
||||
### Added
|
||||
- Adds new file layouts to the `GitLens` custom view
|
||||
- `auto` - automatically switches between displaying files as a `tree` or `list` based on the `gitlens.gitExplorer.files.threshold` setting and the number of files at each nesting level
|
||||
- `list` - displays files as a list
|
||||
- `tree` - displays files as a tree
|
||||
- Adds `gitlens.gitExplorer.files.layout` setting to specify how the `GitLens` custom view will display files
|
||||
- Adds `gitlens.gitExplorer.files.compact` setting to specify whether or not to compact (flatten) unnecessary file nesting in the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.files.threshold` setting to specify when to switch between displaying files as a `tree` or `list` based on the number of files in a nesting level in the `GitLens` custom view
|
||||
- Adds `${directory}` token to the file formatting settings
|
||||
- Adds an all-new `Git File History` explorer to the Explorer activity -- enabled via `"gitlens.insiders": true`
|
||||
- Shows the commit history of the active file -- automatically tracks the active editor
|
||||
- Provides toolbar buttons to `Refresh`
|
||||
- Provides a context menu with `Open Changes`, `Compare File with Working Tree`, `Open File`, `Open File Revision`, `Open File in Remote`, `Open File Revision in Remote`, and `Show Commit Details` commands
|
||||
- Adds a `No stashed changes` message to the `Git Stashes` explorer when there are no stashes
|
||||
- Adds `${filePath}` token to file formatting
|
||||
|
||||
### Changed
|
||||
- Changes `${path}` token to be the full file path in the file formatting settings
|
||||
|
||||
### Fixed
|
||||
- Fixes [#153](https://github.com/eamodio/vscode-gitlens/issues/153) - New folders treated as files in "Changed Files" section of the sidebar component
|
||||
|
||||
## [5.2.0] - 2017-09-23
|
||||
### Added
|
||||
- Adds new `Changed Files` node to the `Repository Status` node of the `GitLens` custom view's `Repository View` -- closes [#139](https://github.com/eamodio/vscode-gitlens/issues/139)
|
||||
- Provides a at-a-glance view of all "working" changes
|
||||
- Expands to a file-based view of all changed files in the working tree (enabled via `"gitlens.insiders": true`) and/or all files in all commits ahead of the upstream
|
||||
- Adds optional (on by default) working tree status information to the `Repository Status` node in the `GitLens` custom view
|
||||
- Adds `auto` value to `gitlens.gitExplorer.view` setting - closes [#150](https://github.com/eamodio/vscode-gitlens/issues/150)
|
||||
- Adds `gitlens.gitExplorer.enabled` setting to specify whether or not to show the `GitLens` custom view - closes [#144](https://github.com/eamodio/vscode-gitlens/issues/144)
|
||||
- Adds `gitlens.gitExplorer.includeWorkingTree` setting to specify whether or not to include working tree files inside the `Repository Status` node of the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.statusFileFormat` setting to the format of the status of a working or committed file in the `GitLens` custom view
|
||||
|
||||
### Changed
|
||||
- Changes the sorting (now alphabetical) of files shown in the `GitLens` custom view
|
||||
- Changes the default of the `gitlens.gitExplorer.view` setting to `auto`
|
||||
- Changes the default of the `gitlens.gitExplorer.commitFormat` setting to add parentheses around the commit id
|
||||
- Removes many menu items from `editor/title` & `editor/title/context` by default -- can be re-enabled via the `gitlens.advanced.menus` setting
|
||||
|
||||
### Fixed
|
||||
- Fixes [#146](https://github.com/eamodio/vscode-gitlens/issues/146) - Blame gutter annotation issue when commit contains emoji
|
||||
- Fixes an issue when running `Open File in Remote` with a multi-line selection wasn't properly opening the selection in GitLab -- thanks to [PR #145](https://github.com/eamodio/vscode-gitlens/pull/145) by Amanda Cameron ([@AmandaCameron](https://github.com/AmandaCameron))!
|
||||
- Fixes an issue where the `gitlens.advanced.menus` setting wasn't controlling all the menu items properly
|
||||
|
||||
## [5.1.0] - 2017-09-15
|
||||
### Added
|
||||
- Adds full (multi-line) commit message to the `details` hover annotations -- closes [#116](https://github.com/eamodio/vscode-gitlens/issues/116)
|
||||
- Adds an external link icon to the `details` hover annotations to run the `Open Commit in Remote` command (`gitlens.openCommitInRemote`)
|
||||
|
||||
### Changed
|
||||
- Optimizes performance of the providing blame annotations, especially for large files (saw a ~78% improvement on some files)
|
||||
- Optimizes date handling (parsing and formatting) for better performance and reduced memory consumption
|
||||
|
||||
### Removed
|
||||
- Removes `gitlens.annotations.file.recentChanges.hover.wholeLine` setting as it didn't really make sense
|
||||
|
||||
### Fixed
|
||||
- Fixes an issue where stashes with only untracked files would not show in the `Stashes` node of the GitLens custom view
|
||||
- Fixes an issue where stashes with untracked files would not show its untracked files in the GitLens custom view
|
||||
|
||||
## [5.0.0] - 2017-09-12
|
||||
### Added
|
||||
- Adds an all-new `GitLens` custom view to the Explorer activity
|
||||
|
||||
- `Repository View` - provides a full repository explorer
|
||||
|
||||

|
||||
|
||||
- `Repository Status` node — provides the status of the repository
|
||||
- Provides the name of the current branch, its upstream tracking branch (if available), and its upstream status (if available)
|
||||
- Provides indicator dots on the repository icon which denote the following:
|
||||
- `None` - up-to-date with the upstream
|
||||
- `Green` - ahead of the upstream
|
||||
- `Red` - behind the upstream
|
||||
- `Yellow` - both ahead of and behind the upstream
|
||||
- Provides additional nodes, if the current branch is not synchronized with the upstream, to quickly see and explore the specific commits ahead and/or behind the upstream
|
||||
- Provides a context menu with `Open Repository in Remote`, and `Refresh` commands
|
||||
|
||||
- `Branches` node — provides a list of the local branches
|
||||
- Indicates which branch is the current branch and optionally shows the remote tracking branch
|
||||
- Expand each branch to easily see its revision (commit) history
|
||||
- Expand each revision (commit) to quickly see the set of files changed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu on each changed file with `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, `Open Revision in Remote`, `Apply Changes`, `Show File History`, and `Show Commit File Details` commands
|
||||
- Provides a context menu on each revision (commit) with `Open Commit in Remote`, `Open All Changes`, `Open All Changes with Working Tree`, `Open Files`, `Open Revisions`, `Copy Commit ID to Clipboard`, `Copy Commit Message to Clipboard`, `Show Commit Details`, and `Refresh` commands
|
||||
- Provides a context menu on each branch with `Open Branch in Remote`, and `Refresh` commands
|
||||
- Provides a context menu with `Open Branches in Remote`, and `Refresh` commands
|
||||
|
||||
- `Remotes` node — provides a list of remotes
|
||||
- Indicates the direction of the remote (fetch, push, both), remote service (if applicable), and repository path
|
||||
- Expand each remote to see its list of branches
|
||||
- Expand each branch to easily see its revision (commit) history
|
||||
- Expand each revision (commit) to quickly see the set of files changed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu on each changed file with `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, `Open Revision in Remote`, `Apply Changes`, and `Show Commit File Details` commands
|
||||
- Provides a context menu on each revision (commit) with `Open Commit in Remote`, `Open All Changes`, `Open All Changes with Working Tree`, `Open Files`, `Open Revisions`, `Copy Commit ID to Clipboard`, `Copy Commit Message to Clipboard`,`Show Commit Details`, and `Refresh` commands
|
||||
- Provides a context menu on each remote with `Open Branches in Remote`, `Open Repository in Remote`, and `Refresh` commands
|
||||
- Provides a context menu with a `Refresh` command
|
||||
|
||||
- `Stashes` node — provides a list of stashed changes
|
||||
- Expand each stash to quickly see the set of files stashed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu with `Stash Changes`, and `Refresh` commands
|
||||
- Provides a context menu on each stash with `Apply Stashed Changes` (confirmation required), `Delete Stashed Changes` (confirmation required), `Open All Changes`, `Open All Changes with Working Tree`, `Open Files`, `Open Revisions`, `Copy Commit Message to Clipboard`, and `Refresh` commands
|
||||
- Provides a context menu on each stashed file with `Apply Changes`, `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, and `Show File History` commands
|
||||
|
||||
- `History View` - provides the revision history of the active file
|
||||
|
||||

|
||||
|
||||
- Automatically updates to track the active editor
|
||||
- Provides a context menu with `Open File`, `Open File in Remote`, and `Refresh` commands
|
||||
- Provides a context menu on each revision (commit) with `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, `Open Revision in Remote`, `Apply Changes`, and `Show Commit File Details` commands
|
||||
|
||||
- Quickly switch between views using the `Switch to Repository View` or `Switch to History View` commands
|
||||
- Provides toolbar commands to `Search Commits`, `Switch to Repository View` or `Switch to History View`, and `Refresh`
|
||||
|
||||
- Adds all-new interactivity to the hover annotations
|
||||
|
||||

|
||||
|
||||
- Adds the following command-links to the `details` hover annotation
|
||||
- Clicking the commit id will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
- Adds the following command-links to the `changes` hover annotation
|
||||
- Clicking on `Changes` will run the `Compare File Revisions` command (`gitlens.diffWith`)
|
||||
- Clicking the current and previous commit ids will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
|
||||
- Adds support for remote services with custom domains -- closes [#120](https://github.com/eamodio/vscode-gitlens/issues/120)
|
||||
- Adds support for the Bitbucket Server (previously called Stash) remote service -- closes [#120](https://github.com/eamodio/vscode-gitlens/issues/120)
|
||||
- Adds `gitlens.blame.ignoreWhitespace` setting to specify whether or not to ignore whitespace when comparing revisions during blame operations -- closes [#138](https://github.com/eamodio/vscode-gitlens/issues/138)
|
||||
- Adds `Compare File Revisions` command (`gitlens.diffWith`) - compares the specified file revisions
|
||||
- Adds `Open Branches in Remote` command (`gitlens.openBranchesInRemote`) - opens the branches in the supported remote service
|
||||
- Adds `Stash Changes` command (`gitlens.stashSave`) to the source control group context menu -- can now stash a group of files
|
||||
- Adds `Stash Changes` command (`gitlens.stashSave`) to the source control resource context menu -- can now stash individual files (works with multi-select too!)
|
||||
- Adds `gitlens.gitExplorer.view` setting to specify the starting view (mode) of the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.showTrackingBranch` setting to specify whether or not to show the tracking branch when displaying local branches in the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.commitFormat` setting to specify the format of committed changes in the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.commitFileFormat` setting to specify the format of a committed file in the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.stashFormat` setting to specify the format of stashed changes in the `GitLens` custom view
|
||||
- Adds `gitlens.gitExplorer.stashFileFormat` setting to specify the format of a stashed file in the `GitLens` custom view
|
||||
- Adds `${filePath}` token to file formatting settings
|
||||
|
||||
### Changed
|
||||
- Changes `Show Stashed Changes` option icon in repository status quick pick menu to match the `GitLens` custom view
|
||||
- Changes `Stash Changes` option icon in stashed changes quick pick menu to a plus (+)
|
||||
- Renames `Compare File with Previous` command (`gitlens.diffWithPrevious`) to `Compare File with Previous Revision`
|
||||
- Renames `Compare File with Next Commit` command (`gitlens.diffWithNext`) to `Compare File with Next Revision`
|
||||
- Renames `Compare File with Working Tree` command (`gitlens.diffWithWorking`) to `Compare File with Working Revision`
|
||||
- Renames `Compare Line Commit with Previous` command (`gitlens.diffLineWithPrevious`) to `Compare Line Revision with Previous`
|
||||
- Renames `Compare Line Commit with Working Tree` command (`gitlens.diffLineWithWorking`) to `Compare Line Revision with Working`
|
||||
|
||||
### Removed
|
||||
- Removes `Git Stashes` custom view view - as it's functionality has been folded into the new `GitLens` custom view
|
||||
- Removes `gitlens.stashExplorer.stashFormat` setting
|
||||
- Removes `gitlens.stashExplorer.stashFileFormat` setting
|
||||
- Removes `Stash Unstaged Changes` option from stashed changes quick pick menu -- didn't work as intended
|
||||
- Removes the seeding of the commit search command from the clipboard
|
||||
|
||||
### Fixed
|
||||
- Fixes an issue where double hover annotations could be shown on blank lines
|
||||
- Fixes an issue where remote branches couldn't be opened properly in their remote service
|
||||
- Fixes [#130](https://github.com/eamodio/vscode-gitlens/issues/130) - First-run "Thank you for choosing GitLens! [...]" info message shown on every start up
|
||||
- Fixes an issue where sometimes diffs (via branch name) wouldn't open properly
|
||||
- Fixes an issue where remotes are queried more than once on startup
|
||||
|
||||
## [4.4.3] - 2017-08-30
|
||||
## Fixed
|
||||
- Fixes [#135](https://github.com/eamodio/vscode-gitlens/issues/135) - Full-width characters break gutter annotations (really this time)
|
||||
|
||||
## [4.4.2] - 2017-08-29
|
||||
## Fixed
|
||||
- Fixes [#135](https://github.com/eamodio/vscode-gitlens/issues/135) - Full-width characters break gutter annotations
|
||||
- Changes `gitlens.stashExplorer.stashFileFormat` setting to defaults to `${filePath}` for better separator handling
|
||||
|
||||
## [4.4.1] - 2017-08-23
|
||||
## Fixed
|
||||
@@ -208,18 +55,21 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
|
||||
## [4.3.1] - 2017-07-03
|
||||
## Added
|
||||
- Adds `gitlens.stashExplorer.enabled` setting to specify whether or not to show the `Git Stashes` custom view
|
||||
- Adds `Toggle Git Stashes Explorer` command (`gitlens.stashExplorer.toggle`) - toggles the `Git Stashes` custom view on and off
|
||||
- Adds `gitlens.stashExplorer.enabled` setting to specify whether or not to show the `Git Stashes` explorer
|
||||
- Adds `Toggle Git Stashes Explorer` command (`gitlens.stashExplorer.toggle`) - toggles the `Git Stashes` explorer on and off
|
||||
|
||||
## Changed
|
||||
- Hides the `Git Stashes` custom view by default
|
||||
- Hides the `Git Stashes` explorer by default
|
||||
|
||||
## Fixed
|
||||
- Fixes [#108](https://github.com/eamodio/vscode-gitlens/issues/108) - Option to remove stash explorer from the main explorer?
|
||||
|
||||
## [4.3.0] - 2017-07-03
|
||||
## Added
|
||||
- Adds `Git Stashes` custom view to the Explorer activity
|
||||
- Adds `Git Stashes` view to the Explorer activity
|
||||
|
||||

|
||||
|
||||
- Shows all of the stashed changes in the repository
|
||||
- Provides toolbar buttons to `Stash Changes` and `Refresh`
|
||||
- Provides a context menu with `Apply Stashed Changes` and `Delete Stashed Changes` commands - both require a confirmation
|
||||
@@ -228,7 +78,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
|
||||
## [4.2.0] - 2017-06-27
|
||||
## Added
|
||||
- Adds `Compare File with Revision...` command (`gitlens.diffWithRevision`) - compares the active file with the selected revision of the same file
|
||||
- Adds `Compare File with Revision...` command (`gitlens.diffWithRevision`) - compare the active file with the selected revision of the same file
|
||||
- Adds `Open Changed Files` command (`gitlens.openChangedFiles`) to the source control group context menu
|
||||
- Adds `Close Unchanged Files` command (`gitlens.closeUnchangedFiles`) to the source control group context menu
|
||||
- Adds `Open File in Remote` command (`gitlens.openFileInRemote`) to the source control resource context menu
|
||||
@@ -282,7 +132,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
|
||||
### Fixed
|
||||
- Fixes excessive memory usage when parsing diffs
|
||||
- Fixes extra newline in multi-line commit messages
|
||||
- Fixes extra newline in multiline commit messages
|
||||
- Fixes (again) [#33](https://github.com/eamodio/vscode-gitlens/issues/33) - Commit messages can causes markdown formatting in hovers
|
||||
|
||||
## [4.0.1] - 2017-06-09
|
||||
@@ -366,7 +216,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
### Added
|
||||
- Improves performance
|
||||
- Reduces the number of git calls on known "untrackables"
|
||||
- Caches many more git commands to reduce git command round-trips and parsing
|
||||
- Caches many more git commands to reduce git command roundtrips and parsing
|
||||
- Increases the debounce (delay) on cursor movement to reduce lag when navigating around a file
|
||||
- Adds diff information (the line's previous version) into the active line hover when the current line is uncommitted
|
||||
- Adds `gitlens.statusBar.alignment` settings to control the alignment of the status bar -- thanks to [PR #72](https://github.com/eamodio/vscode-gitlens/pull/72) by Zack Schuster ([@zackschuster](https://github.com/zackschuster))!
|
||||
@@ -557,7 +407,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
### Fixed
|
||||
- Fixes issue with `gitlens.diffWithPrevious` command execution via code lens when the code lens was not at the document/file level
|
||||
- Fixes issue where full shas were displayed on the file/blame history explorers
|
||||
- Fixes [#30](https://github.com/eamodio/vscode-gitlens/issues/30) - Diff with Working Tree fails from repo/commit quick pick list if file was renamed (and the commit was before the rename)
|
||||
- Fixes [#30](https://github.com/eamodio/vscode-gitlens/issues/30) - Diff with Working Tree fails from repo/commit quickpick list if file was renamed (and the commit was before the rename)
|
||||
- Fixes various other quick pick menu command issues when a file was renamed
|
||||
- Fixes various issues when caching is disabled
|
||||
- Fixes issues with parsing commits history
|
||||
@@ -660,7 +510,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
|
||||
## [2.9.0]
|
||||
### Changed
|
||||
- To accommodate the realization that blame information is invalid when a file has unsaved changes, the following behavior changes have been made
|
||||
- To accomodate the realization that blame information is invalid when a file has unsaved changes, the following behavior changes have been made
|
||||
- Status bar blame information will hide
|
||||
- Code lens change to a `Cannot determine...` message and become unclickable
|
||||
- Many menu choices and commands will hide
|
||||
@@ -698,7 +548,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
|
||||
|
||||
### Fixed
|
||||
- Fixes [#34](https://github.com/eamodio/vscode-gitlens/issues/34) - Open file should open the selected version of the file
|
||||
- Fixes some issue where some editors opened by the quick pick would not be opened in preview tabs
|
||||
- Fixes some issue where some editors opened by the quickpick would not be opened in preview tabs
|
||||
- Fixes issue where copy to clipboard commands would fail if there was no active editor
|
||||
- Fixes issue where active line annotations would show for opened versioned files
|
||||
- Fixes issue where code lens compare commands on opened versioned files would fail
|
||||
|
||||
812
README.md
@@ -1,439 +1,373 @@
|
||||
[](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
|
||||
[](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
|
||||
[](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
|
||||
[](https://join.slack.com/t/vscode-dev-community/shared_invite/enQtMjIxOTgxNDE3NzM0LWU5M2ZiZDU1YjBlMzdlZjA2YjBjYzRhYTM5NTgzMTAxMjdiNWU0ZmQzYWI3MWU5N2Q1YjBiYmQ4MzY0NDE1MzY)
|
||||
|
||||
# GitLens
|
||||
|
||||
GitLens **supercharges** the built-in Visual Studio Code Git capabilities. It helps you to **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.
|
||||
|
||||
GitLens provides an unobtrusive blame annotation at the end of the current line, a status bar item showing the commit information (author and date, by default) of the current line, code lens showing the most recent commit and # of authors of the file and/or code block, and many commands for exploring commits and histories, comparing and navigating revisions, stash access, repository status, and more. GitLens is also [highly customizable](#extension-settings) to meet your specific needs — find code lens intrusive or the current line blame annotation distracting — no problem, it is easy to [turn them off or change how they behave](#extension-settings).
|
||||
|
||||
### Preview — featuring blame annotations, code lens, status bar details, quick pick menus for navigation and exploration, compare with previous, and more
|
||||

|
||||
|
||||
## Features
|
||||
|
||||
### Git Blame Annotations
|
||||
|
||||
- Adds an unobtrusive, highly [customizable](#line-blame-annotation-settings) and [themeable](#theme-settings), **Git blame annotation** to the end of the current line ([optional](#line-blame-annotation-settings), on by default)
|
||||
|
||||

|
||||
- Contains the author, date, and message of the line's most recent commit, by [default](#line-blame-annotation-settings)
|
||||
- Adds a `details` hover annotation to the current line annotation, which provides more commit details ([optional](#line-blame-annotation-settings), on by default)
|
||||
- Clicking the commit id will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
- Adds a `changes` (diff) hover annotation to the current line annotation, which provides **instant** access to the line's previous version ([optional](#line-blame-annotation-settings), on by default)
|
||||
- Clicking on `Changes` will run the `Compare File Revisions` command (`gitlens.diffWith`)
|
||||
- Clicking the current and previous commit ids will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
- Clicking on external link icon will run the the `Open Commit in Remote` command (`gitlens.openCommitInRemote`)
|
||||
|
||||

|
||||
|
||||
- Adds on-demand, beautiful, highly [customizable](#file-blame-annotation-settings) and [themeable](#theme-settings), **Git blame annotations** of the whole file
|
||||
|
||||

|
||||
- Choose between `gutter` (default) and `hover` [annotation styles](#file-blame-annotation-settings)
|
||||
- Contains the commit message and date, by [default](#file-blame-annotation-settings)
|
||||
- Adds a `details` hover annotation to the line's annotation, which provides more commit details ([optional](#file-blame-annotation-settings), on by default)
|
||||
- Clicking the commit id will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
- Adds a `heatmap` (age) indicator to the gutter annotations (on right edge by [default](#file-blame-annotation-settings)), which provides an easy, at-a-glance way to tell the age of a line ([optional](#file-blame-annotation-settings), on by default)
|
||||
- Indicator ranges from bright yellow (newer) to dark brown (older)
|
||||
- Press `Escape` to quickly toggle the annotations off
|
||||
|
||||
- Adds [customizable](#status-bar-settings) **blame information** about the current line to the **status bar** ([optional](#status-bar-settings), on by default)
|
||||
|
||||

|
||||
- Contains the commit author and date, by [default](#status-bar-settings)
|
||||
- Clicking the status bar item will, by [default](#status-bar-settings), show a **commit details quick pick menu** with commands for comparing, navigating and exploring commits, and more
|
||||
- Provides [customizable](#status-bar-settings) click behavior — choose between one of the following
|
||||
- Toggle file blame annotations on and off
|
||||
- Toggle code lens on and off
|
||||
- Compare the line commit with the previous commit
|
||||
- Compare the line commit with the working tree
|
||||
- Show a quick pick menu with details and commands for the commit (default)
|
||||
- Show a quick pick menu with file details and commands for the commit
|
||||
- Show a quick pick menu with the commit history of the file
|
||||
- Show a quick pick menu with the commit history of the current branch
|
||||
|
||||
- Adds a `Toggle File Blame Annotations` command (`gitlens.toggleFileBlame`) with a shortcut of `alt+b` to toggle the file blame annotations on and off
|
||||
- Also adds a `Show File Blame Annotations` command (`gitlens.showFileBlame`)
|
||||
|
||||
- Adds a `Toggle Line Blame Annotations` command (`gitlens.toggleLineBlame`) to toggle the current line blame annotations on and off
|
||||
- Also adds a `Show Line Blame Annotations` command (`gitlens.showLineBlame`)
|
||||
|
||||
### Git Recent Changes Annotations
|
||||
|
||||
- Adds on-demand, [customizable](#file-recent-changes-annotation-settings) and [themeable](#theme-settings), **recent changes annotations** of the whole file
|
||||
- Highlights all of lines changed in the most recent commit
|
||||
- Adds a `details` hover annotation to each line, which provides more commit details ([optional](#file-blame-annotation-settings), on by default)
|
||||
- Clicking the commit id will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
- Adds a `changes` (diff) hover annotation to each line, which provides **instant** access to the line's previous version ([optional](#file-recent-changes-annotation-settings), on by default)
|
||||
- Clicking on `Changes` will run the `Compare File Revisions` command (`gitlens.diffWith`)
|
||||
- Clicking the current and previous commit ids will run the `Show Commit Details` command (`gitlens.showQuickCommitDetails`)
|
||||
- Press `Escape` to quickly toggle the annotations off
|
||||
|
||||
- Adds `Toggle Recent File Changes Annotations` command (`gitlens.toggleFileRecentChanges`) to toggle the recent changes annotations on and off
|
||||
|
||||
### Git Code Lens
|
||||
|
||||
- Adds **code lens** to the top of the file and on code blocks ([optional](#code-lens-settings), on by default)
|
||||
|
||||

|
||||
- **Recent Change** — author and date of the most recent commit for the file or code block
|
||||
- Clicking the code lens will, by [default](#code-lens-settings), show a **commit file details quick pick menu** with commands for comparing, navigating and exploring commits, and more
|
||||
- **Authors** — number of authors of the file or code block and the most prominent author (if there is more than one)
|
||||
- Clicking the code lens will, by [default](#code-lens-settings), toggle the file Git blame annotations on and off of the whole file
|
||||
- Will be hidden if the author of the most recent commit is also the only author of the file or block, to avoid duplicate information and reduce visual noise
|
||||
|
||||
- Provides [customizable](#code-lens-settings) click behavior for each code lens — choose between one of the following
|
||||
- Toggle file blame annotations on and off
|
||||
- Compare the commit with the previous commit
|
||||
- Show a quick pick menu with details and commands for the commit
|
||||
- Show a quick pick menu with file details and commands for the commit
|
||||
- Show a quick pick menu with the commit history of the file
|
||||
- Show a quick pick menu with the commit history of the current branch
|
||||
|
||||
- Adds a `Toggle Git Code Lens` command (`gitlens.toggleCodeLens`) with a shortcut of `shift+alt+b` to toggle the code lens on and off
|
||||
|
||||
### Powerful Comparison Tools
|
||||
|
||||
- Effortlessly navigate between comparisons via the `alt+,` and `alt+.` shortcut keys to go back and forth through a file's revisions
|
||||
|
||||
- Provides easy access to the following comparison commands via the `Command Palette` as well as in context via the many provided quick pick menus
|
||||
|
||||
- Adds a `Directory Compare` command (`gitlens.diffDirectory`) to open the configured Git difftool to compare directories between branches
|
||||
|
||||
- Adds a `Compare File with Branch...` command (`gitlens.diffWithBranch`) to compare the active file with the same file on the selected branch
|
||||
|
||||
- Adds a `Compare File with Next Revision` command (`gitlens.diffWithNext`) with a shortcut of `alt+.` to compare the active file/diff with the next commit revision
|
||||
|
||||
- Adds a `Compare File with Previous Revision` command (`gitlens.diffWithPrevious`) with a shortcut of `alt+,` to compare the active file/diff with the previous commit revision
|
||||
|
||||
- Adds a `Compare Line Revision with Previous` command (`gitlens.diffLineWithPrevious`) with a shortcut of `shift+alt+,` to compare the active file/diff with the previous line commit revision
|
||||
|
||||
- Adds a `Compare File with Revision...` command (`gitlens.diffWithRevision`) to compare the active file with the selected revision of the same file
|
||||
|
||||
- Adds a `Compare File with Working Revision` command (`gitlens.diffWithWorking`) with a shortcut of `shift+alt+w` to compare the most recent commit revision of the active file/diff with the working tree
|
||||
|
||||
- Adds a `Compare Line Revision with Working` command (`gitlens.diffLineWithWorking`) with a shortcut of `alt+w` to compare the commit revision of the active line with the working tree
|
||||
|
||||
### Navigate and Explore
|
||||
|
||||
- Adds a [customizable](#gitlens-custom-view-settings) `GitLens` custom view to the Explorer activity
|
||||
|
||||
- `Repository View` - provides a full repository explorer
|
||||
|
||||

|
||||
|
||||
- `Repository Status` node — provides the status of the repository
|
||||
- Provides the name of the current branch, [optionally](#gitlens-custom-view-settings) its working tree status, and its upstream tracking branch and status (if available)
|
||||
- Provides indicator dots on the repository icon which denote the following:
|
||||
- `None` - up-to-date with the upstream
|
||||
- `Green` - ahead of the upstream
|
||||
- `Red` - behind the upstream
|
||||
- `Yellow` - both ahead of and behind the upstream
|
||||
- Provides additional upstream status nodes, if the current branch is tracking a remote branch and
|
||||
- is behind the upstream — quickly see and explore the specific commits behind the upstream (i.e. commits that haven't been pulled)
|
||||
- is ahead of the upstream — quickly see and explore the specific commits ahead of the upstream (i.e. commits that haven't been pushed)
|
||||
- `Changed Files` node — provides a at-a-glance view of all "working" changes
|
||||
- Expands to a file-based view of all changed files in the working tree ([optionally](#gitlens-custom-view-settings)) and/or all files in all commits ahead of the upstream
|
||||
- Provides a context menu with `Open Repository in Remote`, and `Refresh` commands
|
||||
|
||||
- `Branches` node — provides a list of the local branches
|
||||
- Indicates which branch is the current branch and [optionally](#gitlens-custom-view-settings) shows the remote tracking branch
|
||||
- Expand each branch to easily see its revision (commit) history
|
||||
- Expand each revision (commit) to quickly see the set of files changed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu on each changed file with `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, `Open Revision in Remote`, `Apply Changes`, and `Show Commit File Details` commands
|
||||
|
||||
- Provides a context menu on each revision (commit) with `Open Commit in Remote`, `Open All Changes`, `Open All Changes with Working Tree`, `Open Files`, `Open Revisions`, `Copy Commit ID to Clipboard`, `Copy Commit Message to Clipboard`, `Show Commit Details`, and `Refresh` commands
|
||||
- Provides a context menu on each branch with `Open Branch in Remote`, and `Refresh` commands
|
||||
- Provides a context menu with `Open Branches in Remote`, and `Refresh` commands
|
||||
|
||||
- `Remotes` node — provides a list of remotes
|
||||
- Indicates the direction of the remote (fetch, push, both), remote service (if applicable), and repository path
|
||||
- Expand each remote to see its list of branches
|
||||
- Expand each branch to easily see its revision (commit) history
|
||||
- Expand each revision (commit) to quickly see the set of files changed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu on each changed file with `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, `Open Revision in Remote`, `Apply Changes`, `Show File History`, and `Show Commit File Details` commands
|
||||
- Provides a context menu on each revision (commit) with `Open Commit in Remote`, `Open All Changes`, `Open All Changes with Working Tree`, `Open Files`, `Open Revisions`, `Copy Commit ID to Clipboard`, `Copy Commit Message to Clipboard`,`Show Commit Details`, and `Refresh` commands
|
||||
- Provides a context menu on each remote with `Open Branches in Remote`, `Open Repository in Remote`, and `Refresh` commands
|
||||
- Provides a context menu with a `Refresh` command
|
||||
|
||||
- `Stashes` node — provides a list of stashed changes
|
||||
- Expand each stash to quickly see the set of files stashed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu with `Stash Changes`, and `Refresh` commands
|
||||
- Provides a context menu on each stash with `Apply Stashed Changes` (confirmation required), `Delete Stashed Changes` (confirmation required), `Open All Changes`, `Open All Changes with Working Tree`, `Open Files`, `Open Revisions`, `Copy Commit Message to Clipboard`, and `Refresh` commands
|
||||
- Provides a context menu on each stashed file with `Apply Changes`, `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, and `Show File History` commands
|
||||
|
||||
- `History View` - provides the revision history of the active file
|
||||
|
||||

|
||||
|
||||
- Automatically updates to track the active editor
|
||||
- Provides a context menu with `Open File`, `Open File in Remote`, and `Refresh` commands
|
||||
- Provides a context menu on each revision (commit) with `Open Changes`, `Open Changes with Working Tree`, `Open File`, `Open Revision`, `Open File in Remote`, `Open Revision in Remote`, `Apply Changes`, and `Show Commit File Details` commands
|
||||
|
||||
- Quickly switch between views using the `Switch to Repository View` or `Switch to History View` commands
|
||||
- Provides toolbar commands to `Search Commits`, `Switch to Repository View` or `Switch to History View`, and `Refresh`
|
||||
|
||||
- Adds a `Search Commits` command (`gitlens.showCommitSearch`) with a shortcut of `alt+/` to search for commits by message, author, file(s), or commit id
|
||||
|
||||
- Adds commands to open files, commits, branches, and the repository in the supported remote services, currently **BitBucket, GitHub, GitLab, and Visual Studio Team Services** — only available if a Git upstream service is configured in the repository
|
||||
- Also supports [remote services with custom domains](#custom-remotes-settings), such as **BitBucket, Bitbucket Server (previously called Stash), GitHub, GitHub Enterprise, GitLab**
|
||||
- `Open Branches in Remote` command (`gitlens.openBranchesInRemote`) — opens the branches in the supported remote service
|
||||
- `Open Branch in Remote` command (`gitlens.openBranchInRemote`) — opens the current branch commits in the supported remote service
|
||||
- `Open Commit in Remote` command (`gitlens.openCommitInRemote`) — opens the commit revision of the active line in the supported remote service
|
||||
- `Open File in Remote` command (`gitlens.openFileInRemote`) — opens the active file/revision in the supported remote service
|
||||
- `Open Repository in Remote` command (`gitlens.openRepoInRemote`) — opens the repository in the supported remote service
|
||||
|
||||
- Adds a `Show Current Branch History` command (`gitlens.showQuickRepoHistory`) with a shortcut of `shift+alt+h` to show a paged **branch history quick pick menu** of the current branch for exploring its commit history
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Show Commit Search` and `Open Branch in <remote-service>` when available
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Navigate pages via `alt+,` and `alt+.` to go backward and forward respectively
|
||||
|
||||
- Adds a `Show Branch History` command (`gitlens.showQuickBranchHistory`) to show a paged **branch history quick pick menu** of the selected branch for exploring its commit history
|
||||
- Provides the same features as `Show Current Branch History` above
|
||||
|
||||
- Adds a `Show File History` command (`gitlens.showQuickFileHistory`) to show a paged **file history quick pick menu** of the active file for exploring its commit history
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Show Branch History` and `Open File in <remote-service>` when available
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Navigate pages via `alt+,` and `alt+.` to go backward and forward respectively
|
||||
|
||||
- Adds a `Show Commit Details` command (`gitlens.showQuickCommitDetails`) to show a **commit details quick pick menu** of the most recent commit of the active file
|
||||
|
||||

|
||||
|
||||
- Quickly see the set of files changed in the commit, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides entries to `Copy to Clipboard`, `Directory Compare`, `Open Changed Files`, `Open File in <remote-service>` when available, and more
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
- Use the `alt+right arrow` shortcut on a file entry in the `Changed Files` section to preview the comparison of the current revision with the previous one
|
||||
|
||||
- Adds a `Show Commit File Details` command (`gitlens.showQuickCommitFileDetails`) with a shortcut of `alt+c` to show a **file commit details quick pick menu** of the most recent commit of the active file
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Show Commit Details`, `Show File History`, `Compare File with...`, `Copy to Clipboard`, `Open File`, `Open File in <remote-service>` when available, and more
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
|
||||
- Adds a `Show Repository Status` command (`gitlens.showQuickRepoStatus`) with a shortcut of `alt+s` to show a **repository status quick pick menu** for visualizing the current repository status
|
||||
|
||||

|
||||
|
||||
- Quickly see upstream status (if an Git upstream is configured) — complete with ahead and behind information
|
||||
- If you are ahead of the upstream, an entry will be shown with the number of commits ahead. Choosing it will show a limited **branch history quick pick menu** containing just the commits ahead of the upstream
|
||||
- If you are behind the upstream, an entry will be shown with the number of commits behind. Choosing it will show a limited **branch history quick pick menu** containing just the commits behind the upstream
|
||||
- Quickly see all working changes, both staged and unstaged, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides entries to `Show Stashed Changes`, `Open Changed Files`, and `Close Unchanged Files`
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
- Use the `alt+right arrow` shortcut on a file entry in the `Staged Files` or `Unstaged Files` sections to preview the comparison of the working file with the previous revision
|
||||
|
||||
- Adds a `Show Stashed Changes` command (`gitlens.showQuickStashList`) to show a **stashed changes quick pick menu** for exploring your repository stash history
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Stash Changes`
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
|
||||
- Choosing a stash entry shows a **stash details quick pick menu** which is very similar to the **commit details quick pick menu** above
|
||||
|
||||

|
||||
|
||||
- Quickly see the set of files changed in the stash, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides entries to `Copy Message to Clipboard`, `Directory Compare`, and `Open Changed Files`
|
||||
- Provides entries to `Apply Stashed Changes` and `Delete Stashed Changes` — both require a confirmation
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
- Use the `alt+right arrow` shortcut on a file entry in the `Changed Files` section to preview the comparison of the current revision with the previous one
|
||||
|
||||
- Adds a `Show Last Opened Quick Pick` command (`gitlens.showLastQuickPick`) with a shortcut of `alt+-` to quickly get back to where you were when the last GitLens quick pick menu closed
|
||||
|
||||
- Adds a `Open File History Explorer` command (`gitlens.showFileHistory`) to show a **file history explorer** (peek style) to visualize the history of a file
|
||||
- Likely to be deprecated in a future release, add your voice to [#66](https://github.com/eamodio/vscode-gitlens/issues/66) if you feel it should not be removed
|
||||
|
||||
- Adds a `Open Blame History Explorer` command (`gitlens.showBlameHistory`) to show a **blame history explorer** (peek style) to visualize the blame history of a file or code block
|
||||
- Likely to be deprecated in a future release, add your voice to [#66](https://github.com/eamodio/vscode-gitlens/issues/66) if you feel it should not be removed
|
||||
|
||||
### And More
|
||||
|
||||
- Adds a `Copy Commit ID to Clipboard` command (`gitlens.copyShaToClipboard`) to copy the commit id (sha) of the active line to the clipboard or from the most recent commit to the current branch, if there is no active editor
|
||||
|
||||
- Adds a `Copy Commit Message to Clipboard` command (`gitlens.copyMessageToClipboard`) to copy the commit message of the active line to the clipboard or from the most recent commit to the current branch, if there is no active editor
|
||||
|
||||
- Adds a `Open Changed Files` command (`gitlens.openChangedFiles`) to open any files with working tree changes
|
||||
|
||||
- Adds a `Close Unchanged Files` command (`gitlens.closeUnchangedFiles`) to close any files without working tree changes
|
||||
|
||||
- Adds a `Apply Stashed Changes` command (`gitlens.stashApply`) to chose a stash entry to apply to the working tree from a quick pick menu
|
||||
|
||||
- Adds a `Stash Changes` command (`gitlens.stashSave`) to save any working tree changes to the stash — can optionally provide a stash message
|
||||
- Also adds the command to the Source Control items context menu to stash an individual or group of files, works with multi-select too!
|
||||
|
||||
## Insiders
|
||||
|
||||
Add [`"gitlens.insiders": true`](#general-extension-settings) to your settings to join the insiders channel and get early access to upcoming features. Be aware that because this provides early access expect there to be issues.
|
||||
|
||||
## Extension Settings
|
||||
|
||||
GitLens is highly customizable and provides many configuration settings to allow the personalization of almost all features
|
||||
|
||||
### General Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.defaultDateFormat`|Specifies how all absolute dates will be formatted by default<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|`gitlens.insiders`|Opts into the insiders channel -- provides access to upcoming features
|
||||
|`gitlens.outputLevel`|Specifies how much (if any) output will be sent to the GitLens output channel
|
||||
|
||||
### Blame Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.blame.ignoreWhitespace`|Specifies whether or not to ignore whitespace when comparing revisions during blame operations
|
||||
|
||||
#### File Blame Annotation Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.blame.file.annotationType`|Specifies the type of blame annotations that will be shown for the current file<br />`gutter` - adds an annotation to the beginning of each line<br />`hover` - shows annotations when hovering over each line
|
||||
|`gitlens.blame.file.lineHighlight.enabled`|Specifies whether or not to highlight lines associated with the current line
|
||||
|`gitlens.blame.file.lineHighlight.locations`|Specifies where the associated line highlights will be shown<br />`gutter` - adds a gutter glyph<br />`line` - adds a full-line highlight background color<br />`overviewRuler` - adds a decoration to the overviewRuler (scroll bar)
|
||||
|`gitlens.annotations.file.gutter.format`|Specifies the format of the gutter blame annotations<br />Available tokens<br />`${id}` - commit id<br />`${author}` - commit author<br />`${message}` - commit message<br />`${ago}` - relative commit date (e.g. 1 day ago)<br />`${date}` - formatted commit date (format specified by `gitlens.annotations.file.gutter.dateFormat`)<br />`${authorAgo}` - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.annotations.file.gutter.dateFormat`|Specifies how to format absolute dates (using the `${date}` token) in gutter blame annotations<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|`gitlens.annotations.file.gutter.compact`|Specifies whether or not to compact (deduplicate) matching adjacent gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.heatmap.enabled`|Specifies whether or not to provide a heatmap indicator in the gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.heatmap.location`|Specifies where the heatmap indicators will be shown in the gutter blame annotations<br />`left` - adds a heatmap indicator on the left edge of the gutter blame annotations<br />`right` - adds a heatmap indicator on the right edge of the gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.hover.details`|Specifies whether or not to provide a commit details hover annotation over the gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|`gitlens.annotations.file.hover.heatmap.enabled`|Specifies whether or not to provide heatmap indicators on the left edge of each line
|
||||
|`gitlens.annotations.file.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|
||||
#### Line Blame Annotation Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.blame.line.enabled`|Specifies whether or not to provide a blame annotation for the current line, by default<br />Use the `gitlens.toggleLineBlame` command to toggle the annotations on and off for the current session
|
||||
|`gitlens.blame.line.annotationType`|Specifies the type of blame annotations that will be shown for the current line<br />`trailing` - adds an annotation to the end of the current line<br />`hover` - shows annotations when hovering over the current line
|
||||
|`gitlens.annotations.line.trailing.format`|Specifies the format of the trailing blame annotations<br />Available tokens<br />`${id}` - commit id<br />`${author}` - commit author<br />`${message}` - commit message<br />`${ago}` - relative commit date (e.g. 1 day ago)<br />`${date}` - formatted commit date (format specified by `gitlens.annotations.line.trailing.dateFormat`)<br />`${authorAgo}` - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.annotations.line.trailing.dateFormat`|Specifies how to format absolute dates (using the `${date}` token) in trailing blame annotations<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|`gitlens.annotations.line.trailing.hover.details`|Specifies whether or not to provide a commit details hover annotation over the trailing blame annotations
|
||||
|`gitlens.annotations.line.trailing.hover.changes`|Specifies whether or not to provide a changes (diff) hover annotation over the trailing blame annotations
|
||||
|`gitlens.annotations.line.trailing.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|`gitlens.annotations.line.hover.details`|Specifies whether or not to provide a commit details hover annotation for the current line
|
||||
|`gitlens.annotations.line.hover.changes`|Specifies whether or not to provide a changes (diff) hover annotation for the current line
|
||||
|
||||
### File Recent Changes Annotation Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.recentChanges.file.lineHighlight.locations`|Specifies where the highlights of the recently changed lines will be shown<br />`gutter` - adds a gutter glyph<br />`line` - adds a full-line highlight background color<br />`overviewRuler` - adds a decoration to the overviewRuler (scroll bar)
|
||||
|`gitlens.annotations.file.recentChanges.hover.details`|Specifies whether or not to provide a commit details hover annotation
|
||||
|`gitlens.annotations.file.recentChanges.hover.changes`|Specifies whether or not to provide a changes (diff) hover annotation
|
||||
|
||||
### Code Lens Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.codeLens.enabled`|Specifies whether or not to provide any Git code lens, by default<br />Use the `gitlens.toggleCodeLens` command to toggle the Git code lens on and off for the current session
|
||||
|`gitlens.codeLens.recentChange.enabled`|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`|Specifies the command to be executed when the `recent change` code lens is clicked<br />`gitlens.toggleFileBlame` - toggles file blame annotations<br />`gitlens.showBlameHistory` - opens the blame history explorer<br />`gitlens.showFileHistory` - opens the file history explorer<br />`gitlens.diffWithPrevious` - compares the current committed file with the previous commit<br />`gitlens.showQuickCommitDetails` - shows a commit details quick pick<br />`gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick<br />`gitlens.showQuickFileHistory` - shows a file history quick pick<br />`gitlens.showQuickRepoHistory` - shows a branch history quick pick
|
||||
|`gitlens.codeLens.authors.enabled`|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`|Specifies the command to be executed when the `authors` code lens is clicked<br />`gitlens.toggleFileBlame` - toggles file blame annotations<br />`gitlens.showBlameHistory` - opens the blame history explorer<br />`gitlens.showFileHistory` - opens the file history explorer<br />`gitlens.diffWithPrevious` - compares the current committed file with the previous commit<br />`gitlens.showQuickCommitDetails` - shows a commit details quick pick<br />`gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick<br />`gitlens.showQuickFileHistory` - shows a file history quick pick<br />`gitlens.showQuickRepoHistory` - shows a branch history quick pick
|
||||
|`gitlens.codeLens.locations`|Specifies where Git code lens will be shown in the document<br />`document` - adds code lens at the top of the document<br />`containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)<br />`blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines<br />`custom` - adds code lens at the start of symbols contained in `gitlens.codeLens.locationCustomSymbols`
|
||||
|`gitlens.codeLens.customLocationSymbols`|Specifies the set of document symbols where Git code lens will be shown in the document
|
||||
|`gitlens.codeLens.perLanguageLocations`|Specifies where Git code lens will be shown in the document for the specified languages
|
||||
|
||||
### GitLens Custom View Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.gitExplorer.enabled`|Specifies whether or not to show the `GitLens` custom view"
|
||||
|`gitlens.gitExplorer.view`|Specifies the starting view (mode) of the `GitLens` custom view<br /> `auto` - shows the last selected view, defaults to `repository`<br />`history` - shows the commit history of the active file<br />`repository` - shows a repository explorer"
|
||||
|`gitlens.gitExplorer.files.layout`|Specifies how the `GitLens` custom view will display files<br /> `auto` - automatically switches between displaying files as a `tree` or `list` based on the `gitlens.gitExplorer.files.threshold` setting and the number of files at each nesting level<br /> `list` - displays files as a list<br /> `tree` - displays files as a tree
|
||||
|`gitlens.gitExplorer.files.compact`|Specifies whether or not to compact (flatten) unnecessary file nesting in the `GitLens` custom view<br />Only applies when displaying files as a `tree` or `auto`
|
||||
|`gitlens.gitExplorer.files.threshold`|Specifies when to switch between displaying files as a `tree` or `list` based on the number of files in a nesting level in the `GitLens` custom view<br />Only applies when displaying files as `auto`
|
||||
|`gitlens.gitExplorer.includeWorkingTree`|Specifies whether or not to include working tree files inside the `Repository Status` node of the `GitLens` custom view
|
||||
|`gitlens.gitExplorer.showTrackingBranch`|Specifies whether or not to show the tracking branch when displaying local branches in the `GitLens` custom view"
|
||||
|`gitlens.gitExplorer.commitFormat`|Specifies the format of committed changes in the `GitLens` custom view<br />Available tokens<br /> ${id} - commit id<br /> ${author} - commit author<br /> ${message} - commit message<br /> ${ago} - relative commit date (e.g. 1 day ago)<br /> ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)<br /> ${authorAgo} - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.gitExplorer.commitFileFormat`|Specifies the format of a committed file in the `GitLens` custom view<br />Available tokens<br /> ${directory} - directory name<br /> ${file} - file name<br /> ${filePath} - formatted file name and path<br /> ${path} - full file path
|
||||
|`gitlens.gitExplorer.stashFormat`|Specifies the format of stashed changes in the `GitLens` custom view<br />Available tokens<br /> ${id} - commit id<br /> ${author} - commit author<br /> ${message} - commit message<br /> ${ago} - relative commit date (e.g. 1 day ago)<br /> ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)<br /> ${authorAgo} - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.gitExplorer.stashFileFormat`|Specifies the format of a stashed file in the `GitLens` custom view<br />Available tokens<br /> ${directory} - directory name<br /> ${file} - file name<br /> ${filePath} - formatted file name and path<br /> ${path} - full file path
|
||||
|`gitlens.gitExplorer.statusFileFormat`|Specifies the format of the status of a working or committed file in the `GitLens` custom view<br />Available tokens<br /> ${directory} - directory name<br /> ${file} - file name<br /> ${filePath} - formatted file name and path<br /> ${path} - full file path<br />${working} - optional indicator if the file is uncommitted
|
||||
|
||||
### Custom Remotes Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.remotes`|Specifies any custom domains for remote (code-hosting) services<br />Example: ```"gitlens.remotes": [{ "domain": "git.corporate-url.com", "type": "GitHub" }]```
|
||||
|
||||
### Status Bar Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.statusBar.enabled`|Specifies whether or not to provide blame information on the status bar
|
||||
|`gitlens.statusBar.alignment`|Specifies the blame alignment in the status bar<br />`left` - align to the left, `right` - align to the right
|
||||
|`gitlens.statusBar.command`|Specifies the command to be executed when the blame status bar item is clicked<br />`gitlens.toggleFileBlame` - toggles file blame annotations<br />`gitlens.showBlameHistory` - opens the blame history explorer<br />`gitlens.showFileHistory` - opens the file history explorer<br />`gitlens.diffWithPrevious` - compares the current line commit with the previous<br />`gitlens.diffWithWorking` - compares the current line commit with the working tree<br />`gitlens.toggleCodeLens` - toggles Git code lens<br />`gitlens.showQuickCommitDetails` - shows a commit details quick pick<br />`gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick<br />`gitlens.showQuickFileHistory` - shows a file history quick pick<br />`gitlens.showQuickRepoHistory` - shows a branch history quick pick
|
||||
|`gitlens.statusBar.format`|Specifies the format of the blame information on the status bar<br />Available tokens<br />`${id}` - commit id<br />`${author}` - commit author<br />`${message}` - commit message<br />`${ago}` - relative commit date (e.g. 1 day ago)<br />`${date}` - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.statusBar.dateFormat`|Specifies the date format of absolute dates shown in the blame information on the status bar<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|
||||
### Strings Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.strings.codeLens.unsavedChanges.recentChangeAndAuthors`|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`|Specifies the string to be shown in place of the `recent change` code lens when there are unsaved changes
|
||||
|`gitlens.strings.codeLens.unsavedChanges.authorsOnly`|Specifies the string to be shown in place of the `authors` code lens when there are unsaved changes
|
||||
|
||||
### Theme Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.theme.annotations.file.gutter.separateLines`|Specifies whether or not gutter blame annotations will have line separators
|
||||
|`gitlens.theme.annotations.file.gutter.dark.backgroundColor`|Specifies the dark theme background color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.light.backgroundColor`|Specifies the light theme background color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.dark.foregroundColor`|Specifies the dark theme foreground color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.light.foregroundColor`|Specifies the light theme foreground color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.dark.uncommittedForegroundColor`|Specifies the dark theme foreground color of an uncommitted line in the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.light.uncommittedForegroundColor`|Specifies the light theme foreground color of an uncommitted line in the gutter blame annotations
|
||||
|`gitlens.theme.annotations.line.trailing.dark.backgroundColor`|Specifies the dark theme background color of the trailing blame annotation
|
||||
|`gitlens.theme.annotations.line.trailing.light.backgroundColor`|Specifies the light theme background color of the trailing blame annotation
|
||||
|`gitlens.theme.annotations.line.trailing.dark.foregroundColor`|Specifies the dark theme foreground color of the trailing blame annotation
|
||||
|`gitlens.theme.annotations.line.trailing.light.foregroundColor`|Specifies the light theme foreground color of the trailing blame annotation
|
||||
|`gitlens.theme.lineHighlight.dark.backgroundColor`|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`|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`|Specifies the dark theme overview ruler color of the associated line highlights in blame annotations
|
||||
|`gitlens.theme.lineHighlight.light.overviewRulerColor`|Specifies the light theme overview ruler color of the associated line highlights in blame annotations
|
||||
|
||||
### Advanced Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.advanced.telemetry.enabled`|Specifies whether or not to enable GitLens telemetry (even if enabled still abides by the overall `telemetry.enableTelemetry` setting
|
||||
|`gitlens.advanced.menus`|Specifies which commands will be added to which menus
|
||||
|`gitlens.advanced.caching.enabled`|Specifies whether git output will be cached
|
||||
|`gitlens.advanced.caching.maxLines`|Specifies the threshold for caching larger documents
|
||||
|`gitlens.advanced.git`|Specifies the git path to use
|
||||
|`gitlens.advanced.gitignore.enabled`|Specifies whether or not to parse the root .gitignore file for better performance (i.e. avoids blaming excluded files)
|
||||
|`gitlens.advanced.maxQuickHistory`|Specifies the maximum number of QuickPick history entries to show
|
||||
|`gitlens.advanced.quickPick.closeOnFocusOut`|Specifies whether or not to close the QuickPick menu when focus is lost
|
||||
|
||||
## Known Issues
|
||||
|
||||
- If the `Copy to * clipboard` commands don't work on Linux -- `xclip` needs to be installed. You can install it via `sudo apt-get install xclip`
|
||||
|
||||
## Contributors
|
||||
|
||||
A big thanks to the people that have contributed to this project:
|
||||
|
||||
- Amanda Cameron ([@AmandaCameron](https://github.com/AmandaCameron)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=AmandaCameron))
|
||||
- Peng Lyu ([@rebornix](https://github.com/rebornix)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=rebornix))
|
||||
- Aurelio Ogliari ([@nobitagit](https://github.com/nobitagit)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=nobitagit)
|
||||
- Johannes Rieken ([@jrieken](https://github.com/jrieken)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=jrieken))
|
||||
- Zack Schuster ([@zackschuster](https://github.com/zackschuster)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=zackschuster)
|
||||
[](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
|
||||
[](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
|
||||
[](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
|
||||
[](https://join.slack.com/t/vscode-gitlens/shared_invite/MjIxOTgxNDE3NzM0LTE1MDE2Nzk1MTgtMjkwMmZjMzcxNQ)
|
||||
|
||||
# GitLens
|
||||
|
||||
GitLens **supercharges** the built-in Visual Studio Code Git capabilities. It helps you to **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.
|
||||
|
||||
GitLens provides an unobtrusive blame annotation at the end of the current line, a status bar item showing the commit information (author and date, by default) of the current line, code lens showing the most recent commit and # of authors of the file and/or code block, and many commands for exploring commits and histories, comparing and navigating revisions, stash access, repository status, and more. GitLens is also [highly customizable](#extension-settings) to meet your specific needs — find code lens intrusive or the current line blame annotation distracting — no problem, it is easy to [turn them off or change how they behave](#extension-settings).
|
||||
|
||||
### Preview — featuring blame annotations, code lens, status bar details, quick pick menus for navigation and exploration, compare with previous, and more
|
||||

|
||||
|
||||
## Features
|
||||
|
||||
### Git Blame Annotations
|
||||
|
||||
- Adds an unobtrusive, highly [customizable](#line-blame-annotation-settings) and [themeable](#theme-settings), **Git blame annotation** to the end of the current line ([optional](#line-blame-annotation-settings), on by default)
|
||||
|
||||

|
||||
- Contains the author, date, and message of the line's most recent commit, by [default](#line-blame-annotation-settings)
|
||||
- Adds a `details` hover annotation to the current line annotation, which provides more commit details ([optional](#line-blame-annotation-settings), on by default)
|
||||
- Adds a `changes` (diff) hover annotation to the current line annotation, which provides **instant** access to the line's previous version ([optional](#line-blame-annotation-settings), on by default)
|
||||
|
||||

|
||||
|
||||
- Adds on-demand, beautiful, highly [customizable](#file-blame-annotation-settings) and [themeable](#theme-settings), **Git blame annotations** of the whole file
|
||||
|
||||

|
||||
- Choose between `gutter` (default) and `hover` [annotation styles](#file-blame-annotation-settings)
|
||||
- Contains the commit message and date, by [default](#file-blame-annotation-settings)
|
||||
- Adds a `details` hover annotation to the line's annotation, which provides more commit details ([optional](#file-blame-annotation-settings), on by default)
|
||||
- Adds a `heatmap` (age) indicator to the gutter annotations (on right edge by [default](#file-blame-annotation-settings)), which provides an easy, at-a-glance way to tell the age of a line ([optional](#file-blame-annotation-settings), on by default)
|
||||
- Indicator ranges from bright yellow (newer) to dark brown (older)
|
||||
- Press `Escape` to quickly toggle the annotations off
|
||||
|
||||
- Adds [customizable](#status-bar-settings) **blame information** about the current line to the **status bar** ([optional](#status-bar-settings), on by default)
|
||||
|
||||

|
||||
- Contains the commit author and date, by [default](#status-bar-settings)
|
||||
- Clicking the status bar item will, by [default](#status-bar-settings), show a **commit details quick pick menu** with commands for comparing, navigating and exploring commits, and more
|
||||
- Provides [customizable](#status-bar-settings) click behavior — choose between one of the following
|
||||
- Toggle file blame annotations on and off
|
||||
- Toggle code lens on and off
|
||||
- Compare the line commit with the previous commit
|
||||
- Compare the line commit with the working tree
|
||||
- Show a quick pick menu with details and commands for the commit (default)
|
||||
- Show a quick pick menu with file details and commands for the commit
|
||||
- Show a quick pick menu with the commit history of the file
|
||||
- Show a quick pick menu with the commit history of the current branch
|
||||
|
||||
- Adds a `Toggle File Blame Annotations` command (`gitlens.toggleFileBlame`) with a shortcut of `alt+b` to toggle the file blame annotations on and off
|
||||
- Also adds a `Show File Blame Annotations` command (`gitlens.showFileBlame`)
|
||||
|
||||
- Adds a `Toggle Line Blame Annotations` command (`gitlens.toggleLineBlame`) to toggle the current line blame annotations on and off
|
||||
- Also adds a `Show Line Blame Annotations` command (`gitlens.showLineBlame`)
|
||||
|
||||
### Git Recent Changes Annotations
|
||||
|
||||
- Adds on-demand, [customizable](#file-recent-changes-annotation-settings) and [themeable](#theme-settings), **recent changes annotations** of the whole file
|
||||
- Highlights all of lines changed in the most recent commit
|
||||
- Adds a `details` hover annotation to each line, which provides more commit details ([optional](#file-blame-annotation-settings), on by default)
|
||||
- Adds a `changes` (diff) hover annotation to each line, which provides **instant** access to the line's previous version ([optional](#file-recent-changes-annotation-settings), on by default)
|
||||
- Press `Escape` to quickly toggle the annotations off
|
||||
|
||||
- Adds `Toggle Recent File Changes Annotations` command (`gitlens.toggleFileRecentChanges`) to toggle the recent changes annotations on and off
|
||||
|
||||
### Git Code Lens
|
||||
|
||||
- Adds **code lens** to the top of the file and on code blocks ([optional](#code-lens-settings), on by default)
|
||||
|
||||

|
||||
- **Recent Change** — author and date of the most recent commit for the file or code block
|
||||
- Clicking the code lens will, by [default](#code-lens-settings), show a **commit file details quick pick menu** with commands for comparing, navigating and exploring commits, and more
|
||||
- **Authors** — number of authors of the file or code block and the most prominent author (if there is more than one)
|
||||
- Clicking the code lens will, by [default](#code-lens-settings), toggle the file Git blame annotations on and off of the whole file
|
||||
- Will be hidden if the author of the most recent commit is also the only author of the file or block, to avoid duplicate information and reduce visual noise
|
||||
|
||||
- Provides [customizable](#code-lens-settings) click behavior for each code lens — choose between one of the following
|
||||
- Toggle file blame annotations on and off
|
||||
- Compare the commit with the previous commit
|
||||
- Show a quick pick menu with details and commands for the commit
|
||||
- Show a quick pick menu with file details and commands for the commit
|
||||
- Show a quick pick menu with the commit history of the file
|
||||
- Show a quick pick menu with the commit history of the current branch
|
||||
|
||||
- Adds a `Toggle Git Code Lens` command (`gitlens.toggleCodeLens`) with a shortcut of `shift+alt+b` to toggle the code lens on and off
|
||||
|
||||
### Powerful Comparison Tools
|
||||
|
||||
- Effortlessly navigate between comparisons via the `alt+,` and `alt+.` shortcut keys to go back and forth through a file's revisions
|
||||
|
||||
- Provides easy access to the following comparison commands via the `Command Palette` as well as in context via the many provided quick pick menus
|
||||
|
||||
- Adds a `Directory Compare` command (`gitlens.diffDirectory`) to open the configured Git difftool to compare directories between branches
|
||||
|
||||
- Adds a `Compare File with Branch...` command (`gitlens.diffWithBranch`) to compare the active file with the same file on the selected branch
|
||||
|
||||
- Adds a `Compare File with Next Commit` command (`gitlens.diffWithNext`) with a shortcut of `alt+.` to compare the active file/diff with the next commit revision
|
||||
|
||||
- Adds a `Compare File with Previous` command (`gitlens.diffWithPrevious`) with a shortcut of `alt+,` to compare the active file/diff with the previous commit revision
|
||||
|
||||
- Adds a `Compare Line Commit with Previous` command (`gitlens.diffLineWithPrevious`) with a shortcut of `shift+alt+,` to compare the active file/diff with the previous line commit revision
|
||||
|
||||
- Adds a `Compare File with Revision...` command (`gitlens.diffWithRevision`) to compare the active file with the selected revision of the same file
|
||||
|
||||
- Adds a `Compare File with Working Tree` command (`gitlens.diffWithWorking`) with a shortcut of `shift+alt+w` to compare the most recent commit revision of the active file/diff with the working tree
|
||||
|
||||
- Adds a `Compare Line Commit with Working Tree` command (`gitlens.diffLineWithWorking`) with a shortcut of `alt+w` to compare the commit revision of the active line with the working tree
|
||||
|
||||
### Navigate and Explore
|
||||
|
||||
- Adds a [customizable](#git-file-history-explorer-settings) `Git File History` explorer to the Explorer activity -- currently [insiders](#insiders) only
|
||||
|
||||
- Shows the commit history of the active file -- automatically tracks the active editor
|
||||
- Provides toolbar buttons to `Refresh`
|
||||
- Provides a context menu with `Open Changes`, `Compare File with Working Tree`, `Open File`, `Open File Revision`, `Open File in Remote`, `Open File Revision in Remote`, and `Show Commit Details` commands
|
||||
|
||||
- Adds a [customizable](#git-stashes-explorer-settings) `Git Stashes` explorer to the Explorer activity
|
||||
|
||||

|
||||
|
||||
- Shows all of the stashed changes in the repository
|
||||
- Provides toolbar buttons to `Stash Changes` and `Refresh`
|
||||
- Provides a context menu with `Apply Stashed Changes` and `Delete Stashed Changes` commands — both require a confirmation
|
||||
- Expand each stash to quickly see the set of files changed, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides a context menu with `Open Changes`, `Open File`, `Open Stashed File`, `Open File in Remote`, and `Compare File with Working Tree` commands
|
||||
|
||||
- Adds a `Search Commits` command (`gitlens.showCommitSearch`) with a shortcut of `alt+/` to search for commits by message, author, file(s), or commit id
|
||||
|
||||
- Adds commands to open files, commits, branches, and the repository in the supported remote services, currently **BitBucket, GitHub, GitLab, and Visual Studio Team Services** — only available if a Git upstream service is configured in the repository
|
||||
- `Open Branch in Remote` command (`gitlens.openBranchInRemote`) — opens the current branch commits in the supported remote service
|
||||
- `Open Commit in Remote` command (`gitlens.openCommitInRemote`) — opens the commit revision of the active line in the supported remote service
|
||||
- `Open File in Remote` command (`gitlens.openFileInRemote`) — opens the active file/revision in the supported remote service
|
||||
- `Open Repository in Remote` command (`gitlens.openRepoInRemote`) — opens the repository in the supported remote service
|
||||
|
||||
- Adds a `Show Current Branch History` command (`gitlens.showQuickRepoHistory`) with a shortcut of `shift+alt+h` to show a paged **branch history quick pick menu** of the current branch for exploring its commit history
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Show Commit Search` and `Open Branch in <remote-service>` when available
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Navigate pages via `alt+,` and `alt+.` to go backward and forward respectively
|
||||
|
||||
- Adds a `Show Branch History` command (`gitlens.showQuickBranchHistory`) to show a paged **branch history quick pick menu** of the selected branch for exploring its commit history
|
||||
- Provides the same features as `Show Current Branch History` above
|
||||
|
||||
- Adds a `Show File History` command (`gitlens.showQuickFileHistory`) to show a paged **file history quick pick menu** of the active file for exploring its commit history
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Show Branch History` and `Open File in <remote-service>` when available
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Navigate pages via `alt+,` and `alt+.` to go backward and forward respectively
|
||||
|
||||
- Adds a `Show Commit Details` command (`gitlens.showQuickCommitDetails`) to show a **commit details quick pick menu** of the most recent commit of the active file
|
||||
|
||||

|
||||
|
||||
- Quickly see the set of files changed in the commit, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides entries to `Copy to Clipboard`, `Directory Compare`, `Open Changed Files`, `Open File in <remote-service>` when available, and more
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
- Use the `alt+right arrow` shortcut on a file entry in the `Changed Files` section to preview the comparison of the current revision with the previous one
|
||||
|
||||
- Adds a `Show Commit File Details` command (`gitlens.showQuickCommitFileDetails`) with a shortcut of `alt+c` to show a **file commit details quick pick menu** of the most recent commit of the active file
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Show Commit Details`, `Show File History`, `Compare File with...`, `Copy to Clipboard`, `Open File`, `Open File in <remote-service>` when available, and more
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
|
||||
- Adds a `Show Repository Status` command (`gitlens.showQuickRepoStatus`) with a shortcut of `alt+s` to show a **repository status quick pick menu** for visualizing the current repository status
|
||||
|
||||

|
||||
|
||||
- Quickly see upstream status (if an Git upstream is configured) — complete with ahead and behind information
|
||||
- If you are ahead of the upstream, an entry will be shown with the number of commits ahead. Choosing it will show a limited **branch history quick pick menu** containing just the commits ahead of the upstream
|
||||
- If you are behind the upstream, an entry will be shown with the number of commits behind. Choosing it will show a limited **branch history quick pick menu** containing just the commits behind the upstream
|
||||
- Quickly see all working changes, both staged and unstaged, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides entries to `Show Stashed Changes`, `Open Changed Files`, and `Close Unchanged Files`
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
- Use the `alt+right arrow` shortcut on a file entry in the `Staged Files` or `Unstaged Files` sections to preview the comparison of the working file with the previous revision
|
||||
|
||||
- Adds a `Show Stashed Changes` command (`gitlens.showQuickStashList`) to show a **stashed changes quick pick menu** for exploring your repository stash history
|
||||
|
||||

|
||||
|
||||
- Provides entries to `Stash Changes`
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
|
||||
- Choosing a stash entry shows a **stash details quick pick menu** which is very similar to the **commit details quick pick menu** above
|
||||
|
||||

|
||||
|
||||
- Quickly see the set of files changed in the stash, complete with status indicators for adds, changes, renames, and deletes
|
||||
- Provides entries to `Copy Message to Clipboard`, `Directory Compare`, and `Open Changed Files`
|
||||
- Provides entries to `Apply Stashed Changes` and `Delete Stashed Changes` — both require a confirmation
|
||||
- Navigate back to the previous quick pick menu via `alt+left arrow`, if available
|
||||
- Use the `alt+right arrow` shortcut on an entry to execute it without closing the quick pick menu, if possible — commands that open windows outside of VS Code will still close the quick pick menu unless [`"gitlens.advanced.quickPick.closeOnFocusOut": false`](#extension-settings) is set
|
||||
- Use the `alt+right arrow` shortcut on a file entry in the `Changed Files` section to preview the comparison of the current revision with the previous one
|
||||
|
||||
- Adds a `Show Last Opened Quick Pick` command (`gitlens.showLastQuickPick`) with a shortcut of `alt+-` to quickly get back to where you were when the last GitLens quick pick menu closed
|
||||
|
||||
- Adds a `Open File History Explorer` command (`gitlens.showFileHistory`) to show a **file history explorer** (peek style) to visualize the history of a file
|
||||
- Likely to be deprecated in a future release, add your voice to [#66](https://github.com/eamodio/vscode-gitlens/issues/66) if you feel it should not be removed
|
||||
|
||||
- Adds a `Open Blame History Explorer` command (`gitlens.showBlameHistory`) to show a **blame history explorer** (peek style) to visualize the blame history of a file or code block
|
||||
- Likely to be deprecated in a future release, add your voice to [#66](https://github.com/eamodio/vscode-gitlens/issues/66) if you feel it should not be removed
|
||||
|
||||
### And More
|
||||
|
||||
- Adds a `Copy Commit ID to Clipboard` command (`gitlens.copyShaToClipboard`) to copy the commit id (sha) of the active line to the clipboard or from the most recent commit to the current branch, if there is no active editor
|
||||
|
||||
- Adds a `Copy Commit Message to Clipboard` command (`gitlens.copyMessageToClipboard`) to copy the commit message of the active line to the clipboard or from the most recent commit to the current branch, if there is no active editor
|
||||
|
||||
- Adds a `Open Changed Files` command (`gitlens.openChangedFiles`) to open any files with working tree changes
|
||||
|
||||
- Adds a `Close Unchanged Files` command (`gitlens.closeUnchangedFiles`) to close any files without working tree changes
|
||||
|
||||
- Adds a `Apply Stashed Changes` command (`gitlens.stashApply`) to chose a stash entry to apply to the working tree from a quick pick menu
|
||||
|
||||
- Adds a `Stash Changes` command (`gitlens.stashSave`) to save any working tree changes to the stash — can optionally provide a stash message
|
||||
|
||||
## Insiders
|
||||
|
||||
Add [`"gitlens.insiders": true`](#general-extension-settings) to your settings to join the insiders channel and get early access to upcoming features. Be aware that because this provides early access expect there to be issues.
|
||||
|
||||
## Extension Settings
|
||||
|
||||
GitLens is highly customizable and provides many configuration settings to allow the personalization of almost all features
|
||||
|
||||
### General Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.defaultDateFormat`|Specifies how all absolute dates will be formatted by default\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|`gitlens.insiders`|Opts into the insiders channel -- provides access to upcoming features
|
||||
|`gitlens.outputLevel`|Specifies how much (if any) output will be sent to the GitLens output channel
|
||||
|
||||
### Blame Annotation Settings
|
||||
|
||||
#### File Blame Annotation Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.blame.file.annotationType`|Specifies the type of blame annotations that will be shown for the current file<br />`gutter` - adds an annotation to the beginning of each line<br />`hover` - shows annotations when hovering over each line
|
||||
|`gitlens.blame.file.lineHighlight.enabled`|Specifies whether or not to highlight lines associated with the current line
|
||||
|`gitlens.blame.file.lineHighlight.locations`|Specifies where the associated line highlights will be shown<br />`gutter` - adds a gutter glyph<br />`line` - adds a full-line highlight background color<br />`overviewRuler` - adds a decoration to the overviewRuler (scroll bar)
|
||||
|`gitlens.annotations.file.gutter.format`|Specifies the format of the gutter blame annotations<br />Available tokens<br />`${id}` - commit id<br />`${author}` - commit author<br />`${message}` - commit message<br />`${ago}` - relative commit date (e.g. 1 day ago)<br />`${date}` - formatted commit date (format specified by `gitlens.annotations.file.gutter.dateFormat`)<br />`${authorAgo}` - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.annotations.file.gutter.dateFormat`|Specifies how to format absolute dates (using the `${date}` token) in gutter blame annotations<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|`gitlens.annotations.file.gutter.compact`|Specifies whether or not to compact (deduplicate) matching adjacent gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.heatmap.enabled`|Specifies whether or not to provide a heatmap indicator in the gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.heatmap.location`|Specifies where the heatmap indicators will be shown in the gutter blame annotations<br />`left` - adds a heatmap indicator on the left edge of the gutter blame annotations<br />`right` - adds a heatmap indicator on the right edge of the gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.hover.details`|Specifies whether or not to provide a commit details hover annotation over the gutter blame annotations
|
||||
|`gitlens.annotations.file.gutter.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|`gitlens.annotations.file.hover.heatmap.enabled`|Specifies whether or not to provide heatmap indicators on the left edge of each line
|
||||
|`gitlens.annotations.file.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|
||||
#### Line Blame Annotation Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.blame.line.enabled`|Specifies whether or not to provide a blame annotation for the current line, by default<br />Use the `gitlens.toggleLineBlame` command to toggle the annotations on and off for the current session
|
||||
|`gitlens.blame.line.annotationType`|Specifies the type of blame annotations that will be shown for the current line<br />`trailing` - adds an annotation to the end of the current line<br />`hover` - shows annotations when hovering over the current line
|
||||
|`gitlens.annotations.line.trailing.format`|Specifies the format of the trailing blame annotations<br />Available tokens<br />`${id}` - commit id<br />`${author}` - commit author<br />`${message}` - commit message<br />`${ago}` - relative commit date (e.g. 1 day ago)<br />`${date}` - formatted commit date (format specified by `gitlens.annotations.line.trailing.dateFormat`)<br />`${authorAgo}` - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.annotations.line.trailing.dateFormat`|Specifies how to format absolute dates (using the `${date}` token) in trailing blame annotations<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|`gitlens.annotations.line.trailing.hover.details`|Specifies whether or not to provide a commit details hover annotation over the trailing blame annotations
|
||||
|`gitlens.annotations.line.trailing.hover.changes`|Specifies whether or not to provide a changes (diff) hover annotation over the trailing blame annotations
|
||||
|`gitlens.annotations.line.trailing.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|`gitlens.annotations.line.hover.details`|Specifies whether or not to provide a commit details hover annotation for the current line
|
||||
|`gitlens.annotations.line.hover.changes`|Specifies whether or not to provide a changes (diff) hover annotation for the current line
|
||||
|
||||
### File Recent Changes Annotation Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.recentChanges.file.lineHighlight.locations`|Specifies where the highlights of the recently changed lines will be shown<br />`gutter` - adds a gutter glyph<br />`line` - adds a full-line highlight background color<br />`overviewRuler` - adds a decoration to the overviewRuler (scroll bar)
|
||||
|`gitlens.annotations.file.recentChanges.hover.details`|Specifies whether or not to provide a commit details hover annotation
|
||||
|`gitlens.annotations.file.recentChanges.hover.changes`|Specifies whether or not to provide a changes (diff) hover annotation
|
||||
|`gitlens.annotations.file.recentChanges.hover.wholeLine`|Specifies whether or not to trigger hover annotations over the whole line
|
||||
|
||||
### Code Lens Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.codeLens.enabled`|Specifies whether or not to provide any Git code lens, by default<br />Use the `gitlens.toggleCodeLens` command to toggle the Git code lens on and off for the current session
|
||||
|`gitlens.codeLens.recentChange.enabled`|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`|Specifies the command to be executed when the `recent change` code lens is clicked<br />`gitlens.toggleFileBlame` - toggles file blame annotations<br />`gitlens.showBlameHistory` - opens the blame history explorer<br />`gitlens.showFileHistory` - opens the file history explorer<br />`gitlens.diffWithPrevious` - compares the current committed file with the previous commit<br />`gitlens.showQuickCommitDetails` - shows a commit details quick pick<br />`gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick<br />`gitlens.showQuickFileHistory` - shows a file history quick pick<br />`gitlens.showQuickRepoHistory` - shows a branch history quick pick
|
||||
|`gitlens.codeLens.authors.enabled`|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`|Specifies the command to be executed when the `authors` code lens is clicked<br />`gitlens.toggleFileBlame` - toggles file blame annotations<br />`gitlens.showBlameHistory` - opens the blame history explorer<br />`gitlens.showFileHistory` - opens the file history explorer<br />`gitlens.diffWithPrevious` - compares the current committed file with the previous commit<br />`gitlens.showQuickCommitDetails` - shows a commit details quick pick<br />`gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick<br />`gitlens.showQuickFileHistory` - shows a file history quick pick<br />`gitlens.showQuickRepoHistory` - shows a branch history quick pick
|
||||
|`gitlens.codeLens.locations`|Specifies where Git code lens will be shown in the document<br />`document` - adds code lens at the top of the document<br />`containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)<br />`blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines<br />`custom` - adds code lens at the start of symbols contained in `gitlens.codeLens.locationCustomSymbols`
|
||||
|`gitlens.codeLens.customLocationSymbols`|Specifies the set of document symbols where Git code lens will be shown in the document
|
||||
|`gitlens.codeLens.perLanguageLocations`|Specifies where Git code lens will be shown in the document for the specified languages
|
||||
|
||||
### Git File History Explorer Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.fileHistoryExplorer.commitFormat`|Specifies the format of committed changes in the `Git File History` explorer <br />Available tokens<br /> ${id} - commit id<br /> ${author} - commit author<br /> ${message} - commit message<br /> ${ago} - relative commit date (e.g. 1 day ago)<br /> ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)<br /> ${authorAgo} - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|
||||
### Git Stashes Explorer Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.stashExplorer.stashFormat`|Specifies the format of stashed changes in the `Git Stashes` explorer <br />Available tokens<br /> ${id} - commit id<br /> ${author} - commit author<br /> ${message} - commit message<br /> ${ago} - relative commit date (e.g. 1 day ago)<br /> ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)<br /> ${authorAgo} - commit author, relative commit date<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.stashExplorer.stashFileFormat`|Specifies the format of a stashed file in the `Git Stashes` explorer <br />Available tokens<br /> ${file} - file name<br /> ${filePath} - file name and path<br /> ${path} - file path
|
||||
|
||||
### Status Bar Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.statusBar.enabled`|Specifies whether or not to provide blame information on the status bar
|
||||
|`gitlens.statusBar.alignment`|Specifies the blame alignment in the status bar<br />`left` - align to the left, `right` - align to the right
|
||||
|`gitlens.statusBar.command`|Specifies the command to be executed when the blame status bar item is clicked<br />`gitlens.toggleFileBlame` - toggles file blame annotations<br />`gitlens.showBlameHistory` - opens the blame history explorer<br />`gitlens.showFileHistory` - opens the file history explorer<br />`gitlens.diffWithPrevious` - compares the current line commit with the previous<br />`gitlens.diffWithWorking` - compares the current line commit with the working tree<br />`gitlens.toggleCodeLens` - toggles Git code lens<br />`gitlens.showQuickCommitDetails` - shows a commit details quick pick<br />`gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick<br />`gitlens.showQuickFileHistory` - shows a file history quick pick<br />`gitlens.showQuickRepoHistory` - shows a branch history quick pick
|
||||
|`gitlens.statusBar.format`|Specifies the format of the blame information on the status bar<br />Available tokens<br />`${id}` - commit id<br />`${author}` - commit author<br />`${message}` - commit message<br />`${ago}` - relative commit date (e.g. 1 day ago)<br />`${date}` - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)<br />See https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting
|
||||
|`gitlens.statusBar.dateFormat`|Specifies the date format of absolute dates shown in the blame information on the status bar<br />See https://momentjs.com/docs/#/displaying/format/ for valid formats
|
||||
|
||||
### Strings Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.strings.codeLens.unsavedChanges.recentChangeAndAuthors`|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`|Specifies the string to be shown in place of the `recent change` code lens when there are unsaved changes
|
||||
|`gitlens.strings.codeLens.unsavedChanges.authorsOnly`|Specifies the string to be shown in place of the `authors` code lens when there are unsaved changes
|
||||
|
||||
### Theme Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.theme.annotations.file.gutter.separateLines`|Specifies whether or not gutter blame annotations will have line separators
|
||||
|`gitlens.theme.annotations.file.gutter.dark.backgroundColor`|Specifies the dark theme background color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.light.backgroundColor`|Specifies the light theme background color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.dark.foregroundColor`|Specifies the dark theme foreground color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.light.foregroundColor`|Specifies the light theme foreground color of the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.dark.uncommittedForegroundColor`|Specifies the dark theme foreground color of an uncommitted line in the gutter blame annotations
|
||||
|`gitlens.theme.annotations.file.gutter.light.uncommittedForegroundColor`|Specifies the light theme foreground color of an uncommitted line in the gutter blame annotations
|
||||
|`gitlens.theme.annotations.line.trailing.dark.backgroundColor`|Specifies the dark theme background color of the trailing blame annotation
|
||||
|`gitlens.theme.annotations.line.trailing.light.backgroundColor`|Specifies the light theme background color of the trailing blame annotation
|
||||
|`gitlens.theme.annotations.line.trailing.dark.foregroundColor`|Specifies the dark theme foreground color of the trailing blame annotation
|
||||
|`gitlens.theme.annotations.line.trailing.light.foregroundColor`|Specifies the light theme foreground color of the trailing blame annotation
|
||||
|`gitlens.theme.lineHighlight.dark.backgroundColor`|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`|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`|Specifies the dark theme overview ruler color of the associated line highlights in blame annotations
|
||||
|`gitlens.theme.lineHighlight.light.overviewRulerColor`|Specifies the light theme overview ruler color of the associated line highlights in blame annotations
|
||||
|
||||
### Advanced Settings
|
||||
|
||||
|Name | Description
|
||||
|-----|------------
|
||||
|`gitlens.advanced.telemetry.enabled`|Specifies whether or not to enable GitLens telemetry (even if enabled still abides by the overall `telemetry.enableTelemetry` setting
|
||||
|`gitlens.advanced.menus`|Specifies which commands will be added to which menus
|
||||
|`gitlens.advanced.caching.enabled`|Specifies whether git output will be cached
|
||||
|`gitlens.advanced.caching.maxLines`|Specifies the threshold for caching larger documents
|
||||
|`gitlens.advanced.git`|Specifies the git path to use
|
||||
|`gitlens.advanced.gitignore.enabled`|Specifies whether or not to parse the root .gitignore file for better performance (i.e. avoids blaming excluded files)
|
||||
|`gitlens.advanced.maxQuickHistory`|Specifies the maximum number of QuickPick history entries to show
|
||||
|`gitlens.advanced.quickPick.closeOnFocusOut`|Specifies whether or not to close the QuickPick menu when focus is lost
|
||||
|
||||
## Known Issues
|
||||
|
||||
- If the `Copy to * clipboard` commands don't work on Linux -- `xclip` needs to be installed. You can install it via `sudo apt-get install xclip`
|
||||
|
||||
## Contributors
|
||||
|
||||
A big thanks to the people that have contributed to this project:
|
||||
|
||||
- Peng Lyu ([@rebornix](https://github.com/rebornix)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=rebornix))
|
||||
- Aurelio Ogliari ([@nobitagit](https://github.com/nobitagit)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=nobitagit)
|
||||
- Johannes Rieken ([@jrieken](https://github.com/jrieken)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=jrieken))
|
||||
- Zack Schuster ([@zackschuster](https://github.com/zackschuster)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=zackschuster)
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect fill="#C5C5C5" x="6.5" y="5.5" width="3" height="11"/>
|
||||
<rect fill="#C5C5C5" x="2.5" y="9.5" width="11" height="3"/>
|
||||
</svg>
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><rect height="11" width="3" y="3" x="7" fill="#C5C5C5"/><rect height="3" width="11" y="7" x="3" fill="#C5C5C5"/></svg>
|
||||
|
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 203 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m13,8c0,-1.11 -0.89,-2 -2,-2c-1.11,0 -2,0.89 -2,2c0,0.73 0.41,1.38 1,1.72l0,0.3c-0.02,0.52 -0.23,0.98 -0.63,1.38c-0.4,0.4 -0.86,0.61 -1.38,0.63c-0.83,0.02 -1.48,0.16 -2,0.45l0,-4.76c0.59,-0.34 1,-0.98 1,-1.72c0,-1.11 -0.89,-2 -2,-2c-1.11,0 -1.99,0.89 -1.99,2c0,0.73 0.41,1.38 1,1.72l0,6.56c-0.59,0.35 -1,0.99 -1,1.72c0,1.11 0.89,2 2,2c1.11,0 2,-0.89 2,-2c0,-0.53 -0.2,-1 -0.53,-1.36c0.09,-0.06 0.48,-0.41 0.59,-0.47c0.25,-0.11 0.56,-0.17 0.94,-0.17c1.05,-0.05 1.95,-0.45 2.75,-1.25c0.8,-0.8 1.2,-1.98 1.25,-3.02l-0.02,0c0.61,-0.36 1.02,-1 1.02,-1.73l0,0zm-8,-3.2c0.66,0 1.2,0.55 1.2,1.2c0,0.65 -0.55,1.2 -1.2,1.2c-0.65,0 -1.2,-0.55 -1.2,-1.2c0,-0.65 0.55,-1.2 1.2,-1.2l0,0zm0,12.41c-0.66,0 -1.2,-0.55 -1.2,-1.2c0,-0.65 0.55,-1.2 1.2,-1.2c0.65,0 1.2,0.55 1.2,1.2c0,0.65 -0.55,1.2 -1.2,1.2l0,0zm6,-8c-0.66,0 -1.2,-0.55 -1.2,-1.2c0,-0.65 0.55,-1.2 1.2,-1.2c0.65,0 1.2,0.55 1.2,1.2c0,0.65 -0.55,1.2 -1.2,1.2l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m11.86,10c-0.45,-1.72 -2,-3 -3.86,-3c-1.86,0 -3.41,1.28 -3.86,3l-3.14,0l0,2l3.14,0c0.45,1.72 2,3 3.86,3c1.86,0 3.41,-1.28 3.86,-3l3.14,0l0,-2l-3.14,0zm-3.86,3.2c-1.22,0 -2.2,-0.98 -2.2,-2.2c0,-1.22 0.98,-2.2 2.2,-2.2c1.22,0 2.2,0.98 2.2,2.2c0,1.22 -0.98,2.2 -2.2,2.2z"></path>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="256" height="256" viewBox="0 0 14 16" xml:space="preserve">
|
||||
<path fill="#C5C5C5" d="M10.86 7c-.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2.2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z"></path>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 480 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m7.5,10l2,0l0,1l-2,0l0,2l-1,0l0,-2l-2,0l0,-1l2,0l0,-2l1,0l0,2l0,0zm-3,6l5,0l0,-1l-5,0l0,1l0,0zm4.5,-11l3.5,3.5l0,9.5c0,0.55 -0.45,1 -1,1l-9,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l6.5,0l0,0zm2.5,4l-3,-3l-6,0l0,12l9,0l0,-9l0,0zm-1.5,-6l-5.5,0l0,1l5,0l4,4l0,8l1,0l0,-8.5l-4.5,-4.5l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 437 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m9,15l2,0l-3,3l-3,-3l2,0l0,-5l2,0l0,5l0,0zm3,-8c0,-0.44 -0.91,-3 -4.5,-3c-2.42,0 -4.5,1.92 -4.5,4c-1.98,0 -3,1.52 -3,3c0,1.53 1,3 3,3l3,0l0,-1.3l-3,0c-1.62,0 -1.7,-1.42 -1.7,-1.7c0,-0.17 0.05,-1.7 1.7,-1.7l1.3,0l0,-1.3c0,-1.39 1.56,-2.7 3.2,-2.7c2.55,0 3.13,1.55 3.2,1.8l0,1.2l1.3,0c0.81,0 2.7,0.22 2.7,2.2c0,2.09 -2.25,2.2 -2.7,2.2l-2,0l0,1.3l2,0c2.08,0 4,-1.16 4,-3.5c0,-2.44 -1.92,-3.5 -4,-3.5l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 557 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m9,16l-2,0l0,-7l5,0l0,2l-3,0l0,5l0,0zm-1,-12c-2.19,0 -4.13,1.02 -5.41,2.59l-1.59,-1.59l0,4l4,0l-1.5,-1.5c1.05,-1.33 2.67,-2.2 4.5,-2.2c3.14,0 5.7,2.56 5.7,5.7c0,3.14 -2.56,5.7 -5.7,5.7c-3.14,0 -5.7,-2.56 -5.7,-5.7c0,-0.34 0.03,-0.67 0.09,-1l-1.31,0c-0.05,0.33 -0.08,0.66 -0.08,1c0,3.86 3.14,7 7,7c3.86,0 7,-3.14 7,-7c0,-3.86 -3.14,-7 -7,-7l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 500 B |
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m12.901149,9.091851l-0.094,0.071c-0.269,0.333 -0.746,1.096 -0.91,2.375c0.057,0.277 0.092,0.495 0.092,0.545c0,2.206 -1.794,4 -4,4a3.986,3.986 0 0 1 -2.817,-1.164a3.987,3.987 0 0 1 -1.163,-2.815c0,-2.206 1.794,-4 4,-4l0.351,0.025l0,1.85s1.626,-1.342 1.631,-1.339l1.869,-1.577l-3.5,-2.917l0,2.218l-0.371,-0.03a5.75,5.75 0 0 0 -4.055,9.826a5.75,5.75 0 0 0 9.826,-4.056a5.725,5.725 0 0 0 -0.859,-3.012z" />
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16">
|
||||
<path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3a2.98 2.98 0 0 1-2.107-.868 2.98 2.98 0 0 1-.873-2.111 3.004 3.004 0 0 1 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012L13.115 4.1 8.196 0H7.059v2.404A6.759 6.759 0 0 0 .938 9.125c0 1.809.707 3.508 1.986 4.782a6.707 6.707 0 0 0 4.784 1.988 6.758 6.758 0 0 0 6.75-6.75 6.741 6.741 0 0 0-1.007-3.536z" fill="#2D2D30"/>
|
||||
<path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4a3.986 3.986 0 0 1-2.817-1.164 3.987 3.987 0 0 1-1.163-2.815c0-2.206 1.794-4 4-4l.351.025v1.85S9.685 5.679 9.69 5.682l1.869-1.577-3.5-2.917v2.218l-.371-.03a5.75 5.75 0 0 0-4.055 9.826 5.75 5.75 0 0 0 9.826-4.056 5.725 5.725 0 0 0-.859-3.012z" fill="#C5C5C5"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 987 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m12.519592,15.157073l-9.039184,0c-1.367793,0 -2.480539,-1.112828 -2.480539,-2.480622s1.112746,-2.480539 2.480539,-2.480539l0.281314,0c0.349178,-0.47173 0.888523,-0.771191 1.476341,-0.815025c0.321917,-1.471535 1.619609,-2.537962 3.165139,-2.537962c1.221543,0 2.341663,0.699516 2.889377,1.772488c0.083027,-0.008618 0.166386,-0.012926 0.250076,-0.012926c1.190221,0 2.194667,0.874105 2.378785,2.027867c0.670514,0.460047 1.07869,1.225023 1.07869,2.046096c0,1.367793 -1.112828,2.480622 -2.480539,2.480622z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 655 B |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
<ellipse fill="#32cd32" stroke="#C5C5C5" stroke-width="0.5" rx="3" ry="3" cx="13" cy="4" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 586 B |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
<ellipse fill="#cd3131" stroke="#C5C5C5" stroke-width="0.5" rx="3" ry="3" cx="13" cy="4" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 586 B |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
<ellipse fill="#cdcd32" stroke="#C5C5C5" stroke-width="0.5" rx="3" ry="3" cx="13" cy="4" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 586 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 490 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m14.414133,16.199437l-3.415492,-3.433421c0.627518,-0.878526 0.995065,-1.945307 0.995065,-3.110698c0,-2.967265 -2.411463,-5.378728 -5.378728,-5.378728c-2.967265,0 -5.378728,2.411463 -5.378728,5.378728c0,2.967265 2.411463,5.378728 5.378728,5.378728c1.165391,0 2.223207,-0.367546 3.110698,-0.995065l3.433421,3.415492c0.170326,0.179291 0.403405,0.268936 0.627518,0.268936c0.224114,0 0.466156,-0.080681 0.627518,-0.268936c0.349617,-0.349617 0.349617,-0.914384 0,-1.264001l0,0.008965zm-7.799155,-2.330782c-2.321817,0 -4.213337,-1.891519 -4.213337,-4.213337c0,-2.321817 1.891519,-4.213337 4.213337,-4.213337c2.321817,0 4.213337,1.891519 4.213337,4.213337c0,2.321817 -1.891519,4.213337 -4.213337,4.213337l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 857 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m14.687501,11.955358l-1.079554,-6.821251c-0.076429,-0.458572 -0.477679,-0.821607 -0.955357,-0.821607l-9.30518,0c-0.477679,0 -0.878929,0.363036 -0.955357,0.821607l-1.079554,6.821251l0,4.776787c0,0.525447 0.429911,0.955357 0.955357,0.955357l11.464288,0c0.525447,0 0.955357,-0.429911 0.955357,-0.955357l0,-4.776787l0,0zm-3.133572,0.525447l-0.420357,0.850268c-0.162411,0.324821 -0.496786,0.535 -0.869375,0.535l-4.547501,0c-0.363036,0 -0.687857,-0.210179 -0.850268,-0.525447l-0.420357,-0.869375c-0.162411,-0.315268 -0.496786,-0.525447 -0.850268,-0.525447l-1.327947,0l0.955357,-6.687501l9.553573,0l0.955357,6.687501l-1.318393,0c-0.372589,0 -0.697411,0.210179 -0.869375,0.525447l0.009554,0.009554z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 846 B |
@@ -1,6 +1,6 @@
|
||||
<svg width="14px" height="14px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect fill="#7F4E7E" x="0" y="0" width="100" height="100" rx="35" ry="35"/>
|
||||
<text x="50" y="75" font-size="75" text-anchor="middle" style="font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback";" fill="white">
|
||||
!
|
||||
C
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 431 B After Width: | Height: | Size: 431 B |
@@ -1,6 +0,0 @@
|
||||
<svg width="14px" height="14px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect fill="#6C6C6C" x="0" y="0" width="100" height="100" rx="35" ry="35"/>
|
||||
<text x="50" y="75" font-size="75" text-anchor="middle" style="font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback";" fill="white">
|
||||
?
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 431 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m12.24,10.4c0.19,1.28 -0.2,2.62 -1.2,3.6c-1.47,1.45 -3.74,1.63 -5.41,0.54l1.17,-1.14l-4.3,-0.6l0.6,4.2l1.31,-1.26c2.36,1.74 5.7,1.57 7.84,-0.54c1.24,-1.23 1.81,-2.85 1.74,-4.46l-1.75,-0.34l0,0zm-7.28,-2.4c1.47,-1.45 3.74,-1.63 5.41,-0.54l-1.17,1.14l4.3,0.6l-0.6,-4.2l-1.31,1.26c-2.36,-1.74 -5.7,-1.57 -7.85,0.54c-1.24,1.23 -1.8,2.85 -1.73,4.46l1.75,0.35c-0.19,-1.28 0.2,-2.63 1.2,-3.61l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 546 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m12.5,11l2.5,2.5c0,0.55 -0.45,1 -1,1l-4,0l0,-1l3.5,0l-2,-2l-7,0l-2,2l3.5,0l0,1l-4,0c-0.55,0 -1,-0.45 -1,-1l2.5,-2.5l-2.5,-2.5c0,-0.55 0.45,-1 1,-1l4,0l0,1l-3.5,0l2,2l7,0l2,-2l-3.5,0l0,-1l4,0c0.55,0 1,0.45 1,1l-2.5,2.5l0,0zm-5.5,-1.5l2,0l0,-3l2,0l-3,-3l-3,3l2,0l0,3l0,0zm2,3l-2,0l0,3l-2,0l3,3l3,-3l-2,0l0,-3l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 467 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#C5C5C5" d="m7,12l-2,0l3,-3l3,3l-2,0l0,5l-2,0l0,-5l0,0zm5,-4c0,-0.44 -0.91,-3 -4.5,-3c-2.42,0 -4.5,1.92 -4.5,4c-1.98,0 -3,1.52 -3,3c0,1.53 1,3 3,3l3,0l0,-1.3l-3,0c-1.62,0 -1.7,-1.42 -1.7,-1.7c0,-0.17 0.05,-1.7 1.7,-1.7l1.3,0l0,-1.3c0,-1.39 1.56,-2.7 3.2,-2.7c2.55,0 3.13,1.55 3.2,1.8l0,1.2l1.3,0c0.81,0 2.7,0.22 2.7,2.2c0,2.09 -2.25,2.2 -2.7,2.2l-2,0l0,1.3l2,0c2.08,0 4,-1.16 4,-3.5c0,-2.44 -1.92,-3.5 -4,-3.5l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 558 B |
@@ -1,5 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect fill="#424242" x="6.5" y="5.5" width="3" height="11"/>
|
||||
<rect fill="#424242" x="2.5" y="9.5" width="11" height="3"/>
|
||||
</svg>
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><rect height="11" width="3" y="3" x="7" fill="#424242"/><rect height="3" width="11" y="7" x="3" fill="#424242"/></svg>
|
||||
|
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 203 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m13,8c0,-1.11 -0.89,-2 -2,-2c-1.11,0 -2,0.89 -2,2c0,0.73 0.41,1.38 1,1.72l0,0.3c-0.02,0.52 -0.23,0.98 -0.63,1.38c-0.4,0.4 -0.86,0.61 -1.38,0.63c-0.83,0.02 -1.48,0.16 -2,0.45l0,-4.76c0.59,-0.34 1,-0.98 1,-1.72c0,-1.11 -0.89,-2 -2,-2c-1.11,0 -1.99,0.89 -1.99,2c0,0.73 0.41,1.38 1,1.72l0,6.56c-0.59,0.35 -1,0.99 -1,1.72c0,1.11 0.89,2 2,2c1.11,0 2,-0.89 2,-2c0,-0.53 -0.2,-1 -0.53,-1.36c0.09,-0.06 0.48,-0.41 0.59,-0.47c0.25,-0.11 0.56,-0.17 0.94,-0.17c1.05,-0.05 1.95,-0.45 2.75,-1.25c0.8,-0.8 1.2,-1.98 1.25,-3.02l-0.02,0c0.61,-0.36 1.02,-1 1.02,-1.73l0,0zm-8,-3.2c0.66,0 1.2,0.55 1.2,1.2c0,0.65 -0.55,1.2 -1.2,1.2c-0.65,0 -1.2,-0.55 -1.2,-1.2c0,-0.65 0.55,-1.2 1.2,-1.2l0,0zm0,12.41c-0.66,0 -1.2,-0.55 -1.2,-1.2c0,-0.65 0.55,-1.2 1.2,-1.2c0.65,0 1.2,0.55 1.2,1.2c0,0.65 -0.55,1.2 -1.2,1.2l0,0zm6,-8c-0.66,0 -1.2,-0.55 -1.2,-1.2c0,-0.65 0.55,-1.2 1.2,-1.2c0.65,0 1.2,0.55 1.2,1.2c0,0.65 -0.55,1.2 -1.2,1.2l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m11.86,10c-0.45,-1.72 -2,-3 -3.86,-3c-1.86,0 -3.41,1.28 -3.86,3l-3.14,0l0,2l3.14,0c0.45,1.72 2,3 3.86,3c1.86,0 3.41,-1.28 3.86,-3l3.14,0l0,-2l-3.14,0zm-3.86,3.2c-1.22,0 -2.2,-0.98 -2.2,-2.2c0,-1.22 0.98,-2.2 2.2,-2.2c1.22,0 2.2,0.98 2.2,2.2c0,1.22 -0.98,2.2 -2.2,2.2z"></path>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="256" height="256" viewBox="0 0 14 16" xml:space="preserve">
|
||||
<path fill="#6c6c6c" d="M10.86 7c-.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2.2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z"></path>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 480 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m7.5,10l2,0l0,1l-2,0l0,2l-1,0l0,-2l-2,0l0,-1l2,0l0,-2l1,0l0,2l0,0zm-3,6l5,0l0,-1l-5,0l0,1l0,0zm4.5,-11l3.5,3.5l0,9.5c0,0.55 -0.45,1 -1,1l-9,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l6.5,0l0,0zm2.5,4l-3,-3l-6,0l0,12l9,0l0,-9l0,0zm-1.5,-6l-5.5,0l0,1l5,0l4,4l0,8l1,0l0,-8.5l-4.5,-4.5l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 437 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m9,15l2,0l-3,3l-3,-3l2,0l0,-5l2,0l0,5l0,0zm3,-8c0,-0.44 -0.91,-3 -4.5,-3c-2.42,0 -4.5,1.92 -4.5,4c-1.98,0 -3,1.52 -3,3c0,1.53 1,3 3,3l3,0l0,-1.3l-3,0c-1.62,0 -1.7,-1.42 -1.7,-1.7c0,-0.17 0.05,-1.7 1.7,-1.7l1.3,0l0,-1.3c0,-1.39 1.56,-2.7 3.2,-2.7c2.55,0 3.13,1.55 3.2,1.8l0,1.2l1.3,0c0.81,0 2.7,0.22 2.7,2.2c0,2.09 -2.25,2.2 -2.7,2.2l-2,0l0,1.3l2,0c2.08,0 4,-1.16 4,-3.5c0,-2.44 -1.92,-3.5 -4,-3.5l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 557 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m9,16l-2,0l0,-7l5,0l0,2l-3,0l0,5l0,0zm-1,-12c-2.19,0 -4.13,1.02 -5.41,2.59l-1.59,-1.59l0,4l4,0l-1.5,-1.5c1.05,-1.33 2.67,-2.2 4.5,-2.2c3.14,0 5.7,2.56 5.7,5.7c0,3.14 -2.56,5.7 -5.7,5.7c-3.14,0 -5.7,-2.56 -5.7,-5.7c0,-0.34 0.03,-0.67 0.09,-1l-1.31,0c-0.05,0.33 -0.08,0.66 -0.08,1c0,3.86 3.14,7 7,7c3.86,0 7,-3.14 7,-7c0,-3.86 -3.14,-7 -7,-7l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 500 B |
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m12.901149,9.091851l-0.094,0.071c-0.269,0.333 -0.746,1.096 -0.91,2.375c0.057,0.277 0.092,0.495 0.092,0.545c0,2.206 -1.794,4 -4,4a3.986,3.986 0 0 1 -2.817,-1.164a3.987,3.987 0 0 1 -1.163,-2.815c0,-2.206 1.794,-4 4,-4l0.351,0.025l0,1.85s1.626,-1.342 1.631,-1.339l1.869,-1.577l-3.5,-2.917l0,2.218l-0.371,-0.03a5.75,5.75 0 0 0 -4.055,9.826a5.75,5.75 0 0 0 9.826,-4.056a5.725,5.725 0 0 0 -0.859,-3.012z" />
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16">
|
||||
<path d='M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3a2.98 2.98 0 0 1-2.107-.868 2.98 2.98 0 0 1-.873-2.111 3.004 3.004 0 0 1 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012L13.115 4.1 8.196 0H7.059v2.404A6.759 6.759 0 0 0 .938 9.125c0 1.809.707 3.508 1.986 4.782a6.707 6.707 0 0 0 4.784 1.988 6.758 6.758 0 0 0 6.75-6.75 6.741 6.741 0 0 0-1.007-3.536z' fill='#F6F6F6'/>
|
||||
<path d='M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4a3.986 3.986 0 0 1-2.817-1.164 3.987 3.987 0 0 1-1.163-2.815c0-2.206 1.794-4 4-4l.351.025v1.85S9.685 5.679 9.69 5.682l1.869-1.577-3.5-2.917v2.218l-.371-.03a5.75 5.75 0 0 0-4.055 9.826 5.75 5.75 0 0 0 9.826-4.056 5.725 5.725 0 0 0-.859-3.012z' fill='#424242'/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 987 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m12.519592,15.157073l-9.039184,0c-1.367793,0 -2.480539,-1.112828 -2.480539,-2.480622s1.112746,-2.480539 2.480539,-2.480539l0.281314,0c0.349178,-0.47173 0.888523,-0.771191 1.476341,-0.815025c0.321917,-1.471535 1.619609,-2.537962 3.165139,-2.537962c1.221543,0 2.341663,0.699516 2.889377,1.772488c0.083027,-0.008618 0.166386,-0.012926 0.250076,-0.012926c1.190221,0 2.194667,0.874105 2.378785,2.027867c0.670514,0.460047 1.07869,1.225023 1.07869,2.046096c0,1.367793 -1.112828,2.480622 -2.480539,2.480622z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 655 B |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
<ellipse fill="#32cd32" stroke="#424242" stroke-width="0.5" rx="3" ry="3" cx="13" cy="4" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 586 B |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
<ellipse fill="#cd3131" stroke="#424242" stroke-width="0.5" rx="3" ry="3" cx="13" cy="4" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 586 B |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
<ellipse fill="#cdcd32" stroke="#424242" stroke-width="0.5" rx="3" ry="3" cx="13" cy="4" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 586 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m6,12l-1,0l0,-1l1,0l0,1l0,0zm0,-3l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm0,-2l-1,0l0,1l1,0l0,-1l0,0zm8,-1l0,12c0,0.55 -0.45,1 -1,1l-5,0l0,2l-1.5,-1.5l-1.5,1.5l0,-2l-2,0c-0.55,0 -1,-0.45 -1,-1l0,-12c0,-0.55 0.45,-1 1,-1l10,0c0.55,0 1,0.45 1,1l0,0zm-1,10l-10,0l0,2l2,0l0,-1l3,0l0,1l5,0l0,-2l0,0zm0,-10l-9,0l0,9l9,0l0,-9l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 490 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m14.414133,16.199437l-3.415492,-3.433421c0.627518,-0.878526 0.995065,-1.945307 0.995065,-3.110698c0,-2.967265 -2.411463,-5.378728 -5.378728,-5.378728c-2.967265,0 -5.378728,2.411463 -5.378728,5.378728c0,2.967265 2.411463,5.378728 5.378728,5.378728c1.165391,0 2.223207,-0.367546 3.110698,-0.995065l3.433421,3.415492c0.170326,0.179291 0.403405,0.268936 0.627518,0.268936c0.224114,0 0.466156,-0.080681 0.627518,-0.268936c0.349617,-0.349617 0.349617,-0.914384 0,-1.264001l0,0.008965zm-7.799155,-2.330782c-2.321817,0 -4.213337,-1.891519 -4.213337,-4.213337c0,-2.321817 1.891519,-4.213337 4.213337,-4.213337c2.321817,0 4.213337,1.891519 4.213337,4.213337c0,2.321817 -1.891519,4.213337 -4.213337,4.213337l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 857 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m14.687501,11.955358l-1.079554,-6.821251c-0.076429,-0.458572 -0.477679,-0.821607 -0.955357,-0.821607l-9.30518,0c-0.477679,0 -0.878929,0.363036 -0.955357,0.821607l-1.079554,6.821251l0,4.776787c0,0.525447 0.429911,0.955357 0.955357,0.955357l11.464288,0c0.525447,0 0.955357,-0.429911 0.955357,-0.955357l0,-4.776787l0,0zm-3.133572,0.525447l-0.420357,0.850268c-0.162411,0.324821 -0.496786,0.535 -0.869375,0.535l-4.547501,0c-0.363036,0 -0.687857,-0.210179 -0.850268,-0.525447l-0.420357,-0.869375c-0.162411,-0.315268 -0.496786,-0.525447 -0.850268,-0.525447l-1.327947,0l0.955357,-6.687501l9.553573,0l0.955357,6.687501l-1.318393,0c-0.372589,0 -0.697411,0.210179 -0.869375,0.525447l0.009554,0.009554z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 846 B |
@@ -1,6 +1,6 @@
|
||||
<svg width="14px" height="14px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect fill="#9B4F96" x="0" y="0" width="100" height="100" rx="35" ry="35"/>
|
||||
<text x="50" y="75" font-size="75" text-anchor="middle" style="font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback";" fill="white">
|
||||
!
|
||||
C
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 431 B After Width: | Height: | Size: 431 B |
@@ -1,6 +0,0 @@
|
||||
<svg width="14px" height="14px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect fill="#6C6C6C" x="0" y="0" width="100" height="100" rx="35" ry="35"/>
|
||||
<text x="50" y="75" font-size="75" text-anchor="middle" style="font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback";" fill="white">
|
||||
?
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 431 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m12.24,10.4c0.19,1.28 -0.2,2.62 -1.2,3.6c-1.47,1.45 -3.74,1.63 -5.41,0.54l1.17,-1.14l-4.3,-0.6l0.6,4.2l1.31,-1.26c2.36,1.74 5.7,1.57 7.84,-0.54c1.24,-1.23 1.81,-2.85 1.74,-4.46l-1.75,-0.34l0,0zm-7.28,-2.4c1.47,-1.45 3.74,-1.63 5.41,-0.54l-1.17,1.14l4.3,0.6l-0.6,-4.2l-1.31,1.26c-2.36,-1.74 -5.7,-1.57 -7.85,0.54c-1.24,1.23 -1.8,2.85 -1.73,4.46l1.75,0.35c-0.19,-1.28 0.2,-2.63 1.2,-3.61l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 546 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m12.5,11l2.5,2.5c0,0.55 -0.45,1 -1,1l-4,0l0,-1l3.5,0l-2,-2l-7,0l-2,2l3.5,0l0,1l-4,0c-0.55,0 -1,-0.45 -1,-1l2.5,-2.5l-2.5,-2.5c0,-0.55 0.45,-1 1,-1l4,0l0,1l-3.5,0l2,2l7,0l2,-2l-3.5,0l0,-1l4,0c0.55,0 1,0.45 1,1l-2.5,2.5l0,0zm-5.5,-1.5l2,0l0,-3l2,0l-3,-3l-3,3l2,0l0,3l0,0zm2,3l-2,0l0,3l-2,0l3,3l3,-3l-2,0l0,-3l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 467 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="16" height="22" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#424242" d="m7,12l-2,0l3,-3l3,3l-2,0l0,5l-2,0l0,-5l0,0zm5,-4c0,-0.44 -0.91,-3 -4.5,-3c-2.42,0 -4.5,1.92 -4.5,4c-1.98,0 -3,1.52 -3,3c0,1.53 1,3 3,3l3,0l0,-1.3l-3,0c-1.62,0 -1.7,-1.42 -1.7,-1.7c0,-0.17 0.05,-1.7 1.7,-1.7l1.3,0l0,-1.3c0,-1.39 1.56,-2.7 3.2,-2.7c2.55,0 3.13,1.55 3.2,1.8l0,1.2l1.3,0c0.81,0 2.7,0.22 2.7,2.2c0,2.09 -2.25,2.2 -2.7,2.2l-2,0l0,1.3l2,0c2.08,0 4,-1.16 4,-3.5c0,-2.44 -1.92,-3.5 -4,-3.5l0,0z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 558 B |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 20 KiB |
BIN
images/screenshot-git-stashes.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 25 KiB |
356
package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gitlens",
|
||||
"version": "5.3.0",
|
||||
"version": "4.4.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -16,19 +16,19 @@
|
||||
"integrity": "sha1-qjuL2ivlErGuCgV7lC6GnDcKVWk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "8.0.31"
|
||||
"@types/node": "8.0.25"
|
||||
}
|
||||
},
|
||||
"@types/mocha": {
|
||||
"version": "2.2.43",
|
||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.43.tgz",
|
||||
"integrity": "sha512-xNlAmH+lRJdUMXClMTI9Y0pRqIojdxfm7DHsIxoB2iTzu3fnPmSMEN8SsSx0cdwV36d02PWCWaDUoZPDSln+xw==",
|
||||
"version": "2.2.42",
|
||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.42.tgz",
|
||||
"integrity": "sha512-b6gVDoxEbAQGwbV7gSzeFw/hy3/eEAokztktdzl4bHvGgb9K5zW4mVQDlVYch2w31m8t/J7L2iqhQvz3r5edCQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "8.0.31",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.31.tgz",
|
||||
"integrity": "sha512-R+LdMJHJQwRd/Ca0Nr5KnwbSWHxTD3DWz4ivqoPeNH+YPcuirMWK+Ti9Mx32jOecmPhHOCd+6CefU5e1eVq2Ew==",
|
||||
"version": "8.0.25",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.25.tgz",
|
||||
"integrity": "sha512-zT+t9841g1HsjLtPMCYxmb1U4pcZ2TOegAKiomlmj6bIziuaEYHUavxLE9NRwdntY0vOCrgHho6OXjDX7fm/Kw==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/tmp": {
|
||||
@@ -38,22 +38,19 @@
|
||||
"dev": true
|
||||
},
|
||||
"ajv": {
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz",
|
||||
"integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=",
|
||||
"version": "4.11.8",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
|
||||
"integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"co": "4.6.0",
|
||||
"fast-deep-equal": "1.0.0",
|
||||
"json-schema-traverse": "0.3.1",
|
||||
"json-stable-stringify": "1.0.1"
|
||||
}
|
||||
},
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
|
||||
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
|
||||
},
|
||||
"ansi-styles": {
|
||||
"version": "2.2.1",
|
||||
@@ -252,6 +249,21 @@
|
||||
"supports-color": "2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-regex": "2.1.1"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
||||
@@ -336,7 +348,7 @@
|
||||
"resolved": "https://registry.npmjs.org/copy-paste/-/copy-paste-1.3.0.tgz",
|
||||
"integrity": "sha1-p+bEocKP3t8rCB5yuX3y75X0ce0=",
|
||||
"requires": {
|
||||
"iconv-lite": "0.4.19",
|
||||
"iconv-lite": "0.4.18",
|
||||
"sync-exec": "0.6.2"
|
||||
}
|
||||
},
|
||||
@@ -373,15 +385,15 @@
|
||||
}
|
||||
},
|
||||
"dateformat": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
|
||||
"integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz",
|
||||
"integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=",
|
||||
"dev": true
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"version": "2.6.8",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
@@ -585,12 +597,6 @@
|
||||
"time-stamp": "1.1.0"
|
||||
}
|
||||
},
|
||||
"fast-deep-equal": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
|
||||
"integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
|
||||
"dev": true
|
||||
},
|
||||
"fd-slicer": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
|
||||
@@ -654,7 +660,7 @@
|
||||
"requires": {
|
||||
"asynckit": "0.4.0",
|
||||
"combined-stream": "1.0.5",
|
||||
"mime-types": "2.1.17"
|
||||
"mime-types": "2.1.16"
|
||||
}
|
||||
},
|
||||
"from": {
|
||||
@@ -678,7 +684,7 @@
|
||||
"graceful-fs": "4.1.11",
|
||||
"inherits": "2.0.3",
|
||||
"mkdirp": "0.5.1",
|
||||
"rimraf": "2.6.2"
|
||||
"rimraf": "2.6.1"
|
||||
}
|
||||
},
|
||||
"generate-function": {
|
||||
@@ -993,11 +999,11 @@
|
||||
"is-typedarray": "1.0.0",
|
||||
"isstream": "0.1.2",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"mime-types": "2.1.17",
|
||||
"mime-types": "2.1.16",
|
||||
"oauth-sign": "0.8.2",
|
||||
"qs": "6.3.2",
|
||||
"stringstream": "0.0.5",
|
||||
"tough-cookie": "2.3.3",
|
||||
"tough-cookie": "2.3.2",
|
||||
"tunnel-agent": "0.4.3",
|
||||
"uuid": "3.1.0"
|
||||
}
|
||||
@@ -1080,7 +1086,7 @@
|
||||
"array-uniq": "1.0.3",
|
||||
"beeper": "1.1.1",
|
||||
"chalk": "1.1.3",
|
||||
"dateformat": "2.2.0",
|
||||
"dateformat": "2.0.0",
|
||||
"fancy-log": "1.3.0",
|
||||
"gulplog": "1.0.0",
|
||||
"has-gulplog": "0.1.0",
|
||||
@@ -1181,9 +1187,9 @@
|
||||
}
|
||||
},
|
||||
"har-schema": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
|
||||
"integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
|
||||
"dev": true
|
||||
},
|
||||
"har-validator": {
|
||||
@@ -1205,6 +1211,14 @@
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-regex": "2.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"has-flag": {
|
||||
@@ -1234,12 +1248,6 @@
|
||||
"sntp": "1.0.9"
|
||||
}
|
||||
},
|
||||
"he": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
|
||||
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
|
||||
"dev": true
|
||||
},
|
||||
"hoek": {
|
||||
"version": "2.16.3",
|
||||
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
|
||||
@@ -1258,14 +1266,14 @@
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.19",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
|
||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
||||
"version": "0.4.18",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz",
|
||||
"integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA=="
|
||||
},
|
||||
"ignore": {
|
||||
"version": "3.3.5",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz",
|
||||
"integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw=="
|
||||
"version": "3.3.4",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.4.tgz",
|
||||
"integrity": "sha512-KjHyHxUgicfgFiTJaIA9DoeY3TIQz5thaKqm35re7RTVVB7zjF1fTMIDMXM4GUUBipR4FW8BvGnA115pZ/AxQQ=="
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
@@ -1322,6 +1330,11 @@
|
||||
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
|
||||
"dev": true
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
|
||||
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
|
||||
},
|
||||
"is-glob": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
|
||||
@@ -1440,12 +1453,6 @@
|
||||
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
|
||||
"dev": true
|
||||
},
|
||||
"json-schema-traverse": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
|
||||
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
|
||||
"dev": true
|
||||
},
|
||||
"json-stable-stringify": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
|
||||
@@ -1721,7 +1728,7 @@
|
||||
"normalize-path": "2.1.1",
|
||||
"object.omit": "2.0.1",
|
||||
"parse-glob": "3.0.4",
|
||||
"regex-cache": "0.4.4"
|
||||
"regex-cache": "0.4.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"is-extglob": {
|
||||
@@ -1742,18 +1749,18 @@
|
||||
}
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.30.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
|
||||
"integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
|
||||
"version": "1.29.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz",
|
||||
"integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=",
|
||||
"dev": true
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.17",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
|
||||
"integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
|
||||
"version": "2.1.16",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz",
|
||||
"integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"mime-db": "1.30.0"
|
||||
"mime-db": "1.29.0"
|
||||
}
|
||||
},
|
||||
"minimatch": {
|
||||
@@ -1781,9 +1788,9 @@
|
||||
}
|
||||
},
|
||||
"mocha": {
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
|
||||
"integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz",
|
||||
"integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"browser-stdout": "1.3.0",
|
||||
@@ -1793,22 +1800,10 @@
|
||||
"escape-string-regexp": "1.0.5",
|
||||
"glob": "7.1.1",
|
||||
"growl": "1.9.2",
|
||||
"he": "1.1.1",
|
||||
"json3": "3.3.2",
|
||||
"lodash.create": "3.1.1",
|
||||
"mkdirp": "0.5.1",
|
||||
"supports-color": "3.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.8",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
@@ -1969,9 +1964,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"performance-now": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
||||
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
|
||||
"integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
|
||||
"dev": true
|
||||
},
|
||||
"pinkie": {
|
||||
@@ -2085,12 +2080,13 @@
|
||||
}
|
||||
},
|
||||
"regex-cache": {
|
||||
"version": "0.4.4",
|
||||
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
|
||||
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
|
||||
"integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-equal-shallow": "0.1.3"
|
||||
"is-equal-shallow": "0.1.3",
|
||||
"is-primitive": "2.0.0"
|
||||
}
|
||||
},
|
||||
"remove-trailing-separator": {
|
||||
@@ -2118,147 +2114,57 @@
|
||||
"dev": true
|
||||
},
|
||||
"request": {
|
||||
"version": "2.82.0",
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.82.0.tgz",
|
||||
"integrity": "sha512-/QWqfmyTfQ4OYs6EhB1h2wQsX9ZxbuNePCvCm0Mdz/mxw73mjdg0D4QdIl0TQBFs35CZmMXLjk0iCGK395CUDg==",
|
||||
"version": "2.81.0",
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
|
||||
"integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"aws-sign2": "0.7.0",
|
||||
"aws-sign2": "0.6.0",
|
||||
"aws4": "1.6.0",
|
||||
"caseless": "0.12.0",
|
||||
"combined-stream": "1.0.5",
|
||||
"extend": "3.0.1",
|
||||
"forever-agent": "0.6.1",
|
||||
"form-data": "2.3.1",
|
||||
"har-validator": "5.0.3",
|
||||
"hawk": "6.0.2",
|
||||
"http-signature": "1.2.0",
|
||||
"form-data": "2.1.4",
|
||||
"har-validator": "4.2.1",
|
||||
"hawk": "3.1.3",
|
||||
"http-signature": "1.1.1",
|
||||
"is-typedarray": "1.0.0",
|
||||
"isstream": "0.1.2",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"mime-types": "2.1.17",
|
||||
"mime-types": "2.1.16",
|
||||
"oauth-sign": "0.8.2",
|
||||
"performance-now": "2.1.0",
|
||||
"qs": "6.5.1",
|
||||
"performance-now": "0.2.0",
|
||||
"qs": "6.4.0",
|
||||
"safe-buffer": "5.1.1",
|
||||
"stringstream": "0.0.5",
|
||||
"tough-cookie": "2.3.3",
|
||||
"tough-cookie": "2.3.2",
|
||||
"tunnel-agent": "0.6.0",
|
||||
"uuid": "3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
|
||||
"dev": true
|
||||
},
|
||||
"aws-sign2": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
|
||||
"dev": true
|
||||
},
|
||||
"boom": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
|
||||
"integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"hoek": "4.2.0"
|
||||
}
|
||||
},
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
|
||||
"dev": true
|
||||
},
|
||||
"cryptiles": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
|
||||
"integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"boom": "5.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"boom": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
|
||||
"integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"hoek": "4.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
|
||||
"integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"asynckit": "0.4.0",
|
||||
"combined-stream": "1.0.5",
|
||||
"mime-types": "2.1.17"
|
||||
}
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
|
||||
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
|
||||
"integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ajv": "5.2.3",
|
||||
"har-schema": "2.0.0"
|
||||
}
|
||||
},
|
||||
"hawk": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
|
||||
"integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"boom": "4.3.1",
|
||||
"cryptiles": "3.1.2",
|
||||
"hoek": "4.2.0",
|
||||
"sntp": "2.0.2"
|
||||
}
|
||||
},
|
||||
"hoek": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
|
||||
"integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==",
|
||||
"dev": true
|
||||
},
|
||||
"http-signature": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"jsprim": "1.4.1",
|
||||
"sshpk": "1.13.1"
|
||||
"ajv": "4.11.8",
|
||||
"har-schema": "1.0.5"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.1",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
|
||||
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
|
||||
"integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
|
||||
"dev": true
|
||||
},
|
||||
"sntp": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz",
|
||||
"integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"hoek": "4.2.0"
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
@@ -2286,9 +2192,9 @@
|
||||
}
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
|
||||
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
|
||||
"integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"glob": "7.1.1"
|
||||
@@ -2329,9 +2235,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.4.18",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
|
||||
"integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
|
||||
"version": "0.4.16",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.16.tgz",
|
||||
"integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"source-map": "0.5.7"
|
||||
@@ -2348,7 +2254,7 @@
|
||||
"resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.11.tgz",
|
||||
"integrity": "sha1-ZUUa1lZigB2up1VJgyp4LeAEjb8=",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"debug": "2.6.8",
|
||||
"lodash.assign": "4.2.0",
|
||||
"rxjs": "5.4.3"
|
||||
}
|
||||
@@ -2431,6 +2337,15 @@
|
||||
"safe-buffer": "5.1.1"
|
||||
}
|
||||
},
|
||||
"string-width": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
|
||||
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
|
||||
"requires": {
|
||||
"is-fullwidth-code-point": "2.0.0",
|
||||
"strip-ansi": "4.0.0"
|
||||
}
|
||||
},
|
||||
"stringstream": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
|
||||
@@ -2438,12 +2353,11 @@
|
||||
"dev": true
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
|
||||
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
|
||||
"requires": {
|
||||
"ansi-regex": "2.1.1"
|
||||
"ansi-regex": "3.0.0"
|
||||
}
|
||||
},
|
||||
"strip-bom": {
|
||||
@@ -2546,9 +2460,9 @@
|
||||
}
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
|
||||
"integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
|
||||
"integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"punycode": "1.4.1"
|
||||
@@ -2575,13 +2489,13 @@
|
||||
"resolve": "1.4.0",
|
||||
"semver": "5.4.1",
|
||||
"tslib": "1.7.1",
|
||||
"tsutils": "2.9.0"
|
||||
"tsutils": "2.8.1"
|
||||
}
|
||||
},
|
||||
"tsutils": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.9.0.tgz",
|
||||
"integrity": "sha1-fhU3tVa6tocvp+ZIXf9FsHbVUz0=",
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.1.tgz",
|
||||
"integrity": "sha1-N3FATnyp8L7fXZGaR6SxiQpo7/8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"tslib": "1.7.1"
|
||||
@@ -2601,9 +2515,9 @@
|
||||
"optional": true
|
||||
},
|
||||
"typescript": {
|
||||
"version": "2.5.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz",
|
||||
"integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==",
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz",
|
||||
"integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=",
|
||||
"dev": true
|
||||
},
|
||||
"unique-stream": {
|
||||
@@ -2794,10 +2708,10 @@
|
||||
"gulp-symdest": "1.1.0",
|
||||
"gulp-untar": "0.0.6",
|
||||
"gulp-vinyl-zip": "1.4.0",
|
||||
"mocha": "3.5.3",
|
||||
"request": "2.82.0",
|
||||
"mocha": "3.5.0",
|
||||
"request": "2.81.0",
|
||||
"semver": "5.4.1",
|
||||
"source-map-support": "0.4.18",
|
||||
"source-map-support": "0.4.16",
|
||||
"url-parse": "1.1.9",
|
||||
"vinyl-source-stream": "1.1.0"
|
||||
}
|
||||
|
||||
600
package.json
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "gitlens",
|
||||
"version": "5.3.0",
|
||||
"version": "4.5.0-beta",
|
||||
"author": {
|
||||
"name": "Eric Amodio",
|
||||
"email": "eamodio@gmail.com"
|
||||
},
|
||||
"publisher": "eamodio",
|
||||
"engines": {
|
||||
"vscode": "^1.16.0"
|
||||
"vscode": "^1.15.0"
|
||||
},
|
||||
"license": "SEE LICENSE IN LICENSE",
|
||||
"displayName": "Git Lens \u2014 git blame annotations, code lens, and more",
|
||||
@@ -15,8 +15,8 @@
|
||||
"badges": [
|
||||
{
|
||||
"url": "https://img.shields.io/badge/chat-on%20slack-brightgreen.svg",
|
||||
"href": "https://join.slack.com/t/vscode-dev-community/shared_invite/enQtMjIxOTgxNDE3NzM0LWU5M2ZiZDU1YjBlMzdlZjA2YjBjYzRhYTM5NTgzMTAxMjdiNWU0ZmQzYWI3MWU5N2Q1YjBiYmQ4MzY0NDE1MzY",
|
||||
"description": "Chat at https://vscode-dev-community.slack.com/"
|
||||
"href": "https://join.slack.com/t/vscode-gitlens/shared_invite/MjIxOTgxNDE3NzM0LTE1MDE2Nzk1MTgtMjkwMmZjMzcxNQ",
|
||||
"description": "Chat at https://vscode-gitlens.slack.com/"
|
||||
}
|
||||
],
|
||||
"categories": [
|
||||
@@ -132,6 +132,11 @@
|
||||
"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,
|
||||
@@ -167,11 +172,6 @@
|
||||
"default": false,
|
||||
"description": "Specifies whether or not to trigger hover annotations over the whole line"
|
||||
},
|
||||
"gitlens.blame.ignoreWhitespace": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "Specifies whether or not to ignore whitespace when comparing revisions during blame operations"
|
||||
},
|
||||
"gitlens.blame.file.annotationType": {
|
||||
"type": "string",
|
||||
"default": "gutter",
|
||||
@@ -303,7 +303,7 @@
|
||||
"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`"
|
||||
"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",
|
||||
@@ -388,7 +388,7 @@
|
||||
"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`"
|
||||
"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",
|
||||
@@ -413,104 +413,20 @@
|
||||
"default": null,
|
||||
"description": "Specifies how all absolute dates will be formatted by default\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats"
|
||||
},
|
||||
"gitlens.gitExplorer.commitFormat": {
|
||||
"gitlens.fileHistoryExplorer.commitFormat": {
|
||||
"type": "string",
|
||||
"default": "${message} \u00a0\u2022\u00a0 ${authorAgo} \u00a0 (${id})",
|
||||
"description": "Specifies the format of committed changes in the `GitLens` custom 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"
|
||||
"default": "${message} \u00a0\u2022\u00a0 ${authorAgo} \u00a0\u2022\u00a0 ${id}",
|
||||
"description": "Specifies the format of committed changes in the `Git File History` explorer\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.gitExplorer.commitFileFormat": {
|
||||
"type": "string",
|
||||
"default": "${filePath}",
|
||||
"description": "Specifies the format of a committed file in the `GitLens` custom view\nAvailable tokens\n ${directory} - directory name\n ${file} - file name\n ${filePath} - formatted file name and path\n ${path} - full file path"
|
||||
},
|
||||
"gitlens.gitExplorer.enabled": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Specifies whether or not to show the `GitLens` custom view"
|
||||
},
|
||||
"gitlens.gitExplorer.files.layout": {
|
||||
"type": "string",
|
||||
"default": "auto",
|
||||
"enum": [
|
||||
"auto",
|
||||
"list",
|
||||
"tree"
|
||||
],
|
||||
"description": "Specifies how the `GitLens` custom view will display files\n `auto` - automatically switches between displaying files as a `tree` or `list` based on the `gitlens.gitExplorer.files.threshold` setting and the number of files at each nesting level\n `list` - displays files as a list\n `tree` - displays files as a tree"
|
||||
},
|
||||
"gitlens.gitExplorer.files.compact": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Specifies whether or not to compact (flatten) unnecessary file nesting in the `GitLens` custom view\nOnly applies when displaying files as a `tree` or `auto`"
|
||||
},
|
||||
"gitlens.gitExplorer.files.threshold": {
|
||||
"type": "number",
|
||||
"default": 5,
|
||||
"description": "Specifies when to switch between displaying files as a `tree` or `list` based on the number of files in a nesting level in the `GitLens` custom view\nOnly applies when displaying files as `auto`"
|
||||
},
|
||||
"gitlens.gitExplorer.includeWorkingTree": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Specifies whether or not to include working tree files inside the `Repository Status` node of the `GitLens` custom view"
|
||||
},
|
||||
"gitlens.gitExplorer.showTrackingBranch": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Specifies whether or not to show the tracking branch when displaying local branches in the `GitLens` custom view"
|
||||
},
|
||||
"gitlens.gitExplorer.stashFormat": {
|
||||
"gitlens.stashExplorer.stashFormat": {
|
||||
"type": "string",
|
||||
"default": "${message}",
|
||||
"description": "Specifies the format of stashed changes in the `GitLens` custom 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"
|
||||
"description": "Specifies the format of stashed changes in the `Git Stashes` explorer\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.gitExplorer.stashFileFormat": {
|
||||
"gitlens.stashExplorer.stashFileFormat": {
|
||||
"type": "string",
|
||||
"default": "${filePath}",
|
||||
"description": "Specifies the format of a stashed file in the `GitLens` custom view\nAvailable tokens\n ${directory} - directory name\n ${file} - file name\n ${filePath} - formatted file name and path\n ${path} - full file path"
|
||||
},
|
||||
"gitlens.gitExplorer.statusFileFormat": {
|
||||
"type": "string",
|
||||
"default": "${working}${filePath}",
|
||||
"description": "Specifies the format of the status of a working or committed file in the `GitLens` custom view\nAvailable tokens\n ${directory} - directory name\n ${file} - file name\n ${filePath} - formatted file name and path\n ${path} - full file path\n ${working} - optional indicator if the file is uncommitted"
|
||||
},
|
||||
"gitlens.gitExplorer.view": {
|
||||
"type": "string",
|
||||
"default": "auto",
|
||||
"enum": [
|
||||
"auto",
|
||||
"history",
|
||||
"repository"
|
||||
],
|
||||
"description": "Specifies the starting view (mode) of the `GitLens` custom view\n `auto` - shows the last selected view, defaults to `repository`\n `history` - shows the commit history of the active file\n `repository` - shows a repository explorer"
|
||||
},
|
||||
"gitlens.remotes": {
|
||||
"type": "array",
|
||||
"default": null,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"type",
|
||||
"domain"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"Bitbucket",
|
||||
"BitbucketServer",
|
||||
"GitHub",
|
||||
"GitLab"
|
||||
],
|
||||
"description": "Specifies the type of the custom remote service\n `Bitbucket`, `BitbucketServer`, `GitHub`, or `GitLab`"
|
||||
},
|
||||
"domain": {
|
||||
"type": "string",
|
||||
"description": "Specifies the domain name of the custom remote service"
|
||||
}
|
||||
}
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "Specifies any custom domains for remote (code-hosting) services"
|
||||
"description": "Specifies the format of a stashed file in the `Git Stashes` explorer\nAvailable tokens\n ${file} - file name\n ${filePath} - file name and path\n ${path} - file path"
|
||||
},
|
||||
"gitlens.statusBar.enabled": {
|
||||
"type": "boolean",
|
||||
@@ -682,16 +598,16 @@
|
||||
},
|
||||
"editorTitle": {
|
||||
"blame": true,
|
||||
"fileDiff": false,
|
||||
"history": false,
|
||||
"remote": false,
|
||||
"status": false
|
||||
"fileDiff": true,
|
||||
"history": true,
|
||||
"remote": true,
|
||||
"status": true
|
||||
},
|
||||
"editorTitleContext": {
|
||||
"blame": false,
|
||||
"fileDiff": false,
|
||||
"history": false,
|
||||
"remote": false
|
||||
"blame": true,
|
||||
"fileDiff": true,
|
||||
"history": true,
|
||||
"remote": true
|
||||
},
|
||||
"explorerContext": {
|
||||
"fileDiff": true,
|
||||
@@ -849,11 +765,6 @@
|
||||
"title": "Directory Compare",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWith",
|
||||
"title": "Compare File Revisions",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithBranch",
|
||||
"title": "Compare File with Branch...",
|
||||
@@ -861,17 +772,17 @@
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithNext",
|
||||
"title": "Compare File with Next Revision",
|
||||
"title": "Compare File with Next Commit",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithPrevious",
|
||||
"title": "Compare File with Previous Revision",
|
||||
"title": "Compare File with Previous",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffLineWithPrevious",
|
||||
"title": "Compare Line Revision with Previous",
|
||||
"title": "Compare Line Commit with Previous",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
@@ -881,12 +792,12 @@
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithWorking",
|
||||
"title": "Compare File with Working Revision",
|
||||
"title": "Compare File with Working Tree",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffLineWithWorking",
|
||||
"title": "Compare Line Revision with Working",
|
||||
"title": "Compare Line Commit with Working Tree",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
@@ -953,11 +864,7 @@
|
||||
{
|
||||
"command": "gitlens.showCommitSearch",
|
||||
"title": "Search Commits",
|
||||
"category": "GitLens",
|
||||
"icon": {
|
||||
"dark": "images/dark/icon-search.svg",
|
||||
"light": "images/light/icon-search.svg"
|
||||
}
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showFileHistory",
|
||||
@@ -1024,11 +931,6 @@
|
||||
"title": "Open Changed Files",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openBranchesInRemote",
|
||||
"title": "Open Branches in Remote",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openBranchInRemote",
|
||||
"title": "Open Branch in Remote",
|
||||
@@ -1083,71 +985,66 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.switchToHistoryView",
|
||||
"title": "Switch to History View",
|
||||
"command": "gitlens.fileHistoryExplorer.refresh",
|
||||
"title": "Refresh",
|
||||
"category": "GitLens",
|
||||
"icon": {
|
||||
"dark": "images/dark/icon-history.svg",
|
||||
"light": "images/light/icon-history.svg"
|
||||
"dark": "images/dark/icon-refresh.svg",
|
||||
"light": "images/light/icon-refresh.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.switchToRepositoryView",
|
||||
"title": "Switch to Repository View",
|
||||
"category": "GitLens",
|
||||
"icon": {
|
||||
"dark": "images/dark/icon-repo.svg",
|
||||
"light": "images/light/icon-repo.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChanges",
|
||||
"command": "gitlens.fileHistoryExplorer.openChanges",
|
||||
"title": "Open Changes",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangesWithWorking",
|
||||
"title": "Open Changes with Working Tree",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"command": "gitlens.fileHistoryExplorer.openFile",
|
||||
"title": "Open File",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevision",
|
||||
"title": "Open Revision",
|
||||
"command": "gitlens.fileHistoryExplorer.openFileRevision",
|
||||
"title": "Open File Revision",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevisionInRemote",
|
||||
"title": "Open Revision in Remote",
|
||||
"command": "gitlens.fileHistoryExplorer.openFileInRemote",
|
||||
"title": "Open File in Remote",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFiles",
|
||||
"title": "Open Files",
|
||||
"command": "gitlens.fileHistoryExplorer.openFileRevisionInRemote",
|
||||
"title": "Open File Revision in Remote",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChanges",
|
||||
"title": "Open All Changes",
|
||||
"command": "gitlens.stashExplorer.refresh",
|
||||
"title": "Refresh",
|
||||
"category": "GitLens",
|
||||
"icon": {
|
||||
"dark": "images/dark/icon-refresh.svg",
|
||||
"light": "images/light/icon-refresh.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashExplorer.openChanges",
|
||||
"title": "Open Changes",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChangesWithWorking",
|
||||
"title": "Open All Changes with Working Tree",
|
||||
"command": "gitlens.stashExplorer.openFile",
|
||||
"title": "Open File",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileRevisions",
|
||||
"title": "Open Revisions",
|
||||
"command": "gitlens.stashExplorer.openStashedFile",
|
||||
"title": "Open Stashed File",
|
||||
"category": "GitLens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.applyChanges",
|
||||
"title": "Apply Changes",
|
||||
"command": "gitlens.stashExplorer.openFileInRemote",
|
||||
"title": "Open File in Remote",
|
||||
"category": "GitLens"
|
||||
}
|
||||
],
|
||||
@@ -1157,10 +1054,6 @@
|
||||
"command": "gitlens.diffDirectory",
|
||||
"when": "gitlens:enabled"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWith",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithBranch",
|
||||
"when": "gitlens:isTracked"
|
||||
@@ -1277,10 +1170,6 @@
|
||||
"command": "gitlens.openChangedFiles",
|
||||
"when": "gitlens:enabled"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openBranchesInRemote",
|
||||
"when": "gitlens:hasRemotes"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openBranchInRemote",
|
||||
"when": "gitlens:hasRemotes"
|
||||
@@ -1314,51 +1203,47 @@
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.switchToHistoryView",
|
||||
"when": "gitlens:gitExplorer:view == repository"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.switchToRepositoryView",
|
||||
"when": "gitlens:gitExplorer:view == history"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChanges",
|
||||
"command": "gitlens.fileHistoryExplorer.refresh",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangesWithWorking",
|
||||
"command": "gitlens.fileHistoryExplorer.openChanges",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"command": "gitlens.fileHistoryExplorer.openFile",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevision",
|
||||
"command": "gitlens.fileHistoryExplorer.openFileRevision",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevisionInRemote",
|
||||
"command": "gitlens.fileHistoryExplorer.openFileInRemote",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFiles",
|
||||
"command": "gitlens.fileHistoryExplorer.openFileRevisionInRemote",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChanges",
|
||||
"command": "gitlens.stashExplorer.refresh",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChangesWithWorking",
|
||||
"command": "gitlens.stashExplorer.openChanges",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileRevisions",
|
||||
"command": "gitlens.stashExplorer.openFile",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.applyChanges",
|
||||
"command": "gitlens.stashExplorer.openStashedFile",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashExplorer.openFileInRemote",
|
||||
"when": "false"
|
||||
}
|
||||
],
|
||||
@@ -1433,12 +1318,12 @@
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:enabled && gitlens:hasRemotes && config.gitlens.advanced.menus.editorTitle.remote",
|
||||
"when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote",
|
||||
"group": "1_gitlens"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openRepoInRemote",
|
||||
"when": "gitlens:enabled && gitlens:hasRemotes && config.gitlens.advanced.menus.editorTitle.remote",
|
||||
"when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote",
|
||||
"group": "1_gitlens"
|
||||
},
|
||||
{
|
||||
@@ -1470,7 +1355,7 @@
|
||||
"editor/title/context": [
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:enabled && gitlens:hasRemotes && config.gitlens.advanced.menus.editorTitleContext.remote",
|
||||
"when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote",
|
||||
"group": "1_gitlens"
|
||||
},
|
||||
{
|
||||
@@ -1497,7 +1382,7 @@
|
||||
"explorer/context": [
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:enabled && gitlens:hasRemotes && config.gitlens.advanced.menus.explorerContext.remote",
|
||||
"when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.remote",
|
||||
"group": "navigation@100"
|
||||
},
|
||||
{
|
||||
@@ -1526,11 +1411,6 @@
|
||||
"command": "gitlens.closeUnchangedFiles",
|
||||
"when": "gitlens:enabled",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashSave",
|
||||
"when": "gitlens:enabled",
|
||||
"group": "2_gitlens@1"
|
||||
}
|
||||
],
|
||||
"scm/resourceState/context": [
|
||||
@@ -1548,280 +1428,120 @@
|
||||
"command": "gitlens.showQuickFileHistory",
|
||||
"when": "gitlens:enabled",
|
||||
"group": "1_gitlens_1@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashSave",
|
||||
"when": "gitlens:enabled",
|
||||
"group": "2_gitlens@1"
|
||||
}
|
||||
],
|
||||
"view/title": [
|
||||
{
|
||||
"command": "gitlens.showCommitSearch",
|
||||
"when": "view == gitlens.gitExplorer",
|
||||
"command": "gitlens.gitExplorer.refresh",
|
||||
"when": "gitlens:enabled && view == gitlens.gitExplorer",
|
||||
"group": "navigation"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.fileHistoryExplorer.refresh",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer",
|
||||
"group": "navigation"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashSave",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer",
|
||||
"group": "navigation@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.switchToHistoryView",
|
||||
"when": "view == gitlens.gitExplorer && gitlens:gitExplorer:view == repository",
|
||||
"command": "gitlens.stashExplorer.refresh",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer",
|
||||
"group": "navigation@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.switchToRepositoryView",
|
||||
"when": "view == gitlens.gitExplorer && gitlens:gitExplorer:view == history",
|
||||
"group": "navigation@3"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.refresh",
|
||||
"when": "view == gitlens.gitExplorer",
|
||||
"group": "navigation@4"
|
||||
}
|
||||
],
|
||||
"view/item/context": [
|
||||
{
|
||||
"command": "gitlens.openBranchesInRemote",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:branches:remote",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openBranchInRemote",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:branch-history:remote",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openCommitInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"when": "gitlens:enabled && view == gitlens.gitExplorer && viewItem == commit",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:enabled && view == gitlens.gitExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithPrevious",
|
||||
"when": "gitlens:enabled && view == gitlens.gitExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChangesWithWorking",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"command": "gitlens.diffWithWorking",
|
||||
"when": "gitlens:enabled && view == gitlens.gitExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.fileHistoryExplorer.openChanges",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithWorking",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.fileHistoryExplorer.openFile",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFiles",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"group": "3_gitlens@1"
|
||||
"command": "gitlens.fileHistoryExplorer.openFileRevision",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileRevisions",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"group": "3_gitlens@2"
|
||||
"command": "gitlens.fileHistoryExplorer.openFileInRemote",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@3"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.copyShaToClipboard",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"group": "4_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.copyMessageToClipboard",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"group": "4_gitlens@2"
|
||||
"command": "gitlens.fileHistoryExplorer.openFileRevisionInRemote",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@4"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showQuickCommitDetails",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit",
|
||||
"group": "5_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangesWithWorking",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "2_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevision",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "2_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"when": "gitlens:enabled && view == gitlens.fileHistoryExplorer && viewItem == commit-file",
|
||||
"group": "3_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevisionInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "3_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.applyChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "4_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showQuickFileHistory",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file && gitlens:gitExplorer:view == repository",
|
||||
"group": "5_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showQuickCommitFileDetails",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:commit-file",
|
||||
"group": "5_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:file-history",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:file-history",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openBranchesInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:remote",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openRepoInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:remote",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashSave",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stashes",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashApply",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"group": "1_gitlens@1"
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == stash-commit",
|
||||
"group": "3_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashDelete",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"group": "2_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileChangesWithWorking",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"group": "2_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFiles",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == stash-commit",
|
||||
"group": "3_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangedFileRevisions",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"group": "3_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.copyMessageToClipboard",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash",
|
||||
"group": "4_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.applyChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"command": "gitlens.stashExplorer.openChanges",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"group": "2_gitlens@1"
|
||||
"command": "gitlens.stashExplorer.openFile",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangesWithWorking",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"command": "gitlens.stashExplorer.openStashedFile",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@3"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.stashExplorer.openFileInRemote",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == commit-file",
|
||||
"group": "1_gitlens@4"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.diffWithWorking",
|
||||
"when": "gitlens:enabled && view == gitlens.stashExplorer && viewItem == commit-file",
|
||||
"group": "2_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"group": "3_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevision",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"group": "3_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"group": "4_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showQuickFileHistory",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:stash-file",
|
||||
"group": "5_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openRepoInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:status",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChanges",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openChangesWithWorking",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file",
|
||||
"group": "2_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFileRevision",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file",
|
||||
"group": "2_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:status-file",
|
||||
"group": "3_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showQuickFileHistory",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file && gitlens:gitExplorer:view == repository",
|
||||
"group": "5_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.showQuickCommitFileDetails",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file",
|
||||
"group": "5_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.openFile",
|
||||
"when": "view == gitlens.gitExplorer && viewItem == gitlens:status-file-commits",
|
||||
"group": "1_gitlens@1"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.openFileInRemote",
|
||||
"when": "gitlens:hasRemotes && view == gitlens.gitExplorer && viewItem == gitlens:status-file-commits",
|
||||
"group": "1_gitlens@2"
|
||||
},
|
||||
{
|
||||
"command": "gitlens.gitExplorer.refresh",
|
||||
"when": "view == gitlens.gitExplorer && viewItem != gitlens:commit-file && viewItem != gitlens:stash-file && viewItem != gitlens:status-file",
|
||||
"group": "9_gitlens@1"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1920,9 +1640,14 @@
|
||||
"views": {
|
||||
"explorer": [
|
||||
{
|
||||
"id": "gitlens.gitExplorer",
|
||||
"name": "GitLens",
|
||||
"when": "gitlens:enabled && config.gitlens.gitExplorer.enabled"
|
||||
"id": "gitlens.fileHistoryExplorer",
|
||||
"name": "Git File History",
|
||||
"when": "gitlens:enabled && config.gitlens.insiders"
|
||||
},
|
||||
{
|
||||
"id": "gitlens.stashExplorer",
|
||||
"name": "Git Stashes",
|
||||
"when": "gitlens:enabled"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1944,25 +1669,26 @@
|
||||
"dependencies": {
|
||||
"applicationinsights": "0.21.0",
|
||||
"copy-paste": "1.3.0",
|
||||
"iconv-lite": "0.4.19",
|
||||
"ignore": "3.3.5",
|
||||
"iconv-lite": "0.4.18",
|
||||
"ignore": "3.3.4",
|
||||
"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",
|
||||
"string-width": "2.1.1",
|
||||
"tmp": "0.0.33"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/copy-paste": "1.1.30",
|
||||
"@types/iconv-lite": "0.0.1",
|
||||
"@types/mocha": "2.2.43",
|
||||
"@types/node": "8.0.31",
|
||||
"@types/mocha": "2.2.42",
|
||||
"@types/node": "8.0.25",
|
||||
"@types/tmp": "0.0.33",
|
||||
"mocha": "3.5.3",
|
||||
"mocha": "3.5.0",
|
||||
"tslint": "5.7.0",
|
||||
"typescript": "2.5.3",
|
||||
"typescript": "2.4.2",
|
||||
"vscode": "1.1.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@ export class AnnotationController extends Disposable {
|
||||
}
|
||||
|
||||
getProvider(editor: TextEditor | undefined): AnnotationProviderBase | undefined {
|
||||
if (editor === undefined || editor.document === undefined || !this.git.isEditorBlameable(editor)) return undefined;
|
||||
if (!editor || !editor.document || !this.git.isEditorBlameable(editor)) return undefined;
|
||||
|
||||
return this._annotationProviders.get(editor.viewColumn || -1);
|
||||
}
|
||||
@@ -233,7 +233,7 @@ export class AnnotationController extends Disposable {
|
||||
if (!editor || !editor.document || !this.git.isEditorBlameable(editor)) return false;
|
||||
|
||||
const currentProvider = this._annotationProviders.get(editor.viewColumn || -1);
|
||||
if (currentProvider !== undefined && TextEditorComparer.equals(currentProvider.editor, editor)) {
|
||||
if (currentProvider && TextEditorComparer.equals(currentProvider.editor, editor)) {
|
||||
await currentProvider.selection(shaOrLine);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { Dates, Objects, Strings } from '../system';
|
||||
import { DecorationInstanceRenderOptions, DecorationOptions, MarkdownString, ThemableDecorationRenderOptions } from 'vscode';
|
||||
import { DiffWithCommand, OpenCommitInRemoteCommand, ShowQuickCommitDetailsCommand } from '../commands';
|
||||
import { Strings } from '../system';
|
||||
import { DecorationInstanceRenderOptions, DecorationOptions, ThemableDecorationRenderOptions } from 'vscode';
|
||||
import { IThemeConfig, themeDefaults } from '../configuration';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { CommitFormatter, GitCommit, GitDiffChunkLine, GitService, GitUri, ICommitFormatOptions } from '../gitService';
|
||||
import * as moment from 'moment';
|
||||
|
||||
interface IHeatmapConfig {
|
||||
enabled: boolean;
|
||||
@@ -27,13 +27,13 @@ const escapeMarkdownRegEx = /[`\>\#\*\_\-\+\.]/g;
|
||||
|
||||
export class Annotations {
|
||||
|
||||
static applyHeatmap(decoration: DecorationOptions, date: Date, now: number) {
|
||||
static applyHeatmap(decoration: DecorationOptions, date: Date, now: moment.Moment) {
|
||||
const color = this._getHeatmapColor(now, date);
|
||||
(decoration.renderOptions!.before! as any).borderColor = color;
|
||||
}
|
||||
|
||||
private static _getHeatmapColor(now: number, date: Date) {
|
||||
const days = Dates.dateDaysFromNow(date, now);
|
||||
private static _getHeatmapColor(now: moment.Moment, date: Date) {
|
||||
const days = now.diff(moment(date), 'days');
|
||||
|
||||
if (days <= 2) return '#ffeca7';
|
||||
if (days <= 7) return '#ffdd8c';
|
||||
@@ -47,7 +47,7 @@ export class Annotations {
|
||||
return '#793738';
|
||||
}
|
||||
|
||||
static getHoverMessage(commit: GitCommit, dateFormat: string | null, hasRemotes: boolean): MarkdownString {
|
||||
static getHoverMessage(commit: GitCommit, dateFormat: string | null): string | string[] {
|
||||
if (dateFormat === null) {
|
||||
dateFormat = 'MMMM Do, YYYY h:MMa';
|
||||
}
|
||||
@@ -63,25 +63,16 @@ export class Annotations {
|
||||
.replace(/\n/g, ' \n');
|
||||
message = `\n\n> ${message}`;
|
||||
}
|
||||
|
||||
const openInRemoteCommand = hasRemotes
|
||||
? `${' '.repeat(3)} [\`${GlyphChars.ArrowUpRight}\`](${OpenCommitInRemoteCommand.getMarkdownCommandArgs(commit.sha)} "Open in Remote")`
|
||||
: '';
|
||||
|
||||
const markdown = new MarkdownString(`[\`${commit.shortSha}\`](${ShowQuickCommitDetailsCommand.getMarkdownCommandArgs(commit.sha)} "Show Commit Details") __${commit.author}__, ${commit.fromNow()} _(${commit.formatDate(dateFormat)})_ ${openInRemoteCommand} ${message}`);
|
||||
markdown.isTrusted = true;
|
||||
return markdown;
|
||||
return `\`${commit.shortSha}\` __${commit.author}__, ${moment(commit.date).fromNow()} _(${moment(commit.date).format(dateFormat)})_${message}`;
|
||||
}
|
||||
|
||||
static getHoverDiffMessage(commit: GitCommit, chunkLine: GitDiffChunkLine | undefined): MarkdownString | undefined {
|
||||
static getHoverDiffMessage(commit: GitCommit, chunkLine: GitDiffChunkLine | undefined): string | undefined {
|
||||
if (chunkLine === undefined) return undefined;
|
||||
|
||||
const codeDiff = this._getCodeDiff(chunkLine);
|
||||
const markdown = new MarkdownString(commit.isUncommitted
|
||||
? `[\`Changes\`](${DiffWithCommand.getMarkdownCommandArgs(commit)} "Open Changes") ${GlyphChars.Dash} _uncommitted_\n${codeDiff}`
|
||||
: `[\`Changes\`](${DiffWithCommand.getMarkdownCommandArgs(commit)} "Open Changes") ${GlyphChars.Dash} [\`${commit.previousShortSha}\`](${ShowQuickCommitDetailsCommand.getMarkdownCommandArgs(commit.previousSha!)} "Show Commit Details") ${GlyphChars.ArrowLeftRight} [\`${commit.shortSha}\`](${ShowQuickCommitDetailsCommand.getMarkdownCommandArgs(commit.sha)} "Show Commit Details")\n${codeDiff}`);
|
||||
markdown.isTrusted = true;
|
||||
return markdown;
|
||||
return commit.isUncommitted
|
||||
? `\`Changes\` ${GlyphChars.Dash} _uncommitted_\n${codeDiff}`
|
||||
: `\`Changes\` ${GlyphChars.Dash} \`${commit.previousShortSha}\` ${GlyphChars.ArrowLeftRight} \`${commit.shortSha}\`\n${codeDiff}`;
|
||||
}
|
||||
|
||||
private static _getCodeDiff(chunkLine: GitDiffChunkLine): string {
|
||||
@@ -101,22 +92,22 @@ export class Annotations {
|
||||
} as DecorationOptions;
|
||||
}
|
||||
|
||||
static detailsHover(commit: GitCommit, dateFormat: string | null, hasRemotes: boolean): DecorationOptions {
|
||||
const message = this.getHoverMessage(commit, dateFormat, hasRemotes);
|
||||
static detailsHover(commit: GitCommit, dateFormat: string | null): DecorationOptions {
|
||||
const message = this.getHoverMessage(commit, dateFormat);
|
||||
return {
|
||||
hoverMessage: message
|
||||
} as DecorationOptions;
|
||||
}
|
||||
|
||||
static gutter(commit: GitCommit, format: string, dateFormatOrFormatOptions: string | null | ICommitFormatOptions, renderOptions: IRenderOptions): DecorationOptions {
|
||||
const message = CommitFormatter.fromTemplate(format, commit, dateFormatOrFormatOptions);
|
||||
const content = Strings.pad(CommitFormatter.fromTemplate(format, commit, dateFormatOrFormatOptions), 1, 1);
|
||||
|
||||
return {
|
||||
renderOptions: {
|
||||
before: {
|
||||
...renderOptions.before,
|
||||
...{
|
||||
contentText: Strings.pad(message.replace(/ /g, GlyphChars.Space), 1, 1)
|
||||
contentText: content
|
||||
}
|
||||
},
|
||||
dark: {
|
||||
@@ -133,23 +124,9 @@ export class Annotations {
|
||||
} as DecorationOptions;
|
||||
}
|
||||
|
||||
static gutterRenderOptions(cfgTheme: IThemeConfig, heatmap: IHeatmapConfig, options: ICommitFormatOptions): IRenderOptions {
|
||||
static gutterRenderOptions(cfgTheme: IThemeConfig, heatmap: IHeatmapConfig): IRenderOptions {
|
||||
const cfgFileTheme = cfgTheme.annotations.file.gutter;
|
||||
|
||||
// Try to get the width of the string, if there is a cap
|
||||
let width = 4; // Start with a padding
|
||||
for (const token of Objects.values(options.tokenOptions!)) {
|
||||
if (token === undefined) continue;
|
||||
|
||||
// If any token is uncapped, kick out and set no max
|
||||
if (token.truncateTo == null) {
|
||||
width = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
width += token.truncateTo;
|
||||
}
|
||||
|
||||
let borderStyle = undefined;
|
||||
let borderWidth = undefined;
|
||||
if (heatmap.enabled) {
|
||||
@@ -166,8 +143,7 @@ export class Annotations {
|
||||
borderStyle: borderStyle,
|
||||
borderWidth: borderWidth,
|
||||
height: '100%',
|
||||
margin: '0 26px -1px 0',
|
||||
width: (width > 4) ? `${width}ch` : undefined
|
||||
margin: '0 26px -1px 0'
|
||||
},
|
||||
dark: {
|
||||
backgroundColor: cfgFileTheme.dark.backgroundColor || undefined,
|
||||
@@ -182,12 +158,11 @@ export class Annotations {
|
||||
} as IRenderOptions;
|
||||
}
|
||||
|
||||
static hover(commit: GitCommit, renderOptions: IRenderOptions, now: number): DecorationOptions {
|
||||
const decoration = {
|
||||
renderOptions: { before: { ...renderOptions.before } }
|
||||
static hover(commit: GitCommit, renderOptions: IRenderOptions, heatmap: boolean, dateFormat: string | null): DecorationOptions {
|
||||
return {
|
||||
hoverMessage: this.getHoverMessage(commit, dateFormat),
|
||||
renderOptions: heatmap ? { before: { ...renderOptions.before } } : undefined
|
||||
} as DecorationOptions;
|
||||
this.applyHeatmap(decoration, commit.date, now);
|
||||
return decoration;
|
||||
}
|
||||
|
||||
static hoverRenderOptions(cfgTheme: IThemeConfig, heatmap: IHeatmapConfig): IRenderOptions {
|
||||
@@ -206,15 +181,11 @@ export class Annotations {
|
||||
}
|
||||
|
||||
static trailing(commit: GitCommit, format: string, dateFormat: string | null, cfgTheme: IThemeConfig): DecorationOptions {
|
||||
const message = CommitFormatter.fromTemplate(format, commit, {
|
||||
truncateMessageAtNewLine: true,
|
||||
dateFormat: dateFormat
|
||||
} as ICommitFormatOptions);
|
||||
|
||||
const message = CommitFormatter.fromTemplate(format, commit, dateFormat);
|
||||
return {
|
||||
renderOptions: {
|
||||
after: {
|
||||
contentText: Strings.pad(message.replace(/ /g, GlyphChars.Space), 1, 1)
|
||||
contentText: Strings.pad(message, 1, 1)
|
||||
},
|
||||
dark: {
|
||||
after: {
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
'use strict';
|
||||
import { Iterables } from '../system';
|
||||
import { CancellationToken, Disposable, ExtensionContext, Hover, HoverProvider, languages, Position, Range, TextDocument, TextEditor, TextEditorDecorationType } from 'vscode';
|
||||
import { ExtensionContext, Range, TextEditor, TextEditorDecorationType } from 'vscode';
|
||||
import { AnnotationProviderBase } from './annotationProvider';
|
||||
import { Annotations, endOfLineIndex } from './annotations';
|
||||
import { GitBlame, GitCommit, GitService, GitUri } from '../gitService';
|
||||
import { GitBlame, GitService, GitUri } from '../gitService';
|
||||
import { WhitespaceController } from './whitespaceController';
|
||||
|
||||
export abstract class BlameAnnotationProviderBase extends AnnotationProviderBase implements HoverProvider {
|
||||
export abstract class BlameAnnotationProviderBase extends AnnotationProviderBase {
|
||||
|
||||
protected _blame: Promise<GitBlame | undefined>;
|
||||
protected _hoverProviderDisposable: Disposable;
|
||||
|
||||
constructor(context: ExtensionContext, editor: TextEditor, decoration: TextEditorDecorationType | undefined, highlightDecoration: TextEditorDecorationType | undefined, whitespaceController: WhitespaceController | undefined, protected git: GitService, protected uri: GitUri) {
|
||||
super(context, editor, decoration, highlightDecoration, whitespaceController);
|
||||
@@ -17,11 +15,6 @@ export abstract class BlameAnnotationProviderBase extends AnnotationProviderBase
|
||||
this._blame = this.git.getBlameForFile(this.uri);
|
||||
}
|
||||
|
||||
async clear() {
|
||||
this._hoverProviderDisposable && this._hoverProviderDisposable.dispose();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
async selection(shaOrLine?: string | number, blame?: GitBlame) {
|
||||
if (!this.highlightDecoration) return;
|
||||
|
||||
@@ -63,7 +56,6 @@ export abstract class BlameAnnotationProviderBase extends AnnotationProviderBase
|
||||
const blame = await this._blame;
|
||||
return blame !== undefined && blame.lines.length !== 0;
|
||||
}
|
||||
|
||||
protected async getBlame(requiresWhitespaceHack: boolean): Promise<GitBlame | undefined> {
|
||||
let whitespacePromise: Promise<void> | undefined;
|
||||
// HACK: Until https://github.com/Microsoft/vscode/issues/11485 is fixed -- override whitespace (turn off)
|
||||
@@ -72,47 +64,18 @@ export abstract class BlameAnnotationProviderBase extends AnnotationProviderBase
|
||||
}
|
||||
|
||||
let blame: GitBlame | undefined;
|
||||
if (whitespacePromise !== undefined) {
|
||||
if (whitespacePromise) {
|
||||
[blame] = await Promise.all([this._blame, whitespacePromise]);
|
||||
}
|
||||
else {
|
||||
blame = await this._blame;
|
||||
}
|
||||
|
||||
if (blame === undefined || blame.lines.length === 0) {
|
||||
if (blame === undefined || !blame.lines.length) {
|
||||
this.whitespaceController && await this.whitespaceController.restore();
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return blame;
|
||||
}
|
||||
|
||||
registerHoverProvider() {
|
||||
this._hoverProviderDisposable = languages.registerHoverProvider({ pattern: this.uri.fsPath }, this);
|
||||
}
|
||||
|
||||
async provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise<Hover | undefined> {
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
if (this._config.blame.line.enabled && this.editor.selection.start.line === position.line) return undefined;
|
||||
|
||||
const cfg = this._config.annotations.file.gutter;
|
||||
if (!cfg.hover.wholeLine && position.character !== 0) return undefined;
|
||||
|
||||
const blame = await this.getBlame(true);
|
||||
if (blame === undefined) return undefined;
|
||||
|
||||
const line = blame.lines[position.line - this.uri.offset];
|
||||
|
||||
const commit = blame.commits.get(line.sha);
|
||||
if (commit === undefined) return undefined;
|
||||
|
||||
// Get the full commit message -- since blame only returns the summary
|
||||
let logCommit: GitCommit | undefined = undefined;
|
||||
if (!commit.isUncommitted) {
|
||||
logCommit = await this.git.getLogCommit(commit.repoPath, commit.uri.fsPath, commit.sha);
|
||||
}
|
||||
|
||||
const message = Annotations.getHoverMessage(logCommit || commit, this._config.defaultDateFormat, this.git.hasRemotes(commit.repoPath));
|
||||
return new Hover(message, document.validateRange(new Range(position.line, 0, position.line, endOfLineIndex)));
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,11 @@
|
||||
import { Strings } from '../system';
|
||||
import { DecorationOptions, Range } from 'vscode';
|
||||
import { FileAnnotationType } from './annotationController';
|
||||
import { Annotations } from './annotations';
|
||||
import { Annotations, endOfLineIndex } from './annotations';
|
||||
import { BlameAnnotationProviderBase } from './blameAnnotationProvider';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { GitBlameCommit, ICommitFormatOptions } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import * as moment from 'moment';
|
||||
|
||||
export class GutterBlameAnnotationProvider extends BlameAnnotationProviderBase {
|
||||
|
||||
@@ -16,7 +16,7 @@ export class GutterBlameAnnotationProvider extends BlameAnnotationProviderBase {
|
||||
const blame = await this.getBlame(true);
|
||||
if (blame === undefined) return false;
|
||||
|
||||
const start = process.hrtime();
|
||||
// console.time('Computing blame annotations...');
|
||||
|
||||
const cfg = this._config.annotations.file.gutter;
|
||||
|
||||
@@ -32,97 +32,90 @@ export class GutterBlameAnnotationProvider extends BlameAnnotationProviderBase {
|
||||
tokenOptions: tokenOptions
|
||||
};
|
||||
|
||||
const now = Date.now();
|
||||
const now = moment();
|
||||
const offset = this.uri.offset;
|
||||
const renderOptions = Annotations.gutterRenderOptions(this._config.theme, cfg.heatmap, options);
|
||||
const renderOptions = Annotations.gutterRenderOptions(this._config.theme, cfg.heatmap);
|
||||
const dateFormat = this._config.defaultDateFormat;
|
||||
const separateLines = this._config.theme.annotations.file.gutter.separateLines;
|
||||
|
||||
const decorations: DecorationOptions[] = [];
|
||||
const decorationsMap: { [sha: string]: DecorationOptions | undefined } = Object.create(null);
|
||||
const document = this.document;
|
||||
|
||||
let commit: GitBlameCommit | undefined;
|
||||
let compacted = false;
|
||||
let details: DecorationOptions | undefined;
|
||||
let gutter: DecorationOptions | undefined;
|
||||
let previousSha: string | undefined;
|
||||
|
||||
for (const l of blame.lines) {
|
||||
commit = blame.commits.get(l.sha);
|
||||
if (commit === undefined) continue;
|
||||
|
||||
const line = l.line + offset;
|
||||
|
||||
if (previousSha === l.sha) {
|
||||
// Use a shallow copy of the previous decoration options
|
||||
gutter = { ...gutter } as DecorationOptions;
|
||||
|
||||
if (cfg.compact && !compacted) {
|
||||
// Since we are wiping out the contextText make sure to copy the objects
|
||||
gutter.renderOptions = {
|
||||
...gutter.renderOptions,
|
||||
before: {
|
||||
...gutter.renderOptions!.before,
|
||||
contentText: GlyphChars.Space.repeat(Strings.width(gutter.renderOptions!.before!.contentText!))
|
||||
}
|
||||
gutter.renderOptions = { ...gutter.renderOptions };
|
||||
gutter.renderOptions.before = {
|
||||
...gutter.renderOptions.before,
|
||||
...{ contentText: GlyphChars.Space.repeat(gutter.renderOptions!.before!.contentText!.length) }
|
||||
};
|
||||
|
||||
if (separateLines) {
|
||||
gutter.renderOptions.dark = {
|
||||
...gutter.renderOptions.dark,
|
||||
before: { ...gutter.renderOptions.dark!.before, textDecoration: 'none' }
|
||||
};
|
||||
gutter.renderOptions.light = {
|
||||
...gutter.renderOptions.light,
|
||||
before: { ...gutter.renderOptions.light!.before, textDecoration: 'none' }
|
||||
};
|
||||
gutter.renderOptions.dark = { ...gutter.renderOptions.dark };
|
||||
gutter.renderOptions.dark.before = { ...gutter.renderOptions.dark.before, ...{ textDecoration: 'none' } };
|
||||
gutter.renderOptions.light = { ...gutter.renderOptions.light };
|
||||
gutter.renderOptions.light.before = { ...gutter.renderOptions.light.before, ...{ textDecoration: 'none' } };
|
||||
}
|
||||
|
||||
compacted = true;
|
||||
}
|
||||
|
||||
gutter.range = new Range(line, 0, line, 0);
|
||||
|
||||
const endIndex = document.lineAt(line).firstNonWhitespaceCharacterIndex;
|
||||
gutter.range = new Range(line, 0, line, endIndex);
|
||||
decorations.push(gutter);
|
||||
|
||||
if (details !== undefined) {
|
||||
details = { ...details } as DecorationOptions;
|
||||
details.range = cfg.hover.wholeLine
|
||||
? document.validateRange(new Range(line, 0, line, endOfLineIndex))
|
||||
: gutter.range;
|
||||
decorations.push(details);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
compacted = false;
|
||||
previousSha = l.sha;
|
||||
|
||||
gutter = decorationsMap[l.sha];
|
||||
if (gutter !== undefined) {
|
||||
gutter = {
|
||||
...gutter,
|
||||
range: new Range(line, 0, line, 0)
|
||||
} as DecorationOptions;
|
||||
|
||||
decorations.push(gutter);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
commit = blame.commits.get(l.sha);
|
||||
if (commit === undefined) continue;
|
||||
|
||||
gutter = Annotations.gutter(commit, cfg.format, options, renderOptions);
|
||||
|
||||
if (cfg.heatmap.enabled) {
|
||||
Annotations.applyHeatmap(gutter, commit.date, now);
|
||||
}
|
||||
|
||||
gutter.range = new Range(line, 0, line, 0);
|
||||
|
||||
const endIndex = document.lineAt(line).firstNonWhitespaceCharacterIndex;
|
||||
gutter.range = new Range(line, 0, line, endIndex);
|
||||
decorations.push(gutter);
|
||||
decorationsMap[l.sha] = gutter;
|
||||
|
||||
if (cfg.hover.details) {
|
||||
details = Annotations.detailsHover(commit, dateFormat);
|
||||
details.range = cfg.hover.wholeLine
|
||||
? document.validateRange(new Range(line, 0, line, endOfLineIndex))
|
||||
: gutter.range;
|
||||
decorations.push(details);
|
||||
}
|
||||
}
|
||||
|
||||
if (decorations.length) {
|
||||
this.editor.setDecorations(this.decoration!, decorations);
|
||||
}
|
||||
|
||||
const duration = process.hrtime(start);
|
||||
Logger.log(`${(duration[0] * 1000) + Math.floor(duration[1] / 1000000)} ms to compute gutter blame annotations`);
|
||||
|
||||
if (cfg.hover.details) {
|
||||
this.registerHoverProvider();
|
||||
}
|
||||
// console.timeEnd('Computing blame annotations...');
|
||||
|
||||
this.selection(shaOrLine, blame);
|
||||
return true;
|
||||
|
||||
@@ -1,70 +1,63 @@
|
||||
'use strict';
|
||||
import { DecorationOptions, Range } from 'vscode';
|
||||
import { FileAnnotationType } from './annotationController';
|
||||
import { Annotations } from './annotations';
|
||||
import { Annotations, endOfLineIndex } from './annotations';
|
||||
import { BlameAnnotationProviderBase } from './blameAnnotationProvider';
|
||||
import { GitBlameCommit } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import * as moment from 'moment';
|
||||
|
||||
export class HoverBlameAnnotationProvider extends BlameAnnotationProviderBase {
|
||||
|
||||
async provideAnnotation(shaOrLine?: string | number): Promise<boolean> {
|
||||
this.annotationType = FileAnnotationType.Hover;
|
||||
|
||||
const cfg = this._config.annotations.file.hover;
|
||||
|
||||
const blame = await this.getBlame(cfg.heatmap.enabled);
|
||||
const blame = await this.getBlame(this._config.annotations.file.hover.heatmap.enabled);
|
||||
if (blame === undefined) return false;
|
||||
|
||||
if (cfg.heatmap.enabled) {
|
||||
const start = process.hrtime();
|
||||
// console.time('Computing blame annotations...');
|
||||
|
||||
const now = Date.now();
|
||||
const offset = this.uri.offset;
|
||||
const renderOptions = Annotations.hoverRenderOptions(this._config.theme, cfg.heatmap);
|
||||
const cfg = this._config.annotations.file.hover;
|
||||
|
||||
const decorations: DecorationOptions[] = [];
|
||||
const decorationsMap: { [sha: string]: DecorationOptions } = Object.create(null);
|
||||
const now = moment();
|
||||
const offset = this.uri.offset;
|
||||
const renderOptions = Annotations.hoverRenderOptions(this._config.theme, cfg.heatmap);
|
||||
const dateFormat = this._config.defaultDateFormat;
|
||||
|
||||
let commit: GitBlameCommit | undefined;
|
||||
let hover: DecorationOptions | undefined;
|
||||
const decorations: DecorationOptions[] = [];
|
||||
const document = this.document;
|
||||
|
||||
for (const l of blame.lines) {
|
||||
const line = l.line + offset;
|
||||
let commit: GitBlameCommit | undefined;
|
||||
let hover: DecorationOptions | undefined;
|
||||
|
||||
hover = decorationsMap[l.sha];
|
||||
for (const l of blame.lines) {
|
||||
commit = blame.commits.get(l.sha);
|
||||
if (commit === undefined) continue;
|
||||
|
||||
if (hover !== undefined) {
|
||||
hover = {
|
||||
...hover,
|
||||
range: new Range(line, 0, line, 0)
|
||||
} as DecorationOptions;
|
||||
const line = l.line + offset;
|
||||
|
||||
decorations.push(hover);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
commit = blame.commits.get(l.sha);
|
||||
if (commit === undefined) continue;
|
||||
|
||||
hover = Annotations.hover(commit, renderOptions, now);
|
||||
hover.range = new Range(line, 0, line, 0);
|
||||
|
||||
decorations.push(hover);
|
||||
decorationsMap[l.sha] = hover;
|
||||
hover = Annotations.hover(commit, renderOptions, cfg.heatmap.enabled, dateFormat);
|
||||
|
||||
if (cfg.wholeLine) {
|
||||
hover.range = document.validateRange(new Range(line, 0, line, endOfLineIndex));
|
||||
}
|
||||
else {
|
||||
const endIndex = document.lineAt(line).firstNonWhitespaceCharacterIndex;
|
||||
hover.range = new Range(line, 0, line, endIndex);
|
||||
}
|
||||
|
||||
if (decorations.length) {
|
||||
this.editor.setDecorations(this.decoration!, decorations);
|
||||
if (cfg.heatmap.enabled) {
|
||||
Annotations.applyHeatmap(hover, commit.date, now);
|
||||
}
|
||||
|
||||
const duration = process.hrtime(start);
|
||||
Logger.log(`${(duration[0] * 1000) + Math.floor(duration[1] / 1000000)} ms to compute hover blame annotations`);
|
||||
decorations.push(hover);
|
||||
}
|
||||
|
||||
this.registerHoverProvider();
|
||||
if (decorations.length) {
|
||||
this.editor.setDecorations(this.decoration!, decorations);
|
||||
}
|
||||
|
||||
// console.timeEnd('Computing blame annotations...');
|
||||
|
||||
this.selection(shaOrLine, blame);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
'use strict';
|
||||
import { DecorationOptions, ExtensionContext, MarkdownString, Position, Range, TextEditor, TextEditorDecorationType } from 'vscode';
|
||||
import { DecorationOptions, ExtensionContext, Position, Range, TextEditor, TextEditorDecorationType } from 'vscode';
|
||||
import { Annotations, endOfLineIndex } from './annotations';
|
||||
import { FileAnnotationType } from './annotationController';
|
||||
import { AnnotationProviderBase } from './annotationProvider';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
|
||||
export class RecentChangesAnnotationProvider extends AnnotationProviderBase {
|
||||
|
||||
@@ -21,8 +20,6 @@ export class RecentChangesAnnotationProvider extends AnnotationProviderBase {
|
||||
const diff = await this.git.getDiffForFile(this.uri, commit.previousSha);
|
||||
if (diff === undefined) return false;
|
||||
|
||||
const start = process.hrtime();
|
||||
|
||||
const cfg = this._config.annotations.file.recentChanges;
|
||||
const dateFormat = this._config.defaultDateFormat;
|
||||
|
||||
@@ -37,16 +34,21 @@ export class RecentChangesAnnotationProvider extends AnnotationProviderBase {
|
||||
|
||||
if (line.state === 'unchanged') continue;
|
||||
|
||||
const range = this.editor.document.validateRange(new Range(new Position(count, 0), new Position(count, endOfLineIndex)));
|
||||
let endingIndex = 0;
|
||||
if (cfg.hover.details || cfg.hover.changes) {
|
||||
endingIndex = cfg.hover.wholeLine ? endOfLineIndex : this.editor.document.lineAt(count).firstNonWhitespaceCharacterIndex;
|
||||
}
|
||||
|
||||
const range = this.editor.document.validateRange(new Range(new Position(count, 0), new Position(count, endingIndex)));
|
||||
|
||||
if (cfg.hover.details) {
|
||||
decorators.push({
|
||||
hoverMessage: Annotations.getHoverMessage(commit, dateFormat, this.git.hasRemotes(commit.repoPath)),
|
||||
hoverMessage: Annotations.getHoverMessage(commit, dateFormat),
|
||||
range: range
|
||||
} as DecorationOptions);
|
||||
}
|
||||
|
||||
let message: MarkdownString | undefined = undefined;
|
||||
let message: string | undefined = undefined;
|
||||
if (cfg.hover.changes) {
|
||||
message = Annotations.getHoverDiffMessage(commit, line);
|
||||
}
|
||||
@@ -60,9 +62,6 @@ export class RecentChangesAnnotationProvider extends AnnotationProviderBase {
|
||||
|
||||
this.editor.setDecorations(this.highlightDecoration!, decorators);
|
||||
|
||||
const duration = process.hrtime(start);
|
||||
Logger.log(`${(duration[0] * 1000) + Math.floor(duration[1] / 1000000)} ms to compute recent changes annotations`);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,14 +8,12 @@ export * from './commands/copyShaToClipboard';
|
||||
export * from './commands/diffDirectory';
|
||||
export * from './commands/diffLineWithPrevious';
|
||||
export * from './commands/diffLineWithWorking';
|
||||
export * from './commands/diffWith';
|
||||
export * from './commands/diffWithBranch';
|
||||
export * from './commands/diffWithNext';
|
||||
export * from './commands/diffWithPrevious';
|
||||
export * from './commands/diffWithRevision';
|
||||
export * from './commands/diffWithWorking';
|
||||
export * from './commands/openChangedFiles';
|
||||
export * from './commands/openBranchesInRemote';
|
||||
export * from './commands/openBranchInRemote';
|
||||
export * from './commands/openCommitInRemote';
|
||||
export * from './commands/openFileInRemote';
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
'use strict';
|
||||
import { commands, Disposable, SourceControlResourceGroup, SourceControlResourceState, TextDocumentShowOptions, TextEditor, TextEditorEdit, Uri, window, workspace } from 'vscode';
|
||||
import { ExplorerNode } from '../views/explorerNodes';
|
||||
import { GitBranch, GitCommit, GitRemote } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Telemetry } from '../telemetry';
|
||||
|
||||
@@ -11,7 +10,6 @@ export type Commands =
|
||||
'gitlens.copyMessageToClipboard' |
|
||||
'gitlens.copyShaToClipboard' |
|
||||
'gitlens.diffDirectory' |
|
||||
'gitlens.diffWith' |
|
||||
'gitlens.diffWithBranch' |
|
||||
'gitlens.diffWithNext' |
|
||||
'gitlens.diffWithPrevious' |
|
||||
@@ -20,7 +18,6 @@ export type Commands =
|
||||
'gitlens.diffWithWorking' |
|
||||
'gitlens.diffLineWithWorking' |
|
||||
'gitlens.openChangedFiles' |
|
||||
'gitlens.openBranchesInRemote' |
|
||||
'gitlens.openBranchInRemote' |
|
||||
'gitlens.openCommitInRemote' |
|
||||
'gitlens.openFileInRemote' |
|
||||
@@ -53,7 +50,6 @@ export const Commands = {
|
||||
CopyMessageToClipboard: 'gitlens.copyMessageToClipboard' as Commands,
|
||||
CopyShaToClipboard: 'gitlens.copyShaToClipboard' as Commands,
|
||||
DiffDirectory: 'gitlens.diffDirectory' as Commands,
|
||||
DiffWith: 'gitlens.diffWith' as Commands,
|
||||
DiffWithBranch: 'gitlens.diffWithBranch' as Commands,
|
||||
DiffWithNext: 'gitlens.diffWithNext' as Commands,
|
||||
DiffWithPrevious: 'gitlens.diffWithPrevious' as Commands,
|
||||
@@ -62,7 +58,6 @@ export const Commands = {
|
||||
DiffWithWorking: 'gitlens.diffWithWorking' as Commands,
|
||||
DiffLineWithWorking: 'gitlens.diffLineWithWorking' as Commands,
|
||||
OpenChangedFiles: 'gitlens.openChangedFiles' as Commands,
|
||||
OpenBranchesInRemote: 'gitlens.openBranchesInRemote' as Commands,
|
||||
OpenBranchInRemote: 'gitlens.openBranchInRemote' as Commands,
|
||||
OpenCommitInRemote: 'gitlens.openCommitInRemote' as Commands,
|
||||
OpenFileInRemote: 'gitlens.openFileInRemote' as Commands,
|
||||
@@ -130,22 +125,6 @@ export interface CommandViewContext extends CommandBaseContext {
|
||||
node: ExplorerNode;
|
||||
}
|
||||
|
||||
export function isCommandViewContextWithBranch(context: CommandContext): context is CommandViewContext & { node: (ExplorerNode & { branch: GitBranch }) } {
|
||||
return context.type === 'view' && (context.node as any).branch && (context.node as any).branch instanceof GitBranch;
|
||||
}
|
||||
|
||||
interface ICommandViewContextWithCommit<T extends GitCommit> extends CommandViewContext {
|
||||
node: (ExplorerNode & { commit: T });
|
||||
}
|
||||
|
||||
export function isCommandViewContextWithCommit<T extends GitCommit>(context: CommandContext): context is ICommandViewContextWithCommit<T> {
|
||||
return context.type === 'view' && (context.node as any).commit && (context.node as any).commit instanceof GitCommit;
|
||||
}
|
||||
|
||||
export function isCommandViewContextWithRemote(context: CommandContext): context is CommandViewContext & { node: (ExplorerNode & { remote: GitRemote }) } {
|
||||
return context.type === 'view' && (context.node as any).remote && (context.node as any).remote instanceof GitRemote;
|
||||
}
|
||||
|
||||
export type CommandContext = CommandScmGroupsContext | CommandScmStatesContext | CommandUnknownContext | CommandUriContext | CommandViewContext;
|
||||
|
||||
function isScmResourceGroup(group: any): group is SourceControlResourceGroup {
|
||||
@@ -168,10 +147,6 @@ function isTextEditor(editor: any): editor is TextEditor {
|
||||
|
||||
export abstract class Command extends Disposable {
|
||||
|
||||
static getMarkdownCommandArgsCore<T>(command: Commands, args: T): string {
|
||||
return `command:${command}?${encodeURIComponent(JSON.stringify(args))}`;
|
||||
}
|
||||
|
||||
protected readonly contextParsingOptions: CommandContextParsingOptions = { editor: false, uri: false };
|
||||
|
||||
private _disposable: Disposable;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
import { Iterables } from '../system';
|
||||
import { TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithCommit } from './common';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { copy } from 'copy-paste';
|
||||
@@ -17,16 +17,6 @@ export class CopyMessageToClipboardCommand extends ActiveEditorCommand {
|
||||
super(Commands.CopyMessageToClipboard);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: CopyMessageToClipboardCommandArgs = {}): Promise<any> {
|
||||
if (isCommandViewContextWithCommit(context)) {
|
||||
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: CopyMessageToClipboardCommandArgs = {}): Promise<any> {
|
||||
uri = getCommandUri(uri, editor);
|
||||
|
||||
@@ -74,7 +64,7 @@ export class CopyMessageToClipboardCommand extends ActiveEditorCommand {
|
||||
|
||||
// Get the full commit message -- since blame only returns the summary
|
||||
const commit = await this.git.getLogCommit(gitUri.repoPath, gitUri.fsPath, args.sha);
|
||||
if (commit === undefined) return undefined;
|
||||
if (!commit) return undefined;
|
||||
|
||||
args.message = commit.message;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
import { Iterables } from '../system';
|
||||
import { TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithCommit } from './common';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { copy } from 'copy-paste';
|
||||
@@ -16,16 +16,6 @@ export class CopyShaToClipboardCommand extends ActiveEditorCommand {
|
||||
super(Commands.CopyShaToClipboard);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: CopyShaToClipboardCommandArgs = {}): Promise<any> {
|
||||
if (isCommandViewContextWithCommit(context)) {
|
||||
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: CopyShaToClipboardCommandArgs = {}): Promise<any> {
|
||||
uri = getCommandUri(uri, editor);
|
||||
|
||||
@@ -55,7 +45,7 @@ export class CopyShaToClipboardCommand extends ActiveEditorCommand {
|
||||
|
||||
try {
|
||||
const blame = await this.git.getBlameForLine(gitUri, blameline);
|
||||
if (blame === undefined) return undefined;
|
||||
if (!blame) return undefined;
|
||||
|
||||
args.sha = blame.commit.sha;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
'use strict';
|
||||
import { commands, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { DiffWithPreviousCommandArgs } from './diffWithPrevious';
|
||||
import { DiffWithWorkingCommandArgs } from './diffWithWorking';
|
||||
import { GitCommit, GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface DiffLineWithPreviousCommandArgs {
|
||||
commit?: GitCommit;
|
||||
|
||||
line?: number;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
@@ -41,26 +43,56 @@ export class DiffLineWithPreviousCommand extends ActiveEditorCommand {
|
||||
if (blame === undefined) return Messages.showFileNotUnderSourceControlWarningMessage('Unable to open compare');
|
||||
|
||||
args.commit = blame.commit;
|
||||
|
||||
// If we don't have a sha or the current commit matches the blame, show the previous
|
||||
if (gitUri.sha === undefined || gitUri.sha === args.commit.sha) {
|
||||
return commands.executeCommand(Commands.DiffWithPrevious, new GitUri(uri, args.commit), {
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
} as DiffWithPreviousCommandArgs);
|
||||
}
|
||||
|
||||
// If the line is uncommitted, find the previous commit and treat it as a DiffWithWorking
|
||||
if (args.commit.isUncommitted) {
|
||||
uri = args.commit.uri;
|
||||
args.commit = new GitCommit(args.commit.type, args.commit.repoPath, args.commit.previousSha!, args.commit.previousFileName!, args.commit.author, args.commit.date, args.commit.message);
|
||||
args.line = (blame.line.line + 1) + gitUri.offset;
|
||||
|
||||
return commands.executeCommand(Commands.DiffWithWorking, uri, {
|
||||
commit: args.commit,
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
} as DiffWithWorkingCommandArgs);
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffLineWithPreviousCommand', `getBlameForLine(${blameline})`);
|
||||
Logger.error(ex, 'DiffWithPreviousLineCommand', `getBlameForLine(${blameline})`);
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: args.commit.repoPath,
|
||||
lhs: {
|
||||
sha: args.commit.previousSha !== undefined ? args.commit.previousSha : GitService.fakeSha,
|
||||
uri: args.commit.previousUri
|
||||
},
|
||||
rhs: {
|
||||
sha: args.commit.sha,
|
||||
uri: args.commit.uri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
try {
|
||||
const [rhs, lhs] = await Promise.all([
|
||||
this.git.getVersionedFile(gitUri.repoPath, gitUri.fsPath, gitUri.sha!),
|
||||
this.git.getVersionedFile(args.commit.repoPath, args.commit.uri.fsPath, args.commit.sha)
|
||||
]);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
await commands.executeCommand(BuiltInCommands.Diff,
|
||||
Uri.file(lhs),
|
||||
Uri.file(rhs),
|
||||
`${path.basename(args.commit.uri.fsPath)} (${args.commit.shortSha}) ${GlyphChars.ArrowLeftRight} ${path.basename(gitUri.fsPath)} (${gitUri.shortSha})`,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithPreviousLineCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
'use strict';
|
||||
import { commands, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { DiffWithWorkingCommandArgs } from './diffWithWorking';
|
||||
import { GitCommit, GitService, GitUri } from '../gitService';
|
||||
import { Messages } from '../messages';
|
||||
import { Logger } from '../logger';
|
||||
|
||||
export interface DiffLineWithWorkingCommandArgs {
|
||||
commit?: GitCommit;
|
||||
|
||||
line?: number;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
@@ -53,19 +52,6 @@ export class DiffLineWithWorkingCommand extends ActiveEditorCommand {
|
||||
}
|
||||
}
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: args.commit.repoPath,
|
||||
lhs: {
|
||||
sha: args.commit.sha,
|
||||
uri: args.commit.uri
|
||||
},
|
||||
rhs: {
|
||||
sha: '',
|
||||
uri: args.commit.uri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
return commands.executeCommand(Commands.DiffWithWorking, uri, args as DiffWithWorkingCommandArgs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
'use strict';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands } from './common';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { GitCommit, GitService } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface DiffWithCommandArgsRevision {
|
||||
sha: string;
|
||||
uri: Uri;
|
||||
title?: string;
|
||||
}
|
||||
|
||||
export interface DiffWithCommandArgs {
|
||||
lhs?: DiffWithCommandArgsRevision;
|
||||
rhs?: DiffWithCommandArgsRevision;
|
||||
repoPath?: string;
|
||||
|
||||
line?: number;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
|
||||
export class DiffWithCommand extends ActiveEditorCommand {
|
||||
|
||||
static getMarkdownCommandArgs(args: DiffWithCommandArgs): string;
|
||||
static getMarkdownCommandArgs(commit1: GitCommit, commit2: GitCommit): string;
|
||||
static getMarkdownCommandArgs(argsOrCommit1: DiffWithCommandArgs | GitCommit, commit2?: GitCommit): string {
|
||||
let args = argsOrCommit1;
|
||||
if (argsOrCommit1 instanceof GitCommit) {
|
||||
const commit1 = argsOrCommit1;
|
||||
|
||||
if (commit2 === undefined) {
|
||||
if (commit1.isUncommitted) {
|
||||
args = {
|
||||
repoPath: commit1.repoPath,
|
||||
lhs: {
|
||||
sha: 'HEAD',
|
||||
uri: commit1.uri
|
||||
},
|
||||
rhs: {
|
||||
sha: '',
|
||||
uri: commit1.uri
|
||||
}
|
||||
};
|
||||
}
|
||||
else {
|
||||
args = {
|
||||
repoPath: commit1.repoPath,
|
||||
lhs: {
|
||||
sha: commit1.previousSha!,
|
||||
uri: commit1.previousUri!
|
||||
},
|
||||
rhs: {
|
||||
sha: commit1.sha,
|
||||
uri: commit1.uri
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
else {
|
||||
args = {
|
||||
repoPath: commit1.repoPath,
|
||||
lhs: {
|
||||
sha: commit1.sha,
|
||||
uri: commit1.uri
|
||||
},
|
||||
rhs: {
|
||||
sha: commit2.sha,
|
||||
uri: commit2.uri
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return super.getMarkdownCommandArgsCore<DiffWithCommandArgs>(Commands.DiffWith, args);
|
||||
}
|
||||
|
||||
constructor(private git: GitService) {
|
||||
super(Commands.DiffWith);
|
||||
}
|
||||
|
||||
async execute(editor?: TextEditor, uri?: Uri, args: DiffWithCommandArgs = {}): Promise<any> {
|
||||
args = { ...args };
|
||||
if (args.repoPath === undefined || args.lhs === undefined || args.rhs === undefined) return undefined;
|
||||
|
||||
try {
|
||||
const [lhs, rhs] = await Promise.all([
|
||||
args.lhs.sha !== '' && !GitService.isUncommitted(args.lhs.sha)
|
||||
? this.git.getVersionedFile(args.repoPath, args.lhs.uri.fsPath, args.lhs.sha)
|
||||
: args.lhs.uri.fsPath,
|
||||
args.rhs.sha !== '' && !GitService.isUncommitted(args.rhs.sha)
|
||||
? this.git.getVersionedFile(args.repoPath, args.rhs.uri.fsPath, args.rhs.sha)
|
||||
: args.rhs.uri.fsPath
|
||||
]);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
let rhsPrefix = '';
|
||||
if (rhs === undefined) {
|
||||
rhsPrefix = 'deleted in ';
|
||||
}
|
||||
else if (lhs === undefined || args.lhs.sha === GitService.fakeSha) {
|
||||
rhsPrefix = 'added in ';
|
||||
}
|
||||
|
||||
if (args.lhs.title === undefined && lhs !== undefined && args.lhs.sha !== GitService.fakeSha) {
|
||||
args.lhs.title = (args.lhs.sha === '' || GitService.isUncommitted(args.lhs.sha))
|
||||
? `${path.basename(args.lhs.uri.fsPath)}`
|
||||
: `${path.basename(args.lhs.uri.fsPath)} (${GitService.shortenSha(args.lhs.sha)})`;
|
||||
}
|
||||
if (args.rhs.title === undefined && args.rhs.sha !== GitService.fakeSha) {
|
||||
args.rhs.title = (args.rhs.sha === '' || GitService.isUncommitted(args.rhs.sha))
|
||||
? `${path.basename(args.rhs.uri.fsPath)}`
|
||||
: `${path.basename(args.rhs.uri.fsPath)} (${rhsPrefix}${GitService.shortenSha(args.rhs.sha)})`;
|
||||
}
|
||||
|
||||
const title = (args.lhs.title !== undefined && args.rhs.title !== undefined)
|
||||
? `${args.lhs.title} ${GlyphChars.ArrowLeftRight} ${args.rhs.title}`
|
||||
: args.lhs.title || args.rhs.title;
|
||||
|
||||
return await commands.executeCommand(BuiltInCommands.Diff,
|
||||
lhs === undefined
|
||||
? GitService.toGitContentUri(GitService.fakeSha, args.lhs.uri.fsPath, args.repoPath)
|
||||
: Uri.file(lhs),
|
||||
rhs === undefined
|
||||
? GitService.toGitContentUri(GitService.fakeSha, args.rhs.uri.fsPath, args.repoPath)
|
||||
: Uri.file(rhs),
|
||||
title,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
'use strict';
|
||||
import { commands, TextDocumentShowOptions, TextEditor, Uri } from 'vscode';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import { BranchesQuickPick, CommandQuickPickItem } from '../quickPicks';
|
||||
import * as path from 'path';
|
||||
@@ -42,20 +42,25 @@ export class DiffWithBranchCommand extends ActiveEditorCommand {
|
||||
const branch = pick.branch.name;
|
||||
if (branch === undefined) return undefined;
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: gitUri.repoPath,
|
||||
lhs: {
|
||||
sha: pick.branch.remote ? `remotes/${branch}` : branch,
|
||||
uri: gitUri as Uri,
|
||||
title: `${path.basename(gitUri.fsPath)} (${branch})`
|
||||
},
|
||||
rhs: {
|
||||
sha: '',
|
||||
uri: gitUri as Uri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
try {
|
||||
const compare = await this.git.getVersionedFile(gitUri.repoPath, gitUri.fsPath, branch);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
await commands.executeCommand(BuiltInCommands.Diff,
|
||||
Uri.file(compare),
|
||||
gitUri.fileUri(),
|
||||
`${path.basename(gitUri.fsPath)} (${branch}) ${GlyphChars.ArrowLeftRight} ${path.basename(gitUri.fsPath)}`,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithBranchCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open branch compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,16 +2,16 @@
|
||||
import { Iterables } from '../system';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { GitLogCommit, GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface DiffWithNextCommandArgs {
|
||||
commit?: GitLogCommit;
|
||||
range?: Range;
|
||||
|
||||
line?: number;
|
||||
range?: Range;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
|
||||
@@ -54,19 +54,28 @@ export class DiffWithNextCommand extends ActiveEditorCommand {
|
||||
|
||||
if (args.commit.nextSha === undefined) return commands.executeCommand(Commands.DiffWithWorking, uri);
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: args.commit.repoPath,
|
||||
lhs: {
|
||||
sha: args.commit.sha,
|
||||
uri: args.commit.uri
|
||||
},
|
||||
rhs: {
|
||||
sha: args.commit.nextSha,
|
||||
uri: args.commit.nextUri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
try {
|
||||
const [rhs, lhs] = await Promise.all([
|
||||
this.git.getVersionedFile(args.commit.repoPath, args.commit.nextUri.fsPath, args.commit.nextSha),
|
||||
this.git.getVersionedFile(args.commit.repoPath, args.commit.uri.fsPath, args.commit.sha)
|
||||
]);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
await commands.executeCommand(BuiltInCommands.Diff,
|
||||
Uri.file(lhs),
|
||||
Uri.file(rhs),
|
||||
`${path.basename(args.commit.uri.fsPath)} (${args.commit.shortSha}) ${GlyphChars.ArrowLeftRight} ${path.basename(args.commit.nextUri.fsPath)} (${args.commit.nextShortSha})`,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithNextCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,17 @@
|
||||
import { Iterables } from '../system';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { DiffWithWorkingCommandArgs } from './diffWithWorking';
|
||||
import { GitCommit, GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface DiffWithPreviousCommandArgs {
|
||||
commit?: GitCommit;
|
||||
range?: Range;
|
||||
|
||||
line?: number;
|
||||
range?: Range;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ export class DiffWithPreviousCommand extends ActiveEditorCommand {
|
||||
|
||||
try {
|
||||
const sha = args.commit === undefined ? gitUri.sha : args.commit.sha;
|
||||
if (sha === GitService.fakeSha) return Messages.showCommitHasNoPreviousCommitWarningMessage();
|
||||
|
||||
const log = await this.git.getLogForFile(gitUri.repoPath, gitUri.fsPath, sha, { maxCount: 2, range: args.range!, skipMerges: true });
|
||||
if (log === undefined) return Messages.showFileNotUnderSourceControlWarningMessage('Unable to open compare');
|
||||
@@ -44,9 +43,7 @@ export class DiffWithPreviousCommand extends ActiveEditorCommand {
|
||||
args.commit = (sha && log.commits.get(sha)) || Iterables.first(log.commits.values());
|
||||
|
||||
// If the sha is missing and the file is uncommitted, then treat it as a DiffWithWorking
|
||||
if (gitUri.sha === undefined && await this.git.isFileUncommitted(gitUri)) {
|
||||
return commands.executeCommand(Commands.DiffWithWorking, uri, { commit: args.commit, showOptions: args.showOptions } as DiffWithWorkingCommandArgs);
|
||||
}
|
||||
if (gitUri.sha === undefined && await this.git.isFileUncommitted(gitUri)) return commands.executeCommand(Commands.DiffWithWorking, uri, { commit: args.commit, showOptions: args.showOptions } as DiffWithWorkingCommandArgs);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithPreviousCommand', `getLogForFile(${gitUri.repoPath}, ${gitUri.fsPath})`);
|
||||
@@ -54,19 +51,30 @@ export class DiffWithPreviousCommand extends ActiveEditorCommand {
|
||||
}
|
||||
}
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: args.commit.repoPath,
|
||||
lhs: {
|
||||
sha: args.commit.previousSha !== undefined ? args.commit.previousSha : GitService.fakeSha,
|
||||
uri: args.commit.previousUri
|
||||
},
|
||||
rhs: {
|
||||
sha: args.commit.sha,
|
||||
uri: args.commit.uri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
if (args.commit.previousSha === undefined) return Messages.showCommitHasNoPreviousCommitWarningMessage(args.commit);
|
||||
|
||||
try {
|
||||
const [rhs, lhs] = await Promise.all([
|
||||
this.git.getVersionedFile(args.commit.repoPath, args.commit.uri.fsPath, args.commit.sha),
|
||||
this.git.getVersionedFile(args.commit.repoPath, args.commit.previousUri.fsPath, args.commit.previousSha)
|
||||
]);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
await commands.executeCommand(BuiltInCommands.Diff,
|
||||
Uri.file(lhs),
|
||||
Uri.file(rhs),
|
||||
`${path.basename(args.commit.previousUri.fsPath)} (${args.commit.previousShortSha}) ${GlyphChars.ArrowLeftRight} ${path.basename(args.commit.uri.fsPath)} (${args.commit.shortSha})`,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithPreviousCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,16 @@
|
||||
'use strict';
|
||||
import { commands, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import { CommandQuickPickItem, FileHistoryQuickPick } from '../quickPicks';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface DiffWithRevisionCommandArgs {
|
||||
maxCount?: number;
|
||||
|
||||
line?: number;
|
||||
maxCount?: number;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
|
||||
@@ -46,24 +46,24 @@ export class DiffWithRevisionCommand extends ActiveEditorCommand {
|
||||
|
||||
if (pick instanceof CommandQuickPickItem) return pick.execute();
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: gitUri.repoPath,
|
||||
lhs: {
|
||||
sha: pick.commit.sha,
|
||||
uri: gitUri as Uri
|
||||
},
|
||||
rhs: {
|
||||
sha: '',
|
||||
uri: gitUri as Uri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return await commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
const compare = await this.git.getVersionedFile(gitUri.repoPath, gitUri.fsPath, pick.commit.sha);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
await commands.executeCommand(BuiltInCommands.Diff,
|
||||
Uri.file(compare),
|
||||
gitUri.fileUri(),
|
||||
`${path.basename(gitUri.fsPath)} (${pick.commit.shortSha}) ${GlyphChars.ArrowLeftRight} ${path.basename(gitUri.fsPath)}`,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithRevisionCommand');
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
Logger.error(ex, 'DiffWithRevisionCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open history compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
'use strict';
|
||||
import { commands, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { commands, Range, TextDocumentShowOptions, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { DiffWithCommandArgs } from './diffWith';
|
||||
import { BuiltInCommands, GlyphChars } from '../constants';
|
||||
import { GitCommit, GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface DiffWithWorkingCommandArgs {
|
||||
commit?: GitCommit;
|
||||
|
||||
line?: number;
|
||||
showOptions?: TextDocumentShowOptions;
|
||||
}
|
||||
@@ -48,19 +48,25 @@ export class DiffWithWorkingCommand extends ActiveEditorCommand {
|
||||
const workingFileName = await this.git.findWorkingFileName(gitUri.repoPath, gitUri.fsPath);
|
||||
if (workingFileName === undefined) return undefined;
|
||||
|
||||
const diffArgs: DiffWithCommandArgs = {
|
||||
repoPath: args.commit.repoPath,
|
||||
lhs: {
|
||||
sha: args.commit.sha,
|
||||
uri: args.commit.uri
|
||||
},
|
||||
rhs: {
|
||||
sha: '',
|
||||
uri: args.commit.uri
|
||||
},
|
||||
line: args.line,
|
||||
showOptions: args.showOptions
|
||||
};
|
||||
return commands.executeCommand(Commands.DiffWith, diffArgs);
|
||||
try {
|
||||
const compare = await this.git.getVersionedFile(args.commit.repoPath, args.commit.uri.fsPath, args.commit.sha);
|
||||
|
||||
if (args.line !== undefined && args.line !== 0) {
|
||||
if (args.showOptions === undefined) {
|
||||
args.showOptions = {};
|
||||
}
|
||||
args.showOptions.selection = new Range(args.line, 0, args.line, 0);
|
||||
}
|
||||
|
||||
await commands.executeCommand(BuiltInCommands.Diff,
|
||||
Uri.file(compare),
|
||||
Uri.file(path.resolve(gitUri.repoPath, workingFileName)),
|
||||
`${path.basename(args.commit.uri.fsPath)} (${args.commit.shortSha}) ${GlyphChars.ArrowLeftRight} ${path.basename(workingFileName)}`,
|
||||
args.showOptions);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'DiffWithWorkingCommand', 'getVersionedFile');
|
||||
return window.showErrorMessage(`Unable to open compare. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
'use strict';
|
||||
import { Arrays } from '../system';
|
||||
import { commands, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithBranch } from './common';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
@@ -9,7 +10,6 @@ import { OpenInRemoteCommandArgs } from './openInRemote';
|
||||
|
||||
export interface OpenBranchInRemoteCommandArgs {
|
||||
branch?: string;
|
||||
remote?: string;
|
||||
}
|
||||
|
||||
export class OpenBranchInRemoteCommand extends ActiveEditorCommand {
|
||||
@@ -18,16 +18,6 @@ export class OpenBranchInRemoteCommand extends ActiveEditorCommand {
|
||||
super(Commands.OpenBranchInRemote);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: OpenBranchInRemoteCommandArgs = {}): Promise<any> {
|
||||
if (isCommandViewContextWithBranch(context)) {
|
||||
args = { ...args };
|
||||
args.branch = context.node.branch.name;
|
||||
args.remote = context.node.branch.getRemote();
|
||||
}
|
||||
|
||||
return this.execute(context.editor, context.uri, args);
|
||||
}
|
||||
|
||||
async execute(editor?: TextEditor, uri?: Uri, args: OpenBranchInRemoteCommandArgs = {}) {
|
||||
uri = getCommandUri(uri, editor);
|
||||
|
||||
@@ -51,14 +41,12 @@ export class OpenBranchInRemoteCommand extends ActiveEditorCommand {
|
||||
if (args.branch === undefined) return undefined;
|
||||
}
|
||||
|
||||
const remotes = (await this.git.getRemotes(repoPath)).filter(r => r.provider !== undefined);
|
||||
|
||||
const remotes = Arrays.uniqueBy(await this.git.getRemotes(repoPath), _ => _.url, _ => !!_.provider);
|
||||
return commands.executeCommand(Commands.OpenInRemote, uri, {
|
||||
resource: {
|
||||
type: 'branch',
|
||||
branch: args.branch
|
||||
},
|
||||
remote: args.remote,
|
||||
remotes
|
||||
} as OpenInRemoteCommandArgs);
|
||||
}
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
'use strict';
|
||||
import { commands, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithRemote } from './common';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { OpenInRemoteCommandArgs } from './openInRemote';
|
||||
|
||||
export interface OpenBranchesInRemoteCommandArgs {
|
||||
remote?: string;
|
||||
}
|
||||
|
||||
export class OpenBranchesInRemoteCommand extends ActiveEditorCommand {
|
||||
|
||||
constructor(private git: GitService) {
|
||||
super(Commands.OpenBranchesInRemote);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: OpenBranchesInRemoteCommandArgs = {}): Promise<any> {
|
||||
if (isCommandViewContextWithRemote(context)) {
|
||||
args = { ...args };
|
||||
args.remote = context.node.remote.name;
|
||||
}
|
||||
|
||||
return this.execute(context.editor, context.uri, args);
|
||||
}
|
||||
|
||||
async execute(editor?: TextEditor, uri?: Uri, args: OpenBranchesInRemoteCommandArgs = {}) {
|
||||
uri = getCommandUri(uri, editor);
|
||||
|
||||
const gitUri = uri && await GitUri.fromUri(uri, this.git);
|
||||
|
||||
const repoPath = gitUri === undefined ? this.git.repoPath : gitUri.repoPath;
|
||||
if (!repoPath) return undefined;
|
||||
|
||||
try {
|
||||
const remotes = (await this.git.getRemotes(repoPath)).filter(r => r.provider !== undefined);
|
||||
|
||||
return commands.executeCommand(Commands.OpenInRemote, uri, {
|
||||
resource: {
|
||||
type: 'branches'
|
||||
},
|
||||
remote: args.remote,
|
||||
remotes
|
||||
} as OpenInRemoteCommandArgs);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'OpenBranchesInRemoteCommand');
|
||||
return window.showErrorMessage(`Unable to open branches in remote provider. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
'use strict';
|
||||
import { Arrays } from '../system';
|
||||
import { commands, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithCommit } 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/explorerNodes';
|
||||
|
||||
export interface OpenCommitInRemoteCommandArgs {
|
||||
sha?: string;
|
||||
@@ -12,21 +14,12 @@ export interface OpenCommitInRemoteCommandArgs {
|
||||
|
||||
export class OpenCommitInRemoteCommand extends ActiveEditorCommand {
|
||||
|
||||
static getMarkdownCommandArgs(sha: string): string;
|
||||
static getMarkdownCommandArgs(args: OpenCommitInRemoteCommandArgs): string;
|
||||
static getMarkdownCommandArgs(argsOrSha: OpenCommitInRemoteCommandArgs | string): string {
|
||||
const args = typeof argsOrSha === 'string'
|
||||
? { sha: argsOrSha }
|
||||
: argsOrSha;
|
||||
return super.getMarkdownCommandArgsCore<OpenCommitInRemoteCommandArgs>(Commands.OpenCommitInRemote, args);
|
||||
}
|
||||
|
||||
constructor(private git: GitService) {
|
||||
super(Commands.OpenCommitInRemote);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: OpenCommitInRemoteCommandArgs = {}): Promise<any> {
|
||||
if (isCommandViewContextWithCommit(context)) {
|
||||
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);
|
||||
@@ -61,8 +54,7 @@ export class OpenCommitInRemoteCommand extends ActiveEditorCommand {
|
||||
args.sha = commit.sha;
|
||||
}
|
||||
|
||||
const remotes = (await this.git.getRemotes(gitUri.repoPath)).filter(r => r.provider !== undefined);
|
||||
|
||||
const remotes = Arrays.uniqueBy(await this.git.getRemotes(gitUri.repoPath), _ => _.url, _ => !!_.provider);
|
||||
return commands.executeCommand(Commands.OpenInRemote, uri, {
|
||||
resource: {
|
||||
type: 'commit',
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
'use strict';
|
||||
import { Arrays } from '../system';
|
||||
import { commands, Range, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithBranch, isCommandViewContextWithCommit } from './common';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { OpenInRemoteCommandArgs } from './openInRemote';
|
||||
|
||||
export interface OpenFileInRemoteCommandArgs {
|
||||
branch?: string;
|
||||
range?: boolean;
|
||||
}
|
||||
|
||||
@@ -16,19 +16,6 @@ export class OpenFileInRemoteCommand extends ActiveEditorCommand {
|
||||
super(Commands.OpenFileInRemote);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: OpenFileInRemoteCommandArgs = { range: true }): Promise<any> {
|
||||
if (isCommandViewContextWithCommit(context)) {
|
||||
args = { ...args };
|
||||
args.range = false;
|
||||
if (isCommandViewContextWithBranch(context)) {
|
||||
args.branch = context.node.branch !== undefined ? context.node.branch.name : undefined;
|
||||
}
|
||||
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: OpenFileInRemoteCommandArgs = { range: true }) {
|
||||
uri = getCommandUri(uri, editor);
|
||||
if (uri === undefined) return undefined;
|
||||
@@ -36,23 +23,18 @@ export class OpenFileInRemoteCommand extends ActiveEditorCommand {
|
||||
const gitUri = await GitUri.fromUri(uri, this.git);
|
||||
if (!gitUri.repoPath) return undefined;
|
||||
|
||||
if (args.branch === undefined) {
|
||||
const branch = await this.git.getBranch(gitUri.repoPath);
|
||||
if (branch !== undefined) {
|
||||
args.branch = branch.name;
|
||||
}
|
||||
}
|
||||
const branch = await this.git.getBranch(gitUri.repoPath);
|
||||
|
||||
try {
|
||||
const remotes = (await this.git.getRemotes(gitUri.repoPath)).filter(r => r.provider !== undefined);
|
||||
const remotes = Arrays.uniqueBy(await this.git.getRemotes(gitUri.repoPath), _ => _.url, _ => !!_.provider);
|
||||
const range = (args.range && editor !== undefined)
|
||||
? new Range(editor.selection.start.with({ line: editor.selection.start.line + 1 }), editor.selection.end.with({ line: editor.selection.end.line + 1 }))
|
||||
: undefined;
|
||||
|
||||
return commands.executeCommand(Commands.OpenInRemote, uri, {
|
||||
resource: {
|
||||
type: gitUri.sha === undefined ? 'file' : 'revision',
|
||||
branch: args.branch === undefined ? 'Current' : args.branch,
|
||||
type: 'file',
|
||||
branch: branch === undefined ? 'Current' : branch.name,
|
||||
fileName: gitUri.getRelativePath(),
|
||||
range: range,
|
||||
sha: gitUri.sha
|
||||
|
||||
@@ -3,12 +3,11 @@ import { Strings } from '../system';
|
||||
import { TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { GitLogCommit, GitRemote, GitService, RemoteResource } from '../gitService';
|
||||
import { GitLogCommit, GitRemote, RemoteResource } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { CommandQuickPickItem, OpenRemoteCommandQuickPickItem, RemotesQuickPick } from '../quickPicks';
|
||||
|
||||
export interface OpenInRemoteCommandArgs {
|
||||
remote?: string;
|
||||
remotes?: GitRemote[];
|
||||
resource?: RemoteResource;
|
||||
|
||||
@@ -27,17 +26,8 @@ export class OpenInRemoteCommand extends ActiveEditorCommand {
|
||||
args = { ...args };
|
||||
if (args.remotes === undefined || args.resource === undefined) return undefined;
|
||||
|
||||
if (args.remote !== undefined) {
|
||||
const remotes = args.remotes.filter(r => r.name === args.remote);
|
||||
// Only filter if we get some results
|
||||
if (remotes.length > 0) {
|
||||
args.remotes = remotes;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (args.remotes.length === 1) {
|
||||
this.ensureRemoteBranchName(args);
|
||||
const command = new OpenRemoteCommandQuickPickItem(args.remotes[0], args.resource);
|
||||
return command.execute();
|
||||
}
|
||||
@@ -45,20 +35,25 @@ export class OpenInRemoteCommand extends ActiveEditorCommand {
|
||||
let placeHolder = '';
|
||||
switch (args.resource.type) {
|
||||
case 'branch':
|
||||
this.ensureRemoteBranchName(args);
|
||||
// Check to see if the remote is in the branch
|
||||
const index = args.resource.branch.indexOf('/');
|
||||
if (index >= 0) {
|
||||
const remoteName = args.resource.branch.substring(0, index);
|
||||
const remote = args.remotes.find(r => r.name === remoteName);
|
||||
if (remote !== undefined) {
|
||||
args.resource.branch = args.resource.branch.substring(index + 1);
|
||||
args.remotes = [remote];
|
||||
}
|
||||
}
|
||||
placeHolder = `open ${args.resource.branch} branch in${GlyphChars.Ellipsis}`;
|
||||
break;
|
||||
|
||||
case 'commit':
|
||||
const shortSha = GitService.shortenSha(args.resource.sha);
|
||||
const shortSha = args.resource.sha.substring(0, 8);
|
||||
placeHolder = `open commit ${shortSha} in${GlyphChars.Ellipsis}`;
|
||||
break;
|
||||
|
||||
case 'file':
|
||||
placeHolder = `open ${args.resource.fileName} in${GlyphChars.Ellipsis}`;
|
||||
break;
|
||||
|
||||
case 'revision':
|
||||
if (args.resource.commit !== undefined && args.resource.commit instanceof GitLogCommit) {
|
||||
if (args.resource.commit.status === 'D') {
|
||||
args.resource.sha = args.resource.commit.previousSha;
|
||||
@@ -70,12 +65,16 @@ export class OpenInRemoteCommand extends ActiveEditorCommand {
|
||||
}
|
||||
}
|
||||
else {
|
||||
const shortFileSha = args.resource.sha === undefined ? '' : GitService.shortenSha(args.resource.sha);
|
||||
const shortFileSha = args.resource.sha === undefined ? '' : args.resource.sha.substring(0, 8);
|
||||
const shaSuffix = shortFileSha ? ` ${Strings.pad(GlyphChars.Dot, 1, 1)} ${shortFileSha}` : '';
|
||||
|
||||
placeHolder = `open ${args.resource.fileName}${shaSuffix} in${GlyphChars.Ellipsis}`;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'working-file':
|
||||
placeHolder = `open ${args.resource.fileName} in${GlyphChars.Ellipsis}`;
|
||||
break;
|
||||
}
|
||||
|
||||
if (args.remotes.length === 1) {
|
||||
@@ -94,19 +93,4 @@ export class OpenInRemoteCommand extends ActiveEditorCommand {
|
||||
return window.showErrorMessage(`Unable to open in remote provider. See output channel for more details`);
|
||||
}
|
||||
}
|
||||
|
||||
private ensureRemoteBranchName(args: OpenInRemoteCommandArgs) {
|
||||
if (args.remotes === undefined || args.resource === undefined || args.resource.type !== 'branch') return;
|
||||
|
||||
// Check to see if the remote is in the branch
|
||||
const index = args.resource.branch.indexOf('/');
|
||||
if (index >= 0) {
|
||||
const remoteName = args.resource.branch.substring(0, index);
|
||||
const remote = args.remotes.find(r => r.name === remoteName);
|
||||
if (remote !== undefined) {
|
||||
args.resource.branch = args.resource.branch.substring(index + 1);
|
||||
args.remotes = [remote];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +1,18 @@
|
||||
'use strict';
|
||||
import { Arrays } from '../system';
|
||||
import { commands, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithRemote } from './common';
|
||||
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { OpenInRemoteCommandArgs } from './openInRemote';
|
||||
|
||||
export interface OpenRepoInRemoteCommandArgs {
|
||||
remote?: string;
|
||||
}
|
||||
|
||||
export class OpenRepoInRemoteCommand extends ActiveEditorCommand {
|
||||
|
||||
constructor(private git: GitService) {
|
||||
super(Commands.OpenRepoInRemote);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: OpenRepoInRemoteCommandArgs = {}): Promise<any> {
|
||||
if (isCommandViewContextWithRemote(context)) {
|
||||
args = { ...args };
|
||||
args.remote = context.node.remote.name;
|
||||
}
|
||||
|
||||
return this.execute(context.editor, context.uri, args);
|
||||
}
|
||||
|
||||
async execute(editor?: TextEditor, uri?: Uri, args: OpenRepoInRemoteCommandArgs = {}) {
|
||||
async execute(editor?: TextEditor, uri?: Uri) {
|
||||
uri = getCommandUri(uri, editor);
|
||||
|
||||
const gitUri = uri && await GitUri.fromUri(uri, this.git);
|
||||
@@ -33,13 +21,11 @@ export class OpenRepoInRemoteCommand extends ActiveEditorCommand {
|
||||
if (!repoPath) return undefined;
|
||||
|
||||
try {
|
||||
const remotes = (await this.git.getRemotes(repoPath)).filter(r => r.provider !== undefined);
|
||||
|
||||
const remotes = Arrays.uniqueBy(await this.git.getRemotes(repoPath), _ => _.url, _ => !!_.provider);
|
||||
return commands.executeCommand(Commands.OpenInRemote, uri, {
|
||||
resource: {
|
||||
type: 'repo'
|
||||
},
|
||||
remote: args.remote,
|
||||
remotes
|
||||
} as OpenInRemoteCommandArgs);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ export class ResetSuppressedWarningsCommand extends Command {
|
||||
}
|
||||
|
||||
async execute() {
|
||||
for (const key of Objects.values(SuppressedKeys)) {
|
||||
for (const key of Objects.values<string>(SuppressedKeys)) {
|
||||
await this.context.globalState.update(key, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import { Logger } from '../logger';
|
||||
import { Messages } from '../messages';
|
||||
import { CommandQuickPickItem, CommitsQuickPick } from '../quickPicks';
|
||||
import { ShowQuickCommitDetailsCommandArgs } from './showQuickCommitDetails';
|
||||
import { paste } from 'copy-paste';
|
||||
|
||||
const searchByRegex = /^([@:#])/;
|
||||
const searchByMap = new Map<string, GitRepoSearchBy>([
|
||||
@@ -48,6 +49,12 @@ export class ShowCommitSearchCommand extends ActiveEditorCachedCommand {
|
||||
args.search = `#${blameLine.commit.shortSha}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (!args.search) {
|
||||
args.search = await new Promise<string>((resolve, reject) => {
|
||||
paste((err: Error, content: string) => resolve(err ? '' : content));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
|
||||
@@ -2,7 +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 { GitExplorer } from '../views/gitExplorer';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Messages } from '../messages';
|
||||
import { Logger } from '../logger';
|
||||
@@ -15,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);
|
||||
}
|
||||
|
||||
@@ -33,10 +33,10 @@ export class ShowFileHistoryCommand extends EditorCommand {
|
||||
const gitUri = await GitUri.fromUri(uri, this.git);
|
||||
|
||||
try {
|
||||
// if (this.explorer !== undefined) {
|
||||
// this.explorer.addHistory(gitUri);
|
||||
// return undefined;
|
||||
// }
|
||||
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');
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
'use strict';
|
||||
import { Strings } from '../system';
|
||||
import { commands, TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCachedCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithCommit } from './common';
|
||||
import { ActiveEditorCachedCommand, CommandContext, Commands, getCommandUri } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { CommitNode } from '../views/explorerNodes';
|
||||
import { GitCommit, GitLog, GitLogCommit, GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { CommandQuickPickItem, CommitDetailsQuickPick, CommitWithFileStatusQuickPickItem } from '../quickPicks';
|
||||
@@ -20,29 +21,20 @@ export interface ShowQuickCommitDetailsCommandArgs {
|
||||
|
||||
export class ShowQuickCommitDetailsCommand extends ActiveEditorCachedCommand {
|
||||
|
||||
static getMarkdownCommandArgs(sha: string): string;
|
||||
static getMarkdownCommandArgs(args: ShowQuickCommitDetailsCommandArgs): string;
|
||||
static getMarkdownCommandArgs(argsOrSha: ShowQuickCommitDetailsCommandArgs | string): string {
|
||||
const args = typeof argsOrSha === 'string'
|
||||
? { sha: argsOrSha }
|
||||
: argsOrSha;
|
||||
return super.getMarkdownCommandArgsCore<ShowQuickCommitDetailsCommandArgs>(Commands.ShowQuickCommitDetails, args);
|
||||
}
|
||||
|
||||
constructor(private git: GitService) {
|
||||
super(Commands.ShowQuickCommitDetails);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: ShowQuickCommitDetailsCommandArgs = {}): Promise<any> {
|
||||
protected async preExecute(context: CommandContext, ...args: any[]): Promise<any> {
|
||||
if (context.type === 'view') {
|
||||
args = { ...args };
|
||||
args.sha = context.node.uri.sha;
|
||||
|
||||
if (isCommandViewContextWithCommit(context)) {
|
||||
args.commit = context.node.commit;
|
||||
if (context.node instanceof CommitNode) {
|
||||
args = [{ sha: context.node.uri.sha, commit: context.node.commit }];
|
||||
}
|
||||
else {
|
||||
args = [{ sha: context.node.uri.sha }];
|
||||
}
|
||||
}
|
||||
return this.execute(context.editor, context.uri, args);
|
||||
return this.execute(context.editor, context.uri, ...args);
|
||||
}
|
||||
|
||||
async execute(editor?: TextEditor, uri?: Uri, args: ShowQuickCommitDetailsCommandArgs = {}) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
import { Strings } from '../system';
|
||||
import { TextEditor, Uri, window } from 'vscode';
|
||||
import { ActiveEditorCachedCommand, CommandContext, Commands, getCommandUri, isCommandViewContextWithCommit } from './common';
|
||||
import { ActiveEditorCachedCommand, Commands, getCommandUri } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { GitCommit, GitLog, GitLogCommit, GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
@@ -20,31 +20,10 @@ export interface ShowQuickCommitFileDetailsCommandArgs {
|
||||
|
||||
export class ShowQuickCommitFileDetailsCommand extends ActiveEditorCachedCommand {
|
||||
|
||||
static getMarkdownCommandArgs(sha: string): string;
|
||||
static getMarkdownCommandArgs(args: ShowQuickCommitFileDetailsCommandArgs): string;
|
||||
static getMarkdownCommandArgs(argsOrSha: ShowQuickCommitFileDetailsCommandArgs | string): string {
|
||||
const args = typeof argsOrSha === 'string'
|
||||
? { sha: argsOrSha }
|
||||
: argsOrSha;
|
||||
return super.getMarkdownCommandArgsCore<ShowQuickCommitFileDetailsCommandArgs>(Commands.ShowQuickCommitFileDetails, args);
|
||||
}
|
||||
|
||||
constructor(private git: GitService) {
|
||||
super(Commands.ShowQuickCommitFileDetails);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: ShowQuickCommitFileDetailsCommandArgs = {}): Promise<any> {
|
||||
if (context.type === 'view') {
|
||||
args = { ...args };
|
||||
args.sha = context.node.uri.sha;
|
||||
|
||||
if (isCommandViewContextWithCommit(context)) {
|
||||
args.commit = context.node.commit;
|
||||
}
|
||||
}
|
||||
return this.execute(context.editor, context.uri, args);
|
||||
}
|
||||
|
||||
async execute(editor?: TextEditor, uri?: Uri, args: ShowQuickCommitFileDetailsCommandArgs = {}) {
|
||||
uri = getCommandUri(uri, editor);
|
||||
if (uri === undefined) return undefined;
|
||||
@@ -104,7 +83,7 @@ export class ShowQuickCommitFileDetailsCommand extends ActiveEditorCachedCommand
|
||||
args.commit.workingFileName = workingFileName;
|
||||
args.commit.workingFileName = await this.git.findWorkingFileName(args.commit);
|
||||
|
||||
const shortSha = GitService.shortenSha(args.sha!);
|
||||
const shortSha = args.sha!.substring(0, 8);
|
||||
|
||||
if (args.goBackCommand === undefined) {
|
||||
// Create a command to get back to the commit details
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
'use strict';
|
||||
import { Strings } from '../system';
|
||||
import { MessageItem, window } from 'vscode';
|
||||
import { Command, CommandContext, Commands, isCommandViewContextWithCommit } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { GitService, GitStashCommit } from '../gitService';
|
||||
import { Command, CommandContext, Commands } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { CommitQuickPickItem, StashListQuickPick } from '../quickPicks';
|
||||
import { Logger } from '../logger';
|
||||
import { CommandQuickPickItem, CommitQuickPickItem, StashListQuickPick } from '../quickPicks';
|
||||
import { CommandQuickPickItem } from '../quickPicks';
|
||||
import { StashCommitNode } from '../views/stashCommitNode';
|
||||
|
||||
export interface StashApplyCommandArgs {
|
||||
confirm?: boolean;
|
||||
@@ -22,13 +24,16 @@ export class StashApplyCommand extends Command {
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: StashApplyCommandArgs = { confirm: true, deleteAfter: false }) {
|
||||
if (isCommandViewContextWithCommit<GitStashCommit>(context)) {
|
||||
if (context.type === 'view' && context.node instanceof StashCommitNode) {
|
||||
args = { ...args };
|
||||
args.stashItem = { stashName: context.node.commit.stashName, message: context.node.commit.message };
|
||||
|
||||
const stash = context.node.commit;
|
||||
args.stashItem = { stashName: stash.stashName, message: stash.message };
|
||||
|
||||
return this.execute(args);
|
||||
}
|
||||
|
||||
return this.execute(args);
|
||||
return super.preExecute(context, args);
|
||||
}
|
||||
|
||||
async execute(args: StashApplyCommandArgs = { confirm: true, deleteAfter: false }) {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
'use strict';
|
||||
import { MessageItem, window } from 'vscode';
|
||||
import { Command, CommandContext, Commands, isCommandViewContextWithCommit } from './common';
|
||||
import { Command, CommandContext, Commands } from './common';
|
||||
import { GlyphChars } from '../constants';
|
||||
import { GitService, GitStashCommit } from '../gitService';
|
||||
import { GitService } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
import { CommandQuickPickItem } from '../quickPicks';
|
||||
import { StashCommitNode } from '../views/stashCommitNode';
|
||||
|
||||
export interface StashDeleteCommandArgs {
|
||||
confirm?: boolean;
|
||||
@@ -20,13 +21,16 @@ export class StashDeleteCommand extends Command {
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: StashDeleteCommandArgs = { confirm: true }) {
|
||||
if (isCommandViewContextWithCommit<GitStashCommit>(context)) {
|
||||
if (context.type === 'view' && context.node instanceof StashCommitNode) {
|
||||
args = { ...args };
|
||||
args.stashItem = { stashName: context.node.commit.stashName, message: context.node.commit.message };
|
||||
|
||||
const stash = context.node.commit;
|
||||
args.stashItem = { stashName: stash.stashName, message: stash.message };
|
||||
|
||||
return this.execute(args);
|
||||
}
|
||||
|
||||
return this.execute(args);
|
||||
return super.preExecute(context, args);
|
||||
}
|
||||
|
||||
async execute(args: StashDeleteCommandArgs = { confirm: true }) {
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
'use strict';
|
||||
import { InputBoxOptions, Uri, window } from 'vscode';
|
||||
import { InputBoxOptions, window } from 'vscode';
|
||||
import { GitService } from '../gitService';
|
||||
import { CommandContext } from '../commands';
|
||||
import { Command, Commands } from './common';
|
||||
import { Logger } from '../logger';
|
||||
import { CommandQuickPickItem } from '../quickPicks';
|
||||
|
||||
export interface StashSaveCommandArgs {
|
||||
message?: string;
|
||||
uris?: Uri[];
|
||||
unstagedOnly?: boolean;
|
||||
|
||||
goBackCommand?: CommandQuickPickItem;
|
||||
}
|
||||
@@ -19,28 +18,16 @@ export class StashSaveCommand extends Command {
|
||||
super(Commands.StashSave);
|
||||
}
|
||||
|
||||
protected async preExecute(context: CommandContext, args: StashSaveCommandArgs = {}): Promise<any> {
|
||||
if (context.type === 'scm-states') {
|
||||
args = { ...args };
|
||||
args.uris = context.scmResourceStates.map(s => s.resourceUri);
|
||||
return this.execute(args);
|
||||
}
|
||||
|
||||
if (context.type === 'scm-groups') {
|
||||
args = { ...args };
|
||||
args.uris = context.scmResourceGroups.reduce<Uri[]>((a, b) => a.concat(b.resourceStates.map(s => s.resourceUri)), []);
|
||||
return this.execute(args);
|
||||
}
|
||||
|
||||
return this.execute(args);
|
||||
}
|
||||
|
||||
async execute(args: StashSaveCommandArgs = {}) {
|
||||
async execute(args: StashSaveCommandArgs = { unstagedOnly: false }) {
|
||||
if (!this.git.repoPath) return undefined;
|
||||
|
||||
args = { ...args };
|
||||
if (args.unstagedOnly === undefined) {
|
||||
args.unstagedOnly = false;
|
||||
}
|
||||
|
||||
try {
|
||||
if (args.message == null) {
|
||||
args = { ...args };
|
||||
args.message = await window.showInputBox({
|
||||
prompt: `Please provide a stash message`,
|
||||
placeHolder: `Stash message`
|
||||
@@ -48,7 +35,7 @@ export class StashSaveCommand extends Command {
|
||||
if (args.message === undefined) return args.goBackCommand === undefined ? undefined : args.goBackCommand.execute();
|
||||
}
|
||||
|
||||
return await this.git.stashSave(this.git.repoPath, args.message, args.uris);
|
||||
return await this.git.stashSave(this.git.repoPath, args.message, args.unstagedOnly);
|
||||
}
|
||||
catch (ex) {
|
||||
Logger.error(ex, 'StashSaveCommand');
|
||||
|
||||
@@ -2,13 +2,11 @@
|
||||
import { FileAnnotationType } from './annotations/annotationController';
|
||||
import { Commands } from './commands';
|
||||
import { LineAnnotationType } from './currentLineController';
|
||||
import { GitExplorerView } from './views/gitExplorer';
|
||||
import { OutputLevel } from './logger';
|
||||
|
||||
export { ExtensionKey } from './constants';
|
||||
|
||||
export type CodeLensCommand =
|
||||
'gitlens.toggleFileBlame' |
|
||||
export type CodeLensCommand = 'gitlens.toggleFileBlame' |
|
||||
'gitlens.showBlameHistory' |
|
||||
'gitlens.showFileHistory' |
|
||||
'gitlens.diffWithPrevious' |
|
||||
@@ -42,29 +40,7 @@ export const LineHighlightLocations = {
|
||||
OverviewRuler: 'overviewRuler' as LineHighlightLocations
|
||||
};
|
||||
|
||||
export type CustomRemoteType =
|
||||
'Bitbucket' |
|
||||
'GitHub' |
|
||||
'GitLab';
|
||||
export const CustomRemoteType = {
|
||||
Bitbucket: 'Bitbucket' as CustomRemoteType,
|
||||
BitbucketServer: 'BitbucketServer' as CustomRemoteType,
|
||||
GitHub: 'GitHub' as CustomRemoteType,
|
||||
GitLab: 'GitLab' as CustomRemoteType
|
||||
};
|
||||
|
||||
export type GitExplorerFilesLayout =
|
||||
'auto' |
|
||||
'list' |
|
||||
'tree';
|
||||
export const GitExplorerFilesLayout = {
|
||||
Auto: 'auto' as GitExplorerFilesLayout,
|
||||
List: 'list' as GitExplorerFilesLayout,
|
||||
Tree: 'tree' as GitExplorerFilesLayout
|
||||
};
|
||||
|
||||
export type StatusBarCommand =
|
||||
'gitlens.toggleFileBlame' |
|
||||
export type StatusBarCommand = 'gitlens.toggleFileBlame' |
|
||||
'gitlens.showBlameHistory' |
|
||||
'gitlens.showFileHistory' |
|
||||
'gitlens.toggleCodeLens' |
|
||||
@@ -142,29 +118,6 @@ export interface ICodeLensLanguageLocation {
|
||||
customSymbols?: string[];
|
||||
}
|
||||
|
||||
export interface IGitExplorerConfig {
|
||||
enabled: boolean;
|
||||
view: GitExplorerView;
|
||||
files: {
|
||||
layout: GitExplorerFilesLayout;
|
||||
compact: boolean;
|
||||
threshold: number;
|
||||
};
|
||||
includeWorkingTree: boolean;
|
||||
showTrackingBranch: boolean;
|
||||
commitFormat: string;
|
||||
commitFileFormat: string;
|
||||
stashFormat: string;
|
||||
stashFileFormat: string;
|
||||
statusFileFormat: string;
|
||||
// dateFormat: string | null;
|
||||
}
|
||||
|
||||
export interface IRemotesConfig {
|
||||
type: CustomRemoteType;
|
||||
domain: string;
|
||||
}
|
||||
|
||||
export interface IThemeConfig {
|
||||
annotations: {
|
||||
file: {
|
||||
@@ -279,6 +232,7 @@ export interface IConfig {
|
||||
hover: {
|
||||
details: boolean;
|
||||
changes: boolean;
|
||||
wholeLine: boolean;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -302,8 +256,6 @@ export interface IConfig {
|
||||
};
|
||||
|
||||
blame: {
|
||||
ignoreWhitespace: boolean;
|
||||
|
||||
file: {
|
||||
annotationType: FileAnnotationType;
|
||||
lineHighlight: {
|
||||
@@ -344,9 +296,23 @@ export interface IConfig {
|
||||
|
||||
defaultDateFormat: string | null;
|
||||
|
||||
gitExplorer: IGitExplorerConfig;
|
||||
fileHistoryExplorer: {
|
||||
commitFormat: string;
|
||||
// commitFileFormat: string;
|
||||
// dateFormat: string | null;
|
||||
};
|
||||
|
||||
remotes: IRemotesConfig[];
|
||||
gitExplorer: {
|
||||
commitFormat: string;
|
||||
commitFileFormat: string;
|
||||
// dateFormat: string | null;
|
||||
};
|
||||
|
||||
stashExplorer: {
|
||||
stashFormat: string;
|
||||
stashFileFormat: string;
|
||||
// dateFormat: string | null;
|
||||
};
|
||||
|
||||
statusBar: {
|
||||
enabled: boolean;
|
||||
|
||||
@@ -40,25 +40,23 @@ export const BuiltInCommands = {
|
||||
};
|
||||
|
||||
export type CommandContext =
|
||||
'gitlens:annotationStatus' |
|
||||
'gitlens:canToggleCodeLens' |
|
||||
'gitlens:enabled' |
|
||||
'gitlens:hasRemotes' |
|
||||
'gitlens:gitExplorer:view' |
|
||||
'gitlens:isBlameable' |
|
||||
'gitlens:isRepository' |
|
||||
'gitlens:isTracked' |
|
||||
'gitlens:key';
|
||||
'gitlens:key' |
|
||||
'gitlens:annotationStatus';
|
||||
export const CommandContext = {
|
||||
AnnotationStatus: 'gitlens:annotationStatus' as CommandContext,
|
||||
CanToggleCodeLens: 'gitlens:canToggleCodeLens' as CommandContext,
|
||||
Enabled: 'gitlens:enabled' as CommandContext,
|
||||
GitExplorerView: 'gitlens:gitExplorer:view' as CommandContext,
|
||||
HasRemotes: 'gitlens:hasRemotes' as CommandContext,
|
||||
IsBlameable: 'gitlens:isBlameable' as CommandContext,
|
||||
IsRepository: 'gitlens:isRepository' as CommandContext,
|
||||
IsTracked: 'gitlens:isTracked' as CommandContext,
|
||||
Key: 'gitlens:key' as CommandContext
|
||||
Key: 'gitlens:key' as CommandContext,
|
||||
AnnotationStatus: 'gitlens:annotationStatus' as CommandContext
|
||||
};
|
||||
|
||||
export function setCommandContext(key: CommandContext | string, value: any) {
|
||||
@@ -77,16 +75,11 @@ export type GlyphChars = '\u21a9' |
|
||||
'\u2937' |
|
||||
'\u2190' |
|
||||
'\u2194' |
|
||||
'\u2192' |
|
||||
'\u21e8' |
|
||||
'\u2191' |
|
||||
'\u2197' |
|
||||
'\u2217' |
|
||||
'\u2713' |
|
||||
'\u2014' |
|
||||
'\u2022' |
|
||||
'\u2026' |
|
||||
'\u270E' |
|
||||
'\u00a0' |
|
||||
'\u200b';
|
||||
export const GlyphChars = {
|
||||
@@ -95,26 +88,16 @@ export const GlyphChars = {
|
||||
ArrowDropRight: '\u2937' as GlyphChars,
|
||||
ArrowLeft: '\u2190' as GlyphChars,
|
||||
ArrowLeftRight: '\u2194' as GlyphChars,
|
||||
ArrowRight: '\u2192' as GlyphChars,
|
||||
ArrowRightHollow: '\u21e8' as GlyphChars,
|
||||
ArrowUp: '\u2191' as GlyphChars,
|
||||
ArrowUpRight: '\u2197' as GlyphChars,
|
||||
Asterisk: '\u2217' as GlyphChars,
|
||||
Check: '\u2713' as GlyphChars,
|
||||
Dash: '\u2014' as GlyphChars,
|
||||
Dot: '\u2022' as GlyphChars,
|
||||
Ellipsis: '\u2026' as GlyphChars,
|
||||
Pensil: '\u270E' as GlyphChars,
|
||||
Space: '\u00a0' as GlyphChars,
|
||||
ZeroWidthSpace: '\u200b' as GlyphChars
|
||||
};
|
||||
|
||||
export type GlobalState = 'gitlensVersion';
|
||||
export const GlobalState = {
|
||||
GitLensVersion: 'gitlensVersion' as GlobalState
|
||||
};
|
||||
|
||||
export type WorkspaceState = 'gitlens:gitExplorer:view';
|
||||
export type WorkspaceState = 'gitlensVersion';
|
||||
export const WorkspaceState = {
|
||||
GitExplorerView: 'gitlens:gitExplorer:view' as WorkspaceState
|
||||
GitLensVersion: 'gitlensVersion' as WorkspaceState
|
||||
};
|
||||
@@ -7,7 +7,7 @@ import { Commands } from './commands';
|
||||
import { TextEditorComparer } from './comparers';
|
||||
import { IConfig, StatusBarCommand } from './configuration';
|
||||
import { DocumentSchemes, ExtensionKey } from './constants';
|
||||
import { BlameabilityChangeEvent, CommitFormatter, GitCommit, GitCommitLine, GitContextTracker, GitService, GitUri, ICommitFormatOptions } from './gitService';
|
||||
import { BlameabilityChangeEvent, CommitFormatter, GitCommit, GitCommitLine, GitContextTracker, GitService, GitUri } from './gitService';
|
||||
import { Logger } from './logger';
|
||||
|
||||
const annotationDecoration: TextEditorDecorationType = window.createTextEditorDecorationType({
|
||||
@@ -295,10 +295,12 @@ export class CurrentLineController extends Disposable {
|
||||
const decorationOptions: DecorationOptions[] = [];
|
||||
|
||||
let showChanges = false;
|
||||
let showDetails = false;
|
||||
let showChangesStartIndex = 0;
|
||||
let showChangesInStartingWhitespace = false;
|
||||
|
||||
let showAtStart = false;
|
||||
let showStartIndex = 0;
|
||||
let showDetails = false;
|
||||
let showDetailsStartIndex = 0;
|
||||
let showDetailsInStartingWhitespace = false;
|
||||
|
||||
switch (state.annotationType) {
|
||||
case LineAnnotationType.Trailing: {
|
||||
@@ -306,7 +308,21 @@ export class CurrentLineController extends Disposable {
|
||||
|
||||
showChanges = cfgAnnotations.hover.changes;
|
||||
showDetails = cfgAnnotations.hover.details;
|
||||
showStartIndex = cfgAnnotations.hover.wholeLine ? 0 : endOfLineIndex;
|
||||
|
||||
if (cfgAnnotations.hover.wholeLine) {
|
||||
showChangesStartIndex = 0;
|
||||
showChangesInStartingWhitespace = false;
|
||||
|
||||
showDetailsStartIndex = 0;
|
||||
showDetailsInStartingWhitespace = false;
|
||||
}
|
||||
else {
|
||||
showChangesStartIndex = endOfLineIndex;
|
||||
showChangesInStartingWhitespace = true;
|
||||
|
||||
showDetailsStartIndex = endOfLineIndex;
|
||||
showDetailsInStartingWhitespace = true;
|
||||
}
|
||||
|
||||
const decoration = Annotations.trailing(commit, cfgAnnotations.format, cfgAnnotations.dateFormat === null ? this._config.defaultDateFormat : cfgAnnotations.dateFormat, this._config.theme);
|
||||
decoration.range = editor.document.validateRange(new Range(line, endOfLineIndex, line, endOfLineIndex));
|
||||
@@ -318,8 +334,12 @@ export class CurrentLineController extends Disposable {
|
||||
const cfgAnnotations = this._config.annotations.line.hover;
|
||||
|
||||
showChanges = cfgAnnotations.changes;
|
||||
showChangesStartIndex = 0;
|
||||
showChangesInStartingWhitespace = false;
|
||||
|
||||
showDetails = cfgAnnotations.details;
|
||||
showStartIndex = 0;
|
||||
showDetailsStartIndex = 0;
|
||||
showDetailsInStartingWhitespace = false;
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -328,15 +348,25 @@ export class CurrentLineController extends Disposable {
|
||||
if (showDetails || showChanges) {
|
||||
const annotationType = this.annotationController.getAnnotationType(editor);
|
||||
|
||||
const firstNonWhitespace = editor.document.lineAt(line).firstNonWhitespaceCharacterIndex;
|
||||
|
||||
switch (annotationType) {
|
||||
case FileAnnotationType.Gutter: {
|
||||
const cfgHover = this._config.annotations.file.gutter.hover;
|
||||
if (cfgHover.details) {
|
||||
showDetailsInStartingWhitespace = false;
|
||||
if (cfgHover.wholeLine) {
|
||||
showStartIndex = 0;
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
showDetails = false;
|
||||
}
|
||||
else if (showStartIndex !== 0) {
|
||||
showAtStart = true;
|
||||
else {
|
||||
if (showDetailsStartIndex === 0) {
|
||||
showDetailsStartIndex = firstNonWhitespace === 0 ? 1 : firstNonWhitespace;
|
||||
}
|
||||
if (showChangesStartIndex === 0) {
|
||||
showChangesInStartingWhitespace = true;
|
||||
showChangesStartIndex = firstNonWhitespace === 0 ? 1 : firstNonWhitespace;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,11 +374,20 @@ export class CurrentLineController extends Disposable {
|
||||
}
|
||||
case FileAnnotationType.Hover: {
|
||||
const cfgHover = this._config.annotations.file.hover;
|
||||
showDetailsInStartingWhitespace = false;
|
||||
if (cfgHover.wholeLine) {
|
||||
showStartIndex = 0;
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
showDetails = false;
|
||||
showChangesStartIndex = 0;
|
||||
}
|
||||
else if (showStartIndex !== 0) {
|
||||
showAtStart = true;
|
||||
else {
|
||||
if (showDetailsStartIndex === 0) {
|
||||
showDetailsStartIndex = firstNonWhitespace === 0 ? 1 : firstNonWhitespace;
|
||||
}
|
||||
if (showChangesStartIndex === 0) {
|
||||
showChangesInStartingWhitespace = true;
|
||||
showChangesStartIndex = firstNonWhitespace === 0 ? 1 : firstNonWhitespace;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -356,21 +395,29 @@ export class CurrentLineController extends Disposable {
|
||||
case FileAnnotationType.RecentChanges: {
|
||||
const cfgChanges = this._config.annotations.file.recentChanges.hover;
|
||||
if (cfgChanges.details) {
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
showDetails = false;
|
||||
if (cfgChanges.wholeLine) {
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
showDetails = false;
|
||||
}
|
||||
else {
|
||||
showDetailsInStartingWhitespace = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (cfgChanges.changes) {
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
showChanges = false;
|
||||
if (cfgChanges.wholeLine) {
|
||||
// Avoid double annotations if we are showing the whole-file hover blame annotations
|
||||
showChanges = false;
|
||||
}
|
||||
else {
|
||||
showChangesInStartingWhitespace = false;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const range = editor.document.validateRange(new Range(line, showStartIndex, line, endOfLineIndex));
|
||||
|
||||
if (showDetails) {
|
||||
// Get the full commit message -- since blame only returns the summary
|
||||
let logCommit: GitCommit | undefined = undefined;
|
||||
@@ -378,22 +425,29 @@ export class CurrentLineController extends Disposable {
|
||||
logCommit = await this.git.getLogCommit(this._uri.repoPath, this._uri.fsPath, commit.sha);
|
||||
}
|
||||
|
||||
const decoration = Annotations.detailsHover(logCommit || commit, this._config.defaultDateFormat, this.git.hasRemotes((logCommit || commit).repoPath));
|
||||
decoration.range = range;
|
||||
// I have no idea why I need this protection -- but it happens
|
||||
if (editor.document === undefined) return;
|
||||
|
||||
const decoration = Annotations.detailsHover(logCommit || commit, this._config.defaultDateFormat);
|
||||
decoration.range = editor.document.validateRange(new Range(line, showDetailsStartIndex, line, endOfLineIndex));
|
||||
decorationOptions.push(decoration);
|
||||
|
||||
if (showAtStart) {
|
||||
decorationOptions.push(Annotations.withRange(decoration, 0, 0));
|
||||
if (showDetailsInStartingWhitespace && showDetailsStartIndex !== 0) {
|
||||
decorationOptions.push(Annotations.withRange(decoration, 0, firstNonWhitespace));
|
||||
}
|
||||
}
|
||||
|
||||
if (showChanges) {
|
||||
const decoration = await Annotations.changesHover(commit, line, this._uri, this.git);
|
||||
decoration.range = range;
|
||||
|
||||
// I have no idea why I need this protection -- but it happens
|
||||
if (editor.document === undefined) return;
|
||||
|
||||
decoration.range = editor.document.validateRange(new Range(line, showChangesStartIndex, line, endOfLineIndex));
|
||||
decorationOptions.push(decoration);
|
||||
|
||||
if (showAtStart) {
|
||||
decorationOptions.push(Annotations.withRange(decoration, 0, 0));
|
||||
if (showChangesInStartingWhitespace && showChangesStartIndex !== 0) {
|
||||
decorationOptions.push(Annotations.withRange(decoration, 0, firstNonWhitespace));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -408,10 +462,7 @@ export class CurrentLineController extends Disposable {
|
||||
const cfg = this._config.statusBar;
|
||||
if (!cfg.enabled || this._statusBarItem === undefined) return;
|
||||
|
||||
this._statusBarItem.text = `$(git-commit) ${CommitFormatter.fromTemplate(cfg.format, commit, {
|
||||
truncateMessageAtNewLine: true,
|
||||
dateFormat: cfg.dateFormat === null ? this._config.defaultDateFormat : cfg.dateFormat
|
||||
} as ICommitFormatOptions)}`;
|
||||
this._statusBarItem.text = `$(git-commit) ${CommitFormatter.fromTemplate(cfg.format, commit, cfg.dateFormat === null ? this._config.defaultDateFormat : cfg.dateFormat)}`;
|
||||
|
||||
switch (cfg.command) {
|
||||
case StatusBarCommand.BlameAnnotate:
|
||||
@@ -425,11 +476,11 @@ export class CurrentLineController extends Disposable {
|
||||
break;
|
||||
case StatusBarCommand.DiffWithPrevious:
|
||||
this._statusBarItem.command = Commands.DiffLineWithPrevious;
|
||||
this._statusBarItem.tooltip = 'Compare Line Revision with Previous';
|
||||
this._statusBarItem.tooltip = 'Compare Line Commit with Previous';
|
||||
break;
|
||||
case StatusBarCommand.DiffWithWorking:
|
||||
this._statusBarItem.command = Commands.DiffLineWithWorking;
|
||||
this._statusBarItem.tooltip = 'Compare Line Revision with Working';
|
||||
this._statusBarItem.tooltip = 'Compare Line Commit with Working Tree';
|
||||
break;
|
||||
case StatusBarCommand.ToggleCodeLens:
|
||||
this._statusBarItem.tooltip = 'Toggle Git CodeLens';
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
import { commands, ExtensionContext, extensions, languages, window, workspace } from 'vscode';
|
||||
import { AnnotationController } from './annotations/annotationController';
|
||||
import { CloseUnchangedFilesCommand, OpenChangedFilesCommand } from './commands';
|
||||
import { OpenBranchesInRemoteCommand, OpenBranchInRemoteCommand, OpenCommitInRemoteCommand, OpenFileInRemoteCommand, OpenInRemoteCommand, OpenRepoInRemoteCommand } from './commands';
|
||||
import { OpenBranchInRemoteCommand, OpenCommitInRemoteCommand, OpenFileInRemoteCommand, OpenInRemoteCommand, OpenRepoInRemoteCommand } from './commands';
|
||||
import { CopyMessageToClipboardCommand, CopyShaToClipboardCommand } from './commands';
|
||||
import { DiffDirectoryCommand, DiffLineWithPreviousCommand, DiffLineWithWorkingCommand, DiffWithBranchCommand, DiffWithCommand, DiffWithNextCommand, DiffWithPreviousCommand, DiffWithRevisionCommand, DiffWithWorkingCommand } from './commands';
|
||||
import { DiffDirectoryCommand, DiffLineWithPreviousCommand, DiffLineWithWorkingCommand, DiffWithBranchCommand, DiffWithNextCommand, DiffWithPreviousCommand, DiffWithRevisionCommand, DiffWithWorkingCommand } from './commands';
|
||||
import { ResetSuppressedWarningsCommand } from './commands';
|
||||
import { ClearFileAnnotationsCommand, ShowFileBlameCommand, ShowLineBlameCommand, ToggleFileBlameCommand, ToggleFileRecentChangesCommand, ToggleLineBlameCommand } from './commands';
|
||||
import { ShowBlameHistoryCommand, ShowFileHistoryCommand } from './commands';
|
||||
@@ -16,12 +16,13 @@ import { ShowQuickRepoStatusCommand, ShowQuickStashListCommand } from './command
|
||||
import { StashApplyCommand, StashDeleteCommand, StashSaveCommand } from './commands';
|
||||
import { ToggleCodeLensCommand } from './commands';
|
||||
import { CodeLensLocations, IConfig, LineHighlightLocations } from './configuration';
|
||||
import { ApplicationInsightsKey, CommandContext, ExtensionKey, GlobalState, QualifiedExtensionId, setCommandContext } from './constants';
|
||||
import { ApplicationInsightsKey, CommandContext, ExtensionKey, QualifiedExtensionId, setCommandContext, WorkspaceState } from './constants';
|
||||
import { CodeLensController } from './codeLensController';
|
||||
import { CurrentLineController, LineAnnotationType } from './currentLineController';
|
||||
import { RemoteProviderFactory } from './git/remotes/factory';
|
||||
import { GitContentProvider } from './gitContentProvider';
|
||||
import { GitExplorer } from './views/gitExplorer';
|
||||
// import { GitExplorer } from './views/gitExplorer';
|
||||
import { FileHistoryExplorer } from './views/fileHistoryExplorer';
|
||||
import { StashExplorer } from './views/stashExplorer';
|
||||
import { GitRevisionCodeLensProvider } from './gitRevisionCodeLensProvider';
|
||||
import { GitContextTracker, GitService } from './gitService';
|
||||
import { Keyboard } from './keyboard';
|
||||
@@ -34,7 +35,6 @@ export async function activate(context: ExtensionContext) {
|
||||
Logger.configure(context);
|
||||
Messages.configure(context);
|
||||
Telemetry.configure(ApplicationInsightsKey);
|
||||
RemoteProviderFactory.configure(context);
|
||||
|
||||
const gitlens = extensions.getExtension(QualifiedExtensionId)!;
|
||||
const gitlensVersion = gitlens.packageJSON.version;
|
||||
@@ -71,7 +71,7 @@ export async function activate(context: ExtensionContext) {
|
||||
notifyOnUnsupportedGitVersion(context, gitVersion);
|
||||
notifyOnNewGitLensVersion(context, gitlensVersion);
|
||||
|
||||
await context.globalState.update(GlobalState.GitLensVersion, gitlensVersion);
|
||||
await context.globalState.update(WorkspaceState.GitLensVersion, gitlensVersion);
|
||||
|
||||
const git = new GitService(repoPath);
|
||||
context.subscriptions.push(git);
|
||||
@@ -94,7 +94,11 @@ export async function activate(context: ExtensionContext) {
|
||||
|
||||
context.subscriptions.push(new Keyboard());
|
||||
|
||||
context.subscriptions.push(window.registerTreeDataProvider('gitlens.gitExplorer', new GitExplorer(context, git)));
|
||||
// const explorer = new GitExplorer(context, git);
|
||||
// context.subscriptions.push(window.registerTreeDataProvider('gitlens.gitExplorer', explorer));
|
||||
|
||||
context.subscriptions.push(window.registerTreeDataProvider('gitlens.fileHistoryExplorer', new FileHistoryExplorer(context, git)));
|
||||
context.subscriptions.push(window.registerTreeDataProvider('gitlens.stashExplorer', new StashExplorer(context, git)));
|
||||
|
||||
context.subscriptions.push(commands.registerTextEditorCommand('gitlens.computingFileAnnotations', () => { }));
|
||||
|
||||
@@ -105,13 +109,11 @@ export async function activate(context: ExtensionContext) {
|
||||
context.subscriptions.push(new DiffDirectoryCommand(git));
|
||||
context.subscriptions.push(new DiffLineWithPreviousCommand(git));
|
||||
context.subscriptions.push(new DiffLineWithWorkingCommand(git));
|
||||
context.subscriptions.push(new DiffWithCommand(git));
|
||||
context.subscriptions.push(new DiffWithBranchCommand(git));
|
||||
context.subscriptions.push(new DiffWithNextCommand(git));
|
||||
context.subscriptions.push(new DiffWithPreviousCommand(git));
|
||||
context.subscriptions.push(new DiffWithRevisionCommand(git));
|
||||
context.subscriptions.push(new DiffWithWorkingCommand(git));
|
||||
context.subscriptions.push(new OpenBranchesInRemoteCommand(git));
|
||||
context.subscriptions.push(new OpenBranchInRemoteCommand(git));
|
||||
context.subscriptions.push(new OpenCommitInRemoteCommand(git));
|
||||
context.subscriptions.push(new OpenFileInRemoteCommand(git));
|
||||
@@ -148,7 +150,7 @@ export async function activate(context: ExtensionContext) {
|
||||
export function deactivate() { }
|
||||
|
||||
async function migrateSettings(context: ExtensionContext) {
|
||||
const previousVersion = context.globalState.get<string>(GlobalState.GitLensVersion);
|
||||
const previousVersion = context.globalState.get<string>(WorkspaceState.GitLensVersion);
|
||||
if (previousVersion === undefined) return;
|
||||
|
||||
const [major] = previousVersion.split('.');
|
||||
@@ -274,16 +276,13 @@ async function migrateSettings(context: ExtensionContext) {
|
||||
async function notifyOnNewGitLensVersion(context: ExtensionContext, version: string) {
|
||||
if (context.globalState.get(SuppressedKeys.UpdateNotice, false)) return;
|
||||
|
||||
const previousVersion = context.globalState.get<string>(GlobalState.GitLensVersion);
|
||||
const previousVersion = context.globalState.get<string>(WorkspaceState.GitLensVersion);
|
||||
|
||||
if (previousVersion === undefined) {
|
||||
Logger.log(`GitLens first-time install`);
|
||||
await Messages.showWelcomeMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.log(`GitLens upgraded from v${previousVersion} to v${version}`);
|
||||
|
||||
const [major, minor] = version.split('.');
|
||||
const [prevMajor, prevMinor] = previousVersion.split('.');
|
||||
if (major === prevMajor && minor === prevMinor) return;
|
||||
|
||||
@@ -2,11 +2,9 @@
|
||||
import { Strings } from '../../system';
|
||||
import { GitCommit } from '../models/commit';
|
||||
import { Formatter, IFormatOptions } from './formatter';
|
||||
import { GlyphChars } from '../../constants';
|
||||
import * as moment from 'moment';
|
||||
|
||||
export interface ICommitFormatOptions extends IFormatOptions {
|
||||
truncateMessageAtNewLine?: boolean;
|
||||
|
||||
tokenOptions?: {
|
||||
ago?: Strings.ITokenOptions;
|
||||
author?: Strings.ITokenOptions;
|
||||
@@ -19,7 +17,7 @@ export interface ICommitFormatOptions extends IFormatOptions {
|
||||
export class CommitFormatter extends Formatter<GitCommit, ICommitFormatOptions> {
|
||||
|
||||
get ago() {
|
||||
const ago = this._item.fromNow();
|
||||
const ago = moment(this._item.date).fromNow();
|
||||
return this._padOrTruncate(ago, this._options.tokenOptions!.ago);
|
||||
}
|
||||
|
||||
@@ -29,28 +27,21 @@ export class CommitFormatter extends Formatter<GitCommit, ICommitFormatOptions>
|
||||
}
|
||||
|
||||
get authorAgo() {
|
||||
const authorAgo = `${this._item.author}, ${this._item.fromNow()}`;
|
||||
const authorAgo = `${this._item.author}, ${moment(this._item.date).fromNow()}`;
|
||||
return this._padOrTruncate(authorAgo, this._options.tokenOptions!.authorAgo);
|
||||
}
|
||||
|
||||
get date() {
|
||||
const date = this._item.formatDate(this._options.dateFormat!);
|
||||
const date = moment(this._item.date).format(this._options.dateFormat!);
|
||||
return this._padOrTruncate(date, this._options.tokenOptions!.date);
|
||||
}
|
||||
|
||||
get id() {
|
||||
return this._item.isUncommitted ? 'index' : this._item.shortSha;
|
||||
return this._item.shortSha;
|
||||
}
|
||||
|
||||
get message() {
|
||||
let message = this._item.isUncommitted ? 'Uncommitted change' : this._item.message;
|
||||
if (this._options.truncateMessageAtNewLine) {
|
||||
const index = message.indexOf('\n');
|
||||
if (index !== -1) {
|
||||
message = `${message.substring(0, index)}${GlyphChars.Space}${GlyphChars.Ellipsis}`;
|
||||
}
|
||||
}
|
||||
|
||||
const message = this._item.isUncommitted ? 'Uncommitted change' : this._item.message;
|
||||
return this._padOrTruncate(message, this._options.tokenOptions!.message);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ export abstract class Formatter<TItem = any, TOptions extends IFormatOptions = I
|
||||
|
||||
let max = options.truncateTo;
|
||||
|
||||
const width = Strings.width(s);
|
||||
const width = Strings.getWidth(s);
|
||||
if (max === undefined) {
|
||||
if (this.collapsableWhitespace === 0) return s;
|
||||
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
'use strict';
|
||||
import { Strings } from '../../system';
|
||||
import { GlyphChars } from '../../constants';
|
||||
import { Formatter, IFormatOptions } from './formatter';
|
||||
import { GitStatusFile, IGitStatusFile, IGitStatusFileWithCommit } from '../models/status';
|
||||
import { GitStatusFile, IGitStatusFile } from '../models/status';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface IStatusFormatOptions extends IFormatOptions {
|
||||
relativePath?: string;
|
||||
|
||||
tokenOptions?: {
|
||||
directory?: Strings.ITokenOptions;
|
||||
file?: Strings.ITokenOptions;
|
||||
filePath?: Strings.ITokenOptions;
|
||||
path?: Strings.ITokenOptions;
|
||||
@@ -18,31 +14,21 @@ export interface IStatusFormatOptions extends IFormatOptions {
|
||||
|
||||
export class StatusFileFormatter extends Formatter<IGitStatusFile, IStatusFormatOptions> {
|
||||
|
||||
get directory() {
|
||||
const directory = GitStatusFile.getFormattedDirectory(this._item, false, this._options.relativePath);
|
||||
return this._padOrTruncate(directory, this._options.tokenOptions!.file);
|
||||
}
|
||||
|
||||
get file() {
|
||||
const file = path.basename(this._item.fileName);
|
||||
return this._padOrTruncate(file, this._options.tokenOptions!.file);
|
||||
}
|
||||
|
||||
get filePath() {
|
||||
const filePath = GitStatusFile.getFormattedPath(this._item, undefined, this._options.relativePath);
|
||||
const filePath = GitStatusFile.getFormattedPath(this._item);
|
||||
return this._padOrTruncate(filePath, this._options.tokenOptions!.filePath);
|
||||
}
|
||||
|
||||
get path() {
|
||||
const directory = GitStatusFile.getRelativePath(this._item, this._options.relativePath);
|
||||
const directory = GitStatusFile.getFormattedDirectory(this._item, false);
|
||||
return this._padOrTruncate(directory, this._options.tokenOptions!.file);
|
||||
}
|
||||
|
||||
get working() {
|
||||
const commit = (this._item as IGitStatusFileWithCommit).commit;
|
||||
return (commit !== undefined && commit.isUncommitted) ? `${GlyphChars.Pensil} ${GlyphChars.Space}` : '';
|
||||
}
|
||||
|
||||
static fromTemplate(template: string, status: IGitStatusFile, dateFormat: string | null): string;
|
||||
static fromTemplate(template: string, status: IGitStatusFile, options?: IStatusFormatOptions): string;
|
||||
static fromTemplate(template: string, status: IGitStatusFile, dateFormatOrOptions?: string | null | IStatusFormatOptions): string;
|
||||
|
||||
179
src/git/git.ts
@@ -1,5 +1,4 @@
|
||||
'use strict';
|
||||
import { Strings } from '../system';
|
||||
import { findGitPath, IGit } from './gitLocator';
|
||||
import { Logger } from '../logger';
|
||||
import { spawnPromise } from 'spawn-rx';
|
||||
@@ -11,19 +10,17 @@ import * as iconv from 'iconv-lite';
|
||||
export { IGit };
|
||||
export * from './models/models';
|
||||
export * from './parsers/blameParser';
|
||||
export * from './parsers/branchParser';
|
||||
export * from './parsers/diffParser';
|
||||
export * from './parsers/logParser';
|
||||
export * from './parsers/remoteParser';
|
||||
export * from './parsers/stashParser';
|
||||
export * from './parsers/statusParser';
|
||||
export * from './remotes/provider';
|
||||
|
||||
let git: IGit;
|
||||
|
||||
const defaultBlameParams = [`blame`, `--root`, `--incremental`];
|
||||
const defaultLogParams = [`log`, `--name-status`, `--full-history`, `-M`, `--format=%H -%nauthor %an%nauthor-date %at%nparents %P%nsummary %B%nfilename ?`];
|
||||
const defaultStashParams = [`stash`, `list`, `--name-status`, `--full-history`, `-M`, `--format=%H -%nauthor-date %at%nreflog-selector %gd%nsummary %B%nfilename ?`];
|
||||
// `--format=%H -%nauthor %an%nauthor-date %ai%ncommitter %cn%ncommitter-date %ci%nparents %P%nsummary %B%nfilename ?`
|
||||
const defaultLogParams = [`log`, `--name-status`, `--full-history`, `-M`, `--date=iso8601`, `--format=%H -%nauthor %an%nauthor-date %ai%nparents %P%nsummary %B%nfilename ?`];
|
||||
const defaultStashParams = [`stash`, `list`, `--name-status`, `--full-history`, `-M`, `--format=%H -%nauthor-date %ai%nreflog-selector %gd%nsummary %B%nfilename ?`];
|
||||
|
||||
let defaultEncoding = 'utf8';
|
||||
export function setDefaultEncoding(encoding: string) {
|
||||
@@ -34,55 +31,36 @@ const GitWarnings = [
|
||||
/Not a git repository/,
|
||||
/is outside repository/,
|
||||
/no such path/,
|
||||
/does not have any commits/,
|
||||
/Path \'.*?\' does not exist in/,
|
||||
/Path \'.*?\' exists on disk, but not in/,
|
||||
/no upstream configured for branch/
|
||||
/does not have any commits/
|
||||
];
|
||||
|
||||
interface GitCommandOptions {
|
||||
cwd: string;
|
||||
encoding?: string;
|
||||
overrideErrorHandling?: boolean;
|
||||
}
|
||||
|
||||
async function gitCommand(options: GitCommandOptions, ...args: any[]): Promise<string> {
|
||||
if (options.overrideErrorHandling) return gitCommandCore(options, ...args);
|
||||
|
||||
async function gitCommand(options: { cwd: string, encoding?: string }, ...args: any[]) {
|
||||
try {
|
||||
return await gitCommandCore(options, ...args);
|
||||
// Fixes https://github.com/eamodio/vscode-gitlens/issues/73
|
||||
// See https://stackoverflow.com/questions/4144417/how-to-handle-asian-characters-in-file-names-in-git-on-os-x
|
||||
args.splice(0, 0, '-c', 'core.quotepath=false');
|
||||
|
||||
const opts = { encoding: 'utf8', ...options };
|
||||
const s = await spawnPromise(git.path, args, { cwd: options.cwd, encoding: (opts.encoding === 'utf8') ? 'utf8' : 'binary' });
|
||||
Logger.log('git', ...args, ` cwd='${options.cwd}'`);
|
||||
if (opts.encoding === 'utf8' || opts.encoding === 'binary') return s;
|
||||
|
||||
return iconv.decode(Buffer.from(s, 'binary'), opts.encoding);
|
||||
}
|
||||
catch (ex) {
|
||||
return gitCommandDefaultErrorHandler(ex, options, ...args);
|
||||
}
|
||||
}
|
||||
|
||||
async function gitCommandCore(options: GitCommandOptions, ...args: any[]): Promise<string> {
|
||||
// Fixes https://github.com/eamodio/vscode-gitlens/issues/73
|
||||
// See https://stackoverflow.com/questions/4144417/how-to-handle-asian-characters-in-file-names-in-git-on-os-x
|
||||
args.splice(0, 0, '-c', 'core.quotepath=false');
|
||||
|
||||
const opts = { encoding: 'utf8', ...options };
|
||||
const s = await spawnPromise(git.path, args, { cwd: options.cwd, encoding: (opts.encoding === 'utf8') ? 'utf8' : 'binary' });
|
||||
Logger.log('git', ...args, ` cwd='${options.cwd}'`);
|
||||
if (opts.encoding === 'utf8' || opts.encoding === 'binary') return s;
|
||||
|
||||
return iconv.decode(Buffer.from(s, 'binary'), opts.encoding);
|
||||
}
|
||||
|
||||
function gitCommandDefaultErrorHandler(ex: Error, options: GitCommandOptions, ...args: any[]): string {
|
||||
const msg = ex && ex.toString();
|
||||
if (msg) {
|
||||
for (const warning of GitWarnings) {
|
||||
if (warning.test(msg)) {
|
||||
Logger.warn('git', ...args, ` cwd='${options.cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
|
||||
return '';
|
||||
const msg = ex && ex.toString();
|
||||
if (msg) {
|
||||
for (const warning of GitWarnings) {
|
||||
if (warning.test(msg)) {
|
||||
Logger.warn('git', ...args, ` cwd='${options.cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logger.error(ex, 'git', ...args, ` cwd='${options.cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
|
||||
throw ex;
|
||||
Logger.error(ex, 'git', ...args, ` cwd='${options.cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
export class Git {
|
||||
@@ -111,9 +89,8 @@ export class Git {
|
||||
|
||||
static async getVersionedFile(repoPath: string | undefined, fileName: string, branchOrSha: string) {
|
||||
const data = await Git.show(repoPath, fileName, branchOrSha, 'binary');
|
||||
if (data === undefined) return undefined;
|
||||
|
||||
const suffix = Strings.truncate(Strings.sanitizeForFS(Git.isSha(branchOrSha) ? Git.shortenSha(branchOrSha) : branchOrSha), 50, '');
|
||||
const suffix = Git.isSha(branchOrSha) ? branchOrSha.substring(0, 8) : branchOrSha;
|
||||
const ext = path.extname(fileName);
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
tmp.file({ prefix: `${path.basename(fileName, ext)}-${suffix}__`, postfix: ext },
|
||||
@@ -148,10 +125,6 @@ export class Git {
|
||||
return fileName && fileName.replace(/\\/g, '/');
|
||||
}
|
||||
|
||||
static shortenSha(sha: string) {
|
||||
return sha.substring(0, 8);
|
||||
}
|
||||
|
||||
static splitPath(fileName: string, repoPath: string | undefined, extract: boolean = true): [string, string] {
|
||||
if (repoPath) {
|
||||
fileName = this.normalizePath(fileName);
|
||||
@@ -177,17 +150,15 @@ export class Git {
|
||||
|
||||
// Git commands
|
||||
|
||||
static blame(repoPath: string | undefined, fileName: string, sha?: string, options: { ignoreWhitespace?: boolean, startLine?: number, endLine?: number } = {}) {
|
||||
static blame(repoPath: string | undefined, fileName: string, sha?: string, startLine?: number, endLine?: number) {
|
||||
const [file, root] = Git.splitPath(fileName, repoPath);
|
||||
|
||||
const params = [...defaultBlameParams];
|
||||
const params = [`blame`, `--root`, `--incremental`];
|
||||
|
||||
if (options.ignoreWhitespace) {
|
||||
params.push('-w');
|
||||
}
|
||||
if (options.startLine != null && options.endLine != null) {
|
||||
params.push(`-L ${options.startLine},${options.endLine}`);
|
||||
if (startLine != null && endLine != null) {
|
||||
params.push(`-L ${startLine},${endLine}`);
|
||||
}
|
||||
|
||||
if (sha) {
|
||||
params.push(sha);
|
||||
}
|
||||
@@ -195,42 +166,20 @@ export class Git {
|
||||
return gitCommand({ cwd: root }, ...params, `--`, file);
|
||||
}
|
||||
|
||||
static branch(repoPath: string, options: { all: boolean } = { all: false }) {
|
||||
const params = [`branch`, `-vv`];
|
||||
if (options.all) {
|
||||
static branch(repoPath: string, all: boolean) {
|
||||
const params = [`branch`];
|
||||
if (all) {
|
||||
params.push(`-a`);
|
||||
}
|
||||
|
||||
return gitCommand({ cwd: repoPath }, ...params);
|
||||
}
|
||||
|
||||
static async branch_current(repoPath: string) {
|
||||
const params = [`rev-parse`, `--abbrev-ref`, `--symbolic-full-name`, `@`, `@{u}`];
|
||||
|
||||
const opts = { cwd: repoPath, overrideErrorHandling: true };
|
||||
try {
|
||||
return await gitCommand(opts, ...params);
|
||||
}
|
||||
catch (ex) {
|
||||
if (/no upstream configured for branch/.test(ex && ex.toString())) {
|
||||
return ex.message.split('\n')[0];
|
||||
}
|
||||
|
||||
return gitCommandDefaultErrorHandler(ex, opts, ...params);
|
||||
}
|
||||
}
|
||||
|
||||
static checkout(repoPath: string, fileName: string, sha: string) {
|
||||
const [file, root] = Git.splitPath(fileName, repoPath);
|
||||
|
||||
return gitCommand({ cwd: root }, `checkout`, sha, `--`, file);
|
||||
}
|
||||
|
||||
static async config_get(key: string, repoPath?: string) {
|
||||
try {
|
||||
return await gitCommand({ cwd: repoPath || '', overrideErrorHandling: true }, `config`, `--get`, key);
|
||||
return await gitCommand({ cwd: repoPath || '' }, `config`, `--get`, key);
|
||||
}
|
||||
catch {
|
||||
catch (ex) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -259,14 +208,6 @@ export class Git {
|
||||
return gitCommand({ cwd: repoPath }, ...params);
|
||||
}
|
||||
|
||||
static diff_shortstat(repoPath: string, sha?: string) {
|
||||
const params = [`diff`, `--shortstat`, `--no-ext-diff`];
|
||||
if (sha) {
|
||||
params.push(sha);
|
||||
}
|
||||
return gitCommand({ cwd: repoPath }, ...params);
|
||||
}
|
||||
|
||||
static difftool_dirDiff(repoPath: string, sha1: string, sha2?: string) {
|
||||
const params = [`difftool`, `--dir-diff`, sha1];
|
||||
if (sha2) {
|
||||
@@ -340,19 +281,11 @@ export class Git {
|
||||
return gitCommand({ cwd: repoPath }, ...params, ...search);
|
||||
}
|
||||
|
||||
static log_shortstat(repoPath: string, sha?: string) {
|
||||
const params = [`log`, `--shortstat`, `--oneline`];
|
||||
if (sha) {
|
||||
params.push(sha);
|
||||
}
|
||||
return gitCommand({ cwd: repoPath }, ...params);
|
||||
}
|
||||
|
||||
static async ls_files(repoPath: string, fileName: string): Promise<string> {
|
||||
try {
|
||||
return await gitCommand({ cwd: repoPath, overrideErrorHandling: true }, 'ls-files', fileName);
|
||||
return await gitCommand({ cwd: repoPath }, 'ls-files', fileName);
|
||||
}
|
||||
catch {
|
||||
catch (ex) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -365,25 +298,12 @@ export class Git {
|
||||
return gitCommand({ cwd: repoPath }, 'remote', 'get-url', remote);
|
||||
}
|
||||
|
||||
static async show(repoPath: string | undefined, fileName: string, branchOrSha: string, encoding?: string) {
|
||||
static show(repoPath: string | undefined, fileName: string, branchOrSha: string, encoding?: string) {
|
||||
const [file, root] = Git.splitPath(fileName, repoPath);
|
||||
branchOrSha = branchOrSha.replace('^', '');
|
||||
|
||||
if (Git.isUncommitted(branchOrSha)) throw new Error(`sha=${branchOrSha} is uncommitted`);
|
||||
|
||||
const opts = { cwd: root, encoding: encoding || defaultEncoding, overrideErrorHandling: true };
|
||||
const args = `${branchOrSha}:./${file}`;
|
||||
try {
|
||||
return await gitCommand(opts, 'show', args);
|
||||
}
|
||||
catch (ex) {
|
||||
const msg = ex && ex.toString();
|
||||
if (/Path \'.*?\' does not exist in/.test(msg) || /Path \'.*?\' exists on disk, but not in /.test(msg)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return gitCommandDefaultErrorHandler(ex, opts, args);
|
||||
}
|
||||
if (Git.isUncommitted(branchOrSha)) return Promise.reject(new Error(`sha=${branchOrSha} is uncommitted`));
|
||||
return gitCommand({ cwd: root, encoding: encoding || defaultEncoding }, 'show', `${branchOrSha}:./${file}`);
|
||||
}
|
||||
|
||||
static stash_apply(repoPath: string, stashName: string, deleteAfter: boolean) {
|
||||
@@ -400,18 +320,11 @@ export class Git {
|
||||
return gitCommand({ cwd: repoPath }, ...defaultStashParams);
|
||||
}
|
||||
|
||||
static stash_push(repoPath: string, pathspecs: string[], message?: string) {
|
||||
const params = [`stash`, `push`, `-u`];
|
||||
if (message) {
|
||||
params.push(`-m`);
|
||||
params.push(message);
|
||||
static stash_save(repoPath: string, message?: string, unstagedOnly: boolean = false) {
|
||||
const params = [`stash`, `save`, `--include-untracked`];
|
||||
if (unstagedOnly) {
|
||||
params.push(`--keep-index`);
|
||||
}
|
||||
params.splice(params.length, 0, `--`, ...pathspecs);
|
||||
return gitCommand({ cwd: repoPath }, ...params);
|
||||
}
|
||||
|
||||
static stash_save(repoPath: string, message?: string) {
|
||||
const params = [`stash`, `save`, `-u`];
|
||||
if (message) {
|
||||
params.push(message);
|
||||
}
|
||||
@@ -420,7 +333,7 @@ export class Git {
|
||||
|
||||
static status(repoPath: string, porcelainVersion: number = 1): Promise<string> {
|
||||
const porcelain = porcelainVersion >= 2 ? `--porcelain=v${porcelainVersion}` : '--porcelain';
|
||||
return gitCommand({ cwd: repoPath }, 'status', porcelain, '--branch', '-u');
|
||||
return gitCommand({ cwd: repoPath }, 'status', porcelain, '--branch');
|
||||
}
|
||||
|
||||
static status_file(repoPath: string, fileName: string, porcelainVersion: number = 1): Promise<string> {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { Disposable, Event, EventEmitter, TextDocument, TextDocumentChangeEvent, TextEditor, window, workspace } from 'vscode';
|
||||
import { TextDocumentComparer } from '../comparers';
|
||||
import { CommandContext, setCommandContext } from '../constants';
|
||||
import { GitService, GitUri, RepoChangedReasons } from '../gitService';
|
||||
import { GitService, GitUri } from '../gitService';
|
||||
import { Logger } from '../logger';
|
||||
|
||||
export interface BlameabilityChangeEvent {
|
||||
@@ -32,13 +32,13 @@ export class GitContextTracker extends Disposable {
|
||||
subscriptions.push(workspace.onDidChangeConfiguration(this._onConfigurationChanged, this));
|
||||
subscriptions.push(workspace.onDidSaveTextDocument(this._onTextDocumentSaved, this));
|
||||
subscriptions.push(this.git.onDidBlameFail(this._onBlameFailed, this));
|
||||
subscriptions.push(this.git.onDidChangeRepo(this._onRepoChanged, this));
|
||||
|
||||
this._disposable = Disposable.from(...subscriptions);
|
||||
|
||||
setCommandContext(CommandContext.IsRepository, !!this.git.repoPath);
|
||||
|
||||
this._onConfigurationChanged();
|
||||
this._onActiveTextEditorChanged(window.activeTextEditor);
|
||||
}
|
||||
|
||||
dispose() {
|
||||
@@ -55,13 +55,6 @@ export class GitContextTracker extends Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
async _onRepoChanged(reasons: RepoChangedReasons[]) {
|
||||
if (!reasons.includes(RepoChangedReasons.Remotes)) return;
|
||||
|
||||
const gitUri = this._editor === undefined ? undefined : await GitUri.fromUri(this._editor.document.uri, this.git);
|
||||
this._updateContextHasRemotes(gitUri);
|
||||
}
|
||||
|
||||
private _onActiveTextEditorChanged(editor: TextEditor | undefined) {
|
||||
this._editor = editor;
|
||||
this._updateContext(this._gitEnabled ? editor : undefined);
|
||||
|
||||
@@ -42,7 +42,7 @@ export class GitUri extends Uri {
|
||||
}
|
||||
else {
|
||||
const commit = commitOrRepoPath;
|
||||
base._fsPath = path.resolve(commit.repoPath, commit.originalFileName || commit.fileName || '');
|
||||
base._fsPath = path.resolve(commit.repoPath, commit.originalFileName || commit.fileName);
|
||||
|
||||
if (commit.repoPath !== undefined) {
|
||||
this.repoPath = commit.repoPath;
|
||||
@@ -56,21 +56,18 @@ export class GitUri extends Uri {
|
||||
}
|
||||
|
||||
get shortSha() {
|
||||
return this.sha && GitService.shortenSha(this.sha);
|
||||
return this.sha && this.sha.substring(0, 8);
|
||||
}
|
||||
|
||||
fileUri() {
|
||||
return Uri.file(this.sha ? this.path : this.fsPath);
|
||||
}
|
||||
|
||||
getFormattedPath(separator: string = Strings.pad(GlyphChars.Dot, 2, 2), relativeTo?: string): string {
|
||||
getFormattedPath(separator: string = Strings.pad(GlyphChars.Dot, 2, 2)): string {
|
||||
let directory = path.dirname(this.fsPath);
|
||||
if (this.repoPath) {
|
||||
directory = path.relative(this.repoPath, directory);
|
||||
}
|
||||
if (relativeTo !== undefined) {
|
||||
directory = path.relative(relativeTo, directory);
|
||||
}
|
||||
directory = GitService.normalizePath(directory);
|
||||
|
||||
return (!directory || directory === '.')
|
||||
@@ -78,12 +75,8 @@ export class GitUri extends Uri {
|
||||
: `${path.basename(this.fsPath)}${separator}${directory}`;
|
||||
}
|
||||
|
||||
getRelativePath(relativeTo?: string): string {
|
||||
let relativePath = path.relative(this.repoPath || '', this.fsPath);
|
||||
if (relativeTo !== undefined) {
|
||||
relativePath = path.relative(relativeTo, relativePath);
|
||||
}
|
||||
return GitService.normalizePath(relativePath);
|
||||
getRelativePath(): string {
|
||||
return GitService.normalizePath(path.relative(this.repoPath || '', this.fsPath));
|
||||
}
|
||||
|
||||
static async fromUri(uri: Uri, git: GitService) {
|
||||
@@ -111,19 +104,15 @@ export class GitUri extends Uri {
|
||||
return new GitUri(uri, repoPathOrCommit);
|
||||
}
|
||||
|
||||
static getDirectory(fileName: string, relativeTo?: string): string {
|
||||
let directory: string | undefined = path.dirname(fileName);
|
||||
if (relativeTo !== undefined) {
|
||||
directory = path.relative(relativeTo, directory);
|
||||
}
|
||||
directory = GitService.normalizePath(directory);
|
||||
static getDirectory(fileName: string): string {
|
||||
const directory: string | undefined = GitService.normalizePath(path.dirname(fileName));
|
||||
return (!directory || directory === '.') ? '' : directory;
|
||||
}
|
||||
|
||||
static getFormattedPath(fileNameOrUri: string | Uri, separator: string = Strings.pad(GlyphChars.Dot, 2, 2), relativeTo?: string): string {
|
||||
static getFormattedPath(fileNameOrUri: string | Uri, separator: string = Strings.pad(GlyphChars.Dot, 2, 2)): string {
|
||||
let fileName: string;
|
||||
if (fileNameOrUri instanceof Uri) {
|
||||
if (fileNameOrUri instanceof GitUri) return fileNameOrUri.getFormattedPath(separator, relativeTo);
|
||||
if (fileNameOrUri instanceof GitUri) return fileNameOrUri.getFormattedPath(separator);
|
||||
|
||||
fileName = fileNameOrUri.fsPath;
|
||||
}
|
||||
@@ -131,29 +120,11 @@ export class GitUri extends Uri {
|
||||
fileName = fileNameOrUri;
|
||||
}
|
||||
|
||||
const directory = GitUri.getDirectory(fileName, relativeTo);
|
||||
const directory = GitUri.getDirectory(fileName);
|
||||
return !directory
|
||||
? path.basename(fileName)
|
||||
: `${path.basename(fileName)}${separator}${directory}`;
|
||||
}
|
||||
|
||||
static getRelativePath(fileNameOrUri: string | Uri, relativeTo?: string, repoPath?: string): string {
|
||||
let fileName: string;
|
||||
if (fileNameOrUri instanceof Uri) {
|
||||
if (fileNameOrUri instanceof GitUri) return fileNameOrUri.getRelativePath(relativeTo);
|
||||
|
||||
fileName = fileNameOrUri.fsPath;
|
||||
}
|
||||
else {
|
||||
fileName = fileNameOrUri;
|
||||
}
|
||||
|
||||
let relativePath = path.relative(repoPath || '', fileName);
|
||||
if (relativeTo !== undefined) {
|
||||
relativePath = path.relative(relativeTo, relativePath);
|
||||
}
|
||||
return GitService.normalizePath(relativePath);
|
||||
}
|
||||
}
|
||||
|
||||
export interface IGitCommitInfo {
|
||||
|
||||
@@ -5,32 +5,25 @@ export class GitBranch {
|
||||
current: boolean;
|
||||
name: string;
|
||||
remote: boolean;
|
||||
tracking?: string;
|
||||
|
||||
constructor(public readonly repoPath: string, branch: string, current: boolean = false, tracking?: string) {
|
||||
constructor(branch: string) {
|
||||
branch = branch.trim();
|
||||
|
||||
if (branch.startsWith('* ')) {
|
||||
branch = branch.substring(2);
|
||||
this.current = true;
|
||||
}
|
||||
|
||||
if (branch.startsWith('remotes/')) {
|
||||
branch = branch.substring(8);
|
||||
this.remote = true;
|
||||
}
|
||||
|
||||
this.current = current;
|
||||
const index = branch.indexOf(' ');
|
||||
if (index !== -1) {
|
||||
branch = branch.substring(0, index);
|
||||
}
|
||||
|
||||
this.name = branch;
|
||||
this.tracking = tracking;
|
||||
}
|
||||
|
||||
getName(): string {
|
||||
return this.remote
|
||||
? this.name.substring(this.name.indexOf('/') + 1)
|
||||
: this.name;
|
||||
}
|
||||
|
||||
getRemote(): string | undefined {
|
||||
if (this.remote) return GitBranch.getRemote(this.name);
|
||||
if (this.tracking !== undefined) return GitBranch.getRemote(this.tracking);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
static getRemote(branch: string): string {
|
||||
return branch.substring(0, branch.indexOf('/'));
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
'use strict';
|
||||
import { Dates, Strings } from '../../system';
|
||||
import { Strings } from '../../system';
|
||||
import { Uri } from 'vscode';
|
||||
import { GlyphChars } from '../../constants';
|
||||
import { Git } from '../git';
|
||||
@@ -51,7 +51,7 @@ export class GitCommit {
|
||||
}
|
||||
|
||||
get shortSha() {
|
||||
return Git.shortenSha(this.sha);
|
||||
return this.sha.substring(0, 8);
|
||||
}
|
||||
|
||||
get isUncommitted(): boolean {
|
||||
@@ -62,7 +62,7 @@ export class GitCommit {
|
||||
}
|
||||
|
||||
get previousShortSha() {
|
||||
return this.previousSha && Git.shortenSha(this.previousSha);
|
||||
return this.previousSha && this.previousSha.substring(0, 8);
|
||||
}
|
||||
|
||||
get previousUri(): Uri {
|
||||
@@ -70,23 +70,7 @@ export class GitCommit {
|
||||
}
|
||||
|
||||
get uri(): Uri {
|
||||
return Uri.file(path.resolve(this.repoPath, this.originalFileName || this.fileName || ''));
|
||||
}
|
||||
|
||||
private _dateFormatter?: Dates.IDateFormatter;
|
||||
|
||||
formatDate(format: string) {
|
||||
if (this._dateFormatter === undefined) {
|
||||
this._dateFormatter = Dates.toFormatter(this.date);
|
||||
}
|
||||
return this._dateFormatter.format(format);
|
||||
}
|
||||
|
||||
fromNow() {
|
||||
if (this._dateFormatter === undefined) {
|
||||
this._dateFormatter = Dates.toFormatter(this.date);
|
||||
}
|
||||
return this._dateFormatter.fromNow();
|
||||
return Uri.file(path.resolve(this.repoPath, this.originalFileName || this.fileName));
|
||||
}
|
||||
|
||||
getFormattedPath(separator: string = Strings.pad(GlyphChars.Dot, 2, 2)): string {
|
||||
|
||||
@@ -33,10 +33,4 @@ export interface GitDiff {
|
||||
chunks: GitDiffChunk[];
|
||||
|
||||
diff?: string;
|
||||
}
|
||||
|
||||
export interface GitDiffShortStat {
|
||||
files: number;
|
||||
insertions: number;
|
||||
deletions: number;
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
'use strict';
|
||||
import { Uri } from 'vscode';
|
||||
import { GitCommit, GitCommitType } from './commit';
|
||||
import { Git } from '../git';
|
||||
import { GitStatusFileStatus, IGitStatusFile } from './status';
|
||||
import * as path from 'path';
|
||||
|
||||
@@ -40,12 +39,7 @@ export class GitLogCommit extends GitCommit {
|
||||
this.status = fileStatus.status;
|
||||
}
|
||||
else {
|
||||
if (fileName === undefined) {
|
||||
this.fileStatuses = [];
|
||||
}
|
||||
else {
|
||||
this.fileStatuses = [{ status: status, fileName: fileName, originalFileName: originalFileName } as IGitStatusFile];
|
||||
}
|
||||
this.fileStatuses = [{ status: status, fileName: fileName, originalFileName: originalFileName } as IGitStatusFile];
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
@@ -55,7 +49,7 @@ export class GitLogCommit extends GitCommit {
|
||||
}
|
||||
|
||||
get nextShortSha() {
|
||||
return this.nextSha && Git.shortenSha(this.nextSha);
|
||||
return this.nextSha && this.nextSha.substring(0, 8);
|
||||
}
|
||||
|
||||
get nextUri(): Uri {
|
||||
|
||||
@@ -5,9 +5,23 @@ export type GitRemoteType = 'fetch' | 'push';
|
||||
|
||||
export class GitRemote {
|
||||
|
||||
name: string;
|
||||
url: string;
|
||||
type: GitRemoteType;
|
||||
|
||||
provider?: RemoteProvider;
|
||||
|
||||
constructor(public readonly repoPath: string, public readonly name: string, public readonly url: string, public readonly domain: string, public readonly path: string, public readonly types: GitRemoteType[]) {
|
||||
this.provider = RemoteProviderFactory.getRemoteProvider(this.domain, this.path);
|
||||
constructor(remote: string) {
|
||||
remote = remote.trim();
|
||||
|
||||
const [name, info] = remote.split('\t');
|
||||
this.name = name;
|
||||
|
||||
const [url, typeInfo] = info.split(' ');
|
||||
this.url = url;
|
||||
|
||||
this.type = typeInfo.substring(1, typeInfo.length - 1) as GitRemoteType;
|
||||
|
||||
this.provider = RemoteProviderFactory.getRemoteProvider(this.url);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ import { Strings } from '../../system';
|
||||
import { Uri } from 'vscode';
|
||||
import { GlyphChars } from '../../constants';
|
||||
import { GitUri } from '../gitUri';
|
||||
import { GitLogCommit } from './logCommit';
|
||||
import * as path from 'path';
|
||||
|
||||
export interface GitStatus {
|
||||
@@ -20,7 +19,7 @@ export interface GitStatus {
|
||||
files: GitStatusFile[];
|
||||
}
|
||||
|
||||
export declare type GitStatusFileStatus = '!' | '?' | 'A' | 'C' | 'D' | 'M' | 'R' | 'T' | 'U' | 'X' | 'B';
|
||||
export declare type GitStatusFileStatus = '!' | '?' | 'A' | 'C' | 'D' | 'M' | 'R' | 'U';
|
||||
|
||||
export interface IGitStatusFile {
|
||||
status: GitStatusFileStatus;
|
||||
@@ -28,10 +27,6 @@ export interface IGitStatusFile {
|
||||
originalFileName?: string;
|
||||
}
|
||||
|
||||
export interface IGitStatusFileWithCommit extends IGitStatusFile {
|
||||
commit: GitLogCommit;
|
||||
}
|
||||
|
||||
export class GitStatusFile implements IGitStatusFile {
|
||||
|
||||
originalFileName?: string;
|
||||
@@ -56,19 +51,15 @@ export class GitStatusFile implements IGitStatusFile {
|
||||
return Uri.file(path.resolve(this.repoPath, this.fileName));
|
||||
}
|
||||
|
||||
static getFormattedDirectory(status: IGitStatusFile, includeOriginal: boolean = false, relativeTo?: string): string {
|
||||
const directory = GitUri.getDirectory(status.fileName, relativeTo);
|
||||
static getFormattedDirectory(status: IGitStatusFile, includeOriginal: boolean = false): string {
|
||||
const directory = GitUri.getDirectory(status.fileName);
|
||||
return (includeOriginal && status.status === 'R' && status.originalFileName)
|
||||
? `${directory} ${Strings.pad(GlyphChars.ArrowLeft, 1, 1)} ${status.originalFileName}`
|
||||
: directory;
|
||||
}
|
||||
|
||||
static getFormattedPath(status: IGitStatusFile, separator: string = Strings.pad(GlyphChars.Dot, 2, 2), relativeTo?: string): string {
|
||||
return GitUri.getFormattedPath(status.fileName, separator, relativeTo);
|
||||
}
|
||||
|
||||
static getRelativePath(status: IGitStatusFile, relativeTo?: string): string {
|
||||
return GitUri.getRelativePath(status.fileName, relativeTo);
|
||||
static getFormattedPath(status: IGitStatusFile, separator: string = Strings.pad(GlyphChars.Dot, 2, 2)): string {
|
||||
return GitUri.getFormattedPath(status.fileName, separator);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,10 +71,7 @@ const statusOcticonsMap = {
|
||||
D: '$(diff-removed)',
|
||||
M: '$(diff-modified)',
|
||||
R: '$(diff-renamed)',
|
||||
T: '$(diff-modified)',
|
||||
U: '$(alert)',
|
||||
X: '$(question)',
|
||||
B: '$(question)'
|
||||
U: '$(question)'
|
||||
};
|
||||
|
||||
export function getGitStatusOcticon(status: GitStatusFileStatus, missing: string = GlyphChars.Space.repeat(4)): string {
|
||||
@@ -98,10 +86,7 @@ const statusIconsMap = {
|
||||
D: 'icon-status-deleted.svg',
|
||||
M: 'icon-status-modified.svg',
|
||||
R: 'icon-status-renamed.svg',
|
||||
T: 'icon-status-modified.svg',
|
||||
U: 'icon-status-conflict.svg',
|
||||
X: 'icon-status-unknown.svg',
|
||||
B: 'icon-status-unknown.svg'
|
||||
U: 'icon-status-conflict.svg'
|
||||
};
|
||||
|
||||
export function getGitStatusIcon(status: GitStatusFileStatus): string {
|
||||
|
||||