Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Let run-help filter cmd_args before calling run-help-<command> (was Re: [RFC][PATCH] Try calling command with help flags in run-help)



On Fri, Jun 4, 2021 at 2:33 AM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> Anyway, here's a new version of my patch. Let me know what you think.

I don't see any obvious problems with it but I don't know how to
construct a test case for any of the helpers you've edited.  It would
be nice to know that this does not break the un-edited versions of
those helpers, because if those changes are required rather than just
redundant code removal, other helpers in the wild would also require
editing.

New patch here with test cases, plus a rewrite of run-help-git. All the tests succeed for both the new and old versions of the run-help-* functions (except for the old run-help-git, because the new run-help-git uses `git help` instead of `man`).

From 21257c087fdf8896cc7362ed432a76de7f4a1fff Mon Sep 17 00:00:00 2001
From: Marlon Richert <marlon.richert@xxxxxxxxx>
Date: Sat, 5 Jun 2021 22:06:50 +0300
Subject: [PATCH] Let run-help filter $cmd_args before calling
 run-help-<command>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

…to make it easier to write run-help-<command> functions.
---
 Functions/Misc/run-help       |  15 +++--
 Functions/Misc/run-help-btrfs |   4 --
 Functions/Misc/run-help-git   |  10 +---
 Functions/Misc/run-help-ip    |   4 --
 Functions/Misc/run-help-p4    |   2 +-
 Functions/Misc/run-help-svk   |   2 +-
 Functions/Misc/run-help-svn   |   2 +-
 Test/Z03run-help.ztst         | 103 ++++++++++++++++++++++++++++++++++
 8 files changed, 116 insertions(+), 26 deletions(-)
 create mode 100644 Test/Z03run-help.ztst

diff --git a/Functions/Misc/run-help b/Functions/Misc/run-help
index e351dd6a6..d52c1b032 100644
--- a/Functions/Misc/run-help
+++ b/Functions/Misc/run-help
@@ -101,12 +101,15 @@ do
 		builtin getln cmd_args
 		builtin print -z "$cmd_args"
 		cmd_args=( ${(z)cmd_args} )
-		# Discard environment assignments, etc.
-		while [[ $cmd_args[1] != ${run_help_orig_cmd:-$1} ]]
-		do
-		    shift cmd_args || return 1
-		done
-		eval "run-help-$1:t ${(q@)cmd_args[2,-1]}"
+
+                # Discard the command itself & everything before it.
+                shift $cmd_args[(i)${run_help_orig_cmd:-$1}] cmd_args ||
+                    return
+
+                # Discard options, parameter assignments & paths.
+                cmd_args=( ${cmd_args[@]:#([-+]*|*=*|*/*|\~*)} )
+
+                eval "run-help-$1:t ${(@q)cmd_args}"
 	    else
 		POSIXLY_CORRECT=1 man $@:t
 	    fi
diff --git a/Functions/Misc/run-help-btrfs b/Functions/Misc/run-help-btrfs
index 0dc1dabcb..cb139e9b7 100644
--- a/Functions/Misc/run-help-btrfs
+++ b/Functions/Misc/run-help-btrfs
@@ -1,7 +1,3 @@
-while [[ $# != 0 && $1 == -* ]]; do
-    shift
-done
-
 case $1 in
     (b*)    man btrfs-balance          ;;
     (c*)    man btrfs-check            ;;
diff --git a/Functions/Misc/run-help-git b/Functions/Misc/run-help-git
index ce94d0d02..a841f89d6 100644
--- a/Functions/Misc/run-help-git
+++ b/Functions/Misc/run-help-git
@@ -1,9 +1 @@
-if [ $# -eq 0 ]; then
-    man git
-else
-    local al
-    if al=$(git config --get "alias.$1"); then
-        1=${al%% *}
-    fi
-    man git-$1
-fi
+git help ${1:-git}
diff --git a/Functions/Misc/run-help-ip b/Functions/Misc/run-help-ip
index 8807f9ef1..b811ce352 100644
--- a/Functions/Misc/run-help-ip
+++ b/Functions/Misc/run-help-ip
@@ -14,10 +14,6 @@ if ! man -w ip-address >/dev/null 2>&1; then
     return
 fi
 
-while [[ $# != 0 && $1 == -* ]]; do
-    shift
-done
-
 case $1 in
     (addrl*) man ip-addrlabel ;;
     (a*) man ip-address ;;
diff --git a/Functions/Misc/run-help-p4 b/Functions/Misc/run-help-p4
index 662ce94fe..e48a4d068 100644
--- a/Functions/Misc/run-help-p4
+++ b/Functions/Misc/run-help-p4
@@ -2,4 +2,4 @@ if (( ! $# )); then
   p4 help commands
 else
   p4 help $1
-fi | ${=PAGER:-less}
+fi | ${=PAGER:-more}
diff --git a/Functions/Misc/run-help-svk b/Functions/Misc/run-help-svk
index 92438a53f..782538246 100644
--- a/Functions/Misc/run-help-svk
+++ b/Functions/Misc/run-help-svk
@@ -1 +1 @@
-svk help ${${@:#-*}[1]} | ${=PAGER:-more}
+svk help $1 | ${=PAGER:-more}
diff --git a/Functions/Misc/run-help-svn b/Functions/Misc/run-help-svn
index 5d1068588..d55a493a6 100644
--- a/Functions/Misc/run-help-svn
+++ b/Functions/Misc/run-help-svn
@@ -1 +1 @@
-svn help ${${@:#-*}[1]} | ${=PAGER:-more}
+svn help $1 | ${=PAGER:-more}
diff --git a/Test/Z03run-help.ztst b/Test/Z03run-help.ztst
new file mode 100644
index 000000000..1f280fea7
--- /dev/null
+++ b/Test/Z03run-help.ztst
@@ -0,0 +1,103 @@
+%prep
+  PAGER=cat
+  unalias run-help
+  autoload +X -Uz $PWD/../Functions/Misc/run-help*
+  builtin() {
+    case "$1 $2" in
+      ( 'getln cmd_args' )
+        cmd_args="$BUFFER_STACK"
+      ;;
+      ( 'print -z' )
+      ;;
+      ( 'whence -va' )
+        print -l "$3 is WHENCE:{$3}"
+      ;;
+      ( * )
+        eval $@
+      ;;
+    esac
+  }
+  man() {
+    [[ $1 == -w && -n $NO_SUBCMD_MANUALS ]] &&
+        return 1
+    print "MAN:{${(qq)@}}"
+  }
+  git svn () {
+    print "${(U)0}:{${(qq)@}}"
+  }
+  
+  
+%test
+
+  BUFFER_STACK='btrfs --help'
+  run-help btrfs
+0:btrfs with option flag, no subcmd
+>btrfs is WHENCE:{btrfs}
+>MAN:{'btrfs'}
+
+  BUFFER_STACK='btrfs subvolume snapshot –r /btrfs/SV1 /btrfs/SV1-rosnap'
+  run-help btrfs
+0:btrfs with subcmd
+>btrfs is WHENCE:{btrfs}
+>MAN:{'btrfs-subvolume'}
+
+  BUFFER_STACK="sudo $BUFFER_STACK"
+  run-help btrfs
+0:sudo btrfs with subcmd
+>btrfs is WHENCE:{btrfs}
+>MAN:{'btrfs-subvolume'}
+
+  BUFFER_STACK='ip addr add 192.168.50.5 dev eth1'
+  run-help ip
+0:ip with subcmd
+>ip is WHENCE:{ip}
+>MAN:{'ip-address'}
+
+  NO_SUBCMD_MANUALS=1
+  run-help ip
+  unset NO_SUBCMD_MANUALS
+0:ip with subcmd, but no subcmd manuals
+>ip is WHENCE:{ip}
+>MAN:{'ip'}
+
+  BUFFER_STACK='ip -s -s link ls up'
+  run-help ip
+0:ip with options and subcmd
+>ip is WHENCE:{ip}
+>MAN:{'ip-link'}
+
+  BUFFER_STACK="sudo $BUFFER_STACK"
+  run-help ip
+0:sudo ip with options and subcmd
+>ip is WHENCE:{ip}
+>MAN:{'ip-link'}
+
+  BUFFER_STACK='svn -vq'
+  run-help svn
+0:svn with options
+>svn is WHENCE:{svn}
+>SVN:{'help'}
+
+  BUFFER_STACK+=' commit -m "log messages"'
+  run-help svn
+0:svn with options and subcmd
+>svn is WHENCE:{svn}
+>SVN:{'help' 'commit'}
+
+  BUFFER_STACK='git --exec-path'
+0:git with option
+>git is WHENCE:{git}
+>GIT:{'help' 'git'}
+
+  BUFFER_STACK='git -C $PWD/.. difftool --no-prompt --tool opendiff --dir-diff'
+0:git with option, file & subcmd
+>git is WHENCE:{git}
+>GIT:{'help' 'difftool'}
+
+  BUFFER_STACK='git -c http.proxy=someproxy clone https://github.com/user/repo.git'
+0:git with option, assignment & subcmd
+>git is WHENCE:{git}
+>GIT:{'help' 'clone'}
+
+
+%clean
-- 
2.30.1 (Apple Git-130)



Messages sorted by: Reverse Date, Date, Thread, Author