penguin/utils

my env utils

commit f6c3239846da9acd6510655279d870b5b9158497

author斟酌 鵬兄 <tgckpg@gmail.com>
date2017-09-21T08:25:23Z
subjectExtended go functionalies
commit f6c3239846da9acd6510655279d870b5b9158497
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2017-09-21T08:25:23Z

    Extended go functionalies
---
 bash/bashrc/sources/40_go-command | 109 ++++++++++++++++++++++----------------
 1 file changed, 63 insertions(+), 46 deletions(-)

diff --git a/bash/bashrc/sources/40_go-command b/bash/bashrc/sources/40_go-command
index 7a97f83..540635f 100755
--- a/bash/bashrc/sources/40_go-command
+++ b/bash/bashrc/sources/40_go-command
@@ -5,21 +5,26 @@ function go() {
     ARG1=$1; ARG2=$2; ARG3=$3;
 
     if [[ -z "$ARG1" ]]; then
-        __func_head "[MODE] SITE TARGET_DIR"
-        __func_help "<up|down> [MODE] TARGET_DIR"
+        __func_head "[MODE] SITE TARGET_DIR [..SLICE]"
+        __func_help "up [MODE] TARGET_DIR"
+        __func_help "down [MODE] TARGET_DIR [..SLICE]"
         echo
         return 1
     fi
 
-    NAV=false;
+    NAV=false
     case "$ARG1" in
         p)
+            shift
             CC='pushd' ;;
         c)
+            shift
             CC='cd' ;;
         e)
+            shift
             CC='echo' ;;
         up|down)
+            shift
             NAV=true ;;
         *)
             CC='cd'
@@ -29,59 +34,86 @@ function go() {
     esac
 
     if [ $NAV = true ]; then
-        __go_nav $ARG1 $ARG2 $ARG3
-        return 0;
+        __go_nav $ARG1 $@
+        return $?
     fi
 
     if [[ -f ~/.go_conf ]]; then
         source ~/.go_conf
     else
         echo "Cannot source config file"
-        return 1;
+        return 1
     fi
 
-    SITE=$(ls $UDEV|grep -m 1 $ARG2)
+    SITE=$( ls "$UDEV" | grep -m 1 "$ARG2" )
     if [[ -z "$SITE" ]]; then
         echo "No such site: $ARG2"
-        ls $UDEV -1 | sed 's/^/  /g'
+        find "$UDEV/" -maxdepth 1 -type d | sed "s/^.\+\/\([^\/]\+\)\/\?$/    \1/g"
         return 1
     fi
 
     if [[ -z "$ARG3" ]]; then
-        $CC $UDEV/$SITE
-        return 0
+        $CC "$UDEV/$SITE"
+        return $?
     fi
 
-    for LOC in ${LOCS[@]}
+    for ((i = 0; i < ${#LOCS[@]}; i++))
     do
-        LOCATION=$(ls $UDEV/$SITE/$LOC/ 2> /dev/null | grep -m 1 $ARG3)
+        LOC=${LOCS[i]}
+        LOCATION=$(ls -d "$UDEV/$SITE/$LOC/*$ARGS3*/" 2> /dev/null )
         if [[ -n "$LOCATION" ]]; then
             LOCATION="$LOC/$LOCATION"
-            break;
+            break
         fi
     done
 
+    # shift ARG2 ARG3
+    shift; shift
+
     if [[ -n "$LOCATION" ]]; then
-        $CC $UDEV/$SITE/$LOCATION/
-        return 0
+        __dive $CC "$UDEV/$SITE/$LOCATION/" $@
+        return $?
     else
-        echo "Location '$ARG3' not found under: $SITE"
+        __dive $CC "$UDEV/$SITE" "$ARG3" $@
+        return $?
+    fi
+}
+
+__dive() {
+    CC=$1
+    WDIR=$2
+    shift; shift
+
+    OIFS=$IFS
+    IFS="*"
+    PATT="*$**"
+    IFS=$OIFS
+
+    pushd "$WDIR" > /dev/null
+    DIR=$(find . -type d -path "$PATT" -print -quit | cut -c 3- )
+    popd > /dev/null
+
+    if [[ -z $DIR ]]; then
+        echo "Path: $WDIR"
+        echo "  - Pattern not found: $PATT"
         return 1
     fi
 
-    return 1
+    $CC "$WDIR/$DIR"
 }
 
 __go_nav() {
     ARG1=$1; ARG2=$2; ARG3=$3;
     case "$ARG2" in
         p)
+            shift
             CC='pushd' ;;
         c|"")
+            shift
             CC='cd' ;;
         e)
+            shift
             CC='echo' ;;
-
         *)
             CC='cd'
             ARG3=$ARG2
@@ -89,39 +121,32 @@ __go_nav() {
     esac
 
     if [[ "$ARG1" == "up" ]]; then
+        OIFS=$IFS
         IFS="/" read -a PWDA <<< "$(pwd)"
+        IFS=$OIFS
 
         MARK=0
-        NOT_FOUND=1
-        LISTOF=''
-        for i in "${!PWDA[@]}"
+        S_LEN=$(( ${#PWDA[@]} - 2 ))
+        for (( i=1; i<=$S_LEN; i++ ))
         do
             STACK=${PWDA[$i]}
             if [ -z "$STACK" ]; then
                 continue
             fi
 
-            MARK=$i
-
             if [ -n "$ARG3" ] && [[ "$STACK" =~ "$ARG3" ]]; then
-                unset NOT_FOUND
-                break
-            fi
-
-            if [[ -n "$STACK" ]]; then
-                LISTOF="$LISTOF\n    $STACK";
+                MARK=$i
             fi
         done
 
         if [ -z "$ARG3" ]; then
-            unset NOT_FOUND
-            MARK=$(( $MARK - 1 ))
+            # Go up 1 level
+            MARK=$(( ${#PWDA[@]} - 2 ))
         fi
 
-        if [ -n "$NOT_FOUND" ]; then
+        if [ $MARK -eq 0 ]; then
             echo "No such token in up stack: $ARG3"
-            echo -e $LISTOF;
-            echo
+            for (( i=1; i<=$S_LEN; i++ )); do echo "    ${PWDA[$i]}"; done
             return 1
         fi
 
@@ -132,18 +157,10 @@ __go_nav() {
             DIR="$DIR${PWDA[$i]}/"
         done
 
+        $CC "$DIR"
     else
-        if [ -z "$ARG3" ]; then
-            DIR=$(find . -maxdepth 1 -type d | head -n 2 | tail -n 1)
-        else 
-            DIR=$(find . -type d -name '*'$ARG3'*')
-            if [[ -z $DIR ]]; then
-
-                echo "Directory not found: $ARG3"
-                return 1
-            fi
-        fi
+        shift
+        __dive $CC . $@
+        return $?
     fi
-
-    $CC $DIR
 }