diff options
Diffstat (limited to 'Functions/Zftp/zfrglob')
-rw-r--r-- | Functions/Zftp/zfrglob | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/Functions/Zftp/zfrglob b/Functions/Zftp/zfrglob new file mode 100644 index 000000000..f9d67b3f2 --- /dev/null +++ b/Functions/Zftp/zfrglob @@ -0,0 +1,70 @@ +# function zfrglob { +# Do the remote globbing for zfput, etc. +# We have two choices: +# (1) Get the entire file list and match it one by one +# locally against the pattern. +# Causes problems if we are globbing directories (rare, presumably). +# But: we can cache the current directory, which +# we need for completion anyway. Works on any OS if you +# stick with a single directory. This is the default. +# (2) Use remote globbing, i.e. pass it to ls at the site. +# Faster, but only works with UNIX, and only basic globbing. +# We do this if $zfrglob is non-null. + +# There is only one argument, the variable containing the +# pattern to be globbed. We set this back to an array containing +# all the matches. + +emulate -L zsh +setopt extendedglob + +local pat dir nondir files i + +eval pat=\$$1 + +# Check if we really need to do anything. Look for standard +# globbing characters, and if we are +# using zsh for the actual pattern matching also look for +# extendedglob characters. +if [[ $pat != *[][*?]* && + ( -n $zfrglob || $pat != *[(|)#^]* ) ]]; then + return 0 +fi +local tmpf=${TMPPREFIX}zfrglob$$ + +if [[ $zfrglob != '' ]]; then + zftp ls "$pat" >$tmpf 2>/dev/null + eval "$1=(\$(<\$tmpf))" + rm -f $tmpf +else + if [[ $ZFTP_SYSTEM = UNIX* && $pat = */* ]]; then + # not the current directory and we know how to handle paths + if [[ $pat = ?*/* ]]; then + # careful not to remove too many slashes + dir=${pat%/*} + else + dir=/ + fi + nondir=${pat##*/} + zftp ls "$dir" 2>/dev/null >$tmpf + files=($(<$tmpf)) + files=(${files:t}) + rm -f $tmpf + else + # we just have to do an ls and hope that's right + nondir=$pat + if (( $#zftp_fcache == 0 )); then + # Why does `zftp_fcache=($(zftp ls))' sometimes not work? + zftp ls >$tmpf + zftp_fcache=($(<$tmpf)) + rm -f $tmpf + fi + files=($zftp_fcache) + fi + # now we want to see which of the $files match $nondir: + # ${...:/foo} deletes occurrences of foo matching a complete word, + # while the ^ inverts the sense so that anything not matching the + # pattern in $nondir is excluded. + eval "$1=(\${files:/^\${~nondir}})" +fi +# } |