v2.0.0
===================================================================== Subscwrypts + Environment Inheritance --- Release Notes ------------------------ - added support for environment inheritance - added support for arbitrarily nested scripts (subscwrypts) - added support for CI mode - improved modularity of zsh/utils module - refactored to move some data from ~/.config/scwrypts to ~/.local/share/scwrypts - refactored various scripts to use new subscwrypt api --- New Scripts -------------------------- zsh ) - db/interactive/postgres - aws/rds/interactive-login
This commit is contained in:
@@ -15,12 +15,21 @@ This will immediately open your custom configuration file and reload any necessa
|
||||
If you use Scwrypts, **you should use these commands all the time**.
|
||||
This is your gateway to managing scwrypts sandboxed environments.
|
||||
|
||||
Command | Description
|
||||
------------- | ---------------------------------------------------------------------------------------
|
||||
`edit` | edit an existing environment; synchronizes environments if new variables are added
|
||||
`copy` | copy an existing environment to a new one
|
||||
`delete` | permanently delete an environment by name
|
||||
`synchronize` | uses [template](../../.template.env) to add missing and remove extemporaneous variables
|
||||
Command | Description
|
||||
----------------- | ---------------------------------------------------------------------------------------
|
||||
`edit` | edit an existing environment
|
||||
`copy` | create and edit a new environment from an existing one
|
||||
`delete` | permanently delete an environment by name
|
||||
`stage-variables` | stage missing variables; [helpful for non-ZSH scwrypts](../../py/scwrypts/getenv.py)
|
||||
`synchronize` | uses [template](../../.env.template) to add missing and remove extemporaneous variables
|
||||
|
||||
### Environment Inheritance
|
||||
You can make a child environment by naming an environment `<parent-name>.<child-name>`.
|
||||
Children inherit all parent-set values, and **parent-set values overwrite child-set values**.
|
||||
Remember that synchronize runs *every time you edit an environment*, so changes propagate to children immediately.
|
||||
Inherited values are denoted by `# inherited from <parent-name>` in the environment file.
|
||||
|
||||
Nested children will inherit values from all parents.
|
||||
|
||||
## Logs
|
||||
Quickly view or clear Scwrypts logs.
|
||||
|
26
zsh/scwrypts/configure
vendored
26
zsh/scwrypts/configure
vendored
@@ -6,12 +6,20 @@ source ${0:a:h}/common.zsh
|
||||
|
||||
[ ! -f $SCWRYPTS_CONFIG_PATH/config ] && {
|
||||
__STATUS 'first-time setup detected; creating local configuration override...'
|
||||
cp $SCWRYPTS_ROOT/.config $SCWRYPTS_CONFIG_PATH/config \
|
||||
touch $SCWRYPTS_CONFIG_PATH/config \
|
||||
&& __SUCCESS 'created!' \
|
||||
|| __FAIL 1 "unable to create config at '$SCWRYPTS_CONFIG_PATH/config'"
|
||||
{
|
||||
echo '#'
|
||||
echo '# configuration for scwrypts'
|
||||
echo '#'
|
||||
sed -n '1d; /^###/q; p' $SCWRYPTS_ROOT/.config | sed '$d'
|
||||
} > $SCWRYPTS_CONFIG_PATH/config
|
||||
|
||||
__EDIT $SCWRYPTS_CONFIG_PATH/config
|
||||
|
||||
__STATUS 'attempting to build virtual environments'
|
||||
$SCWRYPTS_ROOT/zsh/scwrypts/virutalenv/update-all \
|
||||
__RUN_SCWRYPT zsh/scwrypts/virtualenv/update-all \
|
||||
&& __SUCCESS 'finished updating virtualenvs' \
|
||||
|| __WARNING 'unable to create one or more virtualenv (see above)' \
|
||||
;
|
||||
@@ -20,16 +28,12 @@ source ${0:a:h}/common.zsh
|
||||
__REMINDER 'use "zsh/scwrypts/virtualenv/update-all" to update environments'
|
||||
__REMINDER '(equivalent to "npm install" or "pip install -r requirements.txt")'
|
||||
__REMINDER
|
||||
} || {
|
||||
__STATUS 'opening local config for editing'
|
||||
__EDIT $SCWRYPTS_CONFIG_PATH/config
|
||||
__STATUS 'finished editing!'
|
||||
}
|
||||
|
||||
__STATUS 'opening local config for editing'
|
||||
__EDIT $SCWRYPTS_CONFIG_PATH/config
|
||||
__STATUS 'finished editing!'
|
||||
|
||||
which __SCWRYPTS >/dev/null 2>&1 && {
|
||||
__STATUS 'reloading configuration for current session'
|
||||
source $SCWRYPTS_ROOT/zsh/common.zsh \
|
||||
|| __FAIL 2 'unable to reload configuration :c'
|
||||
}
|
||||
|
||||
__SUCCESS 'saved new configuration'
|
||||
__REMINDER 'changes which affect the hot-key plugin will require a ZSHRC reload'
|
||||
|
@@ -2,3 +2,10 @@ _DEPENDENCIES+=()
|
||||
_REQUIRED_ENV+=()
|
||||
source ${0:a:h}/../common.zsh
|
||||
#####################################################################
|
||||
|
||||
_SORT_ENV() {
|
||||
local ENV_FILE="$1"
|
||||
|
||||
sed -i "s/^[A-Z]/export &/; s/^[^#=]\\+$/&=/" "$ENV_FILE"
|
||||
LC_COLLATE=C sort -uo "$ENV_FILE" "$ENV_FILE"
|
||||
}
|
||||
|
@@ -11,7 +11,7 @@ TEMPLATE_ENV_NAME=$(__SELECT_ENV)
|
||||
__STATUS "selected '$TEMPLATE_ENV_NAME'"
|
||||
|
||||
__PROMPT 'enter new environment name'
|
||||
ENV_NAME=$(__FZF_HEAD 'new environment')
|
||||
ENV_NAME=$(echo '' | __FZF_HEAD 'new environment')
|
||||
[ ! $ENV_NAME ] && __ABORT
|
||||
|
||||
TEMPLATE_ENV_FILE=$(__GET_ENV_FILE $TEMPLATE_ENV_NAME)
|
||||
@@ -19,7 +19,19 @@ ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
|
||||
[ -f "$ENV_FILE" ] && __FAIL 2 "'$ENV_NAME' already exists"
|
||||
|
||||
__STATUS "creating environment"
|
||||
__STATUS "creating environment '$ENV_NAME'"
|
||||
cp "$TEMPLATE_ENV_FILE" "$ENV_FILE" \
|
||||
&& __SUCCESS "created '$ENV_NAME'" \
|
||||
|| __FAIL 3 "unable to create '$ENV_NAME'"
|
||||
|
||||
__STATUS 'stripping inherited values'
|
||||
sed -i 's/ # inherited from.*$//' "$ENV_FILE" 2>/dev/null
|
||||
|
||||
__RUN_SCWRYPT zsh/scwrypts/environment/synchronize -- --no-prompt \
|
||||
|| __FAIL 4 'failed to run environment sync'
|
||||
|
||||
__RUN_SCWRYPT zsh/scwrypts/environment/edit -- $ENV_NAME \
|
||||
|| __FAIL 4 'failed to edit new environment'
|
||||
;
|
||||
|
||||
__SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'"
|
||||
|
@@ -4,9 +4,13 @@ _REQUIRED_ENV+=()
|
||||
source ${0:a:h}/common.zsh
|
||||
#####################################################################
|
||||
|
||||
[ $SCWRYPTS_ENV ] \
|
||||
&& ENV_NAME=$SCWRYPTS_ENV \
|
||||
|| ENV_NAME=$(__SELECT_OR_CREATE_ENV)
|
||||
[ $1 ] && ENV_NAME="$1"
|
||||
|
||||
[ ! $1 ] && {
|
||||
[ $SCWRYPTS_ENV ] \
|
||||
&& ENV_NAME=$SCWRYPTS_ENV \
|
||||
|| ENV_NAME=$(__SELECT_OR_CREATE_ENV)
|
||||
}
|
||||
[ ! $ENV_NAME ] && __ABORT
|
||||
|
||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
@@ -33,18 +37,8 @@ do
|
||||
}
|
||||
done < $ENV_FILE
|
||||
|
||||
[ $NEW_VAR ] && {
|
||||
LC_COLLATE=C sort -uo $__ENV_TEMPLATE $__ENV_TEMPLATE
|
||||
NOPROMPT=1 ${0:a:h}/synchronize
|
||||
git add $__ENV_TEMPLATE \
|
||||
&& __SUCCESS "auto-staged the $(basename $__ENV_TEMPLATE) changes" \
|
||||
|| {
|
||||
__WARNING "unable to stage $(basename $__ENV_TEMPLATE) changes"
|
||||
__REMINDER "don't forget to commit changes to $(basename $__ENV_TEMPLATE)"
|
||||
}
|
||||
true
|
||||
} || {
|
||||
__STATUS 'no new environment variables'
|
||||
}
|
||||
__RUN_SCWRYPT zsh/scwrypts/environment/synchronize -- --no-prompt \
|
||||
|| __FAIL 4 'failed to run environment sync' \
|
||||
;
|
||||
|
||||
__SUCCESS "environment '$ENV_NAME' successfully modified"
|
||||
|
@@ -4,4 +4,4 @@ _REQUIRED_ENV+=()
|
||||
source ${0:a:h}/common.zsh
|
||||
#####################################################################
|
||||
|
||||
__CHECK_ENV_VARS $@ || NOPROMPT=1 $SCWRYPTS_ROOT/zsh/scwrypts/environment/synchronize
|
||||
__CHECK_REQUIRED_ENV $@
|
||||
|
@@ -1,47 +1,130 @@
|
||||
#!/bin/zsh
|
||||
#!/bin/zsh
|
||||
_DEPENDENCIES+=()
|
||||
_REQUIRED_ENV+=()
|
||||
source ${0:a:h}/common.zsh
|
||||
#####################################################################
|
||||
|
||||
[ ! $NOPROMPT ] && {
|
||||
__yN 'change the template before sync?' && __EDIT $__ENV_TEMPLATE
|
||||
sed -i "s/^[A-Z]/export &/; s/^[^#=]\\+$/&=/; s/=.*$/=/" $__ENV_TEMPLATE
|
||||
LC_COLLATE=C sort -uo $__ENV_TEMPLATE $__ENV_TEMPLATE
|
||||
git add $__ENV_TEMPLATE >/dev/null 2>&1
|
||||
_SYNCHRONIZE() {
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
case $1 in
|
||||
--no-prompt ) SLIENT=1; shift 1 ;;
|
||||
|
||||
* ) __WARNING "argument '$1' not recognized"
|
||||
shift 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
[ ! $SLIENT ] && {
|
||||
__yN 'change the template before sync?' && __EDIT $__ENV_TEMPLATE
|
||||
_SORT_ENV "$__ENV_TEMPLATE"
|
||||
git add $__ENV_TEMPLATE >/dev/null 2>&1
|
||||
}
|
||||
|
||||
ENVIRONMENTS=$(__GET_ENV_NAMES | sort -r)
|
||||
|
||||
_CLEAR_INHERITED_VARIABLES
|
||||
_INSERT_NEW_VARIABLES
|
||||
_REMOVE_OLD_VARIABLES
|
||||
_SORT_AND_CASCADE
|
||||
|
||||
__SUCCESS 'finished sync!'
|
||||
}
|
||||
|
||||
ENVIRONMENTS=$(__GET_ENV_FILES)
|
||||
#####################################################################
|
||||
|
||||
__STATUS 'inserting new environment variables...'
|
||||
while read line
|
||||
do
|
||||
for ENV_FILE in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
grep -q "^$line" $ENV_FILE || {
|
||||
echo $line >> $ENV_FILE && __STATUS "added '$line' to '$ENV_FILE'"
|
||||
}
|
||||
done
|
||||
done < <(sed -n '/^./p' $__ENV_TEMPLATE)
|
||||
_CLEAR_INHERITED_VARIABLES() {
|
||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
sed -i 's/ # inherited from.*//' "$ENV_FILE"
|
||||
done
|
||||
}
|
||||
|
||||
__STATUS 'removing old environment variables...'
|
||||
for ENV_FILE in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
while read line
|
||||
do
|
||||
ENV_VAR=$(echo "$line" | sed 's/=.*/=/')
|
||||
grep -q "$ENV_VAR" $__ENV_TEMPLATE || {
|
||||
sed -i "\\%$ENV_VAR%d" $ENV_FILE
|
||||
__WARNING "removed unwanted '$ENV_VAR' from '$ENV_FILE'"
|
||||
}
|
||||
done < $ENV_FILE
|
||||
done
|
||||
_INSERT_NEW_VARIABLES() {
|
||||
__STATUS 'inserting new environment variables...'
|
||||
|
||||
for ENV_FILE in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
sed -i "s/^[A-Z]/export &/; s/^[^#=]\\+$/&=/" $ENV_FILE
|
||||
LC_COLLATE=C sort -uo $ENV_FILE $ENV_FILE
|
||||
done
|
||||
LC_COLLATE=C sort -uo $__ENV_TEMPLATE $__ENV_TEMPLATE
|
||||
local ENV_NAME ENV_FILE line
|
||||
while read line
|
||||
do
|
||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
grep -q "$line" $ENV_FILE || {
|
||||
echo $line >> $ENV_FILE && __STATUS "added '$line' to '$ENV_NAME'"
|
||||
}
|
||||
done
|
||||
done < <(sed -n '/^./p' "$__ENV_TEMPLATE")
|
||||
}
|
||||
|
||||
__SUCCESS 'finished sync!'
|
||||
_REMOVE_OLD_VARIABLES() {
|
||||
__STATUS 'removing old environment variables...'
|
||||
|
||||
local ENV_NAME ENV_FILE line
|
||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
while read line
|
||||
do
|
||||
ENV_VAR=$(echo "$line" | sed 's/=.*/=/')
|
||||
grep -q "$ENV_VAR" "$__ENV_TEMPLATE" || {
|
||||
sed -i "\\%$ENV_VAR%d" "$ENV_FILE"
|
||||
echo "$ENV_VAR" | grep -qv '^#' \
|
||||
&& __WARNING "removed unwanted '$ENV_VAR' from '$ENV_NAME'"
|
||||
}
|
||||
done < $ENV_FILE
|
||||
done
|
||||
}
|
||||
|
||||
_SORT_AND_CASCADE() {
|
||||
local ENV_NAM ENV_FILE
|
||||
|
||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
_CASCADE_ENVIRONMENT $ENV_NAME
|
||||
done
|
||||
|
||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||
do
|
||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||
_SORT_ENV "$ENV_FILE"
|
||||
done
|
||||
}
|
||||
|
||||
_CASCADE_ENVIRONMENT() {
|
||||
local PARENT_NAME="$1"
|
||||
local PARENT_FILE=$(__GET_ENV_FILE $PARENT_NAME)
|
||||
|
||||
local CHILD_NAMES=$(echo $ENVIRONMENTS | grep "^$PARENT_NAME\\.")
|
||||
[ ! $CHILD_NAMES ] && return 0
|
||||
|
||||
__STATUS "cascading '$PARENT_NAME' to children"
|
||||
for CHILD_NAME in $(echo $CHILD_NAMES)
|
||||
do
|
||||
__SUCCESS "detected child '$CHILD_NAME'"
|
||||
done
|
||||
|
||||
local PARENT_VAR VAR_PATTERN CHILD_NAME CHILD_FILE
|
||||
|
||||
while read PARENT_VAR
|
||||
do
|
||||
VAR_PATTERN=$(echo "$PARENT_VAR" | sed 's/=.*/=/; s/\//\/\//g')
|
||||
__STATUS "propagating '$(echo $VAR_PATTERN | sed 's/^export \([^=]*\)=/\1/')' to children"
|
||||
|
||||
PARENT_VAR+=" # inherited from $PARENT_NAME"
|
||||
|
||||
for CHILD_NAME in $(echo $CHILD_NAMES)
|
||||
do
|
||||
CHILD_FILE=$(__GET_ENV_FILE $CHILD_NAME)
|
||||
|
||||
sed -i "/^$VAR_PATTERN/d" "$CHILD_FILE"
|
||||
echo $PARENT_VAR >> "$CHILD_FILE"
|
||||
done
|
||||
done < <(sed -n '/^[^#][^=]*=[^#]\+$/p' "$PARENT_FILE")
|
||||
|
||||
__SUCCESS "finished '$PARENT_NAME' propagation"
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
_SYNCHRONIZE $@
|
||||
|
@@ -6,7 +6,7 @@ source ${0:a:h}/common.zsh
|
||||
|
||||
cd $SCWRYPTS_ROOT
|
||||
__PROMPT 'select a script log'
|
||||
LOG_FILE=$(ls $SCWRYPTS_LOG_PATH | __FZF 'logfile')
|
||||
LOG_FILE=$(ls -t $SCWRYPTS_LOG_PATH | __FZF 'logfile')
|
||||
[ ! $LOG_FILE ] && { __ERROR 'user abort'; exit 1; }
|
||||
|
||||
__STATUS 'opening logfile'
|
||||
|
@@ -42,11 +42,11 @@ __UPDATE_VIRTUALENV() {
|
||||
return 1
|
||||
}
|
||||
|
||||
cd $VIRTUALENV_PATH/../
|
||||
cd $SCWRYPTS_ROOT
|
||||
local UPDATE_CODE=0
|
||||
case $TYPE in
|
||||
python ) pip install -r requirements.txt; UPDATE_CODE=$? ;;
|
||||
node ) npm install ;
|
||||
python ) cd py; pip install -r requirements.txt; UPDATE_CODE=$? ;;
|
||||
node ) cd zx; npm install ;;
|
||||
esac
|
||||
UPDATE_CODE=$?
|
||||
[[ $UPDATE_CODE -eq 0 ]] \
|
||||
@@ -78,8 +78,8 @@ __DELETE_VIRTUALENV() {
|
||||
__GET_VIRTUALENV_PATH() {
|
||||
local TYPE="$1"
|
||||
case $TYPE in
|
||||
python ) echo "$SCWRYPTS_ROOT/py/.env" ;;
|
||||
node ) echo "$SCWRYPTS_ROOT/zx/.env" ;;
|
||||
python ) echo "$SCWRYPTS_VIRTUALENV_PATH/py" ;;
|
||||
node ) echo "$SCWRYPTS_VIRTUALENV_PATH/zx" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user