motiejus/dotfiles

Unnamed repository; edit this file 'description' to name the repository.
git clone https://git.jakstys.lt/motiejus/dotfiles.git
Log | Tree | Refs | README | LICENSE

commit 8fd6bad4a4dfbad85d57d03e5ba12a00effbfe8c (tree)
parent 224b65ef5880157b1d21dbcddae051ea51a12ca3
Author: Tim Pope <code@tpope.net>
Date:   Sun, 26 Jun 2022 16:02:07 -0400

Handle URL-unsafe characters in :GBrowse API

Of the 8 :GBrowse providers listed in the README, 7 make no attempt to
handle URL encoding.  So it makes sense for Fugitive to take
responsibility for this.  By transposing "%" and "~" in API parameters
and then reversing the process on the generated URL, we can accommodate
both usages.  This is transitional and will later be ditched in favor of
straightforward URL encoding.

References: https://github.com/cedarbaum/fugitive-azure-devops.vim/issues/3

Diffstat:
Mautoload/fugitive.vim | 16++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim @@ -7243,7 +7243,9 @@ augroup END " Section: :GBrowse function! s:BrowserOpen(url, mods, echo_copy) abort - let url = substitute(a:url, '[ <>\|"]', '\="%".printf("%02X",char2nr(submatch(0)))', 'g') + let [_, main, query, anchor; __] = matchlist(a:url, '^\([^#?]*\)\(?[^#]*\)\=\(#.*\)\=') + let url = main . tr(query, ' ', '+') . anchor + let url = substitute(url, '[ <>\|"]', '\="%".printf("%02X",char2nr(submatch(0)))', 'g') let mods = s:Mods(a:mods) if a:echo_copy if has('clipboard') @@ -7476,28 +7478,30 @@ function! fugitive#BrowseCommand(line1, count, range, bang, mods, arg, ...) abor \ 'repo': {'git_dir': git_dir}, \ 'remote': raw, \ 'remote_name': remote, - \ 'commit': commit, - \ 'path': path, + \ 'commit': s:UrlEncode(commit), + \ 'path': substitute(s:UrlEncode(path), '%20', ' ', 'g'), \ 'type': type, \ 'line1': line1, \ 'line2': line2} if empty(path) if type ==# 'ref' && ref =~# '^refs/' - let opts.path = '.git/' . ref + let opts.path = '.git/' . s:UrlEncode(ref) let opts.type = '' elseif type ==# 'root' let opts.path ='.git/index' let opts.type = '' endif elseif type ==# 'tree' && !empty(path) - let opts.path = s:sub(path, '/\=$', '/') + let opts.path = s:sub(opts.path, '/\=$', '/') endif + let opts.path = tr(substitute(opts.path, '\~', '%7E', 'g'), '%', '~') + let opts.commit = tr(substitute(opts.commit, '\~', '%7E', 'g'), '%', '~') for l:.Handler in get(g:, 'fugitive_browse_handlers', []) let l:.url = call(Handler, [copy(opts)]) if type(url) == type('') && url =~# '://' - return s:BrowserOpen(url, a:mods, a:bang) + return s:BrowserOpen(substitute(tr(url, '~', '%'), '\C%7E', '\~', 'g'), a:mods, a:bang) endif endfor