From dd0ffbf69bca1a0a6ac480865baf6ff032b0a439 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Fri, 21 Aug 2026 10:27:25 +0300 Subject: [PATCH] Refactor bootstrap script for SwarmUI management and enhance error handling - Introduced functions `swarm_git_ok`, `clone_swarmui`, and `update_swarmui` to streamline the cloning and updating process of SwarmUI. - Improved error handling during the update process, ensuring a fallback to cloning if the update fails. - Enhanced logging messages for better visibility during cloning and updating operations. - Updated tests to verify the presence of new functions and logging messages in the bootstrap script. --- src/gpu_rent/remote/bootstrap.sh | 34 +++++++++++++++++++++++++++----- tests/test_bootstrap.py | 2 ++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/gpu_rent/remote/bootstrap.sh b/src/gpu_rent/remote/bootstrap.sh index 72a183d..fa3d750 100644 --- a/src/gpu_rent/remote/bootstrap.sh +++ b/src/gpu_rent/remote/bootstrap.sh @@ -127,16 +127,30 @@ fi rm -f "${DATA_ROOT}/.gpu-rent-llm-only" 2>/dev/null || true -if [[ ! -d "${SWARM_ROOT}/.git" ]]; then - log "clone SwarmUI -> ${SWARM_ROOT}" +swarm_git_ok() { + # .git dir can exist after a failed/partial boot and still not be a repo. + [[ -d "${SWARM_ROOT}/.git" ]] \ + && git -C "$SWARM_ROOT" rev-parse --is-inside-work-tree >/dev/null 2>&1 +} + +clone_swarmui() { mkdir -p "$(dirname "$SWARM_ROOT")" + if [[ -e "$SWARM_ROOT" ]]; then + log "удаляю битый/неполный ${SWARM_ROOT} перед clone" + rm -rf "$SWARM_ROOT" + fi + log "clone SwarmUI -> ${SWARM_ROOT}" git clone --depth 1 "$SWARM_REPO" "$SWARM_ROOT" -elif [[ "${GPU_RENT_UPDATE_GIT:-1}" == "1" ]]; then - log "обновляю SwarmUI в ${SWARM_ROOT}" +} + +update_swarmui() { + local branch branch="$(git -C "$SWARM_ROOT" remote show origin 2>/dev/null | sed -n '/HEAD branch/s/.*: //p' || true)" branch="${branch:-master}" # shallow clone: deepen tip of default branch - git -C "$SWARM_ROOT" fetch --depth 1 origin "$branch" || git -C "$SWARM_ROOT" fetch --depth 1 origin + git -C "$SWARM_ROOT" fetch --depth 1 origin "$branch" \ + || git -C "$SWARM_ROOT" fetch --depth 1 origin \ + || return 1 if git -C "$SWARM_ROOT" rev-parse --verify -q "origin/${branch}" >/dev/null; then git -C "$SWARM_ROOT" checkout -B "$branch" "origin/${branch}" git -C "$SWARM_ROOT" reset --hard "origin/${branch}" @@ -144,6 +158,16 @@ elif [[ "${GPU_RENT_UPDATE_GIT:-1}" == "1" ]]; then git -C "$SWARM_ROOT" pull --ff-only || true fi log "SwarmUI @ $(git -C "$SWARM_ROOT" rev-parse --short HEAD)" +} + +if ! swarm_git_ok; then + clone_swarmui +elif [[ "${GPU_RENT_UPDATE_GIT:-1}" == "1" ]]; then + log "обновляю SwarmUI в ${SWARM_ROOT}" + if ! update_swarmui; then + log "WARN: git update failed (exit $?) — переклонирую" + clone_swarmui + fi else log "SwarmUI уже в ${SWARM_ROOT} (update off)" fi diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index 1a722c5..ddded5a 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -23,3 +23,5 @@ def test_bootstrap_script_is_native_swarmui(): assert "install_dotnet_via_curl" in script assert "chown -R" in script assert "wget" in script + assert "swarm_git_ok" in script + assert "переклонирую" in script or "перед clone" in script