about summary refs log tree commit diff
path: root/Completion/Unix/Command
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r--Completion/Unix/Command/_subversion15
1 files changed, 12 insertions, 3 deletions
diff --git a/Completion/Unix/Command/_subversion b/Completion/Unix/Command/_subversion
index 9d6babed5..2dbcb6d65 100644
--- a/Completion/Unix/Command/_subversion
+++ b/Completion/Unix/Command/_subversion
@@ -2,6 +2,7 @@
 
 _svn () {
   local curcontext="$curcontext" state line expl ret=1
+  typeset -A opt_args
 
   _arguments -C \
     '(-)--help[print help information]' \
@@ -207,12 +208,20 @@ _svn_status() {
 
 (( $+functions[_svn_remote_paths] )) ||
 _svn_remote_paths() {
-  local expl remfiles remdispf remdispd suf ret=1
+  local expl remfiles remdispf remdispd suf ret=1 pfx='\^/' sub='^/'
+
+  # prefix must match a valid repository path format, either standard style
+  # schema://host/path/.. or ^/path/.. specifying a path relative to the
+  # root of the working directory repository.  In the second form, allow the
+  # leading '^' be escaped in case the user has the extendedglob option set.
+  [[ -prefix *://*/ ]] ||
+  [[ -f .svn/entries && ( -prefix '^/' || -prefix '\^/' ) ]] ||
+  return 1
 
-  [[ -prefix *://*/ ]] || return 1
+  # return if remote access is not permitted
   zstyle -T ":completion:${curcontext}:" remote-access || return 1
 
-  remfiles=( ${(f)"$(svn list $IPREFIX${PREFIX%%[^./][^/]#} 2>/dev/null)"} )
+  remfiles=( ${(f)"$(svn list $IPREFIX${${PREFIX%%[^/]#}/#$pfx/$sub} 2>/dev/null)"} )
   (( $? == 0 )) || return 1
 
   # you might consider trying to return early if $#remfiles is zero,