【指导】iOS代码静态检查 -- clang format (+ git pre-commit hook + jenkins)

来源:互联网 发布:手机fc2最新域名设置 编辑:程序博客网 时间:2024/05/16 17:23

Xcode IDE中可以安装Clang format插件,格式化iOS代码。可总是有人会忘,故再加上Git客户端pre-commit hook一枚用于防呆,在执行git commit命令后检查,检查通过后正常完成commit:)

可是有些人懒得连hook都不配,所以再加上Jenkins验证,竟然不改就想上库?哼╭(╯^╰)╮,打回去重来~~~~


如下,Git hook采用全局hook的形式(当然你也可以自己每次克隆后拷到单仓下用,如果你时间比较多的话:))

【使用前提】

本地需要安装clang-format工具,.clangformat文件已放好


【部署方法】

1,建立全局hook目录(有了请执行第2步):

$mkdir -p~/.git_template/hooks/
2,将如下两行拷贝到~/.gitconfig文件的最后(有了请执行第3步):
$git config --global init.templatedir ~/.git_template
3,增加pre-commit脚本,并添加可执行权限。这个脚本会检查有没有格式化,没有做会帮他改了直接提交:
#!/bin/bash    STYLE=$(git config --get hooks.clangformat.style)  if [ -n "${STYLE}" ] ; then    STYLEARG="-style=${STYLE}"  else    STYLEARG=""  fi    format_file() {    file="${1}"    if [ "${file##*.}" = "c" ] || [ "${file##*.}" = "m" ] || [ "${file##*.}" = "mm" ] || [ "${file##*.}" = "h" ]; then        clang-format -i ${STYLEARG} ${1}        git add ${1}    fi  }    case "${1}" in    --about )      echo "Runs clang-format on source files"      ;;    * )      for file in `git diff-index --cached --diff-filter=ACMR --name-only HEAD` ; do        format_file "${file}"      done      ;;  esac

4,配置Jenkins gerrit trigger,脚本如下,没有做格式化的禁止提交,但是不帮他改,只打负分:

#!/bin/shif [ -d "checkstyle_dir" ]; then    rm -fr checkstyle_dir    mkdir checkstyle_direlse    mkdir checkstyle_dirfi# get json string:GERRIT_CHANGE_ID="$1"ssh -p 29418 jenkins@x.x.x.x gerrit query --files --current-patch-set $GERRIT_CHANGE_ID --format=json > checkstyle_dir/string.json# delete line 2 to the end (cat xx | wc -l)sed -i '' '2,$d' checkstyle_dir/string.json# read filelist by change-id:cat checkstyle_dir/string.json | jq '.currentPatchSet | .files | map(select(.type != "DELETED")) | .[] | .file' | sed 's/"//g' > checkstyle_dir/filelistwhile read ONE_LINEdo    if [[ ${ONE_LINE} = "Libraries"* ]] || [[ ${ONE_LINE} = *".framework"* ]]; then        echo "skip $ONE_LINE"    elif [ "${ONE_LINE##*.}" = "c" ] || [ "${ONE_LINE##*.}" = "m" ] || [ "${ONE_LINE##*.}" = "mm" ] || [ "${ONE_LINE##*.}" = "h" ]; then        #cp --parents $ONE_LINE checkstyle_dir        cp $ONE_LINE checkstyle_dir    fidone < checkstyle_dir/filelist# checkstylecp ~/.clang-format .RESULT=`ls checkstyle_dir/*.[chm] | xargs clang-format -style=file -output-replacements-xml | grep -c "<replacement "`if [ $RESULT -ne 0 ]; then    echo "===================================================================================================="    echo "Commit did not match clang-format, please use git commit --amend to modify and push to gerrit again!"    echo "===================================================================================================="    exit 1;fi

【使用方法】

1,部署前,已克隆的仓,请手工拷贝到本地工程的hooks目录中去:

$cp~/.git_template/hooks/pre-commit .git/hooks/.
2,部署后,新克隆的仓,无需任何操作,可直接使用:)

【参考】

http://stackoverflow.com/questions/22866609/can-clang-format-tell-me-if-formatting-changes-are-necessary

https://github.com/andrewseidl/githook-clang-format/blob/master/clang-format.hook

0 0
原创粉丝点击