zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication.
@ 2011-11-25 22:00 Simon Ruderich
  2011-12-09 13:59 ` Peter Stephenson
  0 siblings, 1 reply; 3+ messages in thread
From: Simon Ruderich @ 2011-11-25 22:00 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 10754 bytes --]

---
Hello,

This patch adds a new completion utility _remote_files() which
tries to reduce some code duplication when completing remote
files.

Please report any mistakes or overcomplicated solutions (patches
are welcome).

I've tested it (except for _rlogin as I don't use rsh) but I'm
sure there are some cases I missed. Please have a look and test
it.

Regards,
Simon

 Completion/Base/Utility/.distfiles    |    2 +-
 Completion/Base/Utility/_remote_files |   77 +++++++++++++++++++++++++++++++++
 Completion/Unix/Command/_git          |   35 +--------------
 Completion/Unix/Command/_rlogin       |   29 +------------
 Completion/Unix/Command/_rsync        |   28 +-----------
 Completion/Unix/Command/_ssh          |   38 +---------------
 6 files changed, 83 insertions(+), 126 deletions(-)
 create mode 100644 Completion/Base/Utility/_remote_files

diff --git a/Completion/Base/Utility/.distfiles b/Completion/Base/Utility/.distfiles
index 97d86bd..d5e359a 100644
--- a/Completion/Base/Utility/.distfiles
+++ b/Completion/Base/Utility/.distfiles
@@ -5,5 +5,5 @@ _arg_compile      _combination      _regex_arguments  _values
 _arguments        _set_command      _retrieve_cache   _guard
 _cache_invalid    _describe         _sep_parts        _pick_variant
 _call_function    _multi_parts      _store_cache      _regex_words
-_complete_help_generic
+_complete_help_generic _remote_files
 '
diff --git a/Completion/Base/Utility/_remote_files b/Completion/Base/Utility/_remote_files
new file mode 100644
index 0000000..c35e3d3
--- /dev/null
+++ b/Completion/Base/Utility/_remote_files
@@ -0,0 +1,77 @@
+#autoload
+
+# Complete files on remote systems using SSH (and other programs). Needs
+# key-based authentication with no passwords or a running ssh-agent to work.
+#
+# Usage:
+# _remote_files [--no-files] [--no-dirs] -- <cmd> [<cmd options>]
+#
+# Options:
+# - --no-files: don't complete remote files
+# - --no-dirs:  don't complete remote directories
+#
+# Commands:
+# - ssh: Additional options for non-interactive use are automatically added
+#        (see below).
+# - All other commands are used unaltered.
+#
+# Examples:
+# - _remote_files -- ssh
+#   Use ssh to retrieve the remote paths. The "--" is not optional!
+# - _remote_files --no-files -- ssh -2 -p 42
+#   Use ssh with the option -2 and -p 42 to retrieve the remote paths and
+#   complete only directories.
+# - _remote_files -- rsh
+#   Use rsh to retrieve the remote paths.
+
+
+# There should be coloring based on all the different ls -F classifiers.
+local expl rempat remfiles remdispf remdispd args cmd cmd_args suf ret=1
+
+if zstyle -T ":completion:${curcontext}:files" remote-access; then
+
+  # Parse options to _remote_files. Stops at the first "--".
+  zparseopts -D -E -a args -no-files -no-dirs
+  shift
+
+  # Command to run on the remote system.
+  cmd="$1"
+  shift
+
+  # Handle arguments to ssh.
+  if [[ $cmd == ssh ]]; then
+    zparseopts -D -E -a cmd_args p: 1 2 4 6 F:
+    cmd_args="-o BatchMode=yes $cmd_args -a -x"
+  else
+    cmd_args="$@"
+  fi
+
+  if [[ -z $QIPREFIX ]]
+    then rempat="${PREFIX%%[^./][^/]#}\*"
+    else rempat="${(q)PREFIX%%[^./][^/]#}\*"
+  fi
+
+  remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
+
+  compset -P '*/'
+  compset -S '/*' || suf='remote file'
+
+  remdispf=(${remfiles:#*/})
+  remdispd=(${(M)remfiles:#*/})
+
+  _tags files
+  while _tags; do
+    while _next_label files expl ${suf:-remote directory}; do
+      [[ ${args[(I)--no-files]} -eq 0 ]] && \
+        [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
+          ${(q)remdispf%[*=@|]} && ret=0
+      [[ ${args[(I)--no-dirs]} -eq 0 ]] && \
+        compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
+          ${(q)remdispd%/} && ret=0
+    done
+    (( ret )) || return 0
+  done
+  return ret
+else
+    _message -e remote-files 'remote file'
+fi
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 4a830f2..702afe0 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -5444,39 +5444,6 @@ __git_tree_files () {
 
 # Repository Argument Types
 
-# _remote_files
-_remote_files_git () {
-  # FIXME: these should be imported from _ssh
-  # TODO: this should take -/ to only get directories
-  # There should be coloring based on all the different ls -F classifiers.
-  local expl rempat remfiles remdispf remdispd args suf ret=1
-
-  if zstyle -T ":completion:${curcontext}:files" remote-access; then
-    zparseopts -D -E -a args p: 1 2 4 6 F:
-    if [[ -z $QIPREFIX ]]
-    then rempat="${PREFIX%%[^./][^/]#}\*"
-    else rempat="${(q)PREFIX%%[^./][^/]#}\*"
-    fi
-    remfiles=(${(M)${(f)"$(_call_program files ssh $args -a -x ${IPREFIX%:} ls -d1FL "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
-    compset -P '*/'
-    compset -S '/*' || suf='remote file'
-
-    remdispd=(${(M)remfiles:#*/})
-
-    _tags files
-    while _tags; do
-      while _next_label files expl ${suf:-remote directory}; do
-	compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
-	    ${(q)remdispd%/} && ret=0
-      done
-      (( ret )) || return 0
-    done
-    return ret
-  else
-    _message -e remote-files 'remote file'
-  fi
-}
-
 (( $+functions[__git_remote_repositories] )) ||
 __git_remote_repositories () {
   local service
@@ -5484,7 +5451,7 @@ __git_remote_repositories () {
   service= _ssh
 
   if compset -P '*:'; then
-    _remote_files_git
+    _remote_files --no-files -- ssh
   else
     _ssh_hosts -S:
   fi
diff --git a/Completion/Unix/Command/_rlogin b/Completion/Unix/Command/_rlogin
index 0d8355b..a04c6d0 100644
--- a/Completion/Unix/Command/_rlogin
+++ b/Completion/Unix/Command/_rlogin
@@ -1,32 +1,5 @@
 #compdef rlogin rsh remsh=rsh rcp
 
-_rcp_remote_files () {
-  # There should be coloring based on all the different ls -F classifiers.
-  local expl remfiles remdispf remdispd suf ret=1
-
-  if zstyle -T ":completion:${curcontext}:" remote-access; then
-    remfiles=(${(M)${(f)"$(rsh ${IPREFIX%:} ls -d1F ${(Q)PREFIX%%[^./][^/]#}\* 2>/dev/null)"}%%[^/]#(|/)})
-    compset -P '*/'
-    compset -S '/*' || suf='remote file'
-
-    remdispf=(${remfiles:#*/})
-    remdispd=(${(M)remfiles:#*/})
-
-    _tags files
-    while _tags; do
-      while _next_label files expl ${suf:-remote directory}; do
-        [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
-	    ${(q)remdispf%[*=@|]} && ret=0 
-	compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
-	    ${(q)remdispd%/} && ret=0
-      done
-      (( ret )) || return 0
-    done
-  else
-    _message -e remote-files 'remote file'
-  fi
-}
-
 _rlogin () {
   case "$service" in
   rlogin)
@@ -65,7 +38,7 @@ _rlogin () {
 
     if [[ -n "$state" ]]; then
       if compset -P '*:'; then
-	_rcp_remote_files && ret=0
+	_remote_files -- rsh && ret=0
       elif compset -P '*@'; then
         _wanted hosts expl host _rlogin_hosts -S: && ret=0
       else
diff --git a/Completion/Unix/Command/_rsync b/Completion/Unix/Command/_rsync
index b999c1b..f24a06e 100644
--- a/Completion/Unix/Command/_rsync
+++ b/Completion/Unix/Command/_rsync
@@ -59,33 +59,7 @@ elif compset -P 1 '*::' || compset -P 1 'rsync://*/'; then
 elif compset -P 'rsync://'; then
   _rsync_user_or_host / "$@"
 elif compset -P 1 '*:'; then
-
-  if zstyle -T ":completion:${curcontext}:files" remote-access; then
-    if [[ -z $QIPREFIX ]]
-    then rempat="${PREFIX%%[^./][^/]#}\*"
-    else rempat="${(q)PREFIX%%[^./][^/]#}\*"
-    fi
-    remfiles=(${(M)${(f)"$(_call_program files ssh -a -x ${IPREFIX%:} ls -d1FL "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
-    compset -P '*/'
-    compset -S '/*' || suf='remote file'
-
-    remdispf=(${remfiles:#*/})
-    remdispd=(${(M)remfiles:#*/})
-
-    _tags files
-    while _tags; do
-      while _next_label files expl ${suf:-remote directory}; do
-        [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
-	    ${(q)remdispf%[*=@|]} && ret=0 
-	compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
-	    ${(q)remdispd%/} && ret=0
-      done
-      (( ret )) || return 0
-    done
-  else
-    _message -e remote-files 'remote file'
-  fi
-
+  _remote_files -- ssh
 else
   _rsync_user_or_host : "$@"
 fi
diff --git a/Completion/Unix/Command/_ssh b/Completion/Unix/Command/_ssh
index bd23c36..a6f2b40 100644
--- a/Completion/Unix/Command/_ssh
+++ b/Completion/Unix/Command/_ssh
@@ -5,40 +5,6 @@
 # TODO: update ssh-keygen (not based on 5.9)
 # TODO: sshd, ssh-keyscan, ssh-keysign
 
-
-_remote_files () {
-  # There should be coloring based on all the different ls -F classifiers.
-  local expl rempat remfiles remdispf remdispd args suf ret=1
-
-  if zstyle -T ":completion:${curcontext}:files" remote-access; then
-    zparseopts -D -E -a args p: 1 2 4 6 F:
-    if [[ -z $QIPREFIX ]]
-    then rempat="${PREFIX%%[^./][^/]#}\*"
-    else rempat="${(q)PREFIX%%[^./][^/]#}\*"
-    fi
-    remfiles=(${(M)${(f)"$(_call_program files ssh -o BatchMode=yes $args -a -x ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
-    compset -P '*/'
-    compset -S '/*' || suf='remote file'
-
-    remdispf=(${remfiles:#*/})
-    remdispd=(${(M)remfiles:#*/})
-
-    _tags files
-    while _tags; do
-      while _next_label files expl ${suf:-remote directory}; do
-        [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
-            ${(q)remdispf%[*=@|]} && ret=0 
-        compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
-            ${(q)remdispd%/} && ret=0
-      done
-      (( ret )) || return 0
-    done
-    return ret
-  else
-    _message -e remote-files 'remote file'
-  fi
-}
-
 _ssh () {
   local curcontext="$curcontext" state line expl common tmp cmds suf ret=1
   typeset -A opt_args
@@ -386,7 +352,7 @@ _ssh () {
       ;;
     file)
       if compset -P '*:'; then
-        _remote_files ${(kv)~opt_args[(I)-[FP1246]]/-P/-p} && ret=0
+        _remote_files -- ssh ${(kv)~opt_args[(I)-[FP1246]]/-P/-p} && ret=0
       elif compset -P '*@'; then
         suf=( -S '' )
         compset -S ':*' || suf=( -r: -S: )
@@ -400,7 +366,7 @@ _ssh () {
       ;;
     rfile)
       if compset -P '*:'; then
-        _remote_files && ret=0
+        _remote_files -- ssh && ret=0
       elif compset -P '*@'; then
         _wanted hosts expl host _ssh_hosts -r: -S: && ret=0
       else
-- 
1.7.7.3

-- 
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication.
  2011-11-25 22:00 PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication Simon Ruderich
@ 2011-12-09 13:59 ` Peter Stephenson
  2011-12-09 23:11   ` Simon Ruderich
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Stephenson @ 2011-12-09 13:59 UTC (permalink / raw)
  To: zsh-workers

On Fri, 25 Nov 2011 23:00:17 +0100
Simon Ruderich <simon@ruderich.org> wrote:
> This patch adds a new completion utility _remote_files() which
> tries to reduce some code duplication when completing remote
> files.
> 
> Please report any mistakes or overcomplicated solutions (patches
> are welcome).
> 
> I've tested it (except for _rlogin as I don't use rsh) but I'm
> sure there are some cases I missed. Please have a look and test
> it.

I suggest you commit these now the release is out of the way --- I've
tried it out a little but I don't use remote file access (other than
transparent) all that much.

-- 
Peter Stephenson <pws@csr.com>            Software Engineer
Tel: +44 (0)1223 692070                   Cambridge Silicon Radio Limited
Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, UK


Member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom
More information can be found at www.csr.com. Follow CSR on Twitter at http://twitter.com/CSR_PLC and read our blog at www.csr.com/blog


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication.
  2011-12-09 13:59 ` Peter Stephenson
@ 2011-12-09 23:11   ` Simon Ruderich
  0 siblings, 0 replies; 3+ messages in thread
From: Simon Ruderich @ 2011-12-09 23:11 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 374 bytes --]

On Fri, Dec 09, 2011 at 01:59:52PM +0000, Peter Stephenson wrote:
> I suggest you commit these now the release is out of the way --- I've
> tried it out a little but I don't use remote file access (other than
> transparent) all that much.

Committed.

Regards,
Simon
-- 
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-12-09 23:16 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-25 22:00 PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication Simon Ruderich
2011-12-09 13:59 ` Peter Stephenson
2011-12-09 23:11   ` Simon Ruderich

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).