about summary refs log tree commit diff
path: root/Functions/Zftp/zfrglob
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-04-25 15:43:41 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-04-25 15:43:41 +0000
commit206237c8ec4b7619d9e70a75004cd1ae1066b0a0 (patch)
treeff703cbc295605f90755edb68672ed2de11f4a81 /Functions/Zftp/zfrglob
parent8ceb54fbc2f879e0e80f58c18761bd54db07e5f7 (diff)
downloadzsh-dot-zsh-199904280524.tar.gz
zsh-dot-zsh-199904280524.tar.xz
zsh-dot-zsh-199904280524.zip
Diffstat (limited to 'Functions/Zftp/zfrglob')
-rw-r--r--Functions/Zftp/zfrglob70
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
+# }