在非核心代码或开发代码上运行 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