127 lines
2.6 KiB
Bash
Executable File
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 $? |