Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| daa84b583f | |||
| c7890335cc |
@@ -149,16 +149,12 @@ check_one(){ # $1 owner $2 repo $3 num
|
|||||||
J=$(cat "$BATON_GUARD_FIXTURE/issue.json")
|
J=$(cat "$BATON_GUARD_FIXTURE/issue.json")
|
||||||
C=$(cat "$BATON_GUARD_FIXTURE/comments.json")
|
C=$(cat "$BATON_GUARD_FIXTURE/comments.json")
|
||||||
else
|
else
|
||||||
# token:掃已知的 checkout 找第一個帶憑證、指向本站的 remote(同 scripts/ticket 的做法)
|
# token:來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽(那會逼 token 明文嵌在 URL 裡)
|
||||||
local ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}" URL="" U dir TOKEN
|
local TOKEN _GT_LIB
|
||||||
for dir in "$ROOT" "$ROOT/products/$REPO" "$ROOT/matrix/$REPO" "$ROOT/polaris/$REPO"; do
|
_GT_LIB="$(dirname -- "$0")/../scripts/lib/gitea-token.sh"; [ -f "$_GT_LIB" ] && . "$_GT_LIB"
|
||||||
[ -e "$dir/.git" ] || continue
|
command -v gitea_token >/dev/null 2>&1 || return 0
|
||||||
U=$(git -C "$dir" remote -v 2>/dev/null | grep -m1 'git\.uncle6\.me' | grep '@' | awk '{print $2}') || true
|
TOKEN=$(gitea_token) || return 0
|
||||||
[ -n "${U:-}" ] && { URL="$U"; break; }
|
[ -n "$TOKEN" ] || return 0
|
||||||
done
|
|
||||||
[ -n "$URL" ] || return 0
|
|
||||||
TOKEN=$(printf '%s' "$URL" | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
|
|
||||||
[ "$TOKEN" != "$URL" ] || return 0
|
|
||||||
J=$(curl -s --max-time 12 -H "Authorization: token $TOKEN" \
|
J=$(curl -s --max-time 12 -H "Authorization: token $TOKEN" \
|
||||||
"https://git.uncle6.me/api/v1/repos/$OWNER/$REPO/issues/$NUM" 2>/dev/null) || return 0
|
"https://git.uncle6.me/api/v1/repos/$OWNER/$REPO/issues/$NUM" 2>/dev/null) || return 0
|
||||||
C=$(curl -s --max-time 12 -H "Authorization: token $TOKEN" \
|
C=$(curl -s --max-time 12 -H "Authorization: token $TOKEN" \
|
||||||
|
|||||||
@@ -294,7 +294,10 @@ for d in /private/tmp/claude-501/*/*/tasks; do
|
|||||||
done
|
done
|
||||||
[ "$RUNNING" -gt 0 ] && exit 0
|
[ "$RUNNING" -gt 0 ] && exit 0
|
||||||
|
|
||||||
TOKEN=$(git -C "$PROJ" remote get-url gitea 2>/dev/null | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|') || TOKEN=""
|
# token 來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽(那會逼 token 明文嵌在 URL 裡)
|
||||||
|
_GT_LIB="$(dirname -- "$0")/../scripts/lib/gitea-token.sh"; [ -f "$_GT_LIB" ] && . "$_GT_LIB"
|
||||||
|
command -v gitea_token >/dev/null 2>&1 || exit 0
|
||||||
|
TOKEN=$(gitea_token) || TOKEN=""
|
||||||
[ -z "$TOKEN" ] && exit 0
|
[ -z "$TOKEN" ] && exit 0
|
||||||
|
|
||||||
# 🔴 org 是 inkstone,不是 Leo(2026-08-13 搬遷;舊值讓本閘靜默失效到 08-16)
|
# 🔴 org 是 inkstone,不是 Leo(2026-08-13 搬遷;舊值讓本閘靜默失效到 08-16)
|
||||||
|
|||||||
@@ -43,17 +43,12 @@ for line in p.splitlines():
|
|||||||
set -- $SPEC
|
set -- $SPEC
|
||||||
OWNER="$1"; REPO="$2"; NUM="$3"
|
OWNER="$1"; REPO="$2"; NUM="$3"
|
||||||
|
|
||||||
# token 從該 repo 的 gitea remote 取;取不到就安靜結束(不影響派工)
|
# token 來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽;取不到就安靜結束(不影響派工)
|
||||||
for d in "$CLAUDE_PROJECT_DIR/products/$REPO" "$CLAUDE_PROJECT_DIR/matrix/$REPO" "$CLAUDE_PROJECT_DIR"; do
|
_GT_LIB="$(dirname -- "$0")/../scripts/lib/gitea-token.sh"; [ -f "$_GT_LIB" ] && . "$_GT_LIB"
|
||||||
[ -d "$d/.git" ] || continue
|
command -v gitea_token >/dev/null 2>&1 || exit 0
|
||||||
URL=$(git -C "$d" remote get-url gitea 2>/dev/null) || continue
|
TOKEN=$(gitea_token) || exit 0
|
||||||
case "$URL" in *@*) break ;; esac
|
[ -n "$TOKEN" ] || exit 0
|
||||||
done
|
HOST="git.uncle6.me"
|
||||||
[ -n "${URL:-}" ] || exit 0
|
|
||||||
|
|
||||||
TOKEN=$(printf '%s' "$URL" | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
|
|
||||||
HOST=$(printf '%s' "$URL" | sed -E 's|.*@([^/]+)/.*|\1|')
|
|
||||||
[ "$TOKEN" != "$URL" ] || exit 0
|
|
||||||
|
|
||||||
curl -s -o /dev/null --max-time 8 \
|
curl -s -o /dev/null --max-time 8 \
|
||||||
-X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
|
-X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
|
||||||
|
|||||||
@@ -79,10 +79,12 @@ set -- $REF
|
|||||||
OWNER="$1"; REPO="$2"; NUM="$3"
|
OWNER="$1"; REPO="$2"; NUM="$3"
|
||||||
|
|
||||||
# 拿 token(拿不到就放行——這是本地環境問題,不是派工者的錯)
|
# 拿 token(拿不到就放行——這是本地環境問題,不是派工者的錯)
|
||||||
URL=$(git -C "${CLAUDE_PROJECT_DIR:-.}" remote get-url gitea 2>/dev/null || true)
|
# token 來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽(那會逼 token 明文嵌在 URL 裡)
|
||||||
case "${URL:-}" in *@*) ;; *) exit 0 ;; esac
|
_GT_LIB="$(dirname -- "$0")/../scripts/lib/gitea-token.sh"; [ -f "$_GT_LIB" ] && . "$_GT_LIB"
|
||||||
TOKEN=$(printf '%s' "$URL" | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
|
command -v gitea_token >/dev/null 2>&1 || exit 0
|
||||||
HOST=$(printf '%s' "$URL" | sed -E 's|.*@([^/]+)/.*|\1|')
|
TOKEN=$(gitea_token) || exit 0
|
||||||
|
[ -n "$TOKEN" ] || exit 0
|
||||||
|
HOST="git.uncle6.me"
|
||||||
|
|
||||||
RESP=$(curl -s --max-time 15 -H "Authorization: token $TOKEN" \
|
RESP=$(curl -s --max-time 15 -H "Authorization: token $TOKEN" \
|
||||||
"https://$HOST/api/v1/repos/$OWNER/$REPO/issues/$NUM" 2>/dev/null || true)
|
"https://$HOST/api/v1/repos/$OWNER/$REPO/issues/$NUM" 2>/dev/null || true)
|
||||||
|
|||||||
@@ -62,17 +62,12 @@ set -u
|
|||||||
PROJ="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
PROJ="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
||||||
PAYLOAD=$(cat 2>/dev/null || echo '{}')
|
PAYLOAD=$(cat 2>/dev/null || echo '{}')
|
||||||
|
|
||||||
# ── token:同 scripts/ticket 的做法(掃 remote 找帶憑證的,再退到環境變數)──
|
# ── token:來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽 ──
|
||||||
|
# (舊法掃各 repo 的 remote 找帶憑證的網址,代表 token 得明文嵌在 URL 裡 → 會洩進 log)
|
||||||
TOKEN=""
|
TOKEN=""
|
||||||
if [ -z "${PR_VERDICT_FIXTURE:-}" ]; then
|
if [ -z "${PR_VERDICT_FIXTURE:-}" ]; then
|
||||||
for d in "$PROJ" "$PROJ/products"/* "$PROJ/matrix"/* "$PROJ/polaris"/*; do
|
_GT_LIB="$(dirname -- "$0")/../scripts/lib/gitea-token.sh"; [ -f "$_GT_LIB" ] && . "$_GT_LIB"
|
||||||
[ -e "$d/.git" ] || continue
|
command -v gitea_token >/dev/null 2>&1 && TOKEN=$(gitea_token) || TOKEN=""
|
||||||
U=$(git -C "$d" remote -v 2>/dev/null | grep -m1 'git\.uncle6\.me' | grep '@' | awk '{print $2}') || true
|
|
||||||
if [ -n "${U:-}" ]; then
|
|
||||||
T=$(printf '%s' "$U" | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
|
|
||||||
[ "$T" != "$U" ] && { TOKEN="$T"; break; }
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
[ -n "$TOKEN" ] || TOKEN="${GITEA_TOKEN_CLAUDE_CODE:-${GITEA_TOKEN:-}}"
|
[ -n "$TOKEN" ] || TOKEN="${GITEA_TOKEN_CLAUDE_CODE:-${GITEA_TOKEN:-}}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -116,10 +116,10 @@ fi
|
|||||||
# 不影響「擋下來」這個判斷本身。
|
# 不影響「擋下來」這個判斷本身。
|
||||||
HITS=""
|
HITS=""
|
||||||
if [ "$RESOURCE" = "issues" ]; then
|
if [ "$RESOURCE" = "issues" ]; then
|
||||||
REMOTES=$(git -C "${CLAUDE_PROJECT_DIR:-.}" remote -v 2>/dev/null || true)
|
# token 來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽(那會逼 token 明文嵌在 URL 裡)
|
||||||
CRED_LINE=$(printf '%s' "$REMOTES" | grep -m1 'git\.uncle6\.me' | grep -m1 '@' || true)
|
_GT_LIB="$(dirname -- "$0")/../scripts/lib/gitea-token.sh"; [ -f "$_GT_LIB" ] && . "$_GT_LIB"
|
||||||
if [ -n "$CRED_LINE" ]; then
|
TOKEN=""; command -v gitea_token >/dev/null 2>&1 && TOKEN=$(gitea_token) || TOKEN=""
|
||||||
TOKEN=$(printf '%s' "$CRED_LINE" | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
|
if [ -n "$TOKEN" ]; then
|
||||||
# 只認雙引號的 "title": "..."(curl -d/json.dumps 輸出的實際格式,也是
|
# 只認雙引號的 "title": "..."(curl -d/json.dumps 輸出的實際格式,也是
|
||||||
# 2026-08-27 那 13 張票真實用的寫法,見 scripts/test-ticket-api-bypass-guard.sh
|
# 2026-08-27 那 13 張票真實用的寫法,見 scripts/test-ticket-api-bypass-guard.sh
|
||||||
# 既有的模擬指令)。刻意不支援單引號版本——這段 python 要塞進 bash 單引號
|
# 既有的模擬指令)。刻意不支援單引號版本——這段 python 要塞進 bash 單引號
|
||||||
|
|||||||
Executable
+26
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# git-credential-gitea.sh — git credential helper:把 Gitea 憑證從 env/.env 餵給 git,
|
||||||
|
# 讓 remote URL 不必嵌 token(inkstone/ISEP#47)。URL 乾淨 ⇒ git 把它印出來也不洩 token。
|
||||||
|
#
|
||||||
|
# 安裝(gitea-bootstrap.sh 會自動設好,這裡是手動法):
|
||||||
|
# git config credential.helper "$(git rev-parse --show-toplevel)/scripts/git-credential-gitea.sh"
|
||||||
|
# 只對 git.uncle6.me 的 get 供憑證;store/erase 不做事(token 不由 git 保管)。
|
||||||
|
DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||||
|
. "$DIR/lib/gitea-token.sh"
|
||||||
|
|
||||||
|
[ "${1:-}" = "get" ] || exit 0
|
||||||
|
|
||||||
|
HOST=""
|
||||||
|
while IFS='=' read -r k v; do
|
||||||
|
[ -z "$k" ] && break
|
||||||
|
[ "$k" = "host" ] && HOST="$v"
|
||||||
|
done
|
||||||
|
case "$HOST" in
|
||||||
|
git.uncle6.me|"") : ;;
|
||||||
|
*) exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
TOK=$(gitea_token) || exit 0
|
||||||
|
[ -n "$TOK" ] || exit 0
|
||||||
|
printf 'username=claude-code\n'
|
||||||
|
printf 'password=%s\n' "$TOK"
|
||||||
@@ -16,14 +16,29 @@ set -eu
|
|||||||
REPO=""
|
REPO=""
|
||||||
[ "${1:-}" = "-r" ] && { REPO="${2:?-r 後面要接 owner/repo}"; }
|
[ "${1:-}" = "-r" ] && { REPO="${2:?-r 後面要接 owner/repo}"; }
|
||||||
|
|
||||||
REMOTE=$(git remote get-url gitea 2>/dev/null) || {
|
# 取當前 repo 的 remote(雲端叫 origin、本機慣例叫 gitea)
|
||||||
echo "✗ 當前目錄沒有名為 gitea 的 remote。請 cd 到目標 repo,或先加 remote。" >&2; exit 1; }
|
REMOTE_NAME=$(git remote get-url gitea >/dev/null 2>&1 && echo gitea || (git remote get-url origin >/dev/null 2>&1 && echo origin))
|
||||||
|
[ -n "$REMOTE_NAME" ] || { echo "✗ 當前目錄沒有 gitea/origin remote。請 cd 到目標 repo,或先加 remote。" >&2; exit 1; }
|
||||||
|
REMOTE=$(git remote get-url "$REMOTE_NAME" 2>/dev/null)
|
||||||
|
# 去掉網址裡可能嵌著的憑證 → 乾淨 URL(inkstone/ISEP#47:token 不進 remote URL)
|
||||||
|
REMOTE=$(printf '%s' "$REMOTE" | sed -E 's#//[^/@]*@#//#')
|
||||||
|
|
||||||
TOKEN=$(printf '%s' "$REMOTE" | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
|
# token 來源=env/.env(不從 remote URL 抽——那會逼 token 明文嵌在 URL 裡 → 洩進 log)
|
||||||
[ "$TOKEN" = "$REMOTE" ] && { echo "✗ gitea remote URL 裡沒有 token,無法取得認證。" >&2; exit 1; }
|
_GT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||||
HOST=$(printf '%s' "$REMOTE" | sed -E 's|.*@([^/]+)/.*|\1|')
|
[ -f "$_GT_DIR/lib/gitea-token.sh" ] && . "$_GT_DIR/lib/gitea-token.sh"
|
||||||
|
TOKEN=""; command -v gitea_token >/dev/null 2>&1 && TOKEN=$(gitea_token || true)
|
||||||
|
[ -n "$TOKEN" ] || { echo "✗ 取不到 Gitea token(設 GITEA_TOKEN_CLAUDE_CODE,或在 .env 放 GITEA_TOKEN_CLAUDE_CODE=)。" >&2; exit 1; }
|
||||||
|
HOST=$(printf '%s' "$REMOTE" | sed -E 's|.*://([^/]+)/.*|\1|')
|
||||||
[ -n "$REPO" ] || REPO=$(printf '%s' "$REMOTE" | sed -E 's|.*://[^/]+/(.+)\.git$|\1|')
|
[ -n "$REPO" ] || REPO=$(printf '%s' "$REMOTE" | sed -E 's|.*://[^/]+/(.+)\.git$|\1|')
|
||||||
|
|
||||||
|
# 設定乾淨 remote URL + credential helper(冪等):URL 不含 token,認證改由 helper 從 env/.env 供
|
||||||
|
# ⇒ git 把 remote URL 印出來(git-lfs 的 locksverify 那行)也不會洩 token(inkstone/ISEP#47)。
|
||||||
|
if [ -f "$_GT_DIR/git-credential-gitea.sh" ]; then
|
||||||
|
CUR=$(git remote get-url "$REMOTE_NAME" 2>/dev/null || true)
|
||||||
|
case "$CUR" in *@*) git remote set-url "$REMOTE_NAME" "$REMOTE" && echo " ✓ remote $REMOTE_NAME 已清乾淨(移除嵌入的 token)" ;; esac
|
||||||
|
git config credential.helper "$_GT_DIR/git-credential-gitea.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "→ repo: $REPO host: $HOST"
|
echo "→ repo: $REPO host: $HOST"
|
||||||
|
|
||||||
# 狀態機(互斥 scope label)。順序=出貨流程:
|
# 狀態機(互斥 scope label)。順序=出貨流程:
|
||||||
|
|||||||
@@ -30,16 +30,15 @@ if [[ ! -f "$LABELS_YAML" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --- token:跟 InkStoneCo 頂層 gitea remote 拿同一把(不落地檔案、不印出來) ---
|
# --- token:來源=env/.env(inkstone/ISEP#47),不再從 remote URL 抽(那會逼 token 明文嵌在 URL 裡) ---
|
||||||
TOKEN="${GITEA_TOKEN:-}"
|
TOKEN="${GITEA_TOKEN:-}"
|
||||||
if [[ -z "$TOKEN" ]]; then
|
if [[ -z "$TOKEN" ]]; then
|
||||||
INKSTONE_TOP="${INKSTONE_TOP:-$HOME/Documents/tech_projects/InkStoneCo}"
|
_GT_LIB="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)/lib/gitea-token.sh"
|
||||||
if [[ -d "$INKSTONE_TOP/.git" ]]; then
|
[[ -f "$_GT_LIB" ]] && . "$_GT_LIB"
|
||||||
TOKEN="$(git -C "$INKSTONE_TOP" remote get-url gitea 2>/dev/null | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')"
|
command -v gitea_token >/dev/null 2>&1 && TOKEN="$(gitea_token || true)"
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
if [[ -z "$TOKEN" ]]; then
|
if [[ -z "$TOKEN" ]]; then
|
||||||
echo "拿不到 Gitea token——設 GITEA_TOKEN 環境變數,或確認 $INKSTONE_TOP 的 gitea remote 存在" >&2
|
echo "拿不到 Gitea token——設 GITEA_TOKEN_CLAUDE_CODE 環境變數,或在 .env/頂層 .env 放 GITEA_TOKEN_CLAUDE_CODE=" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Executable
+44
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# gitea-token.sh — 解出 Gitea 憑證(GITEA_TOKEN_CLAUDE_CODE)。source 它、呼叫 gitea_token()。
|
||||||
|
#
|
||||||
|
# 為什麼存在(inkstone/ISEP#47):舊法用 `git remote get-url gitea | sed` 從 remote URL
|
||||||
|
# 抽 token ⇒ token 必須明文嵌在 URL 裡 ⇒ 任何印出 remote URL 的訊息(git-lfs 的
|
||||||
|
# locksverify 那行)都會把它洩進 transcript/log。來源統一到這裡後,remote URL 才能改乾淨。
|
||||||
|
#
|
||||||
|
# 解析順序(先環境、後檔案——雲端只有 env、本機有 .env,兩邊都涵蓋):
|
||||||
|
# 1) 環境變數 $GITEA_TOKEN_CLAUDE_CODE(雲端 make-cloud-env 注入;本機 source .env 後也在)
|
||||||
|
# 2) .env 的 GITEA_TOKEN_CLAUDE_CODE=(先找 $CLAUDE_PROJECT_DIR/.env,再找 git 根的 .env)
|
||||||
|
# —— 與既有 gitea_arm_token()(scripts/lib/gitea-arm-common.sh)同一條路,照既有寫法走。
|
||||||
|
# 讀不到 → 印空字串、回非 0(呼叫者必須自己判空,不能把空字串當成功)。
|
||||||
|
#
|
||||||
|
# 🔴 只回值、不印別的——絕不 echo 出 token 以外的東西(避免洩進 log)。
|
||||||
|
|
||||||
|
# 內部:從一個 .env 檔抓 GITEA_TOKEN_CLAUDE_CODE=,去掉外圍引號。
|
||||||
|
_gitea_token_from_file() {
|
||||||
|
[ -f "$1" ] || return 1
|
||||||
|
_gt_val=$(grep '^GITEA_TOKEN_CLAUDE_CODE=' "$1" 2>/dev/null | head -1 | cut -d= -f2-)
|
||||||
|
_gt_val=${_gt_val%\"}; _gt_val=${_gt_val#\"}
|
||||||
|
_gt_val=${_gt_val%\'}; _gt_val=${_gt_val#\'}
|
||||||
|
[ -n "$_gt_val" ] || return 1
|
||||||
|
printf '%s' "$_gt_val"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
gitea_token() {
|
||||||
|
# 1) 環境變數優先
|
||||||
|
if [ -n "${GITEA_TOKEN_CLAUDE_CODE:-}" ]; then
|
||||||
|
printf '%s' "$GITEA_TOKEN_CLAUDE_CODE"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
# 2) $CLAUDE_PROJECT_DIR/.env
|
||||||
|
if [ -n "${CLAUDE_PROJECT_DIR:-}" ] && _gitea_token_from_file "$CLAUDE_PROJECT_DIR/.env"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
# 3) git 根的 .env
|
||||||
|
_gt_root=$(git rev-parse --show-toplevel 2>/dev/null || true)
|
||||||
|
if [ -n "${_gt_root:-}" ] && _gitea_token_from_file "$_gt_root/.env"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
printf ''
|
||||||
|
return 1
|
||||||
|
}
|
||||||
@@ -61,15 +61,21 @@ done
|
|||||||
|
|
||||||
[ -f "$ROSTER" ] || { echo "找不到 roster:$ROSTER" >&2; exit 1; }
|
[ -f "$ROSTER" ] || { echo "找不到 roster:$ROSTER" >&2; exit 1; }
|
||||||
|
|
||||||
# ── Gitea base(含憑證,**絕不可印出來**)────────────────────────────────
|
# ── Gitea base(乾淨網址;token 來源=env/.env,不從 URL 抽——inkstone/ISEP#47)──────────
|
||||||
REMOTE=$(git -C "$ROOT" remote get-url gitea 2>/dev/null || true)
|
_GT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||||
[ -n "$REMOTE" ] || { echo "本 repo 沒有 gitea remote,無法取 repo。" >&2; exit 1; }
|
[ -f "$_GT_DIR/lib/gitea-token.sh" ] && . "$_GT_DIR/lib/gitea-token.sh"
|
||||||
|
REMOTE=$(git -C "$ROOT" remote get-url gitea 2>/dev/null || git -C "$ROOT" remote get-url origin 2>/dev/null || true)
|
||||||
|
[ -n "$REMOTE" ] || { echo "本 repo 沒有 gitea/origin remote,無法取 repo。" >&2; exit 1; }
|
||||||
|
# 去掉網址裡可能還嵌著的舊憑證(遷移期相容)→ 乾淨 base,clone/fetch 靠 credential helper 認證
|
||||||
|
REMOTE=$(printf '%s' "$REMOTE" | sed -E 's#//[^/@]*@#//#')
|
||||||
BASE=${REMOTE%/InkStoneCo.git}
|
BASE=${REMOTE%/InkStoneCo.git}
|
||||||
BASE=${BASE%/InkStoneCo}
|
BASE=${BASE%/InkStoneCo}
|
||||||
SELF=$(basename "$REMOTE" .git)
|
SELF=$(basename "$REMOTE" .git)
|
||||||
SECRET=$(printf '%s' "$REMOTE" | sed -nE 's|.*//[^:]+:([^@]+)@.*|\1|p')
|
# scrub 用的 SECRET:token 從 env/.env 取(不從 URL 抽),用來遮掉萬一夾帶在錯誤訊息裡的 token
|
||||||
# 任何要外流的字串都先過這關(錯誤訊息可能夾帶 clone URL)
|
SECRET=""; command -v gitea_token >/dev/null 2>&1 && SECRET=$(gitea_token || true)
|
||||||
scrub() { if [ -n "$SECRET" ]; then sed "s|$SECRET|***|g"; else cat; fi; }
|
scrub() { if [ -n "$SECRET" ]; then sed "s|$SECRET|***|g"; else cat; fi; }
|
||||||
|
# clone/fetch 的認證:乾淨 URL + credential helper(token 不進 URL、不洩進 log)
|
||||||
|
GIT_CRED=""; [ -f "$_GT_DIR/git-credential-gitea.sh" ] && GIT_CRED="-c credential.helper=$_GT_DIR/git-credential-gitea.sh"
|
||||||
|
|
||||||
mkdir -p "$CACHE"
|
mkdir -p "$CACHE"
|
||||||
# 自己這個 repo 一律讀工作副本 ⇒ 快取裡若留著一份舊的自己,是誤導來源(會被人拿去讀)
|
# 自己這個 repo 一律讀工作副本 ⇒ 快取裡若留著一份舊的自己,是誤導來源(會被人拿去讀)
|
||||||
@@ -95,7 +101,7 @@ for repo in $REPOS; do
|
|||||||
if [ -d "$dst/.git" ]; then
|
if [ -d "$dst/.git" ]; then
|
||||||
if [ "$DO_FETCH" = 1 ]; then
|
if [ "$DO_FETCH" = 1 ]; then
|
||||||
br=$(git -C "$dst" symbolic-ref --short HEAD 2>/dev/null || echo main)
|
br=$(git -C "$dst" symbolic-ref --short HEAD 2>/dev/null || echo main)
|
||||||
git -C "$dst" fetch --quiet origin "$br" 2>&1 | scrub >&2 || true
|
git $GIT_CRED -C "$dst" fetch --quiet origin "$br" 2>&1 | scrub >&2 || true
|
||||||
git -C "$dst" reset --quiet --hard FETCH_HEAD 2>/dev/null || true
|
git -C "$dst" reset --quiet --hard FETCH_HEAD 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -104,7 +110,7 @@ for repo in $REPOS; do
|
|||||||
fi
|
fi
|
||||||
# blobless + sparse:只下載 wiki 目錄的內容,但保留完整 commit 歷史
|
# blobless + sparse:只下載 wiki 目錄的內容,但保留完整 commit 歷史
|
||||||
#(要歷史才算得出「每個檔最後更新是哪天」——淺 clone 會讓所有檔同一天)
|
#(要歷史才算得出「每個檔最後更新是哪天」——淺 clone 會讓所有檔同一天)
|
||||||
if ! err=$(git clone --quiet --filter=blob:none --sparse "$BASE/$repo.git" "$dst" 2>&1 | scrub); then
|
if ! err=$(git $GIT_CRED clone --quiet --filter=blob:none --sparse "$BASE/$repo.git" "$dst" 2>&1 | scrub); then
|
||||||
printf '%s\tclone-failed\t%s\n' "$repo" "$(printf '%s' "$err" | tr '\n' ' ')" >> "$STATUS_TSV"
|
printf '%s\tclone-failed\t%s\n' "$repo" "$(printf '%s' "$err" | tr '\n' ' ')" >> "$STATUS_TSV"
|
||||||
rm -rf "$dst"; continue
|
rm -rf "$dst"; continue
|
||||||
fi
|
fi
|
||||||
@@ -312,7 +318,7 @@ if gap > 0:
|
|||||||
f"Gitea `Leo/*` 在 {ASOF} 實查是 **{TOTAL} 個**,名單 {len(repos)} 個 ⇒ **還有 {gap} 個沒被點名**。")
|
f"Gitea `Leo/*` 在 {ASOF} 實查是 **{TOTAL} 個**,名單 {len(repos)} 個 ⇒ **還有 {gap} 個沒被點名**。")
|
||||||
w(" 補法(人發起,一次呼叫,不排程)——拿到完整清單、把缺的名字加進名單再重跑:")
|
w(" 補法(人發起,一次呼叫,不排程)——拿到完整清單、把缺的名字加進名單再重跑:")
|
||||||
w(" ```")
|
w(" ```")
|
||||||
w(" TOKEN=$(git remote get-url gitea | sed -E 's|.*//[^:]+:([^@]+)@.*|\\1|')")
|
w(" TOKEN=$GITEA_TOKEN_CLAUDE_CODE # 來源=env/.env,不從 remote URL 抽(inkstone/ISEP#47)")
|
||||||
w(" curl -s -H \"Authorization: token $TOKEN\" \\")
|
w(" curl -s -H \"Authorization: token $TOKEN\" \\")
|
||||||
w(" 'https://git.uncle6.me/api/v1/orgs/Leo/repos?limit=100' | python3 -c \\")
|
w(" 'https://git.uncle6.me/api/v1/orgs/Leo/repos?limit=100' | python3 -c \\")
|
||||||
w(" 'import sys,json;[print(r[\"name\"]) for r in json.load(sys.stdin)]'")
|
w(" 'import sys,json;[print(r[\"name\"]) for r in json.load(sys.stdin)]'")
|
||||||
|
|||||||
Reference in New Issue
Block a user