commit 67e9756c35bf1e2f8384c166eac6b0d0ecf16640 (tree)
parent ae2005adbbd656772a2ec4155747e1c6cef24ab2
Author: Tim Pope <code@tpope.net>
Date: Sun, 19 Aug 2018 16:52:58 -0400
Support .git/.. to refer to work tree
Diffstat:
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim
@@ -521,18 +521,24 @@ function! fugitive#Route(object, ...) abort
return fnamemodify(len(file) ? file : a:object, ':p')
endif
endif
- let rev = a:object
+ let rev = s:Slash(a:object)
let tree = s:Tree(dir)
let base = len(tree) ? tree : 'fugitive://' . dir . '//0'
- if rev =~# '^\%(\./\)\=\.git$' && empty(tree)
- let f = dir
- elseif rev =~# '^\%(\./\)\=\.git/'
- let f = substitute(rev, '\C^\%(\./\)\=\.git', '', '')
+ if rev ==# '.git'
+ let f = len(tree) ? tree . '/.git' : dir
+ elseif rev =~# '^\.git/'
+ let f = substitute(rev, '^\.git', '', '')
let cdir = fugitive#CommonDir(dir)
- if cdir !=# dir && (f =~# '^/\%(config\|info\|hooks\|objects\|refs\|worktrees\)' || !filereadable(f) && filereadable(cdir . f))
- let f = cdir . f
+ if f =~# '^/\.\./\.\.\%(/\|$\)'
+ let f = simplify(len(tree) ? tree . f[3:-1] : dir . f)
+ elseif f =~# '^/\.\.\%(/\|$\)'
+ let f = base . f[3:-1]
+ elseif cdir !=# dir && (
+ \ f =~# '^/\%(config\|hooks\|info\|logs/refs\|objects\|refs\|worktrees\)\%(/\|$\)' ||
+ \ f !~# '^/logs$\|/\w*HEAD$' && getftime(dir . f) < 0 && getftime(cdir . f) >= 0)
+ let f = simplify(cdir . f)
else
- let f = dir . f
+ let f = simplify(dir . f)
endif
elseif rev ==# ':/'
let f = base