|
|
@@ -37,22 +37,11 @@ if ! git -C "$APP_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
|
exit 0
|
|
|
fi
|
|
|
|
|
|
-git -C "$APP_DIR" add runtime/current_domain.txt runtime/current_domain.json runtime/state.json runtime/substore_vars.json || true
|
|
|
-
|
|
|
-if git -C "$APP_DIR" diff --cached --quiet; then
|
|
|
- echo "[vmess-domain-rotator] no staged changes, skip git commit"
|
|
|
- exit 0
|
|
|
-fi
|
|
|
-
|
|
|
commit_name="${GIT_COMMIT_NAME:-vmess-domain-rotator}"
|
|
|
commit_email="${GIT_COMMIT_EMAIL:-vmess-domain-rotator@localhost}"
|
|
|
+runtime_branch="${GIT_RUNTIME_BRANCH:-runtime-state}"
|
|
|
ts="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
|
|
|
|
|
-git -C "$APP_DIR" \
|
|
|
- -c user.name="$commit_name" \
|
|
|
- -c user.email="$commit_email" \
|
|
|
- commit -m "chore: rotate preferred domain to ${after} (${ts})"
|
|
|
-
|
|
|
push_remote="${GIT_PUSH_REMOTE:-origin}"
|
|
|
if ! git -C "$APP_DIR" remote get-url "$push_remote" >/dev/null 2>&1; then
|
|
|
push_remote=""
|
|
|
@@ -62,26 +51,77 @@ if ! git -C "$APP_DIR" remote get-url "$push_remote" >/dev/null 2>&1; then
|
|
|
done < <(git -C "$APP_DIR" remote)
|
|
|
fi
|
|
|
|
|
|
+work_dir=""
|
|
|
+cleanup_worktree="0"
|
|
|
current_branch="$(git -C "$APP_DIR" symbolic-ref --quiet --short HEAD 2>/dev/null || true)"
|
|
|
|
|
|
+if [[ "$current_branch" == "$runtime_branch" ]]; then
|
|
|
+ work_dir="$APP_DIR"
|
|
|
+else
|
|
|
+ work_dir="$(mktemp -d "${TMPDIR:-/tmp}/vmess-runtime-state.XXXXXX")"
|
|
|
+ cleanup_worktree="1"
|
|
|
+
|
|
|
+ if git -C "$APP_DIR" show-ref --verify --quiet "refs/heads/${runtime_branch}"; then
|
|
|
+ git -C "$APP_DIR" worktree add --force "$work_dir" "$runtime_branch"
|
|
|
+ else
|
|
|
+ if [[ -n "$push_remote" ]] && git -C "$APP_DIR" ls-remote --exit-code --heads "$push_remote" "$runtime_branch" >/dev/null 2>&1; then
|
|
|
+ git -C "$APP_DIR" fetch "$push_remote" "$runtime_branch:$runtime_branch"
|
|
|
+ git -C "$APP_DIR" worktree add --force "$work_dir" "$runtime_branch"
|
|
|
+ else
|
|
|
+ git -C "$APP_DIR" worktree add --force --detach "$work_dir"
|
|
|
+ git -C "$work_dir" checkout --orphan "$runtime_branch"
|
|
|
+ git -C "$work_dir" rm -rf . >/dev/null 2>&1 || true
|
|
|
+ echo "[vmess-domain-rotator] initialized branch ${runtime_branch}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+fi
|
|
|
+
|
|
|
+if [[ "$cleanup_worktree" == "1" ]]; then
|
|
|
+ cleanup() {
|
|
|
+ git -C "$APP_DIR" worktree remove --force "$work_dir" >/dev/null 2>&1 || rm -rf "$work_dir"
|
|
|
+ }
|
|
|
+ trap cleanup EXIT
|
|
|
+fi
|
|
|
+
|
|
|
+mkdir -p "$work_dir/runtime"
|
|
|
+for file in current_domain.txt current_domain.json state.json substore_vars.json; do
|
|
|
+ src="$APP_DIR/runtime/$file"
|
|
|
+ dst="$work_dir/runtime/$file"
|
|
|
+ if [[ -f "$src" ]]; then
|
|
|
+ cp "$src" "$dst"
|
|
|
+ else
|
|
|
+ rm -f "$dst"
|
|
|
+ fi
|
|
|
+done
|
|
|
+
|
|
|
+git -C "$work_dir" add -A runtime/current_domain.txt runtime/current_domain.json runtime/state.json runtime/substore_vars.json || true
|
|
|
+
|
|
|
+if git -C "$work_dir" diff --cached --quiet; then
|
|
|
+ echo "[vmess-domain-rotator] no staged changes for ${runtime_branch}, skip git commit"
|
|
|
+ exit 0
|
|
|
+fi
|
|
|
+
|
|
|
+git -C "$work_dir" \
|
|
|
+ -c user.name="$commit_name" \
|
|
|
+ -c user.email="$commit_email" \
|
|
|
+ commit -m "chore: rotate preferred domain to ${after} (${ts})"
|
|
|
+
|
|
|
if [[ -z "$push_remote" ]]; then
|
|
|
echo "[vmess-domain-rotator] no remote found, skip git push"
|
|
|
-elif [[ -z "$current_branch" ]]; then
|
|
|
- echo "[vmess-domain-rotator] detached HEAD, skip git push"
|
|
|
else
|
|
|
- if git -C "$APP_DIR" rev-parse --abbrev-ref --symbolic-full-name "@{u}" >/dev/null 2>&1; then
|
|
|
- if git -C "$APP_DIR" push; then
|
|
|
- echo "[vmess-domain-rotator] pushed to ${push_remote}/${current_branch}"
|
|
|
+ if git -C "$work_dir" rev-parse --abbrev-ref --symbolic-full-name "@{u}" >/dev/null 2>&1; then
|
|
|
+ if git -C "$work_dir" push "$push_remote" "$runtime_branch:$runtime_branch"; then
|
|
|
+ echo "[vmess-domain-rotator] pushed to ${push_remote}/${runtime_branch}"
|
|
|
else
|
|
|
echo "[vmess-domain-rotator] git push failed"
|
|
|
fi
|
|
|
else
|
|
|
- if git -C "$APP_DIR" push -u "$push_remote" "$current_branch"; then
|
|
|
- echo "[vmess-domain-rotator] pushed to ${push_remote}/${current_branch} (set upstream)"
|
|
|
+ if git -C "$work_dir" push -u "$push_remote" "$runtime_branch:$runtime_branch"; then
|
|
|
+ echo "[vmess-domain-rotator] pushed to ${push_remote}/${runtime_branch} (set upstream)"
|
|
|
else
|
|
|
echo "[vmess-domain-rotator] git push failed"
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
-echo "[vmess-domain-rotator] committed domain change: ${before} -> ${after}"
|
|
|
+echo "[vmess-domain-rotator] committed domain change on ${runtime_branch}: ${before} -> ${after}"
|