ソースを参照

Improve git URI validation

Close #530
Junegunn Choi 9 年 前
コミット
6575bd65b1
3 ファイル変更38 行追加4 行削除
  1. 9 3
      plug.vim
  2. 2 1
      test/test.vader
  3. 27 0
      test/workflow.vader

+ 9 - 3
plug.vim

@@ -1873,9 +1873,15 @@ function! s:progress_bar(line, bar, total)
 endfunction
 
 function! s:compare_git_uri(a, b)
-  let a = substitute(a:a, 'git:\{1,2}@', '', '')
-  let b = substitute(a:b, 'git:\{1,2}@', '', '')
-  return a ==# b
+  " See `git help clone'
+  " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
+  "          [git@]  github.com[:port] : junegunn/vim-plug [.git]
+  " file://                            / junegunn/vim-plug        [/]
+  "                                    / junegunn/vim-plug        [/]
+  let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
+  let ma = matchlist(a:a, pat)
+  let mb = matchlist(a:b, pat)
+  return ma[1:2] ==# mb[1:2]
 endfunction
 
 function! s:format_message(bullet, name, message)

+ 2 - 1
test/test.vader

@@ -15,7 +15,8 @@ Execute (Initialize test environment):
   " Temporarily patch plug.vim
   call system('cp "$PLUG_SRC" "$PLUG_TMP"')
   call writefile(extend(readfile($PLUG_TMP),
-  \ ['function! ResetPlug()', 'let s:loaded = {}', 'endfunction']), $PLUG_TMP)
+  \ ['function! ResetPlug()', 'let s:loaded = {}', 'endfunction',
+  \  'function! CompareURI(a, b)', 'return s:compare_git_uri(a:a, a:b)', 'endfunction']), $PLUG_TMP)
 
   set t_Co=256
   colo default

+ 27 - 0
test/workflow.vader

@@ -1493,3 +1493,30 @@ Execute (#427 - Tag option with wildcard (requires git 1.9.2 or above)):
     q
     AssertEqual '2.9.7', GitTag('vim-easy-align')
   endif
+
+Execute (#530 - Comparison of compatible git URIs):
+  " .git suffix
+  Assert CompareURI('https://github.com/junegunn/vim-plug.git', 'https://github.com/junegunn/vim-plug')
+
+  " user@
+  Assert CompareURI('https://github.com/junegunn/vim-plug.git', 'https://user@github.com/junegunn/vim-plug.git')
+
+  " git::@
+  Assert CompareURI('https://github.com/junegunn/vim-plug.git', 'https://git::@github.com/junegunn/vim-plug.git')
+
+  " https and ssh
+  Assert CompareURI('https://github.com/junegunn/vim-plug.git', 'git@github.com:junegunn/vim-plug.git')
+
+  " file://
+  Assert CompareURI('file:///tmp/vim-plug', '/tmp/vim-plug')
+  Assert CompareURI('file:///tmp/vim-plug', '/tmp/vim-plug/')
+
+Execute (#530 - Comparison of incompatible git URIs):
+  " Different hostname
+  Assert !CompareURI('https://github.com/junegunn/vim-plug.git', 'https://bitbucket.com/junegunn/vim-plug.git')
+
+  " Different repository
+  Assert !CompareURI('https://github.com/junegunn/vim-plug.git', 'https://github.com/junegunn/emacs-plug.git')
+
+  " Different port
+  Assert !CompareURI('https://github.com/junegunn/vim-plug.git', 'https://github.com:12345/junegunn/vim-plug.git')