#!/bin/sh
################################################################################
# Copyright 2022 Charadon #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); #
# you may not use this file except in compliance with the License. #
# You may obtain a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
################################################################################
set -eu
# Grab checksum of DSCIP for use with updating.
DSCIP_CKSUM="$(cksum "$0")"
cd "$(dirname "$0")"
. "$(pwd -P)/config.sh"
# Checking updates
if [ -f "$WORKING_DIRECTORY/update.sh" ];
then
if [ "$DSCIP_AUTO_UPDATE" = "true" ]; then
. "$WORKING_DIRECTORY/update.sh"
DSCIP_NEW_CKSUM="$(cksum "$0")"
# Rerun dscip if update was found.
if [ ! "$DSCIP_CKSUM" = "$DSCIP_NEW_CKSUM" ]; then
echo "[dscip] Update found. Rerunning DSCIP..."
"$SHELL" "$0" "$@"
exit 0
else
echo "[dscip] No updates found. Continuing..."
fi
else
echo "[dscip] Auto updates turned off. Continuing..."
fi
else
echo "[dscip] Update script doesn't exist. Continuing..."
fi
################################################################################
# Move script to background if DSCIP_DAEMON_FORK is set to true #
set +u
if [ "$DSCIP_DAEMON" = "true" ]; then
if [ "$DSCIP_DAEMON_FORK" = "true" ] && [ ! "$FORKED" = "true" ]; then
FORKED=true nohup "$0" "$@" > /dev/null 2>&1
exit 0
fi
fi
set -u
# Check if script is currently running, and if not, reset LOCK #
if [ -f "$WORKING_DIRECTORY/LOCK" ]; then
LOCKED_PID=$(cat "$WORKING_DIRECTORY/LOCK")
# shellcheck disable=SC2009
for i in $(pgrep -f "$0"); do
if [ "$i" = "$LOCKED_PID" ]; then
echo "[dscip] Script still running. Exiting..."
exit 0
fi
done
echo "[dscip] Script not running. Removing old lock."
rm -f "$WORKING_DIRECTORY/LOCK"
fi
echo "$$" > "$WORKING_DIRECTORY/LOCK"
build () {
# Remove old output
rm -f "$WORKING_DIRECTORY"/output.txt
# Print variables #
{
echo "################################################################################";
printf "%s\n" "$(date) | $DSCIP_NAME | $CURRENT_COMMIT"
echo "################################################################################";
echo "DSCIP_GITREPO=$DSCIP_GITREPO";
echo "DSCIP_GITMODE=$DSCIP_GITMODE";
echo "DSCIP_BRANCH=$DSCIP_BRANCH";
echo "WORKING_DIRECTORY=$WORKING_DIRECTORY";
echo "DSCIP_PRE_CMD=$DSCIP_PRE_CMD";
echo "DSCIP_BUILD_CMD=$DSCIP_BUILD_CMD";
echo "DSCIP_POST_CMD=$DSCIP_POST_CMD";
echo "DSCIP_FAILED_CMD=$DSCIP_FAILED_CMD";
echo "DSCIP_DAEMON=$DSCIP_DAEMON";
echo "DSCIP_DAEMON_FORK=$DSCIP_DAEMON_FORK";
echo "DSCIP_SLEEP=$DSCIP_SLEEP";
echo "DSCIP_DISREGARD_COMMIT_CHECK=$DSCIP_DISREGARD_COMMIT_CHECK";
echo "DSCIP_OUTPUT_TO=$DSCIP_OUTPUT_TO"
} >> "$DSCIP_OUTPUT_TO"
# Grab remote sources #
if [ "$DSCIP_GITMODE" = "clone" ]; then
rm -rf "$WORKING_DIRECTORY/wrkdir" # Clean Up #
git clone --depth 1 -b "$DSCIP_BRANCH" "$DSCIP_GITREPO" wrkdir >> "$DSCIP_OUTPUT_TO" 2>&1 # Clone git #
elif [ "$DSCIP_GITMODE" = "pull" ]; then
if [ ! -d "$WORKING_DIRECTORY/wrkdir" ]; then
git clone --depth 1 -b "$DSCIP_BRANCH" "$DSCIP_GITREPO" wrkdir >> "$DSCIP_OUTPUT_TO" 2>&1
fi
cd wrkdir
git pull >> "$DSCIP_OUTPUT_TO" 2>&1
else
echo "Invalid GITMODE, choose either 'clone' or 'pull'" 2>> "$DSCIP_OUTPUT_TO"
exit 1
fi
# Begin running the build scripts.
{
cd "$WORKING_DIRECTORY/wrkdir";
echo "[dscip] Running pre-build commands...";
"$DSCIP_PRE_CMD";
echo "[dscip] Running build commands...";
cd "$WORKING_DIRECTORY/wrkdir";
if "$DSCIP_BUILD_CMD"; then
echo "[dscip] Running post-build commands...";
cd "$WORKING_DIRECTORY/wrkdir";
"$DSCIP_POST_CMD";
else
echo "[dscip] Build failed. Running failure commands...";
"$DSCIP_FAILED_CMD";
fi
} >> "$DSCIP_OUTPUT_TO" 2>&1
echo "$CURRENT_COMMIT" > "$WORKING_DIRECTORY/LAST_COMMIT" # Save commit #
}
run () {
mkdir -p "$WORKING_DIRECTORY"
cd "$WORKING_DIRECTORY"
LAST_COMMIT=""
# Loads last commit hash if it exists. #
if [ -f "$WORKING_DIRECTORY/LAST_COMMIT" ]; then
LAST_COMMIT="$(cat "$WORKING_DIRECTORY/LAST_COMMIT")"
if [ -z "$LAST_COMMIT" ]; then # Check if LAST_COMMIT was grabbed successfully.
return 0
fi
fi
export LAST_COMMIT
# Loads current commit hash #
CURRENT_COMMIT=$(git ls-remote "$DSCIP_GITREPO" | awk "/refs\/(heads|tags)\/$DSCIP_BRANCH/{print \$1}")
if [ -z "$CURRENT_COMMIT" ]; then # Checks if CURRENT_COMMIT is blank, if so, abort script.
return 0
fi
export CURRENT_COMMIT
# If LAST_COMMIT doesn't exist, that means it's a first run and we can go ahead and build. #
# Or skip the commit check if DSCIP_DISREGARD_COMMIT_CHECK is set to true.
if [ "$DSCIP_DISREGARD_COMMIT_CHECK" = "false" ]; then
if [ -z "$LAST_COMMIT" ]; then
build
elif [ ! "$LAST_COMMIT" = "$CURRENT_COMMIT" ]; then # If the last commit and current commit don't match, then we go ahead and build.
build
else
return 0
fi
else
build
fi
rm "$WORKING_DIRECTORY/LOCK" # Remove lock #
printf "Done.\n\n" >> "$DSCIP_OUTPUT_TO"
}
run
while [ "$DSCIP_DAEMON" = "true" ]; do
sleep "$DSCIP_SLEEP"
run
done
exit 0