Files
scwrypts/zsh/scwrypts/environment/synchronize
T

180 lines
4.1 KiB
Bash
Raw Normal View History

2023-02-21 18:44:27 -07:00
#!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
use scwrypts/environment-files
CHECK_ENVIRONMENT
2022-04-28 16:09:23 -06:00
#####################################################################
2023-02-21 18:44:27 -07:00
SYNCHRONIZE() {
2022-06-22 12:17:19 -06:00
while [[ $# -gt 0 ]]
do
case $1 in
--no-prompt ) SLIENT=1; shift 1 ;;
2023-02-21 18:44:27 -07:00
* ) WARNING "argument '$1' not recognized"
2022-06-22 12:17:19 -06:00
shift 1 ;;
esac
done
2023-02-21 18:44:27 -07:00
local TEMPLATE_FILE
2022-06-22 12:17:19 -06:00
[ ! $SLIENT ] && {
2023-02-21 18:44:27 -07:00
yN 'change the template(s) before sync?' && {
EDIT $(
for TEMPLATE_FILE in $(SCWRYPTS__GET_ENV_TEMPLATE_FILES)
do
[ -f "$TEMPLATE_FILE" ] && echo "$TEMPLATE_FILE"
[ -f "$TEMPLATE_FILE.descriptions" ] && echo "$TEMPLATE_FILE.descriptions"
done
)
}
for TEMPLATE_FILE in $(SCWRYPTS__GET_ENV_TEMPLATE_FILES)
do
{
echo '#!/bin/zsh'
cat "$TEMPLATE_FILE" \
| sed '
/__[a-z_]\+=$/d;
/^#/d; /^$/d;
s/^[A-Z]/export &/; s/^[^#=]\\+$/&=/;
' \
| LC_COLLATE=C sort -u
} > "$TEMPLATE_FILE.temp"
mv "$TEMPLATE_FILE.temp" "$TEMPLATE_FILE"
done
2022-06-22 12:17:19 -06:00
}
2023-02-21 18:44:27 -07:00
local ENVIRONMENTS ENVIRONMENT_FILES
local FILE NAME ENVIRONMENT_FILE
2022-06-22 12:17:19 -06:00
2023-06-27 05:00:06 -06:00
GROUP_PIDS=()
for GROUP in ${SCWRYPTS_GROUPS}
do
{
ENVIRONMENTS=($(SCWRYPTS__GET_ENV_NAMES | sort -r))
ENVIRONMENT_FILES=($(
for NAME in ${ENVIRONMENTS[@]}
do
SCWRYPTS__GET_ENV_FILE $NAME $GROUP
done
))
STATUS 'generating working environment files...'
for FILE in ${ENVIRONMENT_FILES[@]}
2023-02-21 18:44:27 -07:00
do
2023-06-27 05:00:06 -06:00
GENERATE_TEMP_ENVIRONMENT_FILE "$FILE"
2023-02-21 18:44:27 -07:00
done
2022-06-22 12:17:19 -06:00
2023-06-27 05:00:06 -06:00
STATUS 'cascading environment values to children...'
for NAME in ${ENVIRONMENTS[@]}
do
CASCADE_ENVIRONMENT $NAME
done
2022-06-22 12:17:19 -06:00
2023-06-27 05:00:06 -06:00
STATUS 'cleaning up working space...'
for FILE in ${ENVIRONMENT_FILES[@]}
do
CLEANUP_ENVIRONMENT_FILE "$FILE"
done
SUCCESS 'finished sync!'
} &
GROUP_PIDS+=$!
2022-06-22 12:17:19 -06:00
done
2023-06-27 05:00:06 -06:00
for P in ${GROUP_PIDS[@]}; do wait $P; done
2022-06-22 12:17:19 -06:00
}
2023-02-21 18:44:27 -07:00
#####################################################################
CASCADE_ENVIRONMENT() {
2022-06-22 12:17:19 -06:00
local PARENT_NAME="$1"
2023-06-27 05:00:06 -06:00
local PARENT_FILE="$(SCWRYPTS__GET_ENV_FILE $PARENT_NAME $GROUP).temp"
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
local CHILD_NAMES=($(echo $ENVIRONMENTS | sed 's/ \+/\n/g' |grep "^$PARENT_NAME\\."))
[[ ${#CHILD_NAMES[@]} -eq 0 ]] && return 0
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
local PARENT_VARIABLES="$(READ_PARENT_VARIABLES "$PARENT_NAME" "$PARENT_FILE")"
[ ! $PARENT_VARIABLES ] && return 0
local CHILD_NAME CHILD_FILE CONTENT
for CHILD_NAME in ${CHILD_NAMES[@]}
2022-06-22 12:17:19 -06:00
do
2023-02-21 18:44:27 -07:00
STATUS "propagating environment '$PARENT_NAME' to child '$CHILD_NAME'"
2023-06-27 05:00:06 -06:00
CHILD_FILE="$(SCWRYPTS__GET_ENV_FILE $CHILD_NAME $GROUP).temp"
2023-02-21 18:44:27 -07:00
CONTENT=$(cat "$CHILD_FILE")
echo "$PARENT_VARIABLES" | ADD_LINES
echo "$CONTENT" > "$CHILD_FILE"
2022-06-22 12:17:19 -06:00
done
2023-02-21 18:44:27 -07:00
SUCCESS "finished '$PARENT_NAME' propagation"
}
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
#####################################################################
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
GENERATE_TEMP_ENVIRONMENT_FILE() {
local FILE="$1"
local CONTENT=$(GENERATE_TEMPLATE)
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
READ_POPULATED_VARIABLES "$FILE" | ADD_LINES
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
echo "$CONTENT" > "$FILE.temp"
2022-06-22 12:17:19 -06:00
}
2023-02-21 18:44:27 -07:00
ADD_LINES() {
local LINE VARIABLE SHORT VALUE
while read LINE
2022-08-15 18:30:37 -06:00
do
2023-02-21 18:44:27 -07:00
VARIABLE=$(echo $LINE | sed 's/=.*$//')
echo $CONTENT | grep -qi "^$VARIABLE" || {
2023-06-22 15:48:57 -06:00
echo $LINE | grep -q '__[a-z_]\+=' || {
2023-02-21 18:44:27 -07:00
WARNING "skipping variable $(echo $LINE | sed 's/^export //; s/=.*//')
(must be included in a template before it can be added)"
continue
}
SHORT=$(echo "$VARIABLE" | sed 's/__[a-z].*//')
CONTENT=$(echo "$CONTENT" | sed "/^$SHORT/a $LINE")
}
CONTENT=$(echo "$CONTENT" | sed "s%^$VARIABLE.*$%$LINE%")
2022-08-22 16:04:03 -06:00
done
2022-08-15 18:30:37 -06:00
}
2023-02-21 18:44:27 -07:00
READ_POPULATED_VARIABLES() {
local FILE="$1"
cat "$FILE" \
| grep -v '^#' \
| grep -v '=$' \
| grep -v '^$' \
| grep -v ' # from ' \
| awk '/^[^=]+$/{printf "%s_____",$0;next}7' \
| sed 's/\(_____\)\(export\)/\1\n\2/; s/\(_____\)$/\1\n/' \
| sed 's/^.*_____.*$/_____&/' \
2023-06-22 15:48:57 -06:00
| sed 's/^_____export/export/' \
2023-02-21 18:44:27 -07:00
| sed -z 's/[\n
] *_____/_____/g' \
| grep -v '^$' \
;
}
READ_PARENT_VARIABLES() {
local PARENT_NAME="$1"
local PARENT_FILE="$2"
READ_POPULATED_VARIABLES "$PARENT_FILE" \
| sed 's/_____/ /g; s/\s\+/ /g' \
| sed 's/( /(/; s/ )/)/' \
| sed "s/$/ # from $PARENT_NAME/" \
| grep -v '__[a-z_]\+=' \
;
}
CLEANUP_ENVIRONMENT_FILE() {
cat "$1.temp" \
| sed 's/_____$//g; s/_____/\n/g' \
> "$1"
rm "$1.temp"
}
2022-06-22 12:17:19 -06:00
2023-02-21 18:44:27 -07:00
#####################################################################