在非核心代码或开发代码上运行 pgindent
来自 PostgreSQL wiki
跳转到导航跳转到搜索注意:从 http://adpgtech.blogspot.com/2015/05/running-pgindent-on-non-core-code-or.html 复制
运行 pgindent 并不像有些人认为的那么难。最难的部分是获得一组可用的 typedefs 来使用。这就是为什么 buildfarm 现在为每个活动分支自动构建这些列表的原因。
但这对你正在处理的非核心代码没有帮助。以下是我为 Redis FDW 代码获得工作 typedefs 列表的方法
objdump -W redis_fdw.so |\ egrep -A3 DW_TAG_typedef |\ perl -e ' while (<>) { chomp; @flds = split;next unless (1 < @flds);\ next if $flds[0] ne "DW_AT_name" && $flds[1] ne "DW_AT_name";\ next if $flds[-1] =~ /^DW_FORM_str/;\ print $flds[-1],"\n"; }' |\ sort | uniq > redis_fdw.typedefs
这是 buildfarm 代码在 Linux 上获取 typedefs 列表的操作的略微改编。
在那之后,缩进代码就变成了这样
pgindent --typedefs=redis_fdw.typedefs redis_fdw.c
如果你正在开发一段核心代码,并且你想在上面运行 pgindent,但是你引入了了一些新的 typedefs,所以 pgindent 通过添加多余的空格来弄乱了缩进。你有几个选择。假设你正在处理的是后端代码。然后你可以对构建好的后端运行上面的提取 - 它不需要安装,只要针对 src/backend/postgres 运行它。然后使用它来针对你正在处理的每个文件运行 pgindent。你不必为每个文件单独运行它 - 你可以在命令行中指定任意多个要缩进的文件。
如果你这样做,请仔细查看结果。缺少一些平台相关的 typedef 可能弄乱了你的文件。因此,更安全的做法是,从 buildfarm 服务器获取最新的 typedefs 列表,并将其与你刚刚构建的 typedefs 列表合并,如下所示:
wget -q -O - "http://www.pgbuildfarm.org/cgi-bin/typedefs.pl?branch=HEAD" |\ cat - mytypedefs | sort | uniq > mynewtypedefs
然后使用该文件来对你的代码进行 pgindent。
这一切都不像看起来那么容易。但也不算特别难。
提示
如果你只有少数几个新的 typedefs,你可以将它们作为参数传递给 pgindent 的命令行,如下所示:
pgindent --typedefs=mytypedefs --list-of-typedefs="typedef1 typedef2" myfile1.c myfile2.c