]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
perlcheck: add script, run in CI, fix fallouts
authorViktor Szakats <commit@vsz.me>
Wed, 24 Sep 2025 23:54:28 +0000 (01:54 +0200)
committerViktor Szakats <commit@vsz.me>
Fri, 26 Sep 2025 12:47:33 +0000 (14:47 +0200)
Add script to run all Perl sources through `perl -c` to ensure no
issues, and run this script via GHA/checksrc in CI.

Fallouts:
- fix two repeated declarations.
- move `shell_quote()` from `testutil.pm` to `pathhelp.pm`, to
  avoid circular dependency in `globalconfig.pm`.

Closes #18745

.github/workflows/checksrc.yml
scripts/Makefile.am
scripts/perlcheck.sh [new file with mode: 0755]
tests/globalconfig.pm
tests/pathhelp.pm
tests/runner.pm
tests/runtests.pl
tests/servers.pm
tests/test745.pl
tests/testcurl.pl
tests/testutil.pm

index b101a822c5453df916746021816091bd15511a59..71ee031d68a8269a6c250e6766a0f7284e26357b 100644 (file)
@@ -82,6 +82,10 @@ jobs:
           source ~/venv/bin/activate
           scripts/cmakelint.sh
 
+      - name: 'perlcheck'
+        run: |
+          scripts/perlcheck.sh
+
       - name: 'pytype'
         run: |
           source ~/venv/bin/activate
index cfa3d3e740a9328c44ac25afc94848ee03d1da81..a52581155d463a3e38fd0cc325016d1bcd4c7b77 100644 (file)
@@ -25,7 +25,8 @@
 EXTRA_DIST = coverage.sh completion.pl firefox-db2pem.sh checksrc.pl checksrc-all.pl \
   mk-ca-bundle.pl mk-unity.pl schemetable.c cd2nroff nroff2cd cdall cd2cd managen    \
   dmaketgz maketgz release-tools.sh verify-release cmakelint.sh mdlinkcheck          \
-  CMakeLists.txt pythonlint.sh randdisable wcurl top-complexity extract-unit-protos
+  CMakeLists.txt perlcheck.sh pythonlint.sh randdisable wcurl top-complexity         \
+  extract-unit-protos
 
 dist_bin_SCRIPTS = wcurl
 
diff --git a/scripts/perlcheck.sh b/scripts/perlcheck.sh
new file mode 100755 (executable)
index 0000000..be0c0e1
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) Dan Fandrich, <dan@coneharvesters.com>, Viktor Szakats, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+# SPDX-License-Identifier: curl
+#
+###########################################################################
+
+# The xargs invocation is portable, but does not preserve spaces in file names.
+# If such a file is ever added, then this can be portably fixed by switching to
+# "xargs -I{}" and appending {} to the end of the xargs arguments (which will
+# call cmakelint once per file) or by using the GNU extension "xargs -d'\n'".
+
+set -eu
+
+cd "$(dirname "$0")"/..
+
+{
+  if [ -n "${1:-}" ]; then
+    for A in "$@"; do printf "%s\n" "$A"; done
+  elif git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
+    {
+      git ls-files | grep -E '\.(pl|pm)$'
+      git grep -l -E '^#!/usr/bin/env perl'
+    } | sort -u
+  else
+    # strip off the leading ./ to make the grep regexes work properly
+    find . -type f \( -name '*.pl' -o -name '*.pm' \) | sed 's@^\./@@'
+  fi
+} | xargs -n 1 perl -c -Itests
index de9abab34c2a15315fc874b6112c2f38a0c3ce6c..8635dea55b58f9eaef0b245fb9f2afe49354ae96 100644 (file)
@@ -78,11 +78,9 @@ BEGIN {
 use pathhelp qw(
     exe_ext
     dirsepadd
-    );
-use Cwd qw(getcwd);
-use testutil qw(
     shell_quote
     );
+use Cwd qw(getcwd);
 use File::Spec;
 
 
index 169582518848ee4238d2d447a284f114e65fc52f..49987f7453882a437d1b07b32aa4b1536d1bf43b 100644 (file)
@@ -60,6 +60,7 @@ BEGIN {
         os_is_win
         exe_ext
         dirsepadd
+        shell_quote
         sys_native_abs_path
         sys_native_current_path
         build_sys_abs_path
@@ -192,4 +193,23 @@ sub dirsepadd {
     return $dir . '/';
 }
 
+#######################################################################
+# Quote an argument for passing safely to a Bourne shell
+# This does the same thing as String::ShellQuote but doesn't need a package.
+#
+sub shell_quote {
+    my ($s)=@_;
+    if($^O eq 'MSWin32') {
+        $s = '"' . $s . '"';
+    }
+    else {
+        if($s !~ m/^[-+=.,_\/:a-zA-Z0-9]+$/) {
+            # string contains a "dangerous" character--quote it
+            $s =~ s/'/'"'"'/g;
+            $s = "'" . $s . "'";
+        }
+    }
+    return $s;
+}
+
 1;    # End of module
index 62f722f319bc62abe9fd405bce024b48146410a7..1eef1f5b9d3f1480657869fcf6cbc0578ab081ec 100644 (file)
@@ -84,6 +84,7 @@ use Storable qw(
 
 use pathhelp qw(
     exe_ext
+    shell_quote
     );
 use servers qw(
     checkcmd
@@ -100,7 +101,6 @@ use testutil qw(
     logmsg
     runclient
     exerunner
-    shell_quote
     subbase64
     subsha256base64file
     substrippemfile
index 6b6e5b076191d7bcabd9a75f7362f61365a8fbec..d836841a296de269fe6d8c3d5704817209053e7f 100755 (executable)
@@ -91,6 +91,7 @@ use serverhelp qw(
 use pathhelp qw(
     exe_ext
     sys_native_current_path
+    shell_quote
     );
 
 use appveyor;
index e625058870760b5561889f7ec7be8606d12297de..e5505886f6afea3a21b663fd605a99601c265768 100644 (file)
@@ -105,6 +105,7 @@ use pathhelp qw(
     os_is_win
     build_sys_abs_path
     sys_native_abs_path
+    shell_quote
     );
 
 use processhelp;
@@ -114,7 +115,6 @@ use testutil qw(
     runclient
     runclientoutput
     exerunner
-    shell_quote
     );
 
 
index faddda429f396bdc9adf350f2c617f541a3bf8d8..4395eb9681ab2b3af73d9aa2ddd80fe1cb7ef4f5 100755 (executable)
@@ -45,7 +45,8 @@ sub gettypecheck {
 }
 
 sub getinclude {
-    open(my $f, "<", "$root/include/curl/curl.h")
+    my $f;
+    open($f, "<", "$root/include/curl/curl.h")
         || die "no curl.h";
     while(<$f>) {
         if($_ =~ /\((CURLOPT[^,]*), (CURLOPTTYPE_[^,]*)/) {
@@ -61,7 +62,7 @@ sub getinclude {
     $enum{"CURLOPT_CONV_TO_NETWORK_FUNCTION"}++;
     close($f);
 
-    open(my $f, "<", "$root/include/curl/multi.h")
+    open($f, "<", "$root/include/curl/multi.h")
         || die "no curl.h";
     while(<$f>) {
         if($_ =~ /\((CURLMOPT[^,]*), (CURLOPTTYPE_[^,]*)/) {
index 8d6183102bbf85e3172bd0b825ef6c6661850910..4f3eade70347d2dd681ed4ff33df5c670f4f5ac6 100755 (executable)
@@ -584,8 +584,10 @@ if(-f "./libcurl.pc") {
     }
 }
 
+my $f;
+
 logit_spaced "display lib/$confheader";
-open(my $f, "<", "lib/$confheader") or die "lib/$confheader: $!";
+open($f, "<", "lib/$confheader") or die "lib/$confheader: $!";
 while(<$f>) {
     print if /^ *#/;
 }
@@ -660,7 +662,7 @@ if(($have_embedded_ares) &&
 
 my $mkcmd = "$make -i" . ($targetos && !$configurebuild ? " $targetos" : "");
 logit "$mkcmd";
-open(my $f, "-|", "$mkcmd 2>&1") or die;
+open($f, "-|", "$mkcmd 2>&1") or die;
 while(<$f>) {
     s/$pwd//g;
     print;
index e84cc45fde2cafcc3d82d5af489a77e22b6a9fd8..3477d5bb57f882c4a6ca5e1f3df1ade32e503a2e 100644 (file)
@@ -38,7 +38,6 @@ BEGIN {
         runclientoutput
         setlogfunc
         exerunner
-        shell_quote
         subbase64
         subnewlines
         subsha256base64file
@@ -219,25 +218,6 @@ sub exerunner {
     return '';
 }
 
-#######################################################################
-# Quote an argument for passing safely to a Bourne shell
-# This does the same thing as String::ShellQuote but doesn't need a package.
-#
-sub shell_quote {
-    my ($s)=@_;
-    if($^O eq 'MSWin32') {
-        $s = '"' . $s . '"';
-    }
-    else {
-        if($s !~ m/^[-+=.,_\/:a-zA-Z0-9]+$/) {
-            # string contains a "dangerous" character--quote it
-            $s =~ s/'/'"'"'/g;
-            $s = "'" . $s . "'";
-        }
-    }
-    return $s;
-}
-
 sub get_sha256_base64 {
     my ($file_path) = @_;
     return encode_base64(sha256(do { local $/; open my $fh, '<:raw', $file_path or die $!; <$fh> }), "");