gcd_help() { /bin/echo "Usage: to auto cd into a git project." /bin/echo "By Default with no arguments -> list all git projects." /bin/echo "\$ gcd PROJECT -> will cd into project folder and give git status." /bin/echo "Commands: \$ gcd PROJECT [auto, pull, push, nostatus, addall]" /bin/echo "NEW: \$ gcd-push -> to push an git repo dir, and \$ gcd-pop -> to pop last dir" /bin/echo "[nopop] -> will not gpop before it does its gpush" /bin/echo "\$ gcd-pop -> will go back to last folder used by gcd-push" /bin/echo "To edit Projects List: \$ gcd editprojects" } gcd_branch() { echo "You are on Git Branch: " /usr/bin/git branch --list } GIT_DIR_STACK=() git_dirs() { if [ ${#GIT_DIR_STACK[@]} -eq 0 ]; then echo "Empty Stack" 1>&2 return 1 fi printf "Git Push Dirs: " for s in "${GIT_DIR_STACK[@]}"; do if [ -z "$1" ] || [ ! "${GIT_DIR_STACK[-1]}" == "$s" ]; then printf "$s " fi done echo -e "\n" } git_pushd() { if [ ${#GIT_DIR_STACK[@]} -eq 0 ]; then GIT_DIR_STACK+=( $(pwd) ) fi if [ ! -z "$1" ]; then local gitdirname=$1 local nopush=false for s in "${GIT_DIR_STACK[@]}"; do if [ "$s" == "$gitdirname" ]; then nopush=true break; fi done if [ "$nopush" == false ]; then GIT_DIR_STACK+=( "$gitdirname" ) else echo "Already in Stack..." fi if [ -z "$2" ]; then git_dirs here fi cd $gitdirname fi } git_popd() { if [[ ${GIT_DIR_STACK[@]} ]]; then if [ ${#GIT_DIR_STACK[@]} -eq 2 ]; then cd ${GIT_DIR_STACK[-2]} echo "Stack now empty." GIT_DIR_STACK=() elif [ ${#GIT_DIR_STACK[@]} -gt 2 ]; then cd ${GIT_DIR_STACK[-2]} if [ -z "$1" ]; then git_dirs here fi unset GIT_DIR_STACK[-1] else echo "Empty Stack" 1>&2 return 1 fi else echo "Empty Stack" 1>&2 return 1 fi } alias gcd-push='git_pushd' alias gcd-pop='git_popd' alias gcd-dirs='git_dirs' gcd_x() { if [ -z "$2" ]; then git_popd 2> /dev/null > /dev/null git_pushd "$1" elif [ "$2" == "nopop" ]; then git_pushd "$1" else cd "$1" fi } gcd() { #set -x local git_projects=~/.gitprojects if [ ! -r $git_projects ]; then /opt/profiles/scripts/locate_gits.sh if [ $? -eq 0 ]; then mv /tmp/gitprojects $git_projects else echo "Opps!!" exit 1 fi fi if [ -z "$1" ]; then /bin/echo elif [ $1 == "--help" ] || [ $1 == "-help" ] || [ $1 == "help" ] || [ $1 == "?" ]; then gcd_help return 0 elif [ $1 == "editprojects" ]; then $EDITOR "$git_projects" return 0 elif [ $1 == "me" ]; then $EDITOR ${_ENV_PATH}git_cd.env return 0 fi IFSOLD=$IFS IFS=','; found="false" while read -r label mycommand desc; do [[ $label =~ ^#.* ]] && continue if [ -z "$1" ]; then /bin/echo "gcd ${label} , PATH= ${mycommand}, DESC: ${desc}" else [[ "$label" == "$1" ]] && { found="true"; break; } fi done < "$git_projects" IFS=$IFSOLD if [ "$found" == "true" ] && [ ! -z $mycommand ]; then if [ -z $2 ]; then gcd_x "$mycommand" /usr/bin/git status elif [ $2 == "nopop" ]; then gcd_x "$mycommand" nopop /usr/bin/git status elif [ $2 == "auto" ]; then /opt/profiles/scripts/git/dogit "$mycommand" gcd_x "$mycommand" $3 elif [ $2 == "pull" ]; then /opt/profiles/scripts/git/gpull "$mycommand" gcd_x "$mycommand" $3 elif [ $2 == "push" ]; then /opt/profiles/scripts/git/gpull-and-push "$mycommand" gcd_x "$mycommand" $3 elif [ $2 == "nostatus" ]; then gcd_x "$mycommand" $3 elif [ $2 == "addall" ]; then gcd_x "$mycommand" $3 /usr/bin/git add . /usr/bin/git status else gcd_help fi fi #set +x } gpcd() { local gcmdlist=() IFSOLD=$IFS IFS=','; while read -r label mycommand desc; do [[ $label =~ ^#.* ]] && continue if [ "$label" == "$1" ]; then gcd $@ return 0 fi gcmdlist+=("$label" "$desc") done < ~/.gitprojects IFS=$IFSOLD command=$(dialog --ok-label "CD" --cancel-label "EXIT" --output-fd 1 \ --colors \ --menu "Select git project:" 0 0 0 "${gcmdlist[@]}") clear gcd $command $@ }