NLDClient-yudde/Tool/GitHooks/pre-commit

127 lines
2.6 KiB
Bash
Executable File

#!/bin/sh
###################
# 配置区域开始
###################
# 检查规则配置
FORBIDDEN_PATTERNS=(
"Forbidden to commit:检查到禁止提交的标记"
)
# 特定目录的检查规则
DIRECTORY_RULES=(
"ProjectNLD/Assets/Code/:using NPOI:检查到禁止的 NPOI 引用"
"ProjectNLD/Assets/Code/:using dnlib:检查到禁止的 dnlib 引用"
)
# 文件类型限制
FILE_PATTERNS=(
"\.cs$"
)
###################
# 配置区域结束
###################
echo "开始执行 pre-commit 检查..."
# 检查文件是否匹配指定模式
is_target_file() {
local file="$1"
for pattern in "${FILE_PATTERNS[@]}"; do
if [[ "$file" =~ $pattern ]]; then
return 0
fi
done
return 1
}
# 检查通用禁止模式
check_forbidden_patterns() {
local file="$1"
for rule in "${FORBIDDEN_PATTERNS[@]}"; do
local pattern="${rule%%:*}"
local message="${rule#*:}"
if git diff --cached --unified=0 -- "$file" | grep -v '^-' | grep -q "$pattern"; then
echo "错误: $file $message"
return 1
fi
done
return 0
}
# 检查目录特定规则
check_directory_rules() {
local file="$1"
for rule in "${DIRECTORY_RULES[@]}"; do
local dir="${rule%%:*}"
local remaining="${rule#*:}"
local pattern="${remaining%%:*}"
local message="${remaining#*:}"
if [[ $file == *"$dir"* ]]; then
if git diff --cached --unified=0 -- "$file" | grep -v '^-' | grep -q "$pattern"; then
echo "错误: $file $message"
return 1
fi
fi
done
return 0
}
# 检查单个文件
check_file() {
local file="$1"
# 检查文件类型
if ! is_target_file "$file"; then
return 0
fi
echo "检查文件: $file"
# 检查禁止模式
if ! check_forbidden_patterns "$file"; then
return 1
fi
# 检查目录规则
if ! check_directory_rules "$file"; then
return 1
fi
return 0
}
# 主检查函数
main() {
local exit_code=0
local files
# 获取所有待提交的文件
files=$(git diff --cached --name-only)
# 逐个检查文件
for file in $files; do
if ! check_file "$file"; then
exit_code=1
break
fi
done
if [ $exit_code -eq 1 ]; then
echo "❌ pre-commit 检查失败,提交已取消"
return 1
else
echo "✅ pre-commit 检查通过,允许提交"
return 0
fi
}
main
exit $?