code.shell 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/bin/sh
  2. has_errors=0
  3. # 获取git暂存的所有go代码
  4. # --cached 暂存的
  5. # --name-only 只显示名字
  6. # --diff-filter=ACM 过滤暂存文件,A=Added C=Copied M=Modified, 即筛选出添加/复制/修改的文件
  7. allgofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '.go$')
  8. echo "\033[32m------------------------代码开始检测-------------------------------\033[0m\n"
  9. gofiles=()
  10. godirs=()
  11. for allfile in ${allgofiles[@]}; do
  12. # 过滤vendor的
  13. # 过滤prootobuf自动生产的文件
  14. # 过滤测试文件
  15. if [[ $allfile == "vendor"* || $allfile == *".pb.go" || $allfile == *"_test.go" ]];then
  16. continue
  17. else
  18. gofiles+=("$allfile")
  19. # 文件夹去重
  20. existdir=0
  21. dir=`echo "$allfile" |xargs -n1 dirname|sort -u`
  22. for somedir in ${godirs[@]}; do
  23. if [[ $dir == $somedir ]]; then
  24. existdir=1
  25. break
  26. fi
  27. done
  28. if [[ $existdir -eq 0 ]]; then
  29. godirs+=("$dir")
  30. fi
  31. fi
  32. done
  33. [ -z "$gofiles" ] && exit 0
  34. # gofmt 格式化代码
  35. unformatted=$(/data/go/bin/gofmt -l ${gofiles[@]})
  36. if [ -n "$unformatted" ]; then
  37. echo >&2 "\033[31m gofmt 工具发现代码格式不标准,请运行以下命令,然后再git add 提交代码: \033[0m"
  38. echo "-------------------------------------------------------------------"
  39. for f in ${unformatted[@]}; do
  40. echo >&2 "gofmt -d -w $PWD/$f"
  41. # gofmt -d -w $PWD/$f
  42. done
  43. echo "-------------------------------------------------------------------\n\n"
  44. has_errors=1
  45. fi
  46. # goimports 自动格式化,包工具
  47. if /data/go/bin/goimports >/dev/null 2>&1; then # 检测是否安装
  48. unimports=$(/data/go/bin/goimports -l ${gofiles[@]})
  49. if [ -n "$unimports" ]; then
  50. echo >&2 "\033[31m goimports 工具发现import格式不标准,请运行以下命令,然后再git add 提交代码: \033[0m"
  51. echo "-------------------------------------------------------------------"
  52. for f in ${unimports[@]} ; do
  53. echo >&2 "goimports -d -w $PWD/$f"
  54. done
  55. echo "-------------------------------------------------------------------\n\n"
  56. has_errors=1
  57. fi
  58. else
  59. echo 'Error: goimports not install. Run: "go get -u golang.org/x/tools/cmd/goimports"' >&2
  60. exit 1
  61. fi
  62. # golint 代码规范检测(目前不使用)
  63. # echo >&2 "\033[32m golint 工具检测代码是否标准,如果发现有不标准的,请检测后再提交代码(不要求强制优化):\033[0m\n"
  64. # echo "-------------------------------------------------------------------"
  65. # if /data/go/bin/golint >/dev/null 2>&1; then # 检测是否安装
  66. # lint_errors=false
  67. # for file in ${gofiles[@]} ; do
  68. # lint_result="$(/data/go/bin/golint $file)" # run golint
  69. # if test -n "$lint_result" ; then
  70. # echo "golint '$file':\n$lint_result"
  71. # lint_errors=true
  72. # fi
  73. # done
  74. # # if [ $lint_errors = true ] ; then
  75. # # echo ""
  76. # # fi
  77. # else
  78. # echo 'Error: golint 工具未安装,请执行命令: "go get -u github.com/golang/lint/golint"' >&2
  79. # exit 1
  80. # fi
  81. # echo "-------------------------------------------------------------------\n"
  82. # go vet 静态错误检查,检测代码是否能编译
  83. # show_vet_header=true
  84. # for dir in ${godirs[@]} ; do
  85. # vet=$(go vet $PWD/$dir 2>&1)
  86. # if [ -n "$vet" -a $show_vet_header = true ] ; then
  87. # echo "\033[31m govet 检测代码存在异常,请仔细检查以下代码,修改完成后,然后再git add 提交代码: \033[0m"
  88. # show_vet_header=false
  89. # fi
  90. # echo "-------------------------------------------------------------------\n"
  91. # if [ -n "$vet" ] ; then
  92. # echo "$vet\n"
  93. # has_errors=1
  94. # fi
  95. # echo "-------------------------------------------------------------------\n\n"
  96. # done
  97. if [ $has_errors -eq 1 ]; then
  98. echo "\033[31m------------代码检测失败,发现异常,请及时修复后再提交-------------\033[0m\n"
  99. else
  100. echo "\033[32m----------代码检测成功,未发现异常,可以 commit 代码---------------\033[0m\n"
  101. fi;
  102. exit $has_errors