Files
ykxmz/_build/ezhub_push.py
T
xmz7891 d60dfcf671 发布脚本:提前检查 EzHub 令牌写权限
Gitea 令牌可以只给读权限。只读令牌能读仓库、能列发行版,
看起来一切正常,但一推代码就 403、一建发行版也 403。

加了 check_ezhub_scope():开头就用一个**无副作用**的探针确认权限
(对不存在的发行版发 DELETE —— 403 说明缺 write:repository,
404 说明权限过了只是资源不存在),缺权限就立刻停下并给出
明确的修复指引,不让它走到一半才炸。

文档里也写清了这个坑。
2026-10-07 12:25:12 +08:00

97 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
r"""把 EzHub 的令牌存到仓库外,并支持用 HTTPS + 令牌推代码。
为什么需要这个:
用户加 SSH 公钥时可能加错了(服务端拒绝了本机的
SHA256:Acmu49YQcjw3m5WefOXSBzYNY2WPHLL2vvhnlYRAttA),
但令牌有 push 权限,走 HTTPS 就能推。
为什么不把令牌写进 remote URL:
`git remote -v` 会直接打印出来,任何时候截图/录屏都会泄。
所以令牌存在仓库外的 %USERPROFILE%\.ykxmz\ezhub_token,
推送时临时拼 URL,推完不留痕。
用法:
python _build/ezhub_push.py # 用存好的令牌推
python _build/ezhub_push.py <令牌> # 先存再用这个令牌推
python _build/ezhub_push.py --show # 只看存了什么(打码)
"""
from __future__ import annotations
import subprocess
import sys
from pathlib import Path
ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
GIT = r"C:\Program Files\Git\bin\git.exe"
TOKEN_FILE = Path.home() / ".ykxmz" / "ezhub_token"
OWNER = "xmz"
REPO = "ykxmz"
HOST = "git.261826.xyz"
def save_token(token: str) -> None:
TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True)
TOKEN_FILE.write_text(token.strip(), encoding="utf-8")
# 尽量收紧权限(Windows 上效果有限,但聊胜于无)
try:
import os
os.chmod(TOKEN_FILE, 0o600)
except OSError:
pass
print(" 令牌已存到 %s(仓库外,不会进版本库)" % TOKEN_FILE)
def load_token() -> str:
if TOKEN_FILE.is_file():
return TOKEN_FILE.read_text(encoding="utf-8").strip()
return ""
def main() -> int:
args = [a for a in sys.argv[1:] if a]
if args and args[0] == "--show":
token = load_token()
if not token:
print(" 还没存令牌")
else:
print(" 令牌: %s…%s(长度 %d)"
% (token[:8], token[-4:], len(token)))
return 0
if args and not args[0].startswith("--"):
save_token(args[0])
token = load_token()
if not token:
print(" 用法: python _build/ezhub_push.py <令牌>")
return 1
# 带令牌的 HTTPS 地址(只在这次进程里用,不写进 .git/config)
url = "https://%s:%s@%s/%s/%s.git" % (OWNER, token, HOST, OWNER, REPO)
print(" 推到 EzHub(HTTPS + 令牌)…")
result = subprocess.run([GIT, "push", url, "main"], cwd=str(ROOT),
capture_output=True, text=True,
encoding="utf-8", errors="replace")
err = (result.stderr or result.stdout or "").strip()
# 输出里可能带令牌,打码后再打印
safe = err.replace(token, "***")
for line in safe.splitlines()[-6:]:
# 远程 URL 里的令牌也打掉
line = line.replace(url, "https://%s:***@%s/%s/%s.git"
% (OWNER, HOST, OWNER, REPO))
print(" " + line)
if result.returncode != 0:
print(" [失败] exit=%s" % result.returncode)
return result.returncode
print(" ✓ 推完了")
return 0
if __name__ == "__main__":
sys.exit(main())