===================================================================== --- New Scripts -------------------------- - i3 window manager scrypts (see --help for more info) - zsh/i3/create-local-font-override - zsh/i3/launch-or-show --- New Features ------------------------- Now support `__select` syntax in environment files! (see zsh/scwrypts/README.md for more detail) --- Changes ------------------------------ - moved some rogue configuration files under the scwrypts config - ~/.vim/bundle/build.zsh >> ~/.config/scwrypts/vundle.zsh - ~/.config/scwrypts/config.dotfile.zsh >> ~/.config/scwrypts/dotfiles.zsh - __FZF, __FZF_TAIL, and __FZF_HEAD now create prompt+response logs --- Bug Fixes ---------------------------- - zsh/config/symlinks - don't fail when trying to symlink a directory - no longer fails when trying to replace a broken symlink - scwrypts now detects environments which are symlinked - USAGE syntax now correctly shows the position of the '--' argument delimiter support __select in env files; ignore __lower_case suffix in env files; put blank line before comments in env files added i3 scripts
155 lines
3.7 KiB
Bash
Executable File
155 lines
3.7 KiB
Bash
Executable File
#!/bin/zsh
|
|
_DEPENDENCIES+=()
|
|
_REQUIRED_ENV+=()
|
|
source ${0:a:h}/common.zsh
|
|
#####################################################################
|
|
|
|
_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"
|
|
sed -i '/__[a-z_]\+=$/d' "$__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
|
|
_ADD_DESCRIPTIONS
|
|
|
|
__SUCCESS 'finished sync!'
|
|
}
|
|
|
|
#####################################################################
|
|
|
|
_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
|
|
}
|
|
|
|
_INSERT_NEW_VARIABLES() {
|
|
__STATUS 'inserting new environment variables...'
|
|
|
|
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")
|
|
}
|
|
|
|
_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/=.*/=/')
|
|
echo $ENV_VAR | grep -q '__[a-z_]\+=' && continue
|
|
|
|
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"
|
|
}
|
|
|
|
_ADD_DESCRIPTIONS() {
|
|
__STATUS 'updating descriptions'
|
|
while read DESCRIPTION_LINE
|
|
do
|
|
ENV_VAR=$(echo $DESCRIPTION_LINE | sed 's/ \+| .*$//')
|
|
DESCRIPTION=$(echo $DESCRIPTION_LINE | sed 's/^.* | //')
|
|
for ENV_NAME in $(echo $ENVIRONMENTS)
|
|
do
|
|
sed -i "/^export $ENV_VAR=/i # $DESCRIPTION" "$(__GET_ENV_FILE $ENV_NAME)"
|
|
done
|
|
done < <(sed -n '/^[^ ]\+ \+| /p' "$__ENV_TEMPLATE.descriptions")
|
|
|
|
for ENV_NAME in $(echo $ENVIRONMENTS)
|
|
do
|
|
sed -i "/^# /i \ " "$(__GET_ENV_FILE $ENV_NAME)"
|
|
sed -i "s/^ $//" "$(__GET_ENV_FILE $ENV_NAME)"
|
|
done
|
|
}
|
|
|
|
#####################################################################
|
|
_SYNCHRONIZE $@
|