From 769192d3d03555f09561b48870f3373c691d05f7 Mon Sep 17 00:00:00 2001
From: Junegunn Choi <junegunn.c@gmail.com>
Date: Sun, 26 Feb 2017 03:34:59 +0900
Subject: [PATCH] Append -- to git checkout commands

Checking out a branch or tag may not succeed if there is a path entry
with the same name. This commit appends -- to git checkout commands to
clarify that we're not referring to a file or a directory.

Close #602
---
 plug.vim               |  8 ++++----
 test/regressions.vader | 13 +++++++++++++
 test/run               |  2 ++
 test/workflow.vader    |  2 +-
 4 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/plug.vim b/plug.vim
index 7819a5a..3a227e2 100644
--- a/plug.vim
+++ b/plug.vim
@@ -868,7 +868,7 @@ function! s:checkout(spec)
   let output = s:system('git rev-parse HEAD', a:spec.dir)
   if !v:shell_error && !s:hash_match(sha, s:lines(output)[0])
     let output = s:system(
-          \ 'git fetch --depth 999999 && git checkout '.s:esc(sha), a:spec.dir)
+          \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir)
   endif
   return output
 endfunction
@@ -1067,11 +1067,11 @@ function! s:update_finish()
           endif
         endif
         call s:log4(name, 'Checking out '.tag)
-        let out = s:system('git checkout -q '.s:esc(tag).' 2>&1', spec.dir)
+        let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir)
       else
         let branch = s:esc(get(spec, 'branch', 'master'))
         call s:log4(name, 'Merging origin/'.branch)
-        let out = s:system('git checkout -q '.branch.' 2>&1'
+        let out = s:system('git checkout -q '.branch.' -- 2>&1'
               \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir)
       endif
       if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
@@ -2390,7 +2390,7 @@ function! s:revert()
     return
   endif
 
-  call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch), g:plugs[name].dir)
+  call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir)
   setlocal modifiable
   normal! "_dap
   setlocal nomodifiable
diff --git a/test/regressions.vader b/test/regressions.vader
index 3f7d0b0..2b76693 100644
--- a/test/regressions.vader
+++ b/test/regressions.vader
@@ -341,3 +341,16 @@ Execute (#593 Add plugin to &rtp before running post-update hook with : prefix):
   call plug#end()
   PlugInstall!
   AssertEqual ['a', 'b'], g:bar
+
+**********************************************************************
+Execute (#602 Confusion with branch name and path name):
+  call plug#begin()
+  Plug expand('file:////tmp/vim-plug-test/new-branch'), { 'branch': 'plugin' }
+  call plug#end()
+  PlugUpdate
+  call PlugStatusSorted()
+
+Expect:
+  - new-branch: OK
+  Finished. 0 error(s).
+  [=]
diff --git a/test/run b/test/run
index ff50936..133859c 100755
--- a/test/run
+++ b/test/run
@@ -95,6 +95,8 @@ DOC
   echo 'let g:foo = 1' > plugin/foo.vim
   git add plugin/foo.vim
   git commit -m initial
+  git checkout -b plugin
+  git checkout master
 
   cd "$BASE"
 }
diff --git a/test/workflow.vader b/test/workflow.vader
index 0cc28ae..721b8db 100644
--- a/test/workflow.vader
+++ b/test/workflow.vader
@@ -1473,7 +1473,7 @@ Execute (Commit hash support):
   PlugUpdate
   Log getline(1, '$')
   AssertEqual 'x goyo.vim:', getline(5)
-  AssertEqual '    error: pathspec ''ffffffff'' did not match any file(s) known to git.', getline(6)
+  AssertEqual '    fatal: invalid reference: ffffffff', getline(6)
   AssertEqual 0, stridx(getline(7), '- vim-emoji: HEAD is now at 9db7fcf...')
 
   let hash = system(printf('cd %s && git rev-parse HEAD', g:plugs['vim-emoji'].dir))[:-2]