This implements the changes suggested in tpope/fugitive#415.
s:repo_configured_tree is now a global, s:configured_tree() that caches
the bidirectional relation between the worktree and the git_dir.
extract_git_dir() now uses that relation to check whether the
directories it scans are valid worktrees known by the repo at $GIT_DIR.
Taking experimental out of the name, but small tweaks may occur before
then next release.
For future compatibility, any third party handlers should bail and
return an empty string if any of the following are true:
* More than 2 arguments are given.
* The second argument isn't a dictionary.
* The dictionary doesn't contain a "remote" key.
Closes#445.
* <C-R><C-G> in :Gstatus recalls cursor line filename.
* Map dp to show diff in :Gstatus.
* Add ca and cA commit maps to :Gstatus.
* Add cc alias for C in :Gstatus.
* Disable swapfile in :Gstatus.
* Replace :Gstatus cv with cva and cvc.
* Add an `S` mapping for vertical splits from :Gstatus.
* Close diffs when navigating from :Gstatus.
* Enable folding in :Gstatus.
* Accept a count with :Gstatus <C-N>/<C-P>.
* Allow <C-p> pass through to ctrlp.vim in :Gstatus.
* Add . in :Gstatus to prepopulate command line with revision.
* Fix :Gstatus dp with external diff enabled.
* Force displayCommentPrefix to fix :Gstatus on 1.8.5+.
* Support localized `git status`.
* Map g? and <F1> to show help in :Gstatus and :Gblame.
* Kill relativenumber in blame buffer.
* Fix jump to line on reblame.
* Return to blamed buffer on q in blame.
* Restore blamed window on gq in blame.
* Fix :Gblame scrollbind with folds.
* Jump from blame to commit focuses relevant diff.
* :Gblame: Retain original alternate buffer.
* Use - not <CR> for reblame.
* Switch :Gblame <CR> to open commit.
* Open fold when jumping to commit from blame.
* Add maps for resizing blame window.
* Conceal file names and line numbers in :Gblame.
* Set winfixwidth in :Gblame buffers.
* Press <CR> in :Gblame to open commit (reblame is now -).
* Better csh support.
* Work around "always" color option.
* Fix trailing blank line when editing index files.
* Use HTTPS for GitHub URLs in README.
* :Gdiff split direction based on 'diffopt' and window size.
* Focus diff window on :Gdiff.
* Restore options when turning off diff mode.
* Set bufhidden=delete in historical buffers.
* Fix modeline errors in historical buffers.
* Change cp to cP.
* Add :Git! et al. for loading output into a buffer.
* Tab complete Git aliases.
* Enter on a +/- diff line jumps to that line.
* Better Windows support.
* Support core.autocrlf=false on Windows.
* Work around slow \\ Windows network path.
* Work around .git in 'wildignore'.
* Fix garbage during :Gcommit with alternate screen.
* Fix garbling on :Gcommit when nothing is staged.
* Hack around broken :Gcommit with symlinked .git.
* Use y<C-G> to yank the current object's path.
* Preserve alternate file in :Gmove.
* Support bare repositories that don't end in .git.
* Support .git-file repositories (including submodules).
* Support symlinked .git if core.worktree is set.
* Fix redraw issue after :Gbrowse.
* Support GitHub FI in :Gbrowse.
* Support implicit GitHub username in remote for :Gbrowse.
* Make fugitive commands available in nerdtree buffers.
* Make fugitive commands available in command line window.
* :Glgrep and :Gllog.
* :.Glog jumps to same line in each file.
* Map - to go up a directory.
* Provide custom 'foldtext'.
* Respect $GIT_CEILING_DIRECTORIES.
* Look for $GIT_DIR and $GIT_WORK_TREE.
* Improve Windows support.
* Assorted bug fixes.
According to `:help E302`, E302 comes from Vim being unable to rename
the swap file when an open buffer's name is changed; but the error is
mostly harmless. E302 seems to occur in vim-fugitive under Windows but
not *nix.
This fix allow :Glog and :Gdiff to work on such systems; previously the
uncaught error made these operations fail or at least work strangely.
On Windows, if Vim is invoked with a working directory starting with a
lowercase drive letter (e.g. c:\<path> instead of C:\<path>), some
mappings in the blame buffer do not work correctly. For example,
hitting Enter on a line throws an exception rather than showing the
associated commit. The reason for this is that the b:git_dir variable
is not being set on the blame buffer. The reason in turn for this is
that the path to the blame buffer is being stored in s:temp_files with
an uppercase drive letter, but in the fugitive_temp augroup, '<afile>:p'
is being expanded with a lowercase drive letter, so the lookup in
s:temp_files fails. Fix this by converting paths to lowercase before
using them as keys for the s:tempfile dictionary. Because of the way
Vim generates temporary file names, this is safe even on platforms with
case-sensitive file systems.
Our doautocmd in s:ReplaceCmd already processes the modelines while the
buffer is still modifiable, so we can disable it after tha prevent
subsequent invocations.
Closes#323.
This reverts commit d6540b2588, which
caused all sorts of breakages with buffer names with brackets in them.
This was greatly exacerbated by airline.vim setting an erroneous
b:git_dir in plugin buffers based on the current working directory.
Closes#464. Closes#463. Closes#461.
There are rare situations where a user has manually specified what they
wish to use as their work-tree directory, and even rarer situations
where the user wishes the Git directory to be customized. In the case
the user has set these using environment variables, vim-fugitive takes
advantage of these settings in order to set up.
Note that git-config(1) allows setting the work-tree and Git dir in
a number of ways (see the core.worktree) setting. This change only
respects the environment variable method, not the config file method.
The algorithm in fugitive#extract_git_dir() is to move upwards in the
file system hierarchy until a sub-directory called .git is found. When
accessing a file on a network share from a Cygwin Vim and the file is not
within a git repo, this eventually causes a check for the existence of
//serverName/.git and //.git. Such checks are extremely slow so let's
avoid them.
This reverts commit 31dead6d80.
Generating the tags file after already loading the buffer burns me over
and over and over again, and I'm not convinced there was a problem to
begin with.
When using a :Gedit command from the :Gstatus window the git_dir was
being based on the window that was switched into in order to edit the
file. So if Fugitive switched into a window with a file from a different
Git repo (or a file with no Git repo) the :Gedit command could fail or
edit the wrong file.
Instead base the git_dir on the window from which the :Gedit command
originated.