commit 0d0991df19aff063affbcfb93c496169abc1b48b Author: Wryn Wagner Date: Mon Sep 13 21:31:48 2021 -0600 v1 diff --git a/activator.plugin.zsh b/activator.plugin.zsh new file mode 100644 index 0000000..61a4185 --- /dev/null +++ b/activator.plugin.zsh @@ -0,0 +1,80 @@ +#!/bin/zsh +##################################################################### +# # +# CODE_ACTIVATOR : a terminal-based navigation utility # +# # +##################################################################### + +##################################################################### + +DEPENDENCIES=( + fzf + ) + +IMPORTS=( + "${0:a:h}/zsh/settings.zsh" + "${0:a:h}/zsh/helpers.zsh" + "${0:a:h}/zsh/activate.zsh" + "${0:a:h}/zsh/clone.zsh" + ) + +##################################################################### + +for DEPENDENCY in $DEPENDENCIES +do + command -v $DEPENDENCY >/dev/null 2>&1 || { + echo "I require '$DEPENDENCY' but it's not installed :c" + ERROR_CODE=1 + } +done + +##################################################################### + +for IMPORT in $IMPORTS; do source $IMPORT; done + +[ ! $_CA__ACTIVATE_LOADED ] && ERROR_CODE=2 +[ ! $_CA__CLONE_LOADED ] && ERROR_CODE=2 + +##################################################################### + +[ $ERROR_CODE ] && return $ERROR_CODE + +##################################################################### +##################################################################### + +CODE_ACTIVATOR() { + local ERROR=0 + + case $1 in + clone ) _CA__CLONE ${@:2} || ERROR=1 ;; + * ) _CA__ACTIVATE ${@:2} || ERROR=2 ;; + esac + + return $ERROR +} + +_CODE_ACTIVATOR() { + local state + + _arguments \ + '1: :->project' \ + ':: :->arguments' \ + ; + + case $state in + project ) + compadd clone + + for dir in $CODE_ACTIVATOR__DIRS + do + compadd "$(basename $dir)/$(basename $(ls -d -- $dir/*))" + done + ;; + arguments ) + case $words[2] in + clone ) __CA__CLONE ;; + esac + ;; + esac +} +compdef _CODE_ACTIVATOR CODE_ACTIVATOR diff --git a/zsh/' b/zsh/' new file mode 100644 index 0000000..331e084 --- /dev/null +++ b/zsh/' @@ -0,0 +1,43 @@ +##################################################################### + +[ ! $_CA__SETTINGS_LOADED ] && source "${0:a:h}/settings.zsh" +[ ! $_CA__HELPERS_LOADED ] && source "${0:a:h}/helpers.zsh" + +##################################################################### + +_CA__CLONE() { + local BASE_DIR="$1" + local REMOTE_TARGET="$2" + local PROJECT_NAME="$3" + + [ ! $BASE_DIR ] && BASE_DIR=$(_CA_SELECT_BASE_DIR) + [ ! $REMOTE_TARGET ] && REMOTE_TARGET=$(_CA_GET_REMOTE_TARGET) + [ ! $PROJECT_NAME ] && PROJECT_NAME=$(_CA_GET_PROJECT_NAME) +} + + +__CA__CLONE() { + local state + + _arguments \ + '1: :->base_dir' \ + '2: :->project_name' \ + '3: :->remote_target' \ + ':: :->arguments' \ + ; + + case $state in + base_dir ) + for dir in $CODE_ACTIVATOR__DIRS; do compadd $dir; done + ;; + project_name ) + ;; + remote_target ) + ;; + arguments ) ;; + esac +} + +##################################################################### + +export _CA__CLONE_LOADED=1 diff --git a/zsh/activate.zsh b/zsh/activate.zsh new file mode 100644 index 0000000..6c852c8 --- /dev/null +++ b/zsh/activate.zsh @@ -0,0 +1,56 @@ +##################################################################### + +[ ! $_CA__SETTINGS_LOADED ] && source "${0:a:h}/settings.zsh" +[ ! $_CA__HELPERS_LOADED ] && source "${0:a:h}/helpers.zsh" + +##################################################################### + +_CA__ACTIVATE() { + _CA__RESTORE_ENVIRONMENT + + local PROJECT="$1" + [ ! $PROJECT ] && { cd; return 0; } + + local PROJECT_PATH=$(_CA__GET_FULL_PATH $PROJECT) + [ ! -d $PROJECT_PATH ] && { cd; return 0; } + + _CA__ACTIVATE_VIRTUAL_ENV $PROJECT_PATH + _CA__ACTIVATE_CUSTOM_ENV $PROJECT_PATH + _CA__ACTIVATE_SOURCE_DIR $PROJECT_PATH + + _CA__TMUX_WINDOW_RENAME $PROJECT +} + +_CA__ACTIVATE_VIRTUAL_ENV() { + local PROJECT_PATH="$1" + local ACTIVATE="$PROJECT_PATH/$_CA__VIRTUAL_ENV_NAME/bin/activate" + local NO_ENV="$PROJECT_PATH/$_CA__NO_ENV_SENTINEL" + + [ -f $ACTIVATE ] && { + source $ACTIVATE + } || { + [ -f $NO_ENV ] && { + echo 'no virtual environment here, boss!' + } || { + _CA__INTERACTIVE_ENV_SETUP $PROJECT_PATH + } + } +} + +_CA__ACTIVATE_CUSTOM_ENV() { + local PROJECT_PATH="$1" + local CUSTOM_ENV="$PROJECT_PATH/$_CA__CUSTOM_ENV_NAME" + + [ ! -f $CUSTOM_ENV ] || { + source $CUSTOM_ENV && echo 'custom environment active' + } +} + +_CA__ACTIVATE_SOURCE_DIR() { + local SOURCE_DIR="$1/$_CA__SOURCE_DIR_NAME" + cd $SOURCE_DIR +} + +##################################################################### + +export _CA__ACTIVATE_LOADED=1 diff --git a/zsh/clone.zsh b/zsh/clone.zsh new file mode 100644 index 0000000..eb49c10 --- /dev/null +++ b/zsh/clone.zsh @@ -0,0 +1,95 @@ +##################################################################### + +[ ! $_CA__SETTINGS_LOADED ] && source "${0:a:h}/settings.zsh" +[ ! $_CA__HELPERS_LOADED ] && source "${0:a:h}/helpers.zsh" + +##################################################################### + +_CA__CLONE() { + local BASE_DIR="$1" + local REMOTE_TARGET="$2" + local PROJECT_NAME="$3" + + [ ! $BASE_DIR ] && BASE_DIR=$(_CA__SELECT_BASE_DIR) + [ ! $BASE_DIR ] && return 1 + + [ ! $REMOTE_TARGET ] && REMOTE_TARGET=$(_CA__GET_REMOTE_TARGET) + [ ! $REMOTE_TARGET ] && return 1 + echo $REMOTE_TARGET + [[ $REMOTE_TARGET =~ .git$ ]] || return 1 + + [ ! $PROJECT_NAME ] && PROJECT_NAME=$(_CA__GET_PROJECT_NAME $REMOTE_TARGET) + [ ! $PROJECT_NAME ] && return 1 + + local PROJECT_PATH="$BASE_DIR/$PROJECT_NAME" + + [ -d $PROJECT_PATH ] && { + echo "project '$PROJECT_NAME' already exists in '$(basename $BASE_DIR)'" + return 1 + } + + mkdir $PROJECT_PATH + _CA__CLONE_SOURCE $REMOTE_TARGET $PROJECT_PATH + _CA__INTERACTIVE_ENV_SETUP $PROJECT_PATH + _CA__INIT_CUSTOM_ENV $PROJECT_PATH +} + + +__CA__CLONE() { + local state + + _arguments \ + '1: :->base_dir' \ + '2: :->project_name' \ + '3: :->remote_target' \ + ':: :->arguments' \ + ; + + case $state in + base_dir ) + for dir in $CODE_ACTIVATOR__DIRS; do compadd $dir; done + ;; + project_name ) + ;; + remote_target ) + ;; + arguments ) ;; + esac +} + +##################################################################### + +_CA__CLONE_SOURCE() { + local REMOTE_TARGET="$1" + local PROJECT_PATH="$2" + local SOURCE_DIR="$PROJECT_PATH/$_CA__SOURCE_DIR_NAME" + + echo "trying to clone '$REMOTE_TARGET' to '$PROJECT_PATH'" + git clone "$REMOTE_TARGET" "$SOURCE_DIR" >/dev/null 2>&1 || { + echo "failed to clone '$REMOTE_TARGET'" + + printf "is this a new project? [y/N]" + read -k yn + [[ $yn =~ ^[yY] ]] && { + printf 'initializing project...' + { + mkdir $SOURCE_DIR \ + && cd $SOURCE_DIR \ + && git init \ + && touch .gitignore \ + && git add .gitignore \ + && git commit -m 'project init' \ + && git remote add "$_CA__GIT_MAIN_BRANCH" $REMOTE_TARGET \ + && cd .. \ + ; + } >/dev/null >&1 && echo ' success :)' || echo ' failed :c' + } || { + echo 'exiting' + return 1 + } + } +} + +##################################################################### + +export _CA__CLONE_LOADED=1 diff --git a/zsh/custom-env-template.zsh b/zsh/custom-env-template.zsh new file mode 100644 index 0000000..8059e9d --- /dev/null +++ b/zsh/custom-env-template.zsh @@ -0,0 +1,3 @@ +##################################################################### + +##################################################################### diff --git a/zsh/helpers.zsh b/zsh/helpers.zsh new file mode 100644 index 0000000..9a086b3 --- /dev/null +++ b/zsh/helpers.zsh @@ -0,0 +1,144 @@ +##################################################################### + +[ ! $_CA__SETTINGS_LOADED ] && source "${0:a:h}/settings.zsh" + +##################################################################### + +_CA__RESTORE_ENVIRONMENT() { + deactivate >/dev/null 2>&1 + deactivate_node >dev/null 2>&1 + + [ $_CA__RESTORE_PATH ] && export PATH="$_CA__RESTORE_PATH" + [ $_CA__RESTORE_ENV ] && for var in $_CA__RESTORE_ENV; do unset $var; done + + unset _CA__RESTORE_PATH _CA__RESTORE_ENV +} + +_CA__GET_FULL_PATH() { + local PROJECT="$1" + + local PROJECT_ROOT_SHORT=$(dirname $PROJECT) + local PROJECT_NAME=$(basename $PROJECT) + + local FULL_BASE_DIR=$(echo $CODE_ACTIVATOR__DIRS | grep "^.*/$PROJECT_ROOT_SHORT$") + + echo "$FULL_BASE_DIR/$PROJECT_NAME" +} + +_CA__TMUX_WINDOW_RENAME() { + local PROJECT="$1" + + [[ $TERM =~ ^tmux- ]] \ + && tmux rename-window "$(dirname $PROJECT):$(basename $PROJECT)" +} + +_CA__SELECT_BASE_DIR() { + local BASE_NAMES=() + + for dir in $CODE_ACTIVATOR__DIRS + do + BASE_NAMES=($BASE_NAMES $(basename $dir)) + done + + echo $CODE_ACTIVATOR__DIRS \ + | grep $(echo $BASE_NAMES | $FZF --prompt 'select base directory : ') +} + +_CA__GET_REMOTE_TARGET() { + local REMOTE_TARGET=$(\ + echo $CODE_ACTIVATOR__KNOWN_TARGETS \ + | sed 's/\s\+/\n/g' \ + | $FZF --print-query --prompt 'set a remote target : ' \ + | tail -1 \ + ) + + local FIRST_SELECTION="$REMOTE_TARGET" + + echo $CODE_ACTIVATOR__KNOWN_TARGETS | grep -q "$REMOTE_TARGET" && { + REMOTE_TARGET="$REMOTE_TARGET$(echo | $FZF --print-query --prompt "$REMOTE_TARGET" | tail -1)" + } + + [[ $REMOTE_TARGET == $FIRST_SELECTION ]] && return '' + + echo $REMOTE_TARGET | grep -q '\.git$' || REMOTE_TARGET="$REMOTE_TARGET.git" + echo $REMOTE_TARGET +} + +_CA__GET_PROJECT_NAME() { + local REMOTE_TARGET="$1" + local DEFAULT_NAME=$(basename $REMOTE_TARGET | sed 's/\.git$//') + + echo $DEFAULT_NAME | $FZF --print-query --prompt 'set local project name : ' | tail -1 +} + +_CA__INTERACTIVE_ENV_SETUP() { + local PROJECT_PATH="$1" + local NO_ENV="$PROJECT_PATH/$_CA__NO_ENV_SENTINEL" + + printf 'set up a virtual environment now? [(Y)es / (n)o / n(e)ver] ' + read -k yn + + case $yn in + e ) touch $NO_ENV; return 1 ;; + n ) return 1 ;; + esac + + local ENV_VERSION=$(_CA__SELECT_VIRTUAL_ENV) + _CA__INIT_VIRTUAL_ENV $PROJECT_PATH $ENV_VERSION +} + +_CA__SELECT_VIRTUAL_ENV() { + local VERISON=$(\ + echo "$(_CA__GET_PYTHON_IN_PATH)\n$(which node 2>/dev/null)" \ + | $FZF --prompt 'select a virtual environment : ' \ + ) + + [[ $VERSION =~ node$ ]] && VERSION=$(\ + nodeenv --list \ + | sed 's/\s\+/\n/g' \ + | $FZF --prompt 'select a node version : '\ + ) + + echo $VERSION +} + +_CA__GET_PYTHON_IN_PATH() { + whence -pm '*' | grep python | grep -v -- '-config$' +} + +_CA__INIT_VIRTUAL_ENV() { + local PROJECT_PATH="$1" + local ENV_VERSION="$2" + local ENV_PATH="$PROJECT_PATH/$_CA__VIRTUAL_ENV_NAME" + + [[ $ENV_VERSION =~ ^[0-9] ]]\ + && _CA__INIT_NODE_ENV $PROJECT_PATH $ENV_VERSION \ + || _CA__INIT_VIRTUALENV $PROJECT_PATH $ENV_VERSION \ + ; +} + +_CA__INIT_NODE_ENV() { + local ENV_PATH="$1" + local ENV_VERSION="$2" + + nodeenv --node=$ENV_VERSION $ENV_PATH +} + +_CA__INIT_VIRTUALENV() { + local ENV_PATH="$1" + local ENV_VERSION="$2" + + virtualenv --python=$ENV_VERSION $ENV_PATH +} + +_CA__INIT_CUSTOM_ENV() { + local PROJECT_PATH="$1" + local CUSTOM_ENV="$PROJECT_PATH/$_CA__CUSTOM_ENV_NAME" + local CUSTOM_ENV_TEMPLATE="$_CA__CUSTOM_ENV_TEMPALTE" + + cp $CUSTOM_ENV_TEMPLATE $CUSTOM_ENV +} + +##################################################################### + +export _CA__HELPERS_LOADED=1 diff --git a/zsh/settings.zsh b/zsh/settings.zsh new file mode 100644 index 0000000..c17b886 --- /dev/null +++ b/zsh/settings.zsh @@ -0,0 +1,27 @@ +##################################################################### + +[ ! $CODE_ACTIVATOR__DIRS ] && export CODE_ACTIVATOR__DIRS=("$HOME/Code") + +export CODE_ACTIVATOR__KNOWN_TARGETS=( + $CODE_ACTIVATOR__KNOWN_TARGETS + 'https://github.com/' + 'https://bitbucket.org/' + 'git@github.com:' + 'git@bitbucket.org:' + ) + +##################################################################### + +[ ! $_CA__SOURCE_DIR_NAME ] && export _CA__SOURCE_DIR_NAME='code' +[ ! $_CA__VIRTUAL_ENV_NAME ] && export _CA__VIRTUAL_ENV_NAME='env' +[ ! $_CA__CUSTOM_ENV_NAME ] && export _CA__CUSTOM_ENV_NAME='custom-env' +[ ! $_CA__NO_ENV_SENTINEL ] && export _CA__NO_ENV_SENTINEL='.no-env' +[ ! $_CA__GIT_MAIN_BRANCH ] && export _CA__GIT_MAIN_BRANCH='master' + +[ ! $_CA__CUSTOM_ENV_TEMPLATE ] && export _CA__CUSTOM_ENV_TEMPLATE="${0:a:h}/custome-env-template.zsh" + +FZF=(fzf -i --height=20% --layout=reverse) + +##################################################################### + +export _CA__SETTINGS_LOADED=1