本文由RT-Thread论坛用户@RTT_逍遥原创公布:https://club.rt-thread.org/as...

这篇文章能够将RT-THREAD的官网的formatting和astyle等整顿文档的工具整合到git外面从而实现git commit的时候主动帮你实现formatting等格式化的问题,再也不必放心代码没有通过formatting 无奈PR胜利,而后须要本人手动操作了。这边只有部署一次,当前都是由git hook 自动化实现。

GITHUB仓库:
git_auto_script
欢送START和提issue。有好的倡议能够PR或者提issue。
一、简介

你是否会遇到过遗记应用formatting脚本来整顿下代码,导致RTTHREAD PR不通过打回去从新批改?你是否总是遗记整顿那些astyle的格局问题,总是提交的代码不够好看?总是因为空格TAB等格局问题,让熊大等合并者头疼?你是否总是有些bug是因为没有通过动态查看,导致前面bug一大堆?

来看下这个软件吧,保障对你有肯定帮忙,而且在做其余我的项目的时候这个软件包也能够应用。

本软件包通过整合cppcheck(动态编译软件), astyle(格式化代码), formatting(RTTHREAD格局整顿)

三款软件,将这三款软件整合到git的hook中,让你当前提交代码再也不要放心被CI的formatting检测出问题从新提交了。

本软件一次部署长期有效,只有你的git仓库没有更换,就始终无效。

当然如果有好的倡议或者批改,欢送PR,咱们大家一起来保护。

当然也如果有更好的软件或者更好的需要,也欢送在issue外面提出来。
二、如何应用

第一次应用可能会麻烦一点,不过我感觉这个就是一劳永逸的事件,前面就简直无感了。
2.1 CPPCHECK

STEP1: CPPCHECK官网 下载安装

STEP2: 环境变量path增加cppcheck门路

STEP3:命令行外面执行cppcheck命令,能够用即可
2.2 ASTYLE

STEP1: ASTYEL官网 下载解压

STEP2: 环境变量path增加astyle门路

STEP3:命令行外面执行astyle命令,能够用即可
2.3 formatting

这个是来自formatting.py 的自动化脚本,这边我把这个python脚本整顿成exe命令行的模式:

STEP1: 间接clonegit_auto_script目录

STEP2: 将Windows_exe 文件夹增加到path环境变量中

STEP3: 命令行外面执行formatting 能够用即可

生成exe采纳命令(这一步我曾经弄好放到Windows_exe中,通常不须要操作,如果须要更新的话在formatting.py目录下执行上面操作)

pyinstaller --onefile --nowindowed formatting.py

2.4 pre-commit装置

将 RTTHREAD_auto/pre-commit拷贝到你的工程的.git/hook 文件夹上面,当前commit无需操作任何操作就能够间接commit 无需思考formatting或者格局问题或者动态查看问题

image-20211025223018211.png

好了, 所有ready。

这个时候,只有你失常commit,你就会发现,你的代码格局曾经通过astyle优化过了,如果代码动态查看有问题,会commit不过,并且提醒你须要批改,同时也是通过formatting的批改了。之后再也不必放心PR会有格局上的问题了。

上面看下动画演示:
help.gif

GITHUB仓库:
git_auto_script
欢送START和提issue。又好的倡议能够PR或者提issue。
三、FAQ
3.1 cppcheck和astyle等命令在哪里能够去掉?

在pre-commit文件夹中,找到cppcheck命令和astyle命令和formatting命令,后面加#就能够去掉

如下所示:正文掉所有的命令,就不会执行自动化脚本了

if [ -n "$changed_files" ]; then

#cppcheck --enable=warning,performance,portability --inline-suppr --error-exitcode=1 --force $changed_fileserr=$?if [ $err -ne 0 ]; then    echo "Hello! we found a obvious fault, please fix the error then commit again"    exit $errfi

fi

We only filter the file name with c or cpp file.

changed_files=$(git diff-index --cached $against | \

grep -E '[MA]    .*\.(c|cpp|h)$' | cut -d'    ' -f 2)

if [ -n "$changed_files" ]; then

#astyle --style=allman --indent=spaces=4 --indent=spaces=4 --indent=spaces=4 --pad-header --pad-header --pad-header --align-pointer=name --lineend=linux --convert-tabs --verbose  $changed_files#formatting $changed_filesgit add $changed_files

fi

3.2 commit 之后文件夹上面多进去一些奇怪的文件是否能够去掉

生成一些*.orig文件是因为astyle对文件进行了批改,为了避免改错文件,将源文件做了备份,如果不想要的话能够在astyle命令上面增加上面的选项来去掉:

--suffix=none

3.3 cppcheck 的选项的含意

cppcheck选项能够参考官网manual

astyle 选项参考官网的astyle option

本我的项目次要目标是提供一种自动化的commit机制,如果感觉cppcheck机制和astyle机制不好用,能够正文掉或者用其余的命令替换掉,也欢送提供一些比拟好用的收费的不便的软件。

astyle的选项,参考RTTHREAD官网文档
3.4 pre-commit是否能够在主仓库中保留

目前我感觉是无奈在仓库中保留的,欢送大家提出好的idea。我也心愿能有好的办法在主仓库保留