1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-25 17:20:25 +02:00

11252: no colon at the end of zftp function contexts

This commit is contained in:
Peter Stephenson 2000-05-08 10:45:02 +00:00
parent cfcb3202ef
commit 17d342160a
24 changed files with 394 additions and 230 deletions

View file

@ -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

View file

@ -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()

View file

@ -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
# }

View file

@ -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]
# }

View file

@ -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

View file

@ -1,3 +1,4 @@
# function zfclose {
[[ $curcontext = :zf* ]] || local curcontext=:zfclose
zftp close
# }

View file

@ -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

View file

@ -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
# }

View file

@ -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

View file

@ -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,47 +19,39 @@
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
if [[ -n $opt_c ]]; then
zftp get $rem
stat=$?
else
loc=${rem:t}
if zftp get $rem >$loc; then
[[ $time = 1 ]] && zfrtime $rem $loc
[[ $opt_t = 1 ]] && zfrtime $rem $loc
else
stat=1
fi
fi
done
fi
done

View file

@ -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

View file

@ -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
# }

View file

@ -1,6 +1,7 @@
# function zfls {
emulate -L zsh
[[ $curcontext = :zf* ]] || local curcontext=:zfls
# directory hack, see zfcd
if [[ $1 = $HOME || $1 = $HOME/* ]]; then

View file

@ -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

View file

@ -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
# }

View file

@ -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 $*
# }

View file

@ -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'* ]]

View file

@ -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
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
[[ $? == 0 ]] || stat=$?
done
(( $? )) && 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

View file

@ -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

View file

@ -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

View file

@ -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 )

View file

@ -1,5 +1,6 @@
# function zftype {
local type zftmp=${TMPPREFIX}zftype$$
[[ $curcontext = :zf* ]] || local curcontext=:zftype
zfautocheck -d

View file

@ -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

View file

@ -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