|
@@ -95,15 +95,21 @@ echo "🚀 正在运行代码质量检查..."
|
|
|
echo "========================================"
|
|
echo "========================================"
|
|
|
echo "模式: ${MODE}"
|
|
echo "模式: ${MODE}"
|
|
|
|
|
|
|
|
|
|
+# 工作根:优先 WORKSPACE_ROOT;容器内默认 /workspace,宿主机上回退当前 git 仓库根/当前目录
|
|
|
|
|
+WORKSPACE_ROOT="${WORKSPACE_ROOT:-/workspace}"
|
|
|
|
|
+if [ ! -d "$WORKSPACE_ROOT" ]; then
|
|
|
|
|
+ WORKSPACE_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
# 切换到工作目录(文件收集阶段;实际运行 trunk 前会再切到目标仓库根)
|
|
# 切换到工作目录(文件收集阶段;实际运行 trunk 前会再切到目标仓库根)
|
|
|
-cd /workspace || exit
|
|
|
|
|
|
|
+cd "$WORKSPACE_ROOT" || exit
|
|
|
|
|
|
|
|
-# 解析 trunk 二进制(优先级:TRUNK_BIN 环境变量 > /workspace/trunk > PATH 中的 trunk)
|
|
|
|
|
|
|
+# 解析 trunk 二进制(优先级:TRUNK_BIN 环境变量 > $WORKSPACE_ROOT/trunk > PATH 中的 trunk)
|
|
|
resolve_trunk() {
|
|
resolve_trunk() {
|
|
|
if [[ -n ${TRUNK_BIN-} ]] && [[ -x ${TRUNK_BIN} ]]; then
|
|
if [[ -n ${TRUNK_BIN-} ]] && [[ -x ${TRUNK_BIN} ]]; then
|
|
|
printf '%s\n' "${TRUNK_BIN}"
|
|
printf '%s\n' "${TRUNK_BIN}"
|
|
|
- elif [[ -x /workspace/trunk ]]; then
|
|
|
|
|
- printf '%s\n' /workspace/trunk
|
|
|
|
|
|
|
+ elif [[ -x "${WORKSPACE_ROOT}/trunk" ]]; then
|
|
|
|
|
+ printf '%s\n' "${WORKSPACE_ROOT}/trunk"
|
|
|
elif command -v trunk >/dev/null 2>&1; then
|
|
elif command -v trunk >/dev/null 2>&1; then
|
|
|
command -v trunk
|
|
command -v trunk
|
|
|
else
|
|
else
|
|
@@ -187,7 +193,7 @@ echo ""
|
|
|
# 确定目标所在的 git 仓库根并切换(子模块是独立 git 仓库,需在各自仓库根运行 trunk)
|
|
# 确定目标所在的 git 仓库根并切换(子模块是独立 git 仓库,需在各自仓库根运行 trunk)
|
|
|
if [[ -n ${ALL_FILES} ]]; then
|
|
if [[ -n ${ALL_FILES} ]]; then
|
|
|
FIRST_FILE="$(printf '%s\n' "${ALL_FILES}" | head -n 1)"
|
|
FIRST_FILE="$(printf '%s\n' "${ALL_FILES}" | head -n 1)"
|
|
|
- REPO_ROOT="$(git -C "$(dirname "${FIRST_FILE}")" rev-parse --show-toplevel 2>/dev/null || echo /workspace)"
|
|
|
|
|
|
|
+ REPO_ROOT="$(git -C "$(dirname "${FIRST_FILE}")" rev-parse --show-toplevel 2>/dev/null || echo "$WORKSPACE_ROOT")"
|
|
|
else
|
|
else
|
|
|
REPO_ROOT="/workspace"
|
|
REPO_ROOT="/workspace"
|
|
|
fi
|
|
fi
|
|
@@ -199,8 +205,10 @@ echo "🔍 正在运行代码质量检查..."
|
|
|
# 文件数量过多时,直接以 ${ALL_FILES} 展开成 argv 会超过 ARG_MAX(如根仓库 3 万+ 文件
|
|
# 文件数量过多时,直接以 ${ALL_FILES} 展开成 argv 会超过 ARG_MAX(如根仓库 3 万+ 文件
|
|
|
# ≈ 2.8MB > 2MB),触发 "Argument list too long"(E2BIG)。
|
|
# ≈ 2.8MB > 2MB),触发 "Argument list too long"(E2BIG)。
|
|
|
# 改为换行分隔经 xargs 按字节上限自动分批调用;任一批次失败即整体失败。
|
|
# 改为换行分隔经 xargs 按字节上限自动分批调用;任一批次失败即整体失败。
|
|
|
|
|
+# 用 `tr '\n' '\0' | xargs -0 -s` 而非 GNU 专有的 `xargs -d`/`-r`,兼容 macOS(BSD) xargs;
|
|
|
|
|
+# 空输入已在上面提前 exit 0,故无需 -r 的"空不执行"语义。
|
|
|
TRUNK_BATCH_BYTES="${TRUNK_BATCH_BYTES:-131072}"
|
|
TRUNK_BATCH_BYTES="${TRUNK_BATCH_BYTES:-131072}"
|
|
|
-if ! printf '%s\n' "${ALL_FILES}" | xargs -d '\n' -r -s "${TRUNK_BATCH_BYTES}" "${TRUNK_BIN}" check; then
|
|
|
|
|
|
|
+if ! printf '%s\n' "${ALL_FILES}" | tr '\n' '\0' | xargs -0 -s "${TRUNK_BATCH_BYTES}" "${TRUNK_BIN}" check; then
|
|
|
echo ""
|
|
echo ""
|
|
|
echo "❌ 代码质量检查失败!"
|
|
echo "❌ 代码质量检查失败!"
|
|
|
echo ""
|
|
echo ""
|