pre-merge-consistency-check.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #!/bin/bash
  2. # 合并前一致性检查脚本
  3. set -e
  4. FEATURE_BRANCH="$1"
  5. TARGET_BRANCH="${2:-main}"
  6. if [[ -z "$FEATURE_BRANCH" ]]; then
  7. echo "❌ 用法: $0 <feature-branch> [target-branch]"
  8. exit 1
  9. fi
  10. echo "🔍 执行Feature一致性检查..."
  11. echo "分支: $FEATURE_BRANCH -> $TARGET_BRANCH"
  12. echo "================================"
  13. # 1. 基础检查
  14. echo "1️⃣ 基础检查..."
  15. # 检查分支是否存在
  16. if ! git rev-parse --verify "$FEATURE_BRANCH" >/dev/null 2>&1; then
  17. echo "❌ 分支 $FEATURE_BRANCH 不存在"
  18. exit 1
  19. fi
  20. # 检查是否有未提交的更改
  21. if ! git diff-index --quiet HEAD --; then
  22. echo "❌ 存在未提交的更改,请先提交"
  23. exit 1
  24. fi
  25. # 2. 检查合并冲突
  26. echo "2️⃣ 检查合并冲突..."
  27. CURRENT_BRANCH=$(git branch --show-current)
  28. git checkout "$TARGET_BRANCH" >/dev/null 2>&1
  29. git pull origin "$TARGET_BRANCH" >/dev/null 2>&1
  30. # 尝试合并测试
  31. if ! git merge --no-commit --no-ff "$FEATURE_BRANCH" >/dev/null 2>&1; then
  32. echo "❌ 检测到合并冲突,请先解决冲突"
  33. git merge --abort >/dev/null 2>&1
  34. git checkout "$CURRENT_BRANCH" >/dev/null 2>&1
  35. exit 1
  36. else
  37. echo "✅ 无合并冲突"
  38. git merge --abort >/dev/null 2>&1
  39. fi
  40. git checkout "$CURRENT_BRANCH" >/dev/null 2>&1
  41. # 3. TypeScript编译检查
  42. echo "3️⃣ TypeScript编译检查..."
  43. if command -v tsc >/dev/null 2>&1; then
  44. if ! npx tsc --noEmit --skipLibCheck; then
  45. echo "❌ TypeScript编译失败"
  46. exit 1
  47. fi
  48. echo "✅ TypeScript编译通过"
  49. else
  50. echo "⚠️ 未找到TypeScript编译器,跳过编译检查"
  51. fi
  52. # 4. 共享组件版本检查
  53. echo "4️⃣ 共享组件版本检查..."
  54. check_component_compatibility() {
  55. local component_file="$1"
  56. local component_name="$2"
  57. if [[ -f "$component_file" ]]; then
  58. # 检查是否有破坏性变更
  59. git checkout "$TARGET_BRANCH" >/dev/null 2>&1
  60. local main_hash=""
  61. if [[ -f "$component_file" ]]; then
  62. main_hash=$(git rev-parse HEAD:"$component_file" 2>/dev/null || echo "")
  63. fi
  64. git checkout "$CURRENT_BRANCH" >/dev/null 2>&1
  65. local feature_hash=""
  66. if [[ -f "$component_file" ]]; then
  67. feature_hash=$(git rev-parse HEAD:"$component_file" 2>/dev/null || echo "")
  68. fi
  69. if [[ -n "$main_hash" && -n "$feature_hash" && "$main_hash" != "$feature_hash" ]]; then
  70. echo " ⚠️ $component_name 在feature分支中被修改"
  71. # 检查是否为向后兼容的修改
  72. git checkout "$TARGET_BRANCH" >/dev/null 2>&1
  73. local main_exports=$(grep -E "^export " "$component_file" 2>/dev/null | sort || true)
  74. git checkout "$CURRENT_BRANCH" >/dev/null 2>&1
  75. local feature_exports=$(grep -E "^export " "$component_file" 2>/dev/null | sort || true)
  76. if [[ "$main_exports" != "$feature_exports" ]]; then
  77. echo " ❌ $component_name 的导出接口发生变化,可能不兼容"
  78. return 1
  79. else
  80. echo " ✅ $component_name 导出接口保持兼容"
  81. fi
  82. else
  83. echo " ✅ $component_name 无变更"
  84. fi
  85. fi
  86. return 0
  87. }
  88. COMPATIBILITY_ISSUES=0
  89. # 检查关键共享组件
  90. check_component_compatibility "src/modules/account/AccountManager.ts" "AccountManager" || COMPATIBILITY_ISSUES=1
  91. check_component_compatibility "src/modules/trading/PriceManager.ts" "PriceManager" || COMPATIBILITY_ISSUES=1
  92. check_component_compatibility "src/exchanges/pacifica/PacificaProxyClient.ts" "PacificaProxyClient" || COMPATIBILITY_ISSUES=1
  93. if [[ $COMPATIBILITY_ISSUES -eq 0 ]]; then
  94. echo "✅ 共享组件兼容性检查通过"
  95. fi
  96. # 5. 配置文件冲突检查
  97. echo "5️⃣ 配置文件冲突检查..."
  98. check_config_conflicts() {
  99. local config_files=(
  100. "package.json"
  101. "tsconfig.json"
  102. ".env.example"
  103. "CLAUDE.md"
  104. )
  105. local conflicts_found=0
  106. for config_file in "${config_files[@]}"; do
  107. if [[ -f "$config_file" ]]; then
  108. git checkout "$TARGET_BRANCH" >/dev/null 2>&1
  109. local main_config=""
  110. if [[ -f "$config_file" ]]; then
  111. main_config=$(cat "$config_file" 2>/dev/null || echo "")
  112. fi
  113. git checkout "$CURRENT_BRANCH" >/dev/null 2>&1
  114. local feature_config=""
  115. if [[ -f "$config_file" ]]; then
  116. feature_config=$(cat "$config_file" 2>/dev/null || echo "")
  117. fi
  118. if [[ "$main_config" != "$feature_config" ]]; then
  119. echo " ⚠️ $config_file 在feature分支中被修改"
  120. # 特殊处理package.json - 检查是否只是添加依赖
  121. if [[ "$config_file" == "package.json" ]]; then
  122. # 检查是否只是添加了新的依赖而没有修改现有的
  123. echo " 📦 检查package.json依赖变更..."
  124. fi
  125. else
  126. echo " ✅ $config_file 无冲突"
  127. fi
  128. fi
  129. done
  130. return $conflicts_found
  131. }
  132. check_config_conflicts
  133. # 6. 运行测试
  134. echo "6️⃣ 运行测试套件..."
  135. if [[ -f "package.json" ]] && grep -q '"test"' package.json; then
  136. if ! npm test; then
  137. echo "❌ 测试失败"
  138. exit 1
  139. fi
  140. echo "✅ 测试通过"
  141. else
  142. echo "⚠️ 未找到测试配置,跳过测试"
  143. fi
  144. # 7. Feature特定检查
  145. echo "7️⃣ Feature特定检查..."
  146. # 检查spec文档是否完整
  147. SPEC_DIR="specs/${FEATURE_BRANCH}"
  148. if [[ -d "$SPEC_DIR" ]]; then
  149. local required_files=("spec.md" "plan.md" "data-model.md" "quickstart.md")
  150. local missing_files=()
  151. for file in "${required_files[@]}"; do
  152. if [[ ! -f "$SPEC_DIR/$file" ]]; then
  153. missing_files+=("$file")
  154. fi
  155. done
  156. if [[ ${#missing_files[@]} -eq 0 ]]; then
  157. echo "✅ Feature文档完整"
  158. else
  159. echo "❌ Feature文档不完整,缺失: ${missing_files[*]}"
  160. exit 1
  161. fi
  162. else
  163. echo "❌ Feature spec目录不存在: $SPEC_DIR"
  164. exit 1
  165. fi
  166. # 8. 最终检查总结
  167. echo "================================"
  168. if [[ $COMPATIBILITY_ISSUES -eq 0 ]]; then
  169. echo "✅ 所有一致性检查通过"
  170. echo "🚀 $FEATURE_BRANCH 可以安全合并到 $TARGET_BRANCH"
  171. else
  172. echo "❌ 发现兼容性问题,请解决后再合并"
  173. exit 1
  174. fi
  175. echo ""
  176. echo "📋 合并建议:"
  177. echo "1. git checkout $TARGET_BRANCH"
  178. echo "2. git pull origin $TARGET_BRANCH"
  179. echo "3. git merge --no-ff $FEATURE_BRANCH"
  180. echo "4. 运行完整测试: npm test"
  181. echo "5. git push origin $TARGET_BRANCH"