Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o3ugU-00040j-3Y for pgsql-hackers@arkaria.postgresql.org; Wed, 22 Jun 2022 07:21:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1o3ugS-0004hB-Tw for pgsql-hackers@arkaria.postgresql.org; Wed, 22 Jun 2022 07:21:52 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o3ugS-0004ez-8f for pgsql-hackers@lists.postgresql.org; Wed, 22 Jun 2022 07:21:52 +0000 Received: from mail-qk1-x735.google.com ([2607:f8b0:4864:20::735]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1o3ugP-0004sD-B4 for pgsql-hackers@lists.postgresql.org; Wed, 22 Jun 2022 07:21:51 +0000 Received: by mail-qk1-x735.google.com with SMTP id r138so1352434qke.13 for ; Wed, 22 Jun 2022 00:21:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=leadboat.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=QcimkzUwX4i2/XbXMqzH31tAb/YIzZ8DFAynzp3dt2Y=; b=OwVw+eOmZ0LgQTHk4XJf5dkrdX1TlYqtDHM0/KuGtFLh7HiEniMhbgyMeWWvNmTZFm hHLmSEmvgfKIcmwJM64d47E3hLDOhWrE1Lxg72ouIQvN7QMR4TNrjInlVLWqz7c8Lu3/ Hf1oi5/0oBi5p4F2kQvSczy2aywtTgTdNPMoc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=QcimkzUwX4i2/XbXMqzH31tAb/YIzZ8DFAynzp3dt2Y=; b=Bcq2ygF6XD+NdafurQmf5ZRW7mN5LeQ7YZ97yJTJfwX/0ef4EB3sa9FCYDofbpQDhz ZZ4cnZvGqdi7cqaX8n2/49/Tcb+O/FZZDb/K5K94j1EciHg/YnEdGg5OMLi31yM3VveB hpc8myr6J44OzMgefMhKloEjskN9Tc1+/a3GqUfxyx7aEWwaCVf4J26GkFYEwbycU9I6 cEITsDi1JcUTFmJrFwMZg26hqwERQc4VYwjq31gGWz/I5XU0y8eG3o+0+AcoTMbVgbMc efb21VIN52wTMD2+4bvqcX7dCOwTOPOGILq87FwMg4VEaLNBy01B2lhCSQY0Bx17R9Ti LEdg== X-Gm-Message-State: AJIora8YjJjFO3+ihVgsZ3BGv4jvdPcO8U60raeWwoAafEACnfS4uqhM xAbjbKw/2FErg5dclBFkPep3cQ== X-Google-Smtp-Source: AGRyM1vJgF7NoDcyd+MXVL2zMqDCAHgnB6WzinKAZmvs1XHo3DcQcUXJWWmgFpNreni0x8LjkPffog== X-Received: by 2002:a05:620a:d86:b0:6a7:92ff:cfbc with SMTP id q6-20020a05620a0d8600b006a792ffcfbcmr1264535qkl.176.1655882508352; Wed, 22 Jun 2022 00:21:48 -0700 (PDT) Received: from rfd.leadboat.com ([2600:1702:a20:5750::2e]) by smtp.gmail.com with ESMTPSA id bq38-20020a05620a46a600b006a785ba0c25sm15097693qkb.77.2022.06.22.00.21.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 22 Jun 2022 00:21:47 -0700 (PDT) Date: Wed, 22 Jun 2022 00:21:44 -0700 From: Noah Misch To: Andrew Dunstan Cc: Michael Paquier , Tom Lane , Andres Freund , Erik Rijkers , Robert Haas , Alvaro Herrera , Mark Dilger , PostgreSQL Hackers Subject: Re: Postgres perl module namespace Message-ID: <20220622072144.GD4167527@rfd.leadboat.com> References: <20220418141530.nfxtkohefvwnzncl@alap3.anarazel.de> <20220418155224.GA1149931@rfd.leadboat.com> <2361941.1650303832@sss.pgh.pa.us> <02188900-ba1e-8c6c-c7dd-98294f39c23f@dunslane.net> <2364418.1650305263@sss.pgh.pa.us> <03909eb8-21ce-ca68-fea0-cd338e35ad59@dunslane.net> <6790e47f-aa12-e28b-e123-3fbe46f78513@dunslane.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="eJnRUKwClWJh1Khz" Content-Disposition: inline In-Reply-To: <6790e47f-aa12-e28b-e123-3fbe46f78513@dunslane.net> User-Agent: Mutt/1.5.24 (2015-08-30) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --eJnRUKwClWJh1Khz Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Apr 19, 2022 at 07:24:58PM -0400, Andrew Dunstan wrote: > On 2022-04-19 Tu 18:39, Michael Paquier wrote: > > +*generate_ascii_string = *TestLib::generate_ascii_string; > > +*slurp_dir = *TestLib::slurp_dir; > > +*slurp_file = *TestLib::slurp_file; > > > > I am not sure if it is possible and my perl-fu is limited in this > > area, but could a failure be enforced when loading this path if a new > > routine added in TestLib.pm is forgotten in this list? > > Not very easily that I'm aware of, but maybe some superior perl wizard > will know better. One can alias the symbol table, like https://metacpan.org/pod/Package::Alias does. I'm attaching what I plan to use. Today, check-world fails after sed -i 's/TestLib/PostgreSQL::Test::Utils/g; s/PostgresNode/PostgreSQL::Test::Cluster/g' **/*.pl on REL_14_STABLE, because today's alias list is incomplete. With this change, the same check-world passes. --eJnRUKwClWJh1Khz Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="alias-perl-symbol-tables-v1.patch" Author: Noah Misch Commit: Noah Misch For PostgreSQL::Test compatibility, alias entire package symbol tables. 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 FIXME. Discussion: https://postgr.es/m/FIXME diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 12339c2..a855fbc 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -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 behavior reacting to the class name. package PostgreSQL::Test::Cluster; @@ -11,5 +11,8 @@ use strict; use warnings; use PostgresNode; +BEGIN { *PostgreSQL::Test::Cluster:: = \*PostgresNode::; } + +use Exporter 'import'; 1; diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index bdbbd6e..e743bdf 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -1,48 +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 - check_mode_recursive - chmod_recursive - check_pg_config - dir_symlink - system_or_bail - system_log - run_log - run_command - 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 - $is_msys2 - $use_unix_sockets -); +use Exporter 'import'; 1; diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index be90963..5b8c7a9 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -149,6 +149,11 @@ of finding port numbers, registering instances for cleanup, etc. sub new { my ($class, $name, $pghost, $pgport) = @_; + + # Use release 15+ semantics when called under a release 15+ name. + return PostgresNode->get_new_node(@_[ 1 .. $#_ ]) + if $class ne 'PostgresNode'; + my $testname = basename($0); $testname =~ s/\.[^.]+$//; my $self = { @@ -2796,18 +2801,4 @@ sub corrupt_page_checksum =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(@_); -} - -no warnings 'once'; - -*get_free_port = *PostgresNode::get_free_port; - 1; diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index f3ee20a..610050e 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -979,46 +979,4 @@ sub command_checks_all =cut -# 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; -*check_mode_recursive = *TestLib::check_mode_recursive; -*chmod_recursive = *TestLib::chmod_recursive; -*check_pg_config = *TestLib::check_pg_config; -*dir_symlink = *TestLib::dir_symlink; -*system_or_bail = *TestLib::system_or_bail; -*system_log = *TestLib::system_log; -*run_log = *TestLib::run_log; -*run_command = *TestLib::run_command; -*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; -*is_msys2 = *TestLib::is_msys2; -*use_unix_sockets = *TestLib::use_unix_sockets; -*timeout_default = *TestLib::timeout_default; -*tmp_check = *TestLib::tmp_check; -*log_path = *TestLib::log_path; -*test_logfile = *TestLib::test_log_file; - 1; --eJnRUKwClWJh1Khz--