From aaab6af22ee583dcc8711e9fb2dc9aa53ef762bc Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Tue, 15 Jul 2025 09:23:13 +0900 Subject: [PATCH] Add switch branch script --- src/bin/base_setup.sh | 26 +++++++++++++++++++----- src/bin/switch_branch.sh | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 src/bin/switch_branch.sh diff --git a/src/bin/base_setup.sh b/src/bin/base_setup.sh index 530fbc9..1183df5 100755 --- a/src/bin/base_setup.sh +++ b/src/bin/base_setup.sh @@ -75,14 +75,21 @@ if [ -d "${GIT_WEBHOOK_BASE_FOLDER}" ]; then echo "[TODO] -> Not implemented: check folder, check ACL"; # copy scripts & default config echo "~ Copy basic script and config files"; - # git_sync.sh, init.sh, new_clone.sh, webhook.default.cfg - cp "${BASE_FOLDER}new_clone.sh" "${BASE_FOLDER}init.sh" "${BASE_FOLDER}git_sync.sh" "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}"; - cp "${CONFIG_BASE}/webhook.default.cfg" "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}"; + # git_sync.sh, init.sh, new_clone.sh, switch_branch.sh, webhook.default.cfg + cp \ + "${BASE_FOLDER}new_clone.sh" \ + "${BASE_FOLDER}init.sh" \ + "${BASE_FOLDER}git_sync.sh" \ + "${BASE_FOLDER}switch_branch.sh" \ + "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}"; + cp "${CONFIG_BASE}/webhook.default.cfg" \ + "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}"; # and make sure they are all owned by the correct user chown "${SUDO_USER}" \ "${BASE_FOLDER}new_clone.sh" \ "${BASE_FOLDER}init.sh" \ "${BASE_FOLDER}git_sync.sh" \ + "${BASE_FOLDER}switch_branch.sh" \ "${CONFIG_BASE}/webhook.default.cfg"; # check config entries missing exit; @@ -159,13 +166,22 @@ EOF # Copy files echo "+ Copy basic script and config files"; # git_sync.sh, init.sh, new_clone.sh, webhook.default.cfg - cp "${BASE_FOLDER}new_clone.sh" "${BASE_FOLDER}init.sh" "${BASE_FOLDER}git_sync.sh" "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}"; - cp "${CONFIG_BASE}/webhook.cfg" "${CONFIG_BASE}/webhook.default.cfg" "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}"; + cp \ + "${BASE_FOLDER}new_clone.sh" \ + "${BASE_FOLDER}init.sh" \ + "${BASE_FOLDER}git_sync.sh" \ + "${BASE_FOLDER}switch_branch.sh" \ + "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}"; + cp \ + "${CONFIG_BASE}/webhook.cfg" \ + "${CONFIG_BASE}/webhook.default.cfg" \ + "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}"; # and make sure they are all owned by the correct user chown "${SUDO_USER}" \ "${BASE_FOLDER}new_clone.sh" \ "${BASE_FOLDER}init.sh" \ "${BASE_FOLDER}git_sync.sh" \ + "${BASE_FOLDER}switch_branch.sh" \ "${CONFIG_BASE}/webhook.cfg" \ "${CONFIG_BASE}/webhook.default.cfg"; fi; diff --git a/src/bin/switch_branch.sh b/src/bin/switch_branch.sh new file mode 100644 index 0000000..2782ae2 --- /dev/null +++ b/src/bin/switch_branch.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +# AUTHOR: Clemens Schwaighofer +# DATE: 2025/7/15 +# DESC: Switch a branch, run this script if we have to switch to a different branch +# If not the new branch will merge into the branch that was originally selected + +REPOSITORY="$1"; +BRANCH="$2"; +REMOTE_NAME="$3"; +if [ -z "${REMOTE_NAME}" ]; then + REMOTE_NAME="origin" +fi; +BASE_FOLDER=$(dirname "$(readlink -f "$0")")"/"; +# shellcheck source=init.sh +. "${BASE_FOLDER}init.sh"; + +GIT_REPOSITORY_FOLDER="${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}${REPOSITORY}"; +if [ ! -d "${GIT_REPOSITORY_FOLDER}" ]; then + echo "[!] ${REPOSITORY} not found in clone folder"; + echo "[!] Full path: ${GIT_REPOSITORY_FOLDER}"; + exit; +fi; +LOG_FILE="${GIT_WEBHOOK_BASE_FOLDER}${LOG_FOLDER}${REPOSITORY}.log"; +unique_id=$(uuidgen | tr -d '-' | head -c 8); + +echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [START] On repository ${GIT_REPOSITORY_FOLDER} switch to branch ${REMOTE_NAME}/${BRANCH}" | tee -a "$LOG_FILE"; +# add new branch to remote +GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "remote" "set-branches" "--add" "${REMOTE_NAME}" "${BRANCH}") +"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE"; +# fetch new branch +GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "fetch" "--depth" "1" "${REMOTE_NAME}" "${BRANCH}") +"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE"; +# checkout new branch +GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "checkout" "${BRANCH}"); +"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE"; +# get the latest changes from branch +GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "pull" "${REMOTE_NAME}" "${BRANCH}") +"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE"; +echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [END] branch switch done" | tee -a "$LOG_FILE"; + + +# __END__