Explorar o código

Merge pull request #3527 from afishbeck/bash_completion3139

HPCC-3139 Make ecl cli bash_completion command specific

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman %!s(int64=12) %!d(string=hai) anos
pai
achega
bc8a46d456
Modificáronse 1 ficheiros con 200 adicións e 19 borrados
  1. 200 19
      initfiles/etc/bash_completion/ecl

+ 200 - 19
initfiles/etc/bash_completion/ecl

@@ -21,30 +21,211 @@
 # File must be copied/linked from /etc/bash_completion.d/ to work seamlessly
 # You must have ". /etc/bash_completion" on your bashrc file (you probably have it)
 
-_ecl()
+#set -x
+
+_flag_option()
 {
-    local cur prev opts
-    COMPREPLY=()
-    cur="${COMP_WORDS[COMP_CWORD]}"
-    prev="${COMP_WORDS[COMP_CWORD-1]}"
+    case "$1" in
+        "--help" | "-v" | "--verbose" | "--no-reload" | "--no-files" | "-A" | "--activate" | "-O" | "--overwrite" | "--ecl-only")
+            echo 1
+            ;;
+        *)
+            echo 0
+            ;;
+    esac
+}
 
-    # Command options
-    case ${prev} in
-         queries)
-             opts="list copy"
-             ;;
-         package)
-             opts="add copyFiles delete activate deactivate list info"
-             ;;
-         ecl)
-             opts="--version deploy publish unpublish run activate deactivate queries package"
-             ;;
+_ecl_opts_file()
+{
+    local prev="${COMP_WORDS[COMP_CWORD-1]}"
+    if [ "$prev" = "=" ]
+    then
+       prev="${COMP_WORDS[COMP_CWORD-2]}"
+    fi
+    local isFlagOption=$(_flag_option $prev)
+    if [ "$isFlagOption" = "1" ] || [ "${prev:0:1}" != "-" ] || [ "$prev" = "--manifest" ]
+    then
+       echo "<filelist>"
+    fi
+}
+
+_ecl_nextcommand()
+{
+    local value=0
+    local pos=$(($1))
+    for ((; pos<$COMP_CWORD; pos++))
+    do
+        cur="${COMP_WORDS[pos]}"
+        ch="${cur:0:1}"
+        if [ "$ch" == "=" ]
+        then
+            pos=$(($pos + 1))
+        elif [ "$ch" != "-" ]
+        then
+            value=$(($pos))
+            break
+        else
+            isFlagOption=$(_flag_option $cur )
+            if [ "$isFlagOption" -eq "0" ] && [ "${COMP_WORDS[pos+1]}" != "=" ]
+            then
+               pos=$(($pos + 1))
+            fi
+        fi
+    done
+    echo $value
+}
+
+_ecl_opts_common()
+{
+    echo "--help -v --verbose -s --server=<ip> --port=N -u --username=<name> -pw --password=<pw>"
+}
+
+_ecl_opts_queries()
+{
+    local subcmdpos=$(_ecl_nextcommand $1)
+    local subcmdname="${COMP_WORDS[subcmdpos]}"
+    case "${subcmdname}" in
+        "" | ecl)
+            echo "--help list copy config"
+            ;;
+        copy)
+            echo -n "--no-reload --wait=MS --timeLimit=SEC --warnTimeLimit=SEC --memoryLimit=MEM "
+            _ecl_opts_common
+            ;;
+        config)
+            echo -n "-t --target=<target> --no-files --daliip=<ip> -A --activate --no-reload "
+            echo -n "-O --overwrite --wait=MS --timeLimit=SEC --warnTimeLimit=SEC --memoryLimit=MEM "
+            _ecl_opts_common
+            ;;
+        list)
+            echo -n "-t --target=<target> --show=<ASU> "
+            _ecl_opts_common
+            ;;
+         *)
+         ;;
+    esac
+}
+
+_ecl_opts_roxie()
+{
+    local subcmdpos=$(_ecl_nextcommand $1)
+    local subcmdname="${COMP_WORDS[subcmdpos]}"
+    case "${subcmdname}" in
+        "" | ecl)
+            echo "--help attach detach check reload"
+            ;;
+        attach | detach | check | reload)
+            echo -n "--wait=MS "
+            _ecl_opts_common
+            ;;
          *)
-             opts="-t --target=<name> -n --name=<name> -v --verbose -s --server=<host:port> -u --username=<user> -pw --password==<pw> --main=<definition> --ecl-only --limit=N -A --activate --wait=<ms>"
+            ;;
+    esac
+}
+
+_ecl_opts_packagemap()
+{
+    local subcmdpos=$(_ecl_nextcommand $1)
+    local subcmdname="${COMP_WORDS[subcmdpos]}"
+    case "${subcmdname}" in
+        "" | ecl)
+             echo "--help add copyFiles delete activate deactivate list info"
+            ;;
+        add)
+            if [ "${COMP_WORDS[COMP_CWORD]:0:1}" != "-" ]
+            then
+                _ecl_opts_file
+            else
+                echo -n "-O --overwrite "
+                _ecl_opts_common
+            fi
+            ;;
+        delete | activate | deactivate | list | info)
+            _ecl_opts_common
+            ;;
+        *)
+              ;;
+    esac
+}
+
+_ecl_opts_deploy()
+{
+    echo -n "-t --target=<name> -n --name=<name> --main=<definition> --ecl-only --limit=N "
+    echo -n "--wait=<ms> -I<path> -L<path> -f<option>=value --manifest=<file> "
+}
+
+_ecl_opts_core_file()
+{
+    if [ "${COMP_WORDS[COMP_CWORD]:0:1}" != "-" ]
+    then
+        _ecl_opts_file
+    else
+       case "$1" in
+            deploy)
+                _ecl_opts_deploy
+                _ecl_opts_common
+                ;;
+            publish)
+                echo -n "-A --activate --no-reload --timeLimit=ms --warnTimeLimit=ms --memoryLimit=value "
+                _ecl_opts_deploy
+                _ecl_opts_common
+                ;;
+            run)
+                echo -n "-in --input=<xml|file> -X<name>=<value> "
+                _ecl_opts_deploy
+                _ecl_opts_common
+                ;;
+             *)
              ;;
+        esac
+    fi
+}
+
+_ecl_opts_core()
+{
+   case "$1" in
+        deploy | publish | run)
+            _ecl_opts_core_file $1
+            ;;
+        unpublish | activate | deactivate)
+            _ecl_opts_common
+            ;;
+         *)
+            ;;
     esac
+}
 
-    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+_ecl()
+{
+    COMPREPLY=()
+    local cmdpos=$(_ecl_nextcommand 1)
+    local cmdname="${COMP_WORDS[cmdpos]}"
+    case "${cmdname}" in
+        "" | ecl)
+            opts="--help --version help deploy publish unpublish run activate deactivate queries packagemap roxie"
+            ;;
+        roxie)
+            opts=$(_ecl_opts_roxie $(($cmdpos + 1)))
+            ;;
+        queries)
+            opts=$(_ecl_opts_queries $(($cmdpos + 1)))
+            ;;
+        packagemap)
+            opts=$(_ecl_opts_packagemap $(($cmdpos + 1)))
+            ;;
+        *)
+            opts=$(_ecl_opts_core $cmdname)
+            ;;
+    esac
+
+    local cur="${COMP_WORDS[COMP_CWORD]}"
+    if [ "$opts" = "<filelist>" ]
+    then
+        COMPREPLY=( $(compgen -f ${cur}) )
+    else
+        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+    fi
     return 0
 }
-complete -F _ecl ecl
+
+complete -o nospace -F _ecl ecl