diff --git a/plugin/fugitive.vim b/plugin/fugitive.vim index 0886b45..e928c82 100644 --- a/plugin/fugitive.vim +++ b/plugin/fugitive.vim @@ -299,6 +299,7 @@ function! s:repo_bare() dict abort endfunction function! s:repo_translate(spec) dict abort + let refs = self.dir('refs/') if a:spec ==# '.' || a:spec ==# '/.' return self.bare() ? self.dir() : self.tree() elseif a:spec =~# '^/\=\.git$' && self.bare() @@ -322,18 +323,18 @@ function! s:repo_translate(spec) dict abort return 'fugitive://'.self.dir().'//0/'.a:spec[1:-1] elseif a:spec ==# '@' return self.dir('HEAD') - elseif a:spec =~# 'HEAD\|^refs/' && a:spec !~ ':' && filereadable(self.dir(a:spec)) - return self.dir(a:spec) - elseif filereadable(self.dir('refs/'.a:spec)) - return self.dir('refs/'.a:spec) - elseif filereadable(self.dir('refs/tags/'.a:spec)) - return self.dir('refs/tags/'.a:spec) - elseif filereadable(self.dir('refs/heads/'.a:spec)) - return self.dir('refs/heads/'.a:spec) - elseif filereadable(self.dir('refs/remotes/'.a:spec)) - return self.dir('refs/remotes/'.a:spec) - elseif filereadable(self.dir('refs/remotes/'.a:spec.'/HEAD')) - return self.dir('refs/remotes/'.a:spec,'/HEAD') + elseif a:spec =~# 'HEAD\|^refs/' && a:spec !~ ':' && filereadable(refs . '../' . a:spec) + return simplify(refs . '../' . a:spec) + elseif filereadable(refs.a:spec) + return refs.a:spec + elseif filereadable(refs.'tags/'.a:spec) + return refs.'tags/'.a:spec + elseif filereadable(refs.'heads/'.a:spec) + return refs.'heads/'.a:spec + elseif filereadable(refs.'remotes/'.a:spec) + return refs.'remotes/'.a:spec + elseif filereadable(refs.'remotes/'.a:spec.'/HEAD') + return refs.'remotes/'.a:spec,'/HEAD' else try let ref = self.rev_parse(matchstr(a:spec,'[^:]*'))