Re: WIP pgindent replacement

Bruce Momjian <bruce@momjian.us>

From: Bruce Momjian <bruce@momjian.us>
To: Andrew Dunstan <andrew@dunslane.net>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2012-08-03T03:09:51Z
Lists: pgsql-hackers

Attachments

On Tue, Jun 21, 2011 at 08:27:45PM -0400, Andrew Dunstan wrote:
> 
> Attached is a WIP possible replacement for pgindent. Instead of a
> shell script invoking a mishmash of awk and sed, some of which is
> pretty impenetrable, it uses a single engine (perl) to do all the
> pre and post indent processing. Of course, if your regex-fu and
> perl-fu is not up the scratch this too might be impenetrable, but
> all but a couple of the recipes are reduced to single lines, and I'd
> argue that they are all at least as comprehensible as what they
> replace.
> 
> Attached also is a diff file showing what it does differently from
> the existing script. I think that these are all things where the new
> script is more correct than the existing script. Most of the changes
> come into two categories:
> 
>    * places where the existing script fails to combine the function
>      return type and the function name on a single line in function
>      prototypes.
>    * places where unwanted blank lines are removed by the new script
>      but not by the existing script.
> 
> Features include:
> 
>    * command line compatibility with the existing script, so you can do:
>      find ../../.. -name '*.[ch]' -type f -print | egrep -v -f
>      exclude_file_patterns | xargs -n100 ./pgindent.pl typedefs.list
>    * a new way of doing the same thing much more nicely:
>      ./pgindent.pl --search-base=../../.. --typedefs=typedefs.list
>      --excludes=exclude_file_patterns
>    * only passes relevant typedefs to indent, not the whole huge list
>    * should in principle be runnable on Windows, unlike existing script
>      (I haven't tested yet)
>    * no semantic tab literals; tabs are only generated using \t and
>      tested for using \t, \h or \s as appropriate. This makes debugging
>      the script much less frustrating. If something looks like a space
>      it should be a space.
> 
> In one case I used perl's extended regex mode to comment a fairly
> hairy regex. This should probably be done a bit more, maybe for all
> of them.
> 
> If anybody is so inclined, this could be used as a basis for
> removing the use of bsd indent altogether, as has been suggested
> before, as well as external entab/detab.

Thirteen months after Andrew posted this WIP, I have restructured and
tested this code, and it is now ready to replace the pgindent shell
script as pgindent.pl, attached.

I have tested this version by re-running the 9.1 and 9.2 pgindent runs
and comparing the output, and it is just like Andrew said --- it is the
same, except for the two improvements he mentioned.

A Perl version of pgindent has several advantages:

*  more portable;  less dependent on utility command variances
*  able to run on Windows, assuming someone makes entab and
   pg_bsd_indent Windows binaries
*  able to fix more limitations of pgindent

I will add documentation about the arguments.

Many thanks to Andrew for his fine work on this.  Any objections?

-- 
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +