已合并
support pre commit function flow #2042
张旭创建于 4月2日
support pre commit function flow #2042
已合并
共 3 个文件变更+562-1
| @@ -61,4 +61,7 @@ ascend_download | |||
| 61 | tbetoolkits-*.log | 61 | tbetoolkits-*.log |
| 62 | *_result.csv | 62 | *_result.csv |
| 63 | 63 | ||
| 64 | -/third_party | 64 | +third_party/ |
| 65 | +oat_reports/ | ||
| 66 | + | ||
| 67 | +log/ | ||
| @@ -0,0 +1,18 @@ | |||
| 1 | +repos: | ||
| 2 | + - repo: https://github.com/pre-commit/mirrors-clang-format | ||
| 3 | + rev: v16.0.0 | ||
| 4 | + hooks: | ||
| 5 | + - id: clang-format | ||
| 6 | + types_or: [c++, c] | ||
| 7 | + | ||
| 8 | + # OAT compliance check (Open Source Audit Tool) | ||
| 9 | + - repo: local | ||
| 10 | + hooks: | ||
| 11 | + - id: oat-check | ||
| 12 | + name: OAT Compliance Check | ||
| 13 | + entry: bash scripts/oat_check.sh | ||
| 14 | + language: system | ||
| 15 | + pass_filenames: true | ||
| 16 | + types: [file] | ||
| 17 | + stages: [commit] | ||
| 18 | + verbose: true | ||
| @@ -0,0 +1,540 @@ | |||
| 1 | +#!/bin/sh | ||
| 2 | +# ----------------------------------------------------------------------------------------------------------- | ||
| 3 | +# Copyright (c) 2026 Huawei Technologies Co., Ltd. | ||
| 4 | +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of | ||
| 5 | +# CANN Open Software License Agreement Version 2.0 (the "License"). | ||
| 6 | +# Please refer to the License for details. You may not use this file except in compliance with the License. | ||
| 7 | +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, | ||
| 8 | +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. | ||
| 9 | +# See LICENSE in the root of the software repository for the full text of the License. | ||
| 10 | +# ----------------------------------------------------------------------------------------------------------- | ||
| 11 | +# OAT Pre-commit Check Script (for pre-commit framework) | ||
| 12 | +# This script is called by pre-commit framework automatically | ||
| 13 | +# | ||
| 14 | + | ||
| 15 | +# --- Self-healing: strip Windows CRLF line endings --- | ||
| 16 | +# When this script is edited on Windows, Git may introduce \r\n line endings | ||
| 17 | +# which cause "command not found" or syntax errors on Linux/macOS. | ||
| 18 | +# Solution: detect and strip \r in-place, then re-exec with a clean copy. | ||
| 19 | +# This block intentionally runs before 'set -e'. | ||
| 20 | +_SCRIPT="$(cd "$(dirname "$0")" && pwd)/$(basename "$0")" | ||
| 21 | +if sed 's/\r//' "$_SCRIPT" | diff -q - "$_SCRIPT" >/dev/null 2>&1; then | ||
| 22 | + : # No CRLF found, continue normally | ||
| 23 | +else | ||
| 24 | + echo "[OAT] CRLF line endings detected, auto-fixing script and re-running..." | ||
| 25 | + _TMP="${_SCRIPT}.lf" | ||
| 26 | + sed 's/\r//' "$_SCRIPT" > "$_TMP" && mv "$_TMP" "$_SCRIPT" | ||
| 27 | + exec sh "$_SCRIPT" "$@" | ||
| 28 | +fi | ||
| 29 | + | ||
| 30 | +set -e | ||
| 31 | + | ||
| 32 | +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd) | ||
| 33 | +REPO_NAME=$(basename "$REPO_ROOT") | ||
| 34 | +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) | ||
| 35 | +OAT_DIR="$REPO_ROOT/../tools_oat" | ||
| 36 | +OAT_GIT_URL="https://gitcode.com/openharmony-sig/tools_oat.git" | ||
| 37 | +OAT_JAR_PATTERN="$OAT_DIR/target/ohos_ossaudittool-*.jar" | ||
| 38 | +OAT_REPORT_DIR="$REPO_ROOT/oat_reports" | ||
| 39 | +OAT_POLICY="filetype:!binary~must|!archive~must;license:*@.*" | ||
| 40 | + | ||
| 41 | +echo "[OAT] Running OAT scan (binary files + license headers) - INCREMENTAL MODE..." | ||
| 42 | +echo "[OAT] Project: $REPO_NAME" | ||
| 43 | + | ||
| 44 | +# --- 1. Get list of files to be committed --- | ||
| 45 | +if [ $# -gt 0 ]; then | ||
| 46 | + # Files passed as arguments from pre-commit | ||
| 47 | + STAGED_FILES="$@" | ||
| 48 | + FILE_COUNT=$# | ||
| 49 | +else | ||
| 50 | + # Fallback: get from git | ||
| 51 | + STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM) | ||
| 52 | + if [ -z "$STAGED_FILES" ]; then | ||
| 53 | + echo "[OAT] No files to check. Skipping OAT scan." | ||
| 54 | + exit 0 | ||
| 55 | + fi | ||
| 56 | + FILE_COUNT=$(echo "$STAGED_FILES" | wc -l) | ||
| 57 | +fi | ||
| 58 | + | ||
| 59 | +echo "[OAT] Checking $FILE_COUNT staged file(s)..." | ||
| 60 | + | ||
| 61 | +# Convert file list to absolute paths and join with | | ||
| 62 | +FILE_LIST="" | ||
| 63 | +for file in $STAGED_FILES; do | ||
| 64 | + # Convert to absolute path if relative | ||
| 65 | + if [ "${file#/}" = "$file" ]; then | ||
| 66 | + # Relative path | ||
| 67 | + file="$REPO_ROOT/$file" | ||
| 68 | + fi | ||
| 69 | + | ||
| 70 | + if [ -z "$FILE_LIST" ]; then | ||
| 71 | + FILE_LIST="$file" | ||
| 72 | + else | ||
| 73 | + FILE_LIST="$FILE_LIST|$file" | ||
| 74 | + fi | ||
| 75 | +done | ||
| 76 | + | ||
| 77 | +# --- 2. Check Java environment --- | ||
| 78 | +echo "" | ||
| 79 | +echo "[OAT] Checking runtime environment..." | ||
| 80 | + | ||
| 81 | +if ! command -v java >/dev/null 2>&1; then | ||
| 82 | + echo "" | ||
| 83 | + echo "====================================================================" | ||
| 84 | + echo " Java 未安装 - 正在尝试自动安装" | ||
| 85 | + echo "====================================================================" | ||
| 86 | + echo "" | ||
| 87 | + echo "[OAT] 检测到系统未安装 Java,开始自动安装..." | ||
| 88 | + echo "[OAT] 注意: 首次安装需要下载约 50-100MB,可能需要 2-5 分钟" | ||
| 89 | + echo "" | ||
| 90 | + | ||
| 91 | + # Detect OS | ||
| 92 | + OS_TYPE="unknown" | ||
| 93 | + if [ "$(uname)" = "Linux" ]; then | ||
| 94 | + OS_TYPE="linux" | ||
| 95 | + elif [ "$(uname)" = "Darwin" ]; then | ||
| 96 | + OS_TYPE="macos" | ||
| 97 | + elif [ -n "$WINDIR" ] || [ "$(uname -o 2>/dev/null)" = "Msys" ] || [ "$(uname -o 2>/dev/null)" = "Cygwin" ]; then | ||
| 98 | + OS_TYPE="windows" | ||
| 99 | + fi | ||
| 100 | + | ||
| 101 | + echo "[OAT] 检测到操作系统: $OS_TYPE" | ||
| 102 | + echo "" | ||
| 103 | + | ||
| 104 | + JAVA_INSTALLED=false | ||
| 105 | + | ||
| 106 | + # Linux: 使用 apt / yum | ||
| 107 | + if [ "$OS_TYPE" = "linux" ]; then | ||
| 108 | + if command -v apt-get >/dev/null 2>&1; then | ||
| 109 | + echo "[OAT] 使用 apt 安装 OpenJDK 21..." | ||
| 110 | + echo "[OAT] 可能需要输入管理员密码" | ||
| 111 | + echo "" | ||
| 112 | + | ||
| 113 | + sudo apt-get update -qq >/dev/null 2>&1 | ||
| 114 | + sudo apt-get install -y openjdk-21-jre >/dev/null 2>&1 | ||
| 115 | + | ||
| 116 | + if [ $? -eq 0 ]; then | ||
| 117 | + JAVA_INSTALLED=true | ||
| 118 | + echo "[OAT] [OK] OpenJDK 21 安装成功" | ||
| 119 | + else | ||
| 120 | + echo "[OAT] [ERROR] 自动安装失败" | ||
| 121 | + fi | ||
| 122 | + elif command -v yum >/dev/null 2>&1; then | ||
| 123 | + echo "[OAT] 使用 yum 安装 OpenJDK 21..." | ||
| 124 | + sudo yum install -y java-21-openjdk >/dev/null 2>&1 | ||
| 125 | + | ||
| 126 | + if [ $? -eq 0 ]; then | ||
| 127 | + JAVA_INSTALLED=true | ||
| 128 | + echo "[OAT] [OK] OpenJDK 21 安装成功" | ||
| 129 | + fi | ||
| 130 | + fi | ||
| 131 | + | ||
| 132 | + # macOS: 使用 Homebrew | ||
| 133 | + elif [ "$OS_TYPE" = "macos" ]; then | ||
| 134 | + if command -v brew >/dev/null 2>&1; then | ||
| 135 | + echo "[OAT] 使用 Homebrew 安装 OpenJDK 21..." | ||
| 136 | + echo "[OAT] 这可能需要几分钟..." | ||
| 137 | + echo "" | ||
| 138 | + | ||
| 139 | + brew install openjdk@21 >/dev/null 2>&1 | ||
| 140 | + | ||
| 141 | + if [ $? -eq 0 ]; then | ||
| 142 | + JAVA_INSTALLED=true | ||
| 143 | + echo "[OAT] [OK] OpenJDK 21 安装成功" | ||
| 144 | + | ||
| 145 | + # Add to PATH for current session (Intel & Apple Silicon) | ||
| 146 | + if [ -d "/usr/local/opt/openjdk@21/bin" ]; then | ||
| 147 | + export PATH="/usr/local/opt/openjdk@21/bin:$PATH" | ||
| 148 | + elif [ -d "/opt/homebrew/opt/openjdk@21/bin" ]; then | ||
| 149 | + export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH" | ||
| 150 | + fi | ||
| 151 | + else | ||
| 152 | + echo "[OAT] [ERROR] 自动安装失败" | ||
| 153 | + fi | ||
| 154 | + else | ||
| 155 | + echo "[OAT] [ERROR] Homebrew 未安装" | ||
| 156 | + echo "[OAT] 请先安装 Homebrew: https://brew.sh/" | ||
| 157 | + fi | ||
| 158 | + | ||
| 159 | + # Windows: 提供下载链接(无法自动安装) | ||
| 160 | + elif [ "$OS_TYPE" = "windows" ]; then | ||
| 161 | + echo "[OAT] Windows 系统无法自动安装 Java" | ||
| 162 | + echo "[OAT] 请手动下载并安装 Java 23:" | ||
| 163 | + echo "" | ||
| 164 | + echo " 方式一(推荐)- Oracle JDK 23 官方安装包:" | ||
| 165 | + echo " https://www.oracle.com/java/technologies/downloads/#java23-windows" | ||
| 166 | + echo " 下载 Windows x64 Installer (.exe) 直接安装" | ||
| 167 | + echo "" | ||
| 168 | + echo " 方式二 - Scoop(命令行安装):" | ||
| 169 | + echo " scoop bucket add java" | ||
| 170 | + echo " scoop install temurin23-jdk" | ||
| 171 | + echo "" | ||
| 172 | + echo " 安装后重启 Git Bash,验证: java -version" | ||
| 173 | + echo "" | ||
| 174 | + echo "[OAT] 跳过 OAT 检查,继续提交..." | ||
| 175 | + echo "[OAT] 建议安装 Java 后再次运行检查" | ||
| 176 | + echo "" | ||
| 177 | + exit 0 | ||
| 178 | + fi | ||
| 179 | + | ||
| 180 | + # Verify installation | ||
| 181 | + if [ "$JAVA_INSTALLED" = true ]; then | ||
| 182 | + if command -v java >/dev/null 2>&1; then | ||
| 183 | + JAVA_VERSION=$(java -version 2>&1 | head -n 1) | ||
| 184 | + echo "[OAT] [OK] Java 安装验证通过: $JAVA_VERSION" | ||
| 185 | + echo "" | ||
| 186 | + else | ||
| 187 | + echo "[OAT] [ERROR] Java 安装后仍无法使用,可能需要重启终端" | ||
| 188 | + echo "" | ||
| 189 | + echo "请尝试:" | ||
| 190 | + echo " 1. 关闭并重新打开终端" | ||
| 191 | + echo " 2. 运行: source ~/.bashrc (Linux) 或 source ~/.zshrc (macOS)" | ||
| 192 | + echo " 3. 重新提交: git commit" | ||
| 193 | + echo "" | ||
| 194 | + echo "[OAT] 跳过 OAT 检查,继续提交..." | ||
| 195 | + echo "[OAT] 建议重启终端后再次运行检查" | ||
| 196 | + echo "" | ||
| 197 | + exit 0 | ||
| 198 | + fi | ||
| 199 | + else | ||
| 200 | + echo "" | ||
| 201 | + echo "[OAT] 自动安装失败,跳过 OAT 检查" | ||
| 202 | + echo "" | ||
| 203 | + echo "手动安装方法:" | ||
| 204 | + echo " Linux: sudo apt install openjdk-21-jre" | ||
| 205 | + echo " macOS: brew install openjdk@21" | ||
| 206 | + echo " Windows: https://www.oracle.com/java/technologies/downloads/#java23-windows" | ||
| 207 | + echo "" | ||
| 208 | + echo "[OAT] 继续提交(未进行合规性检查)..." | ||
| 209 | + echo "[OAT] 建议安装 Java 后再次运行: pre-commit run oat-check" | ||
| 210 | + echo "" | ||
| 211 | + exit 0 | ||
| 212 | + fi | ||
| 213 | +fi | ||
| 214 | + | ||
| 215 | +JAVA_VERSION=$(java -version 2>&1 | head -n 1) | ||
| 216 | +echo " [OK] Java: $JAVA_VERSION" | ||
| 217 | + | ||
| 218 | +# --- 3. Check Maven environment --- | ||
| 219 | +echo "" | ||
| 220 | +echo "[OAT] Checking Maven environment..." | ||
| 221 | + | ||
| 222 | +if ! command -v mvn >/dev/null 2>&1; then | ||
| 223 | + echo "" | ||
| 224 | + echo "====================================================================" | ||
| 225 | + echo " Maven 未安装 - 正在尝试自动安装" | ||
| 226 | + echo "====================================================================" | ||
| 227 | + echo "" | ||
| 228 | + echo "[OAT] 检测到系统未安装 Maven,开始自动安装..." | ||
| 229 | + echo "[OAT] 注意: 首次安装需要下载约 10-20MB" | ||
| 230 | + echo "" | ||
| 231 | + | ||
| 232 | + # Detect OS | ||
| 233 | + OS_TYPE="unknown" | ||
| 234 | + if [ "$(uname)" = "Linux" ]; then | ||
| 235 | + OS_TYPE="linux" | ||
| 236 | + elif [ "$(uname)" = "Darwin" ]; then | ||
| 237 | + OS_TYPE="macos" | ||
| 238 | + elif [ -n "$WINDIR" ] || [ "$(uname -o 2>/dev/null)" = "Msys" ] || [ "$(uname -o 2>/dev/null)" = "Cygwin" ]; then | ||
| 239 | + OS_TYPE="windows" | ||
| 240 | + fi | ||
| 241 | + | ||
| 242 | + echo "[OAT] 检测到操作系统: $OS_TYPE" | ||
| 243 | + echo "" | ||
| 244 | + | ||
| 245 | + MAVEN_INSTALLED=false | ||
| 246 | + | ||
| 247 | + # Linux: 使用 apt | ||
| 248 | + if [ "$OS_TYPE" = "linux" ]; then | ||
| 249 | + if command -v apt-get >/dev/null 2>&1; then | ||
| 250 | + echo "[OAT] 使用 apt 安装 Maven..." | ||
| 251 | + echo "[OAT] 可能需要输入管理员密码" | ||
| 252 | + echo "" | ||
| 253 | + | ||
| 254 | + sudo apt-get update -qq >/dev/null 2>&1 | ||
| 255 | + sudo apt-get install -y maven >/dev/null 2>&1 | ||
| 256 | + | ||
| 257 | + if [ $? -eq 0 ]; then | ||
| 258 | + MAVEN_INSTALLED=true | ||
| 259 | + echo "[OAT] [OK] Maven 安装成功" | ||
| 260 | + else | ||
| 261 | + echo "[OAT] [ERROR] 自动安装失败" | ||
| 262 | + fi | ||
| 263 | + elif command -v yum >/dev/null 2>&1; then | ||
| 264 | + echo "[OAT] 使用 yum 安装 Maven..." | ||
| 265 | + sudo yum install -y maven >/dev/null 2>&1 | ||
| 266 | + | ||
| 267 | + if [ $? -eq 0 ]; then | ||
| 268 | + MAVEN_INSTALLED=true | ||
| 269 | + echo "[OAT] [OK] Maven 安装成功" | ||
| 270 | + fi | ||
| 271 | + fi | ||
| 272 | + | ||
| 273 | + # macOS: 使用 Homebrew | ||
| 274 | + elif [ "$OS_TYPE" = "macos" ]; then | ||
| 275 | + if command -v brew >/dev/null 2>&1; then | ||
| 276 | + echo "[OAT] 使用 Homebrew 安装 Maven..." | ||
| 277 | + echo "[OAT] 这可能需要几分钟..." | ||
| 278 | + echo "" | ||
| 279 | + | ||
| 280 | + brew install maven >/dev/null 2>&1 | ||
| 281 | + | ||
| 282 | + if [ $? -eq 0 ]; then | ||
| 283 | + MAVEN_INSTALLED=true | ||
| 284 | + echo "[OAT] [OK] Maven 安装成功" | ||
| 285 | + else | ||
| 286 | + echo "[OAT] [ERROR] 自动安装失败" | ||
| 287 | + fi | ||
| 288 | + else | ||
| 289 | + echo "[OAT] [ERROR] Homebrew 未安装" | ||
| 290 | + echo "[OAT] 请先安装 Homebrew: https://brew.sh/" | ||
| 291 | + fi | ||
| 292 | + | ||
| 293 | + # Windows: 提供下载链接(无法自动安装) | ||
| 294 | + elif [ "$OS_TYPE" = "windows" ]; then | ||
| 295 | + echo "[OAT] Windows 系统无法自动安装 Maven" | ||
| 296 | + echo "[OAT] 请手动下载并安装:" | ||
| 297 | + echo "" | ||
| 298 | + echo " 1. 访问: https://maven.apache.org/download.cgi" | ||
| 299 | + echo " 2. 下载: apache-maven-3.x.x-bin.zip" | ||
| 300 | + echo " 3. 解压到 C:\\Program Files\\apache-maven-3.x.x" | ||
| 301 | + echo " 4. 添加到系统 PATH" | ||
| 302 | + echo " 5. 重启 Git Bash" | ||
| 303 | + echo " 6. 验证: mvn -version" | ||
| 304 | + echo "" | ||
| 305 | + echo "[OAT] 跳过 OAT 检查,继续提交..." | ||
| 306 | + echo "[OAT] 建议安装 Maven 后再次运行检查" | ||
| 307 | + echo "" | ||
| 308 | + exit 0 | ||
| 309 | + fi | ||
| 310 | + | ||
| 311 | + # Verify installation | ||
| 312 | + if [ "$MAVEN_INSTALLED" = true ]; then | ||
| 313 | + if command -v mvn >/dev/null 2>&1; then | ||
| 314 | + MAVEN_VERSION=$(mvn -version 2>&1 | head -n 1) | ||
| 315 | + echo "[OAT] [OK] Maven 安装验证通过: $MAVEN_VERSION" | ||
| 316 | + echo "" | ||
| 317 | + else | ||
| 318 | + echo "[OAT] [ERROR] Maven 安装后仍无法使用,可能需要重启终端" | ||
| 319 | + echo "" | ||
| 320 | + echo "请尝试:" | ||
| 321 | + echo " 1. 关闭并重新打开终端" | ||
| 322 | + echo " 2. 运行: source ~/.bashrc (Linux) 或 source ~/.zshrc (macOS)" | ||
| 323 | + echo " 3. 重新提交: git commit" | ||
| 324 | + echo "" | ||
| 325 | + echo "[OAT] 跳过 OAT 检查,继续提交..." | ||
| 326 | + echo "[OAT] 建议重启终端后再次运行检查" | ||
| 327 | + echo "" | ||
| 328 | + exit 0 | ||
| 329 | + fi | ||
| 330 | + else | ||
| 331 | + echo "" | ||
| 332 | + echo "[OAT] 自动安装失败,跳过 OAT 检查" | ||
| 333 | + echo "" | ||
| 334 | + echo "手动安装方法:" | ||
| 335 | + echo " Linux: sudo apt install maven" | ||
| 336 | + echo " macOS: brew install maven" | ||
| 337 | + echo " Windows: https://maven.apache.org/download.cgi" | ||
| 338 | + echo "" | ||
| 339 | + echo "[OAT] 继续提交(未进行合规性检查)..." | ||
| 340 | + echo "[OAT] 建议安装 Maven 后再次运行: pre-commit run oat-check" | ||
| 341 | + echo "" | ||
| 342 | + exit 0 | ||
| 343 | + fi | ||
| 344 | +fi | ||
| 345 | + | ||
| 346 | +MAVEN_VERSION=$(mvn -version 2>&1 | head -n 1) | ||
| 347 | +echo " [OK] Maven: $MAVEN_VERSION" | ||
| 348 | + | ||
| 349 | +# --- 4. Clone tools_oat if not present --- | ||
| 350 | +if [ ! -d "$OAT_DIR" ]; then | ||
| 351 | + echo "" | ||
| 352 | + echo "[OAT] tools_oat not found. Cloning..." | ||
| 353 | + git clone "$OAT_GIT_URL" "$OAT_DIR" --depth=1 >/dev/null 2>&1 | ||
| 354 | + if [ $? -ne 0 ]; then | ||
| 355 | + echo "[OAT] [ERROR] Failed to clone tools_oat." | ||
| 356 | + echo "[OAT] You can manually clone from: $OAT_GIT_URL" | ||
| 357 | + exit 1 | ||
| 358 | + fi | ||
| 359 | + echo "[OAT] [OK] tools_oat cloned successfully." | ||
| 360 | +fi | ||
| 361 | + | ||
| 362 | +# --- 5. Build OAT jar if not present --- | ||
| 363 | +OAT_JAR=$(ls $OAT_JAR_PATTERN 2>/dev/null | head -n 1) | ||
| 364 | + | ||
| 365 | +if [ -z "$OAT_JAR" ]; then | ||
| 366 | + echo "" | ||
| 367 | + echo "[OAT] Building OAT jar with Maven..." | ||
| 368 | + echo "[OAT] This may take a few minutes (first time only)..." | ||
| 369 | + | ||
| 370 | + cd "$OAT_DIR" | ||
| 371 | + # Force UTF-8 for entire Maven JVM process (fixes GBK default on Java 11/Windows) | ||
| 372 | + JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8" \ | ||
| 373 | + mvn package -q -DskipTests \ | ||
| 374 | + -Dfile.encoding=UTF-8 \ | ||
| 375 | + -Dproject.build.sourceEncoding=UTF-8 \ | ||
| 376 | + -Dproject.reporting.outputEncoding=UTF-8 \ | ||
| 377 | + 2>&1 | grep -E "(Building|BUILD SUCCESS|BUILD FAILURE|ERROR)" || true | ||
| 378 | + BUILD_RESULT=${PIPESTATUS[0]} | ||
| 379 | + cd - >/dev/null | ||
| 380 | + | ||
| 381 | + OAT_JAR=$(ls $OAT_JAR_PATTERN 2>/dev/null | head -n 1) | ||
| 382 | + | ||
| 383 | + if [ -z "$OAT_JAR" ] || [ $BUILD_RESULT -ne 0 ]; then | ||
| 384 | + echo "" | ||
| 385 | + echo "====================================================================" | ||
| 386 | + echo " Maven 打包失败" | ||
| 387 | + echo "====================================================================" | ||
| 388 | + echo "" | ||
| 389 | + echo "[OAT] 无法打包 OAT JAR,跳过 OAT 检查" | ||
| 390 | + echo "" | ||
| 391 | + echo "可能原因:" | ||
| 392 | + echo " 1. Maven 配置问题" | ||
| 393 | + echo " 2. 网络连接问题(无法下载依赖)" | ||
| 394 | + echo " 3. pom.xml 配置错误" | ||
| 395 | + echo "" | ||
| 396 | + echo "建议解决方案:" | ||
| 397 | + echo " 1. 手动打包:" | ||
| 398 | + echo " cd $OAT_DIR" | ||
| 399 | + echo " mvn clean package -DskipTests" | ||
| 400 | + echo "" | ||
| 401 | + echo " 2. 配置 Maven 镜像(国内网络):" | ||
| 402 | + echo " 编辑 ~/.m2/settings.xml 添加阿里云镜像" | ||
| 403 | + echo "" | ||
| 404 | + echo "[OAT] 继续提交(未进行合规性检查)..." | ||
| 405 | + echo "[OAT] 建议修复打包问题后运行: pre-commit run oat-check" | ||
| 406 | + echo "" | ||
| 407 | + exit 0 | ||
| 408 | + fi | ||
| 409 | + | ||
| 410 | + echo "[OAT] [OK] OAT jar built successfully." | ||
| 411 | + echo "[OAT] JAR location: $OAT_JAR" | ||
| 412 | +fi | ||
| 413 | + | ||
| 414 | +echo "" | ||
| 415 | +echo " [OK] OAT JAR: $OAT_JAR" | ||
| 416 | + | ||
| 417 | +# --- 6. Run OAT scan in INCREMENTAL mode --- | ||
| 418 | +mkdir -p "$OAT_REPORT_DIR" | ||
| 419 | + | ||
| 420 | +# --- Ensure OAT output dirs are in .gitignore (after dirs are created) --- | ||
| 421 | +GITIGNORE_FILE="$REPO_ROOT/.gitignore" | ||
| 422 | +for _entry in "oat_reports" "log"; do | ||
| 423 | + # Strip \r before grep to handle CRLF files (Windows) | ||
| 424 | + if ! sed 's/\r//' "$GITIGNORE_FILE" 2>/dev/null | grep -qE "^${_entry}/?$"; then | ||
| 425 | + # Use awk to safely append: ensures a leading newline if file doesn't end with one. | ||
| 426 | + # This is fully POSIX-compatible and works on both Windows (Git Bash) and Linux. | ||
| 427 | + awk -v entry="${_entry}/" ' | ||
| 428 | + BEGIN { needs_newline = 0 } | ||
| 429 | + { last_line = $0; has_content = 1 } | ||
| 430 | + END { | ||
| 431 | + if (has_content && last_line !~ /^[[:space:]]*$/) { | ||
| 432 | + printf "\n" | ||
| 433 | + } | ||
| 434 | + printf "%s\n", entry | ||
| 435 | + } | ||
| 436 | + ' "$GITIGNORE_FILE" >> "$GITIGNORE_FILE" 2>/dev/null \ | ||
| 437 | + || printf "\n%s/\n" "$_entry" >> "$GITIGNORE_FILE" | ||
| 438 | + echo "[OAT] 已将 ${_entry}/ 添加到 .gitignore" | ||
| 439 | + fi | ||
| 440 | +done | ||
| 441 | + | ||
| 442 | +echo "" | ||
| 443 | +echo "[OAT] Running compliance scan..." | ||
| 444 | +java -jar "$OAT_JAR" \ | ||
| 445 | + -mode s \ | ||
| 446 | + -s "$REPO_ROOT" \ | ||
| 447 | + -r "$OAT_REPORT_DIR" \ | ||
| 448 | + -n "$REPO_NAME" \ | ||
| 449 | + -w 1 \ | ||
| 450 | + -f "$FILE_LIST" \ | ||
| 451 | + -policy "$OAT_POLICY" >/dev/null 2>&1 | ||
| 452 | + | ||
| 453 | +if [ $? -ne 0 ]; then | ||
| 454 | + echo "" | ||
| 455 | + echo "====================================================================" | ||
| 456 | + echo " OAT 扫描执行失败" | ||
| 457 | + echo "====================================================================" | ||
| 458 | + echo "" | ||
| 459 | + echo "[OAT] 扫描失败,跳过 OAT 检查" | ||
| 460 | + echo "" | ||
| 461 | + echo "可能原因:" | ||
| 462 | + echo " 1. JAR 文件损坏" | ||
| 463 | + echo " 2. Java 版本不兼容" | ||
| 464 | + echo " 3. OAT 配置问题" | ||
| 465 | + echo "" | ||
| 466 | + echo "建议解决方案:" | ||
| 467 | + echo " 1. 删除并重新打包 JAR:" | ||
| 468 | + echo " rm $OAT_JAR" | ||
| 469 | + echo " cd $OAT_DIR && mvn clean package -DskipTests" | ||
| 470 | + echo "" | ||
| 471 | + echo " 2. 检查 Java 版本(需要 Java 8+):" | ||
| 472 | + echo " java -version" | ||
| 473 | + echo "" | ||
| 474 | + echo "[OAT] 继续提交(未进行合规性检查)..." | ||
| 475 | + echo "[OAT] 建议修复扫描问题后运行: pre-commit run oat-check" | ||
| 476 | + echo "" | ||
| 477 | + exit 0 | ||
| 478 | +fi | ||
| 479 | + | ||
| 480 | +# --- 7. Check report and generate result.txt --- | ||
| 481 | +REPORT_FILE="$OAT_REPORT_DIR/single/PlainReport_${REPO_NAME}.txt" | ||
| 482 | +RESULT_FILE="$OAT_REPORT_DIR/single/result.txt" | ||
| 483 | + | ||
| 484 | +if [ -f "$REPORT_FILE" ]; then | ||
| 485 | + # Extract key information to result.txt | ||
| 486 | + { | ||
| 487 | + echo "===================================" | ||
| 488 | + echo "OAT Scan Result Summary" | ||
| 489 | + echo "===================================" | ||
| 490 | + echo "Scan Time: $(date '+%Y-%m-%d %H:%M:%S')" | ||
| 491 | + echo "Project: $REPO_NAME" | ||
| 492 | + echo "Files Checked: $FILE_COUNT" | ||
| 493 | + echo "" | ||
| 494 | + | ||
| 495 | + # Extract Invalid File Type section | ||
| 496 | + echo "-----------------------------------" | ||
| 497 | + awk '/^Invalid File Type Total Count:/{found=1} found{print; if(/^$/ && NR>1 && prev!~/^$/)exit} {prev=$0}' "$REPORT_FILE" | ||
| 498 | + | ||
| 499 | + # Extract License Header Invalid section | ||
| 500 | + echo "-----------------------------------" | ||
| 501 | + awk '/^License Header Invalid Total Count:/{found=1} found{print; if(/^$/ && NR>1 && prev!~/^$/)exit} {prev=$0}' "$REPORT_FILE" | ||
| 502 | + | ||
| 503 | + echo "===================================" | ||
| 504 | + } > "$RESULT_FILE" | ||
| 505 | + | ||
| 506 | + # Check for issues (read from result.txt instead of PlainReport) | ||
| 507 | + INVALID_FILE_TYPE=$(grep "^Invalid File Type Total Count:" "$RESULT_FILE" | grep -oE '[0-9]+' | head -1) | ||
| 508 | + LICENSE_INVALID=$(grep "^License Header Invalid Total Count:" "$RESULT_FILE" | grep -oE '[0-9]+' | head -1) | ||
| 509 | + | ||
| 510 | + # Delete PlainReport files to keep only result.txt | ||
| 511 | + echo "[OAT] Cleaning up redundant reports..." | ||
| 512 | + rm -f "$OAT_REPORT_DIR/single/PlainReport_"*.txt | ||
| 513 | + | ||
| 514 | + TOTAL_ISSUES=$((INVALID_FILE_TYPE + LICENSE_INVALID)) | ||
| 515 | + | ||
| 516 | + if [ "$TOTAL_ISSUES" -gt 0 ]; then | ||
| 517 | + echo "" | ||
| 518 | + echo "====================================================================" | ||
| 519 | + echo " 发现合规性问题" | ||
| 520 | + echo "====================================================================" | ||
| 521 | + echo "" | ||
| 522 | + echo "[OAT] Found $TOTAL_ISSUES compliance issue(s):" | ||
| 523 | + echo " - Invalid File Type: $INVALID_FILE_TYPE" | ||
| 524 | + echo " - License Header Invalid: $LICENSE_INVALID" | ||
| 525 | + echo "" | ||
| 526 | + echo "[OAT] 查看详细信息:" | ||
| 527 | + echo " cat $RESULT_FILE" | ||
| 528 | + echo "" | ||
| 529 | + echo "或临时跳过检查:" | ||
| 530 | + echo " git commit --no-verify" | ||
| 531 | + echo "" | ||
| 532 | + exit 1 | ||
| 533 | + fi | ||
| 534 | +fi | ||
| 535 | + | ||
| 536 | +echo "" | ||
| 537 | +echo "[OAT] [OK] All checks passed ($FILE_COUNT file(s) checked)." | ||
| 538 | +echo "[OAT] 查看扫描摘要: cat $RESULT_FILE" | ||
| 539 | +echo "" | ||
| 540 | +exit 0 | ||