diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2000-05-08 10:45:02 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2000-05-08 10:45:02 +0000 |
commit | 17d342160ae1c59687b61332bd4dee5e62bd509a (patch) | |
tree | 7ca5430438165cd96abb44d1d201819438625f11 | |
parent | cfcb3202ef71040a7019609da6cb21de57f16ad6 (diff) | |
download | zsh-17d342160ae1c59687b61332bd4dee5e62bd509a.tar.gz zsh-17d342160ae1c59687b61332bd4dee5e62bd509a.tar.xz zsh-17d342160ae1c59687b61332bd4dee5e62bd509a.zip |
11252: no colon at the end of zftp function contexts
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Doc/Zsh/zftpsys.yo | 4 | ||||
-rw-r--r-- | Functions/Zftp/zfanon | 44 | ||||
-rw-r--r-- | Functions/Zftp/zfcd | 13 | ||||
-rw-r--r-- | Functions/Zftp/zfcget | 31 | ||||
-rw-r--r-- | Functions/Zftp/zfclose | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfcput | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfdir | 35 | ||||
-rw-r--r-- | Functions/Zftp/zfgcp | 34 | ||||
-rw-r--r-- | Functions/Zftp/zfget | 50 | ||||
-rw-r--r-- | Functions/Zftp/zfgoto | 81 | ||||
-rw-r--r-- | Functions/Zftp/zfhere | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfls | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfmark | 51 | ||||
-rw-r--r-- | Functions/Zftp/zfopen | 51 | ||||
-rw-r--r-- | Functions/Zftp/zfparams | 23 | ||||
-rw-r--r-- | Functions/Zftp/zfpcp | 6 | ||||
-rw-r--r-- | Functions/Zftp/zfput | 59 | ||||
-rw-r--r-- | Functions/Zftp/zfsession | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfstat | 30 | ||||
-rw-r--r-- | Functions/Zftp/zftransfer | 7 | ||||
-rw-r--r-- | Functions/Zftp/zftype | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfuget | 51 | ||||
-rw-r--r-- | Functions/Zftp/zfuput | 43 |
24 files changed, 394 insertions, 230 deletions
diff --git a/ChangeLog b/ChangeLog index 20c62f146..db511ca22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2000-05-08 Peter Stephenson <pws@cambridgesiliconradio.com> + + * 11252: Functions/Zftp/zf*: context should be + e.g. `:zftp:zfopen', no colon at the end. + 2000-05-08 Sven Wischnowsky <wischnow@zsh.org> * 11253: Completion/Base/_arguments, Src/Zle/computil.c: more diff --git a/Doc/Zsh/zftpsys.yo b/Doc/Zsh/zftpsys.yo index e5b980cef..783de107f 100644 --- a/Doc/Zsh/zftpsys.yo +++ b/Doc/Zsh/zftpsys.yo @@ -522,14 +522,14 @@ given, although that is not useful in the cases described here). These values will then be used throughout the zftp function system. For more precise control, the first argument, which gives a context in which the style applies, can be modified to include a particular function, as for -example `tt(:zftp:zfget:)': the style will then have the given value only +example `tt(:zftp:zfget)': the style will then have the given value only in the tt(zfget) function. Values for the same style in different contexts may be set; the most specific function will be used, where strings are held to be more specific than patterns, and longer patterns and shorter patterns. Note that only the top level function name, as called by the user, is used; calling of lower level functions is transparent to the user. Hence modifications to the title bar in tt(zftp_chpwd) use the -contexts tt(:zftp:zfopen:), tt(:zftp:zfcd:), etc., depending where it was +contexts tt(:zftp:zfopen), tt(:zftp:zfcd), etc., depending where it was called from. The following styles are understood: startitem() diff --git a/Functions/Zftp/zfanon b/Functions/Zftp/zfanon index d8a9d06a3..5dc22617c 100644 --- a/Functions/Zftp/zfanon +++ b/Functions/Zftp/zfanon @@ -2,31 +2,20 @@ emulate -L zsh -local opt optlist once +[[ $curcontext = :zf* ]] || local curcontext=:zfanon +local opt opt_1 dir -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - 1) once=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :1 opt; do + [[ $opt = "?" ]] && print "zfanon: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) if [[ -z $EMAIL_ADDR ]]; then # Exercise in futility. There's a poem by Wallace Stevens # called something like `N ways of looking at a blackbird', # where N is somewhere around 0x14 to 0x18. Now zftp is - # ashamed to prsent `N ways of looking at a hostname'. + # ashamed to present `N ways of looking at a hostname'. local domain host # First, maybe we've already got it. Zen-like. if [[ $HOST = *.* ]]; then @@ -38,7 +27,8 @@ if [[ -z $EMAIL_ADDR ]]; then [[ -n $domain ]] && host=$HOST.$domain fi # Next, maybe we've got nlsookup. May not work on LINUX. - [[ -z $host ]] && host=$(nslookup $HOST | awk '/Name:/ { print $2 }') + [[ -z $host ]] && host=$(nslookup $HOST 2>/dev/null | + awk '/Name:/ { print $2 }') if [[ -z $host ]]; then # we're running out of ideas, but this should work. # after all, i wrote it... @@ -61,10 +51,20 @@ if [[ -z $EMAIL_ADDR ]]; then print "Using $EMAIL_ADDR as anonymous FTP password." fi -if [[ $once = 1 ]]; then - zftp open $1 anonymous $EMAIL_ADDR +if [[ $1 = */* ]]; then + 1=${1##ftp://} + dir=${1#*/} + 1=${1%%/*} +fi + +if [[ $opt_1 = 1 ]]; then + zftp open $1 anonymous $EMAIL_ADDR || return 1 else zftp params $1 anonymous $EMAIL_ADDR - zftp open + zftp open || return 1 +fi + +if [[ -n $dir ]]; then + zfcd $dir fi # } diff --git a/Functions/Zftp/zfcd b/Functions/Zftp/zfcd index b726d9f55..05b7dc998 100644 --- a/Functions/Zftp/zfcd +++ b/Functions/Zftp/zfcd @@ -20,11 +20,12 @@ # work just as long as the directory structures under the home match. emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfcd if [[ $1 = /* ]]; then - zfautocheck -dn + zfautocheck -dn || return 1 else - zfautocheck -d + zfautocheck -d || return 1 fi if [[ $1 = $HOME || $1 = $HOME/* ]]; then @@ -36,7 +37,7 @@ if (( $# == 0 )); then set -- '~' elif [[ $# -eq 1 && $1 = - ]]; then # Emulate `cd -' behaviour. - set -- $zflastdir + set -- $zfconfig[lastdir_$ZFTP_SESSION] elif [[ $# -eq 2 ]]; then # Emulate `cd old new' behaviour. # We have to find a character not in $1 or $2; ! is a good bet. @@ -47,6 +48,8 @@ fi # if we want to keep it. local lastdir=$ZFTP_PWD -zftp cd "$@" && zflastdir=$lastdir -print $zflastsession +zftp cd "$@" && [[ $lastdir != $ZFTP_PWD ]] && +zfconfig[lastdir_$ZFTP_SESSION]=$lastdir + +print $zfconfig[lastloc_$ZFTP_SESSION] # } diff --git a/Functions/Zftp/zfcget b/Functions/Zftp/zfcget index fd6accfed..476a730a6 100644 --- a/Functions/Zftp/zfcget +++ b/Functions/Zftp/zfcget @@ -12,35 +12,22 @@ emulate -L zsh -local loc rem stat=0 optlist opt nglob remlist locst remst -local tmpfile=${TMPPREFIX}zfcget$$ rstat tsize time +[[ $curcontext = :zf* ]] || local curcontext=:zfcget +local loc rem stat=0 opt opt_G opt_t remlist locst remst +local tmpfile=${TMPPREFIX}zfcget$$ rstat tsize -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :Gt opt; do + [[ $opt = '?' ]] && print "zfcget: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) for remlist in $*; do # zfcd directory hack to put the front back to ~ if [[ $remlist = $HOME || $remlist = $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_G != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then @@ -73,7 +60,7 @@ for remlist in $*; do continue else if zftp getat $rem $locst[1] >>$loc; then - [[ $time = 1 ]] && zfrtime $loc $rem $remst[2] + [[ $opt_t = 1 ]] && zfrtime $loc $rem $remst[2] else stat=1 fi diff --git a/Functions/Zftp/zfclose b/Functions/Zftp/zfclose index fb49efd51..b1823fb49 100644 --- a/Functions/Zftp/zfclose +++ b/Functions/Zftp/zfclose @@ -1,3 +1,4 @@ # function zfclose { +[[ $curcontext = :zf* ]] || local curcontext=:zfclose zftp close # } diff --git a/Functions/Zftp/zfcput b/Functions/Zftp/zfcput index fad5c3f86..d8a8a60a3 100644 --- a/Functions/Zftp/zfcput +++ b/Functions/Zftp/zfcput @@ -12,6 +12,7 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfcput local loc rem stat=0 locst remst offs tailtype local tmpfile=${TMPPREFIX}zfcget$$ rstat diff --git a/Functions/Zftp/zfdir b/Functions/Zftp/zfdir index 55befe000..4818dc973 100644 --- a/Functions/Zftp/zfdir +++ b/Functions/Zftp/zfdir @@ -22,7 +22,10 @@ emulate -L zsh setopt extendedglob +[[ $curcontext = :zf* ]] || local curcontext=:zfdir local file opt optlist redir i newargs force +local curdir=$zfconfig[curdir_$ZFTP_SESSION] +local otherdir=$zfconfig[otherdir_$ZFTP_SESSION] while [[ $1 = -* ]]; do if [[ $1 = - || $1 = -- ]]; then @@ -40,9 +43,9 @@ while [[ $1 = -* ]]; do ;; f) force=1 ;; - d) [[ -n $zfcurdir && -f $zfcurdir ]] && rm -f $zfcurdir - [[ -n $zfotherdir && -f $zfotherdir ]] && rm -f $zfotherdir - zftp_fcache=() + d) [[ -n $curdir && -f $curdir ]] && rm -f $curdir + [[ -n $otherdir && -f $otherdir ]] && rm -f $otherdir + zffcache -d return 0 ;; esac @@ -50,7 +53,7 @@ while [[ $1 = -* ]]; do shift done -zfautocheck -d +zfautocheck -d || return 1 # directory hack, see zfcd for (( i = 1; i <= $#argv; i++ )); do @@ -62,26 +65,32 @@ done if [[ $# -eq 0 ]]; then # Cache it in the current directory file. This means that repeated # calls to zfdir with no arguments always use a cached file. - [[ -z $zfcurdir ]] && zfcurdir=${TMPPREFIX}zfcurdir$$ - file=$zfcurdir + if [[ -z $curdir ]]; then + curdir=${TMPPREFIX}zfcurdir_${ZFTP_SESSION}_$$ + zfconfig[curdir_$ZFTP_SESSION]=$curdir + fi + file=$curdir else # Last directly looked at was not the current one, or at least # had non-standard arguments. - [[ -z $zfotherdir ]] && zfotherdir=${TMPPREFIX}zfotherdir$$ - file=$zfotherdir + if [[ -z $otherdir ]]; then + otherdir=${TMPPREFIX}zfotherdir_${ZFTP_SESSION}_$$ + zfconfig[otherdir_$ZFTP_SESSION]=$otherdir + fi + file=$otherdir newargs="$*" if [[ -f $file && $redir != 1 && $force -ne 1 ]]; then # Don't use the cached file if the arguments changed. - [[ $newargs = $zfotherargs ]] || rm -f $file + [[ $newargs = $zfconfig[otherargs_$ZFTP_SESSION] ]] || rm -f $file fi - zfotherargs=$newargs + zfconfig[otherargs_$ZFTP_SESSION]=$newargs fi if [[ $force -eq 1 ]]; then rm -f $file # if it looks like current directory has changed, better invalidate # the filename cache, too. - (( $# == 0 )) && zftp_fcache=() + (( $# == 0 )) && zffcache -d fi if [[ -n $file && -f $file ]]; then @@ -89,11 +98,11 @@ if [[ -n $file && -f $file ]]; then else if (zftp test); then # Works OK in subshells - zftp dir $* | tee $file | eval ${PAGER-:more} + zftp dir $* | tee $file | eval ${PAGER:-more} else # Doesn't work in subshells (IRIX 6.2 --- why?) zftp dir $* >$file - eval ${PAGER-:more} $file + eval ${PAGER:-more} $file fi fi # } diff --git a/Functions/Zftp/zfgcp b/Functions/Zftp/zfgcp index 26a08697d..c9045c951 100644 --- a/Functions/Zftp/zfgcp +++ b/Functions/Zftp/zfgcp @@ -16,30 +16,17 @@ emulate -L zsh -local opt optlist nglob remlist rem loc time +[[ $curcontext = :zf* ]] || local curcontext=:zfgcp +local opt remlist rem loc opt_G opt_t integer stat do_close -while [[ $1 == -* ]]; do - if [[ $1 == - || $1 == -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $opt in - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :Gt opt; do + [[ $opt = '?' ]] && print "zfgcp: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -zfautocheck +zfautocheck || return 1 # hmm, we should really check this after expanding the glob, # but we shouldn't expand the last argument remotely anyway. @@ -59,14 +46,14 @@ if [[ -d $argv[-1] ]]; then if [[ $remlist = $HOME || $remlist = $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_G != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then for rem in $remlist; do loc=$dir/${rem:t} if zftp get $rem >$loc; then - [[ $time = 1 ]] && zfrtime $rem $loc + [[ $opt_t = 1 ]] && zfrtime $rem $loc else stat=1 fi @@ -74,6 +61,9 @@ if [[ -d $argv[-1] ]]; then fi done else + if [[ $1 = $HOME || $1 = $HOME/* ]]; then + 1="~${1#$HOME}" + fi zftp get $1 >$2 || stat=$? fi diff --git a/Functions/Zftp/zfget b/Functions/Zftp/zfget index 878a36346..ad9658ec3 100644 --- a/Functions/Zftp/zfget +++ b/Functions/Zftp/zfget @@ -1,10 +1,16 @@ # function zfget { # Get files from remote server. Options: +# -c cat: dump files to stdout. +# alias zfcat="zfget -c" +# zfpage() { zfget -c "$@" | eval $PAGER } +# are sensible things to do, but aren't done for you. Note the +# second doesn't work on all OS's. # -G don't to remote globbing, else do # -t update the local file times to the same time as the remote. # Currently this only works if you have the `perl' command, # and that perl is version 5 with the standard library. -# See the function zfrtime for more gory details. +# See the function zfrtime for more gory details. This has +# no effect with the -c option. # # If the connection is not currently open, try to open it with the current # parameters (set by a previous zfopen or zfparams), then close it after @@ -13,46 +19,38 @@ emulate -L zsh -local loc rem optlist opt nglob remlist time +[[ $curcontext = :zf* ]] || local curcontext=:zfget +local loc rem opt remlist opt_G opt_t opt_c integer stat do_close -while [[ $1 == -* ]]; do - if [[ $1 == - || $1 == -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $opt in - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :Gtc opt; do + [[ $opt = '?' ]] && print "zfget: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -zfautocheck +zfautocheck || return 1 for remlist in $*; do # zfcd directory hack to put the front back to ~ if [[ $remlist == $HOME || $remlist == $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_G != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then for rem in $remlist; do - loc=${rem:t} - if zftp get $rem >$loc; then - [[ $time = 1 ]] && zfrtime $rem $loc + if [[ -n $opt_c ]]; then + zftp get $rem + stat=$? else - stat=1 + loc=${rem:t} + if zftp get $rem >$loc; then + [[ $opt_t = 1 ]] && zfrtime $rem $loc + else + stat=1 + fi fi done fi diff --git a/Functions/Zftp/zfgoto b/Functions/Zftp/zfgoto index e69de29bb..86942721c 100644 --- a/Functions/Zftp/zfgoto +++ b/Functions/Zftp/zfgoto @@ -0,0 +1,81 @@ +# zfgoto bname +# Go to bookmark bname, a location on a remote FTP host. Unless +# this was the last session or is for anonymous FTP, prompt for +# the user's password. +# +# Maybe this should try and look for an appropriate session to use +# for the transfer. + +emulate -L zsh +setopt extendedglob +[[ $curcontext = :zf* ]] || local curcontext=:zfgoto + +# Set ZFTP_BMFILE if not already set. This should agree with +# the corresponding line in zfmark. +: ${ZFTP_BMFILE:=${ZFDOTDIR:-$HOME}/.zfbkmarks} + +typeset -A bkmarks +local line opt_n opt + +while getopts :n opt; do + [[ $opt = '?' ]] && print "zfgoto: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" +done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) + +if (( $# != 1 )); then + print "Usage: zfgoto bookmark" >&2 + return 1 +fi + +if [[ -n $opt_n && -f ~/.ncftp/bookmarks ]]; then + local oldifs=$IFS + IFS=, + while read -rA line; do + bkmarks[$line[1]]="${line[3]:-anonymous}@${line[2]}:${line[6]}" + done < ~/.ncftp/bookmarks + IFS=$oldifs +elif [[ -f $ZFTP_BMFILE ]]; then + # read in file: could optimise this by recording last read time + # comparing with file + while read -r line; do + # ignore blank and comment lines + [[ $line = [[:blank:]]# || $line = [[:blank:]]#'#'* ]] && continue + bkmarks[${line%% *}]="${line#* }" + done <$ZFTP_BMFILE +fi + +line=${bkmarks[$1]} + +if [[ -z $line ]]; then + print "Bookmark \`$1' not found" >&2 + return 1 +fi + +local user host dir +user=${line%%@*} +line=${line#*@} +host=${line%%:*} +dir=${line#*:} + +if [[ $ZFTP_USER = $user && $ZFTP_HOST = $host ]]; then + # We're already there, just change directory + zfcd ${dir:-~} +elif [[ $user = ftp || $user = anonymous ]]; then + # Anonymous ftp, so we don't need password etc. + zfanon $host && [[ -n $dir ]] && zfcd $dir +elif [[ $zfconfig[lastloc_$ZFTP_SESSION] = ${host}:* && + $user = $zfconfig[lastuser_$ZFTP_SESSION] ]]; then + # This was the last session, so assume it's still setup in the + # open parameters + zfopen && [[ -n $dir ]] && zfcd $dir +else + # Last try: see if it's in the parameters. + local params + params=($(zftp params)) + if [[ $host = $params[1] && $user = $params[2] ]]; then + zfopen && [[ -n $dir ]] && zfcd $dir + else + zfopen $host $user && [[ -n $dir ]] && zfcd $dir + fi +fi diff --git a/Functions/Zftp/zfhere b/Functions/Zftp/zfhere index 43e599d3a..8fa607e28 100644 --- a/Functions/Zftp/zfhere +++ b/Functions/Zftp/zfhere @@ -1,5 +1,6 @@ # function zfhere { # Change to the directory corresponding to $PWD on the server. # See zfcd for how this works. +[[ $curcontext = :zf* ]] || local curcontext=:zfhere zfcd $PWD # } diff --git a/Functions/Zftp/zfls b/Functions/Zftp/zfls index e8d3cfb28..73211b46a 100644 --- a/Functions/Zftp/zfls +++ b/Functions/Zftp/zfls @@ -1,6 +1,7 @@ # function zfls { emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfls # directory hack, see zfcd if [[ $1 = $HOME || $1 = $HOME/* ]]; then diff --git a/Functions/Zftp/zfmark b/Functions/Zftp/zfmark index e69de29bb..e81cc27d8 100644 --- a/Functions/Zftp/zfmark +++ b/Functions/Zftp/zfmark @@ -0,0 +1,51 @@ +# zfmark [bname] +# Set a bookmark for the current zftp connection, or use the +# information about the last session if there isn't one. +# A bookmark includes both the host *and* the directory on that host. +# +# Without bname, list the current bookmarks and their locations. + +emulate -L zsh +setopt extendedglob +[[ $curcontext = :zf* ]] || local curcontext=:zfmark + +# Set ZFTP_BMFILE if not already set. This should agree with +# the corresponding line in zfgoto. +: ${ZFTP_BMFILE:=${ZDOTDIR:-$HOME}/.zfbkmarks} + +typeset -A bkmarks +local line + +if [[ -f $ZFTP_BMFILE ]]; then + # read in file: could optimise this by recording last read time + # comparing with file + while read -r line; do + # ignore blank and comment lines + [[ $line = [[:blank:]]# || $line = [[:blank:]]#'#'* ]] && continue + bkmarks[${line%% *}]="${line#* }" + done <$ZFTP_BMFILE +fi + +if (( $# == 0 )); then + for line in ${(ko)bkmarks}; do + print -r- "$line ${bkmarks[$line]}" + done + return 0 +elif (( $# > 1 )); then + print "Usage: zfmark [bookmark]" >&2 + return 1 +fi + +if [[ -n $ZFTP_HOST ]]; then + bkmarks[$1]="${ZFTP_USER}@${ZFTP_HOST}:${ZFTP_PWD}" +elif [[ -n $zfconfig[lastloc_$ZFTP_SESSION] ]]; then + bkmarks[$1]="${zfconig[lastuser_$ZFTP_SESSION]}@\ +${zfconfig[lastloc_$ZFTP_SESSION]}" +else + print "No current or recent ZFTP session to bookmark." >&2 + return 1 +fi + +for line in ${(ko)bkmarks}; do + print -r- "$line ${bkmarks[$line]}" +done >$ZFTP_BMFILE diff --git a/Functions/Zftp/zfopen b/Functions/Zftp/zfopen index fa9b4f81d..30e9cbfc9 100644 --- a/Functions/Zftp/zfopen +++ b/Functions/Zftp/zfopen @@ -7,36 +7,45 @@ emulate -L zsh -local optlist opt once +[[ $curcontext = :zf* ]] || local curcontext=:zfopen +local opt dir opt_1 setparams -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - 1) once=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :1 opt; do + [[ $opt = "?" ]] && print "zfopen: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) # This is where we should try and do same name-lookupage in # both .netrc and .ncftp/bookmarks . We could even try saving # the info in their for new hosts, like ncftp does. -if [[ $once = 1 ]]; then - zftp open $* +if [[ $1 = */* ]]; then + 1=${1##ftp://} + dir=${1#*/} + 1=${1%%/*} +fi + +if [[ $opt_1 = 1 ]]; then + zftp open $* || return 1 + if [[ $# = 1 ]]; then + if ! zftp login; then + zftp close + return 1 + fi + fi else # set parameters, but only if there was at least a host - (( $# > 0 )) && zfparams $* + (( $# > 0 )) && zfparams $* && setparams=1 # now call with no parameters - zftp open + if ! zftp open; then + [[ -n $ZFTP_HOST ]] && zftp close + [[ -n $setparams ]] && zfparams - + return 1 + fi +fi + +if [[ -n $dir ]]; then + zfcd $dir fi # } diff --git a/Functions/Zftp/zfparams b/Functions/Zftp/zfparams index 5c5262c52..59fea0ed4 100644 --- a/Functions/Zftp/zfparams +++ b/Functions/Zftp/zfparams @@ -1,12 +1,27 @@ # function zfparams { emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfparams -# Set to prompt for any user or password if not given. -# Don't worry about accounts here. -if (( $# > 0 )); then +if [[ $# -eq 1 && $1 = - ]]; then + # Delete existing parameter set. + local sess=$ZFTP_SESSION key + key=${zfconfig[fcache_$sess]} + [[ -n $key ]] && unset $key + for key in fcache lastloc lastdir curdir otherdir otherargs lastuser; do + unset "zfconfig[${key}_${sess}]" + done +elif (( $# > 0 )); then + # Set to prompt for any user or password if not given. + # Don't worry about accounts here. (( $# < 2 )) && 2='?' - (( $# < 3 )) && 3='?' + if (( $# < 3 )); then + if [[ $2 = '?'* ]]; then + 3="?Password on ${1}: " + else + 3="?Password for ${2##\\?} on ${1}: " + fi + fi fi zftp params $* # } diff --git a/Functions/Zftp/zfpcp b/Functions/Zftp/zfpcp index ddd570e59..e74ee34f8 100644 --- a/Functions/Zftp/zfpcp +++ b/Functions/Zftp/zfpcp @@ -14,10 +14,11 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfpcp local rem loc integer stat do_close -zfautocheck +zfautocheck || return 1 if [[ $# -gt 2 || $2 = (.|..) || $2 = */ ]]; then local dir=$argv[-1] @@ -32,6 +33,9 @@ if [[ $# -gt 2 || $2 = (.|..) || $2 = */ ]]; then zftp put $rem <$loc || stat=1 done else + if [[ $2 = $HOME || $2 = $HOME/* ]]; then + 2="~${2#$HOME}" + fi zftp put $2 <$1 stat=$? if [[ stat -ne 0 && $ZFTP_CODE = 553 && $ZFTP_REPLY = *'Is a directory'* ]] diff --git a/Functions/Zftp/zfput b/Functions/Zftp/zfput index 0687163f0..68ef5be5c 100644 --- a/Functions/Zftp/zfput +++ b/Functions/Zftp/zfput @@ -3,19 +3,64 @@ # off any directory parts to get the remote filename (i.e. always # goes into current remote directory). Use zfpcp to specify new # file name or new directory at remote end. +# +# -r means put recursively: any directories encountered will have +# all their contents to arbitrary depth transferred. Note that +# this creates the required directories. Any files in subdirectories +# whose names begin with a `.' will also be included. emulate -L zsh -local loc rem -integer stat do_close +[[ $curcontext = :zf* ]] || local curcontext=:zfput +local opt opt_r +integer stat do_close abort + +while getopts :r opt; do + [[ $opt = '?' ]] && print "zfget: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" +done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) zfautocheck -for loc in $*; do - rem=${loc:t} - zftp put $rem <$loc - [[ $? == 0 ]] || stat=$? -done +zfput_sub() { + local subdirs loc rem + integer stat + subdirs=() + + for loc in $*; do + if [[ -n $opt_r ]]; then + if [[ -d $loc ]]; then + subdirs=($subdirs $loc) + continue + else + rem=$loc + fi + else + rem=${loc:t} + fi + + zftp put $rem <$loc + (( $? )) && stat=$? + if ! zftp test; then + abort=1 + (( stat )) || stat=1 + break; + fi + done + + while (( $#subdirs && ! abort )); do + zftp mkdir ${subdirs[1]} + zfput_sub ${subdirs[1]}/*(ND) + (( $? )) && stat=$? + shift subdirs + done + + return $stat +} + +zfput_sub $* +stat=$? (( $do_close )) && zfclose diff --git a/Functions/Zftp/zfsession b/Functions/Zftp/zfsession index 9cd0d918f..79d4da93c 100644 --- a/Functions/Zftp/zfsession +++ b/Functions/Zftp/zfsession @@ -3,6 +3,7 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfsession local opt opt_l opt_v opt_o opt_d hadopts while getopts ":lovd" opt; do diff --git a/Functions/Zftp/zfstat b/Functions/Zftp/zfstat index 0ca755d03..033e6976b 100644 --- a/Functions/Zftp/zfstat +++ b/Functions/Zftp/zfstat @@ -6,25 +6,16 @@ setopt localoptions unset unsetopt ksharrays -local i stat=0 opt optlist verbose +[[ $curcontext = :zf* ]] || local curcontext=:zfstat +local i stat=0 opt opt_v -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $opt in - v) verbose=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :v opt; do + [[ $opt = "?" ]] && print "zfstat: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) + +[[ -n $ZFTP_SESSION ]] && print "Session:\t$ZFTP_SESSION" if [[ -n $ZFTP_HOST ]]; then print "Host:\t\t$ZFTP_HOST" @@ -55,7 +46,8 @@ if [[ -n $ZFTP_HOST ]]; then fi else print "Not connected." - [[ -n $zflastsession ]] && print "Last session:\t$zflastsession" + [[ -n $zfconfig[lastloc_$ZFTP_SESSION] ]] && + print "Last location:\t$zfconfig[lastloc_$ZFTP_SESSION]" stat=1 fi @@ -77,7 +69,7 @@ for (( i = 1; i <= ${#ZFTP_PREFS}; i++ )); do done print -if [[ -n $ZFTP_HOST && $verbose = 1 ]]; then +if [[ -n $ZFTP_HOST && $opt_v = 1 ]]; then zfautocheck -d print "Status of remote server:" # make sure we print the reply diff --git a/Functions/Zftp/zftransfer b/Functions/Zftp/zftransfer index 929f099d2..c70bf7248 100644 --- a/Functions/Zftp/zftransfer +++ b/Functions/Zftp/zftransfer @@ -4,6 +4,7 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zftransfer local sess1 sess2 file1 file2 oldsess=${ZFTP_SESSION} if [[ $# -ne 2 ]]; then @@ -39,7 +40,9 @@ zfautocheck || return 1 # the size from the pipe --- and if it does, it's probably wrong. # To avoid that, try to get the size and set it for the progress to # see. -if [[ $zfconfig[progress] != none ]]; then +local style +zstyle -s ':zftp:zftransfer' progress style +if [[ -n $style && $style != none ]]; then local ZFTP_TSIZE array tmpfile=${TMPPREFIX}zft$$ zftp remote $file1 >$tmpfile 2>/dev/null array=($(<$tmpfile)) @@ -49,7 +52,7 @@ fi # We do the RHS of the pipeline in a subshell, too, so that # the LHS can get SIGPIPE when it exits. -{ zfconfig[progress]=none +{ zstyle '*' progress none zftp get $file1 } | ( zftp session $sess2 zfautocheck && zftp put $file2 ) diff --git a/Functions/Zftp/zftype b/Functions/Zftp/zftype index c3b93b7a0..0cdf7e2aa 100644 --- a/Functions/Zftp/zftype +++ b/Functions/Zftp/zftype @@ -1,5 +1,6 @@ # function zftype { local type zftmp=${TMPPREFIX}zftype$$ +[[ $curcontext = :zf* ]] || local curcontext=:zftype zfautocheck -d diff --git a/Functions/Zftp/zfuget b/Functions/Zftp/zfuget index 482da42e9..c1033c930 100644 --- a/Functions/Zftp/zfuget +++ b/Functions/Zftp/zfuget @@ -25,8 +25,9 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfuget local loc rem locstats remstats doit tmpfile=${TMPPREFIX}zfuget$$ -local rstat remlist verbose optlist opt bad i silent nglob time +local rstat remlist opt opt_v opt_s opt_G opt_t integer stat do_close zfuget_print_time() { @@ -43,40 +44,20 @@ zfuget_print () { print ", $locstats[1] bytes)" } -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - v) verbose=1 - ;; - s) silent=1 - ;; - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :vsGt opt; do + [[ $opt = "?" ]] && print "zfuget: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -[[ -n $bad ]] && return 1 - -zfautocheck +zfautocheck || return 1 for remlist in $*; do # zfcd directory hack to put the front back to ~ if [[ $remlist == $HOME || $remlist == $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_n != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then @@ -99,11 +80,11 @@ for remlist in $*; do stat=1 continue fi - [[ $verbose = 1 ]] && zfuget_print + [[ $opt_v = 1 ]] && zfuget_print if (( $locstats[1] != $remstats[1] )); then # Files have different sizes - if [[ $locstats[2] > $remstats[2] && $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuget_print + if [[ $locstats[2] > $remstats[2] && $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuget_print print "Local file $loc more recent than remote," 1>&2 print -n "but sizes are different. Transfer anyway [y/n]? " 1>&2 read -q doit @@ -111,24 +92,24 @@ for remlist in $*; do else # Files have same size if [[ $locstats[2] < $remstats[2] ]]; then - if [[ $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuget_print + if [[ $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuget_print print "Local file $loc has same size as remote," 1>&2 print -n "but local file is older. Transfer anyway [y/n]? " 1>&2 read -q doit fi else # presumably same file, so don't get it. - [[ $verbose = 1 ]] && print Not transferring + [[ $opt_v = 1 ]] && print Not transferring doit=n fi fi else - [[ $verbose = 1 ]] && print New file $loc + [[ $opt_v = 1 ]] && print New file $loc fi if [[ $doit = y ]]; then if zftp get $rem >$loc; then - if [[ $time = 1 ]]; then + if [[ $opt_t = 1 ]]; then # if $remstats is set, it's second element is the remote time zfrtime $loc $rem $remstats[2] fi diff --git a/Functions/Zftp/zfuput b/Functions/Zftp/zfuput index b54d0d0d4..4e0e42dcd 100644 --- a/Functions/Zftp/zfuput +++ b/Functions/Zftp/zfuput @@ -11,8 +11,9 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfuput local loc rem locstats remstats doit tmpfile=${TMPPREFIX}zfuput$$ -local rstat verbose optlist opt bad i silent +local rstat opt opt_v opt_s integer stat do_close zfuput_print_time() { @@ -29,29 +30,13 @@ zfuput_print () { print ", $locstats[1] bytes)" } -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - v) verbose=1 - ;; - s) silent=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :vs opt; do + [[ $opt = "?" ]] && print "zfuget: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -[[ -n $bad ]] && return 1 - -zfautocheck +zfautocheck || return 1 if [[ $ZFTP_VERBOSE = *5* ]]; then # should we turn it off locally? @@ -77,13 +62,13 @@ for rem in $*; do print "Server does not implement full command set required." 1>&2 return 1 elif [[ $rstat = 1 ]]; then - [[ $verbose = 1 ]] && print New file $loc + [[ $opt_v = 1 ]] && print New file $loc else - [[ $verbose = 1 ]] && zfuput_print + [[ $opt_v = 1 ]] && zfuput_print if (( $locstats[1] != $remstats[1] )); then # Files have different sizes - if [[ $locstats[2] < $remstats[2] && $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuput_print + if [[ $locstats[2] < $remstats[2] && $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuput_print print "Remote file $rem more recent than local," 1>&2 print -n "but sizes are different. Transfer anyway [y/n]? " 1>&2 read -q doit @@ -91,15 +76,15 @@ for rem in $*; do else # Files have same size if [[ $locstats[2] > $remstats[2] ]]; then - if [[ $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuput_print + if [[ $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuput_print print "Remote file $rem has same size as local," 1>&2 print -n "but remote file is older. Transfer anyway [y/n]? " 1>&2 read -q doit fi else # presumably same file, so don't get it. - [[ $verbose = 1 ]] && print Not transferring + [[ $opt_v = 1 ]] && print Not transferring doit=n fi fi |