Big update to pass the first batch of tests
This commit is contained in:
parent
832ecb6d1f
commit
cc0d8d4c92
108
forgebuild.sh
108
forgebuild.sh
|
@ -1,27 +1,35 @@
|
||||||
#/bin/bash
|
#! /bin/bash
|
||||||
# This script was indeed self-updated!
|
|
||||||
|
|
||||||
# Catch signals so we don't leave zombie tasks behind if we Ctrl^C
|
# Catch signals so we don't leave zombie tasks behind if we Ctrl^C
|
||||||
# No idea why but it seems to prevent the script from working? Disable!
|
# No idea why but it seems to prevent the script from working? Disable!
|
||||||
#trap "exit" INT TERM ERR
|
#trap "exit" INT TERM ERR
|
||||||
#trap "kill 0" EXIT
|
#trap "kill 0" EXIT
|
||||||
|
|
||||||
BASEDIR="$HOME/.git-build"
|
|
||||||
[ ! -d $BASEDIR ] && mkdir $BASEDIR
|
|
||||||
|
|
||||||
# So scripts can know we're still running (for autoupdater)
|
|
||||||
echo "$BASHPID" > $BASEDIR/.LOCK
|
|
||||||
|
|
||||||
|
|
||||||
# Default logging levels (error is always enabled)
|
# Default logging levels (error is always enabled)
|
||||||
INFO=1
|
INFO=1
|
||||||
DEBUG=0
|
DEBUG=0
|
||||||
|
|
||||||
|
# TODO: Remove this quickhack which prevents from using real value in tasks
|
||||||
|
# (but enables unit testing of host-based config)
|
||||||
|
if [ ! -z $HOST ]; then
|
||||||
|
HOSTNAME="$HOST"
|
||||||
|
fi
|
||||||
|
|
||||||
# Extract two letters from $LANG
|
# Extract two letters from $LANG
|
||||||
locale="${LANG:0:2}"
|
locale="${LANG:0:2}"
|
||||||
|
|
||||||
|
# Ensure translations have been setup
|
||||||
|
if [ -d /usr/share/forgebuild/i18n ]; then
|
||||||
|
I18N_DIR=/usr/share/forgebuild/i18n
|
||||||
|
elif [ -d $HOME/.local/share/forgebuild/i18n ]; then
|
||||||
|
I18N_DIR=$HOME/.local/share/forgebuild/i18n
|
||||||
|
else
|
||||||
|
echo "ERROR: could not find translations. Maybe you need to run the setup.sh script?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Initialize translations
|
# Initialize translations
|
||||||
[ -f i18n/$locale.json ] && locale_strings="$(cat i18n/$locale.json)" || locale_strings="$(cat i18n/en.json)"
|
[ -f $I18N_DIR/$locale.json ] && locale_strings="$(cat $I18N_DIR/$locale.json)" || locale_strings="$(cat $I18N_DIR/en.json)"
|
||||||
|
|
||||||
# Takes one argument, looks up translation
|
# Takes one argument, looks up translation
|
||||||
trans() {
|
trans() {
|
||||||
|
@ -52,6 +60,14 @@ debug () {
|
||||||
[[ $DEBUG = 1 ]] && echo -e "\e[36m$(trans debug)\e[0m$(trans $1)" | envsubst
|
[[ $DEBUG = 1 ]] && echo -e "\e[36m$(trans debug)\e[0m$(trans $1)" | envsubst
|
||||||
}
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo "forgebuild [tasks]"
|
||||||
|
echo " Trigger updates on `tasks` (all tasks by default)"
|
||||||
|
echo "ARGS:"
|
||||||
|
echo " -f: force run of tasks regardless of updates on the repository"
|
||||||
|
echo " -b BASEDIR: consider tasks from BASEDIR, not ~/.forgebuild"
|
||||||
|
}
|
||||||
|
|
||||||
# Logging is done with the LOG="debug|info|error" environment variable
|
# Logging is done with the LOG="debug|info|error" environment variable
|
||||||
if [ ! -z $LOG ] && [ "$LOG" != "" ]; then
|
if [ ! -z $LOG ] && [ "$LOG" != "" ]; then
|
||||||
case $LOG in
|
case $LOG in
|
||||||
|
@ -74,31 +90,30 @@ run() {
|
||||||
p_name="$1"
|
p_name="$1"
|
||||||
i18n_task="$p_name" info run
|
i18n_task="$p_name" info run
|
||||||
# Run in background and redirect output to $p_name.log
|
# Run in background and redirect output to $p_name.log
|
||||||
(GITBUILDCONF="$CONFDIR" GITBUILDDIR="$BASEDIR" nohup $BASEDIR/$p_name $p_name > $BASEDIR/$p_name.log 2>&1) &
|
#(GITBUILDCONF="$CONFDIR" GITBUILDDIR="$BASEDIR" nohup $BASEDIR/$p_name $p_name > $BASEDIR/$p_name.log 2>&1) &
|
||||||
|
GITBUILDCONF="$CONFDIR" GITBUILDDIR="$BASEDIR" $BASEDIR/$p_name $p_name > $BASEDIR/$p_name.log 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Overriden by -f/--force to force rebuild when no update is available
|
# Overriden by -f/--force to force rebuild when no update is available
|
||||||
FORCE=0
|
FORCE=0
|
||||||
|
|
||||||
# Check if we have host-specific config then LOCAL=0
|
|
||||||
# TODO: maybe we should just match for $BASEDIR/$HOSTNAME directly? Would allow to fallback to global config for multihost setup where one host is not configured.. but is that desired? Also enables to have more folders in $BASEDIR (maybe logs/)
|
|
||||||
LOCAL=1
|
|
||||||
for folder in $BASEDIR/*/; do
|
|
||||||
# Hidden folders (repos) are ignored by the pattern, so we can assume if a folder is not config/ then there are host-based configs here.
|
|
||||||
[[ "$(basename $folder)" != "config" ]] && LOCAL=0 && break
|
|
||||||
done
|
|
||||||
|
|
||||||
# Pass either local or global config to the task
|
|
||||||
[[ LOCAL = 1 ]] && CONFDIR=$BASEDIR/config || CONFDIR="$BASEDIR/$HOSTNAME"
|
|
||||||
export i18n_config="$CONFDIR"
|
|
||||||
info config
|
|
||||||
|
|
||||||
# Find targeted projects from args and extra arguments
|
# Find targeted projects from args and extra arguments
|
||||||
PROJECTS=()
|
PROJECTS=()
|
||||||
|
BASEDIR="$HOME/.forgebuild"
|
||||||
|
FOUND_BASEDIR=0
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
if [[ "$arg" = "-f" ]] || [[ "$arg" = "--force" ]]; then
|
if [ $FOUND_BASEDIR -eq 1 ]; then
|
||||||
|
BASEDIR="$(readlink -m $arg)"
|
||||||
|
if [ ! -d $BASEDIR ]; then
|
||||||
|
echo "ERROR: Could not find task directory: $BASEDIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
FOUND_BASEDIR=0
|
||||||
|
elif [[ "$arg" = "-f" ]] || [[ "$arg" = "--force" ]]; then
|
||||||
info force_flag
|
info force_flag
|
||||||
FORCE=1
|
FORCE=1
|
||||||
|
elif [[ "$arg" = "-b" ]] || [[ "$arg" = "--basedir" ]]; then
|
||||||
|
FOUND_BASEDIR=1
|
||||||
# Maybe it's a task name and we find a corresponding source?
|
# Maybe it's a task name and we find a corresponding source?
|
||||||
# TODO: Support source-less tasks https://tildegit.org/southerntofu/git-build.sh/issues/8
|
# TODO: Support source-less tasks https://tildegit.org/southerntofu/git-build.sh/issues/8
|
||||||
elif [ -f $BASEDIR/$arg.source ]; then
|
elif [ -f $BASEDIR/$arg.source ]; then
|
||||||
|
@ -124,6 +139,15 @@ for arg in "$@"; do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Still the default BASEDIR, if it doesn't exist we create it as a convenience
|
||||||
|
if [ ! -d $BASEDIR ]; then
|
||||||
|
echo "ERROR: No such basedir: $BASEDIR. Creating it and aborting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# So scripts can know we're still running (for autoupdater)
|
||||||
|
echo "$BASHPID" > $BASEDIR/.LOCK
|
||||||
|
|
||||||
# If no project argument passed, default to all projects
|
# If no project argument passed, default to all projects
|
||||||
if [[ ${#PROJECTS[*]} = 0 ]]; then
|
if [[ ${#PROJECTS[*]} = 0 ]]; then
|
||||||
info no_task
|
info no_task
|
||||||
|
@ -138,28 +162,34 @@ if [[ ${#PROJECTS[*]} = 0 ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Check if we have host-specific config or default to the config/ folder
|
||||||
|
[ -d $BASEDIR/$HOSTNAME ] && CONFDIR="$BASEDIR/$HOSTNAME" || CONFDIR=$BASEDIR/config
|
||||||
|
export i18n_config="$CONFDIR"
|
||||||
|
info config
|
||||||
|
|
||||||
# TODO: sourceless tasks
|
# TODO: sourceless tasks
|
||||||
for p_name in ${PROJECTS[*]}; do
|
for p_name in ${PROJECTS[*]}; do
|
||||||
# For translations
|
# For translations
|
||||||
export i18n_task="$p_name"
|
export i18n_task="$p_name"
|
||||||
debug start_proc
|
debug start_proc
|
||||||
# Check if task should run on host
|
# Check if task should run on host
|
||||||
if [[ $LOCAL = 0 ]]; then
|
if [ -f $BASEDIR/$p_name.host ]; then
|
||||||
if [ -f $BASEDIR/$p_name.host ]; then
|
for_host="$(cat $BASEDIR/$p_name.host)"
|
||||||
for_host="$(cat $BASEDIR/$p_name.host)"
|
if [[ "$for_host" != "$HOSTNAME" ]]; then
|
||||||
if [[ "$for_host" != "$HOSTNAME" ]]; then
|
# The task is specifically configured for a different host, ignore
|
||||||
# The task is specifically configured for a different host, ignore
|
export i18n_host="$for_host"
|
||||||
export i18n_host="$for_host"
|
debug skipped
|
||||||
debug skipped
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# The task has a PROJECT.ignore file in host config, ignore
|
|
||||||
if [ -f $BASEDIR/$HOSTNAME/$p_name.ignore ]; then
|
|
||||||
info host_ignored
|
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
# The task has a PROJECT.ignore file in host config, ignore
|
||||||
|
if [ -f $BASEDIR/$HOSTNAME/$p_name.ignore ]; then
|
||||||
|
info host_ignored
|
||||||
|
continue
|
||||||
|
fi
|
||||||
info process
|
info process
|
||||||
# TODO: Should be able to switch branch after a repo was cloned
|
# TODO: Should be able to switch branch after a repo was cloned
|
||||||
if [ -f $BASEDIR/$p_name.branch ]; then
|
if [ -f $BASEDIR/$p_name.branch ]; then
|
||||||
|
|
Loading…
Reference in New Issue