public inbox for [email protected]
help / color / mirror / Atom feedFrom: Andrew Dunstan <[email protected]>
To: Peter Eisentraut <[email protected]>
To: Tom Lane <[email protected]>
Cc: pgsql-hackers <[email protected]>
Subject: Re: pgindent vs. pgperltidy command-line arguments
Date: Thu, 6 Jul 2023 11:47:33 -0400
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
References: <[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
On 2023-06-21 We 07:35, Andrew Dunstan wrote:
>
>
> On 2023-06-21 We 05:09, Peter Eisentraut wrote:
>> On 20.06.23 17:38, Andrew Dunstan wrote:
>>>>> +1, although I wonder if we shouldn't follow pgindent's new lead
>>>>> and require some argument(s).
>>>>
>>>> That makes sense to me. Here is a small update with this behavior
>>>> change and associated documentation update.
>>>
>>> I'm intending to add some of the new pgindent features to
>>> pgperltidy. Preparatory to that here's a rewrite of pgperltidy in
>>> perl - no new features yet but it does remove the hardcoded path,
>>> and requires you to pass in one or more files / directories as
>>> arguments.
>>
>> Are you planning to touch pgperlcritic and pgperlsyncheck as well?
>
>
> Yeah, it would make sense to.
>
Here's a patch that turns all these into perl scripts.
cheers
andrew
--
Andrew Dunstan
EDB:https://www.enterprisedb.com
Attachments:
[text/x-patch] perl-check-scripts-perl.patch (5.5K, ../[email protected]/3-perl-check-scripts-perl.patch)
download | inline diff:
diff --git a/src/tools/perlcheck/FindPerlFiles.pm b/src/tools/perlcheck/FindPerlFiles.pm
new file mode 100644
index 0000000000..3a098f6614
--- /dev/null
+++ b/src/tools/perlcheck/FindPerlFiles.pm
@@ -0,0 +1,62 @@
+
+# Copyright (c) 2023, PostgreSQL Global Development Group
+
+=pod
+
+=head1 NAME
+
+FindPerlFiles - module for finding perl files from a list of paths
+
+=head1 SYNOPSIS
+
+ use FindPerlFiles;
+
+ my @files = FindPerlFiles::findperl(path, ...);
+
+
+=head1 DESCRIPTION
+
+FindPerlFiles finds files which either have a perl extension (.pl or .pm) or
+are bot executable and found by the `file` program to be perl scripts.
+
+=cut
+
+
+package FindPerlFiles;
+
+use strict;
+use warnings;
+
+use File::Find;
+use File::stat;
+use Fcntl ':mode';
+
+my @files;
+
+sub _is_perl_exec
+{
+ my $name = shift;
+ my $out = `file $name 2>/dev/null`;
+ return $out =~ /:.*perl[0-9]*\b/i;
+}
+
+sub findperl
+{
+ my @files ;
+ my $wanted = sub
+ {
+ my $name = $File::Find::name;
+ my $st;
+ # check it's a plain file and either it has a perl extension (.p[lm])
+ # or it's executable and `file` thinks it's a perl script.
+ ($st = lstat($_))
+ && -f $st
+ && (/\.p[lm]$/ || ((($st->mode & S_IXUSR) && _is_perl_exec($_))))
+ && push(@files, $name);
+ };
+
+ File::Find::find({ wanted => $wanted }, @_);
+ return @files;
+}
+
+1;
diff --git a/src/tools/perlcheck/find_perl_files b/src/tools/perlcheck/find_perl_files
deleted file mode 100644
index 20dceb800d..0000000000
--- a/src/tools/perlcheck/find_perl_files
+++ /dev/null
@@ -1,18 +0,0 @@
-# src/tools/perlcheck/find_perl_files
-
-# shell function to find all perl files in the source tree
-
-find_perl_files () {
- if [ $# -eq 0 ]; then
- echo 'No files to process' 1>&2
- return
- fi
- {
- # take all .pl and .pm files
- find "$@" -type f -name '*.p[lm]' -print
- # take executable files that file(1) thinks are perl files
- find "$@" -type f -perm -100 -exec file {} \; -print |
- egrep -i ':.*perl[0-9]*\>' |
- cut -d: -f1
- } | sort -u | grep -v '^\./\.git/'
-}
diff --git a/src/tools/perlcheck/pgperlcritic b/src/tools/perlcheck/pgperlcritic
index 2ec6f20de3..87d5e92df7 100755
--- a/src/tools/perlcheck/pgperlcritic
+++ b/src/tools/perlcheck/pgperlcritic
@@ -1,20 +1,27 @@
-#!/bin/sh
+#!/usr/bin/perl
+
+# Copyright (c) 2023, PostgreSQL Global Development Group
# src/tools/perlcheck/pgperlcritic
-test -f src/tools/perlcheck/perlcriticrc || {
- echo could not find src/tools/perlcheck/perlcriticrc
- exit 1
- }
+use strict;
+use warnings;
-set -e
+use FindBin ();
+use lib "$FindBin::Bin";
+use FindPerlFiles;
+
+die "No directories or files specified\n" unless @ARGV;
+
+my $rc_loc = "$FindBin::Bin/perlcriticrc";
+
+die "no $rc_loc\n" unless -f $rc_loc;
# set this to override default perlcritic program:
-PERLCRITIC=${PERLCRITIC:-perlcritic}
+my $perlcritic = $ENV{PERLCRITIC} || 'perlcritic';
-. src/tools/perlcheck/find_perl_files
+my @files = FindPerlFiles::findperl(@ARGV);
-find_perl_files "$@" | xargs $PERLCRITIC \
- --quiet \
- --program-extensions .pl \
- --profile=src/tools/perlcheck/perlcriticrc
+exit unless @files;
+
+exec $perlcritic, '--program-extensions', '.pl', "--profile=$rc_loc", @files
diff --git a/src/tools/perlcheck/pgperlsyncheck b/src/tools/perlcheck/pgperlsyncheck
index da59c9727c..70ff248daf 100755
--- a/src/tools/perlcheck/pgperlsyncheck
+++ b/src/tools/perlcheck/pgperlsyncheck
@@ -1,16 +1,48 @@
-#!/bin/sh
+#!/usr/bin/perl
+
+# Copyright (c) 2023, PostgreSQL Global Development Group
# script to detect compile time errors and warnings in all perl files
-INCLUDES="-I src/tools/msvc -I src/tools/msvc/dummylib -I src/backend/catalog"
-INCLUDES="-I src/test/perl -I src/backend/utils/mb/Unicode $INCLUDES"
-INCLUDES="-I src/bin/pg_rewind -I src/test/ssl/t $INCLUDES"
+use strict;
+use warnings;
-set -e
+use FindBin ();
+use lib "$FindBin::Bin";
-. src/tools/perlcheck/find_perl_files
+use Cwd qw(abs_path);
+use FindPerlFiles;
-# for zsh
-setopt shwordsplit 2>/dev/null || true
+die "No directories or files specified\n" unless @ARGV;
-find_perl_files "$@" | xargs -L 1 perl $INCLUDES -cw 2>&1 | grep -v OK
+my $srcroot = abs_path("$FindBin::Bin/../../..");
+
+my $includes="";
+
+my @incdirs = qw(
+ src/tools/msvc
+ src/tools/msvc/dummylib
+ src/backend/catalog
+ src/test/perl
+ src/backend/utils/mb/Unicode
+ src/bin/pg_rewind src/test/ssl/t
+);
+
+foreach my $inc (@incdirs)
+{
+ $includes .= "-I $srcroot/$inc ";
+}
+
+my @files = FindPerlFiles::findperl(@ARGV);
+
+my $status = 0;
+
+foreach my $file (@files)
+{
+ my $out = `perl $includes -cw $file 2>&1`;
+ next if $out =~ /OK/;
+ $status = 1;
+ print $out;
+}
+
+exit $status;
diff --git a/src/tools/pgindent/pgperltidy b/src/tools/pgindent/pgperltidy
index 6af27d21d5..be433c1836 100755
--- a/src/tools/pgindent/pgperltidy
+++ b/src/tools/pgindent/pgperltidy
@@ -1,12 +1,22 @@
-#!/bin/sh
+#!/usr/bin/perl
+
+# Copyright (c) 2023, PostgreSQL Global Development Group
# src/tools/pgindent/pgperltidy
-set -e
+use strict;
+use warnings;
-# set this to override default perltidy program:
-PERLTIDY=${PERLTIDY:-perltidy}
+use FindBin ();
+use lib "$FindBin::Bin/../perlcheck";
+use FindPerlFiles;
-. src/tools/perlcheck/find_perl_files
+my $perltidy = $ENV{PERLTIDY} || 'perltidy';
-find_perl_files "$@" | xargs $PERLTIDY --profile=src/tools/pgindent/perltidyrc
+die "No directories or files specified\n" unless @ARGV;
+
+my @files = FindPerlFiles::findperl(@ARGV);
+
+exit unless @files;
+
+exec "$perltidy", "--profile=$FindBin::Bin /perltidyrc", @files;
view thread (8+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected]
Subject: Re: pgindent vs. pgperltidy command-line arguments
In-Reply-To: <[email protected]>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox