"Instruct" iOS code static check--clang format (+ git pre-commit hook + jenkins)

Source: Internet
Author: User
Tags call back diff git client git hooks


The clang format plug-in can be installed in the Xcode IDE to format the iOS code. But someone will always forget, so plus git client pre-commit hook one for the stay, after the execution of git commit command check, check after the normal completion of a commit:



But some people are too lazy to even hook are not worthy, so plus Jenkins verification, unexpectedly don't change on the library. Hum ╭ (╯^╰), call back again ~ ~ ~ ~






For example, Git hooks take the form of a global hook (you can also copy them to the Tancang after each clone, if you have more time:)



"Use premises"



Local need to install Clang-format tools,. clangformat files are ready






the Deployment Method



1, set up the Global hook directory (please perform step 2nd):


$mkdir-p~/.git_template/hooks/
2, copy the following two lines to the end of the ~/.gitconfig file (please perform step 3rd):
$git config--global init.templatedir ~/.git_template
3, increase the Pre-commit script and add executable permissions. This script will check to see if there is no formatting, no doing will help him to change the direct submission:
#!/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 '; does  
      format_file ' ${file} '  
    do Ne  
    ;;  
Esac


4, configure the Jenkins Gerrit Trigger, the script is as follows, did not do the format of the prohibit submit, but do not help him to change, only play negative points:


#!/bin/sh
 
if [ -d "checkstyle_dir" ]; then
    rm -fr checkstyle_dir
    mkdir checkstyle_dir
else
    mkdir checkstyle_dir
fi
 
# 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/filelist
while read ONE_LINE
do
    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
    fi
done < checkstyle_dir/filelist
 
# checkstyle
cp ~/.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  
"Use Method"





1, before deployment, the cloned warehouse, please manually copy to the local Engineering hooks directory:


$CP ~/.git_template/hooks/pre-commit. git/hooks/.
2, after deployment, the newly cloned warehouse, without any operation, can be used directly:





Reference



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


Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.