For PostgreSQL::Test compatibility, alias entire package symbol tables.
authorNoah Misch <[email protected]>
Sat, 25 Jun 2022 16:07:44 +0000 (09:07 -0700)
committerNoah Misch <[email protected]>
Sat, 25 Jun 2022 16:07:46 +0000 (09:07 -0700)
Remove the need to edit back-branch-specific code sites when
back-patching the addition of a PostgreSQL::Test::Utils symbol.  Replace
per-symbol, incomplete alias lists.  Give old and new package names the
same EXPORT and EXPORT_OK semantics.  Back-patch to v10 (all supported
versions).

Reviewed by Andrew Dunstan.

Discussion: https://postgr.es/m/20220622072144[email protected]

src/test/perl/PostgreSQL/Test/Cluster.pm
src/test/perl/PostgreSQL/Test/Utils.pm
src/test/perl/PostgresNode.pm
src/test/perl/TestLib.pm

index 12339c23de19db703ae941e2708928893f6d4c35..14b8ee737764d5fd6c62ce8cfbc1e548d53d223f 100644 (file)
@@ -1,9 +1,9 @@
 
 # Copyright (c) 2022, PostgreSQL Global Development Group
 
-# allow use of release 15+ perl namespace in older branches
-# just 'use' the older module name.
-# See PostgresNode.pm for function implementations
+# Allow use of release 15+ Perl package name in older branches, by giving that
+# package the same symbol table as the older package.  See PostgresNode::new
+# for supporting heuristics.
 
 package PostgreSQL::Test::Cluster;
 
@@ -11,5 +11,8 @@ use strict;
 use warnings;
 
 use PostgresNode;
+BEGIN { *PostgreSQL::Test::Cluster:: = \*PostgresNode::; }
+
+use Exporter 'import';
 
 1;
index bd6a49475ec0e9cdf00c2d84bb024dd3ca60c713..e743bdfc834ea1474a99817e9d339f51563debb1 100644 (file)
@@ -1,41 +1,16 @@
 # Copyright (c) 2022, PostgreSQL Global Development Group
 
-# allow use of release 15+ perl namespace in older branches
-# just 'use' the older module name.
-# We export the same names as the v15 module.
-# See TestLib.pm for alias assignment that makes this all work.
+# Allow use of release 15+ Perl package name in older branches, by giving that
+# package the same symbol table as the older package.
 
 package PostgreSQL::Test::Utils;
 
 use strict;
 use warnings;
 
-use Exporter 'import';
-
 use TestLib;
+BEGIN { *PostgreSQL::Test::Utils:: = \*TestLib::; }
 
-our @EXPORT = qw(
-  generate_ascii_string
-  slurp_dir
-  slurp_file
-  append_to_file
-  system_or_bail
-  system_log
-  run_log
-  pump_until
-
-  command_ok
-  command_fails
-  command_exit_is
-  program_help_ok
-  program_version_ok
-  program_options_handling_ok
-  command_like
-  command_like_safe
-  command_fails_like
-  command_checks_all
-
-  $windows_os
-);
+use Exporter 'import';
 
 1;
index e310e23f95fdc43c978d935d2291647947b3a19f..60d24bf8c0db69fcef3ebda6d4727a3a17afa40d 100644 (file)
@@ -147,6 +147,17 @@ of finding port numbers, registering instances for cleanup, etc.
 sub new
 {
    my ($class, $name, $pghost, $pgport) = @_;
+
+   # Use release 15+ semantics when the arguments look like (node_name,
+   # %params).  We can't use $class to decide, because get_new_node() passes
+   # a v14- argument list regardless of the class.  $class might be an
+   # out-of-core subclass.  $class->isa('PostgresNode') returns true even for
+   # descendants of PostgreSQL::Test::Cluster, so it doesn't help.
+   return $class->get_new_node(@_[ 1 .. $#_ ])
+     if !$pghost
+     or !$pgport
+     or $pghost =~ /^[a-zA-Z0-9_]$/;
+
    my $testname = basename($0);
    $testname =~ s/\.[^.]+$//;
    my $self = {
@@ -2134,14 +2145,4 @@ sub pg_recvlogical_upto
 
 =cut
 
-# support release 15+ perl module namespace
-
-package PostgreSQL::Test::Cluster; ## no critic (ProhibitMultiplePackages)
-
-sub new
-{
-   shift; # remove class param from args
-   return PostgresNode->get_new_node(@_);
-}
-
 1;
index 541c21084816f1c669353840e2f3637bb3c23e8c..26dc0e381792495898526def0b3f2f6e504203f7 100644 (file)
@@ -485,39 +485,4 @@ sub command_checks_all
    return;
 }
 
-# support release 15+ perl module namespace
-
-package PostgreSQL::Test::Utils; ## no critic (ProhibitMultiplePackages)
-
-# we don't want to export anything here, but we want to support things called
-# via this package name explicitly.
-
-# use typeglobs to alias these functions and variables
-
-no warnings qw(once);
-
-*generate_ascii_string = *TestLib::generate_ascii_string;
-*slurp_dir = *TestLib::slurp_dir;
-*slurp_file = *TestLib::slurp_file;
-*append_to_file = *TestLib::append_to_file;
-*system_or_bail = *TestLib::system_or_bail;
-*system_log = *TestLib::system_log;
-*run_log = *TestLib::run_log;
-*command_ok = *TestLib::command_ok;
-*command_fails = *TestLib::command_fails;
-*command_exit_is = *TestLib::command_exit_is;
-*program_help_ok = *TestLib::program_help_ok;
-*program_version_ok = *TestLib::program_version_ok;
-*program_options_handling_ok = *TestLib::program_options_handling_ok;
-*command_like = *TestLib::command_like;
-*command_like_safe = *TestLib::command_like_safe;
-*command_fails_like = *TestLib::command_fails_like;
-*command_checks_all = *TestLib::command_checks_all;
-
-*windows_os = *TestLib::windows_os;
-*timeout_default = *TestLib::timeout_default;
-*tmp_check = *TestLib::tmp_check;
-*log_path = *TestLib::log_path;
-*test_logfile = *TestLib::test_log_file;
-
 1;