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
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;