From 943b4c53a85d5236fdfddafcb7767a04d0823769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C5=8Dan?= Date: Thu, 12 Mar 2026 12:48:24 -0600 Subject: [PATCH 1/4] fix: sync generated files after Getopt::Yath extraction The "Break out Getopt::Yath" commit (5be97a8) added Getopt::Yath as a dependency in dist.ini but the generated Makefile.PL and cpanfile were not regenerated. This caused CPAN smoker failures: Can't locate Getopt/Yath/Settings.pm in @INC Changes: - Add Getopt::Yath 2.000007 to PREREQ_PM and FallbackPrereqs in Makefile.PL - Add Getopt::Yath 2.000007 to cpanfile requires - Remove stale t/unit/Getopt/Yath test paths from TESTS glob (files were removed with the module extraction) --- Makefile.PL | 4 +++- cpanfile | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile.PL b/Makefile.PL index facf9eeb7..78d2d13ce 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -70,6 +70,7 @@ my %WriteMakefileArgs = ( "File::ShareDir" => 0, "File::Spec" => 0, "File::Temp" => 0, + "Getopt::Yath" => "2.000007", "HTTP::Tiny" => 0, "HTTP::Tiny::Multipart" => 0, "HTTP::Tiny::UNIX" => 0, @@ -149,7 +150,7 @@ my %WriteMakefileArgs = ( }, "VERSION" => "2.000007", "test" => { - "TESTS" => "t/*.t t/JUnit/*.t t/UI/*.t t/acceptence/*.t t/database/*.t t/integration/*.t t/integration/signals/*.t t/unit/App/*.t t/unit/App/Yath/*.t t/unit/App/Yath/Command/*.t t/unit/App/Yath/Command/client/*.t t/unit/App/Yath/Command/db/*.t t/unit/App/Yath/Options/*.t t/unit/App/Yath/Plugin/*.t t/unit/App/Yath/Renderer/*.t t/unit/App/Yath/Renderer/Default/*.t t/unit/App/Yath/Resource/*.t t/unit/App/Yath/Resource/SharedJobSlots/*.t t/unit/App/Yath/Schema/*.t t/unit/App/Yath/Schema/MariaDB/*.t t/unit/App/Yath/Schema/MySQL/*.t t/unit/App/Yath/Schema/Overlay/*.t t/unit/App/Yath/Schema/Percona/*.t t/unit/App/Yath/Schema/PostgreSQL/*.t t/unit/App/Yath/Schema/Result/*.t t/unit/App/Yath/Schema/SQLite/*.t t/unit/App/Yath/Server/*.t t/unit/App/Yath/Server/Controller/*.t t/unit/App/Yath/Server/Util/*.t t/unit/App/Yath/Theme/*.t t/unit/Getopt/Yath/*.t t/unit/Getopt/Yath/Option/*.t t/unit/Getopt/Yath/Settings/*.t t/unit/TAP/Harness/*.t t/unit/TAP/Harness/Yath/*.t t/unit/Test2/*.t t/unit/Test2/EventFacet/*.t t/unit/Test2/Formatter/*.t t/unit/Test2/Harness/*.t t/unit/Test2/Harness/Collector/*.t t/unit/Test2/Harness/Collector/Auditor/*.t t/unit/Test2/Harness/Collector/IOParser/*.t t/unit/Test2/Harness/IPC/*.t t/unit/Test2/Harness/IPC/Protocol/*.t t/unit/Test2/Harness/IPC/Protocol/AtomicPipe/*.t t/unit/Test2/Harness/IPC/Protocol/IPSocket/*.t t/unit/Test2/Harness/IPC/Protocol/UnixSocket/*.t t/unit/Test2/Harness/Instance/*.t t/unit/Test2/Harness/Log/*.t t/unit/Test2/Harness/Log/CoverageAggregator/*.t t/unit/Test2/Harness/Preload/*.t t/unit/Test2/Harness/Reloader/*.t t/unit/Test2/Harness/Resource/*.t t/unit/Test2/Harness/Run/*.t t/unit/Test2/Harness/Runner/*.t t/unit/Test2/Harness/Runner/Preloading/*.t t/unit/Test2/Harness/Scheduler/*.t t/unit/Test2/Harness/Util/*.t t/unit/Test2/Harness/Util/File/*.t t/unit/Test2/Tools/*.t" + "TESTS" => "t/*.t t/JUnit/*.t t/UI/*.t t/acceptence/*.t t/database/*.t t/integration/*.t t/integration/signals/*.t t/unit/App/*.t t/unit/App/Yath/*.t t/unit/App/Yath/Command/*.t t/unit/App/Yath/Command/client/*.t t/unit/App/Yath/Command/db/*.t t/unit/App/Yath/Options/*.t t/unit/App/Yath/Plugin/*.t t/unit/App/Yath/Renderer/*.t t/unit/App/Yath/Renderer/Default/*.t t/unit/App/Yath/Resource/*.t t/unit/App/Yath/Resource/SharedJobSlots/*.t t/unit/App/Yath/Schema/*.t t/unit/App/Yath/Schema/MariaDB/*.t t/unit/App/Yath/Schema/MySQL/*.t t/unit/App/Yath/Schema/Overlay/*.t t/unit/App/Yath/Schema/Percona/*.t t/unit/App/Yath/Schema/PostgreSQL/*.t t/unit/App/Yath/Schema/Result/*.t t/unit/App/Yath/Schema/SQLite/*.t t/unit/App/Yath/Server/*.t t/unit/App/Yath/Server/Controller/*.t t/unit/App/Yath/Server/Util/*.t t/unit/App/Yath/Theme/*.t t/unit/TAP/Harness/*.t t/unit/TAP/Harness/Yath/*.t t/unit/Test2/*.t t/unit/Test2/EventFacet/*.t t/unit/Test2/Formatter/*.t t/unit/Test2/Harness/*.t t/unit/Test2/Harness/Collector/*.t t/unit/Test2/Harness/Collector/Auditor/*.t t/unit/Test2/Harness/Collector/IOParser/*.t t/unit/Test2/Harness/IPC/*.t t/unit/Test2/Harness/IPC/Protocol/*.t t/unit/Test2/Harness/IPC/Protocol/AtomicPipe/*.t t/unit/Test2/Harness/IPC/Protocol/IPSocket/*.t t/unit/Test2/Harness/IPC/Protocol/UnixSocket/*.t t/unit/Test2/Harness/Instance/*.t t/unit/Test2/Harness/Log/*.t t/unit/Test2/Harness/Log/CoverageAggregator/*.t t/unit/Test2/Harness/Preload/*.t t/unit/Test2/Harness/Reloader/*.t t/unit/Test2/Harness/Resource/*.t t/unit/Test2/Harness/Run/*.t t/unit/Test2/Harness/Runner/*.t t/unit/Test2/Harness/Runner/Preloading/*.t t/unit/Test2/Harness/Scheduler/*.t t/unit/Test2/Harness/Util/*.t t/unit/Test2/Harness/Util/File/*.t t/unit/Test2/Tools/*.t" } ); @@ -182,6 +183,7 @@ my %FallbackPrereqs = ( "File::ShareDir" => 0, "File::Spec" => 0, "File::Temp" => 0, + "Getopt::Yath" => "2.000007", "HTTP::Tiny" => 0, "HTTP::Tiny::Multipart" => 0, "HTTP::Tiny::UNIX" => 0, diff --git a/cpanfile b/cpanfile index 606331a7c..822248f68 100644 --- a/cpanfile +++ b/cpanfile @@ -27,6 +27,7 @@ requires "File::Path" => "2.11"; requires "File::ShareDir" => "0"; requires "File::Spec" => "0"; requires "File::Temp" => "0"; +requires "Getopt::Yath" => "2.000007"; requires "HTTP::Tiny" => "0"; requires "HTTP::Tiny::Multipart" => "0"; requires "HTTP::Tiny::UNIX" => "0"; From 66c928be50c59acb85c8b79913460c57a106f772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C5=8Dan?= Date: Thu, 12 Mar 2026 21:30:27 -0600 Subject: [PATCH 2/4] rebase: apply review feedback on #304 --- deplib/Getopt/Yath/Option/BoolMap.pm | 83 ++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 deplib/Getopt/Yath/Option/BoolMap.pm diff --git a/deplib/Getopt/Yath/Option/BoolMap.pm b/deplib/Getopt/Yath/Option/BoolMap.pm new file mode 100644 index 000000000..e02f9dc92 --- /dev/null +++ b/deplib/Getopt/Yath/Option/BoolMap.pm @@ -0,0 +1,83 @@ +package Getopt::Yath::Option::BoolMap; +use strict; +use warnings; + +our $VERSION = '2.000007'; + +use Carp qw/croak/; + +use parent 'Getopt::Yath::Option::Map'; +use Test2::Harness::Util::HashBase qw/+pattern +requires_arg +custom_matches/; + +sub allows_list { 1 } +sub allows_default { 1 } +sub allows_arg { 1 } +sub allows_autofill { 0 } +sub requires_autofill { 0 } + +sub notes { (shift->SUPER::notes(), 'Can be specified multiple times') } + +sub requires_arg { $_[0]->{+REQUIRES_ARG} ? 1 : 0 } + +sub init { + my $self = shift; + $self->SUPER::init(@_); + + croak "A 'pattern' is required" unless $self->{+PATTERN}; + + return $self; +} + +sub no_arg_value { $_[0]->field, 1 } + +sub pattern { + my $self = shift; + + my $append = $self->{+PATTERN}; + return qr/^--(no-)?$append$/; +} + +sub default_long_examples { + my $self = shift; + my $out = $self->SUPER::default_long_examples(@_); + push @$out => $self->pattern; + return $out; +} + +sub default_short_examples { + my $self = shift; + my $out = $self->SUPER::default_short_examples(@_); + push @$out => $self->pattern; + return $out; +} + +sub custom_matches { + my $self = shift; + my $pattern = $self->pattern; + + return sub { + my ($input, $state) = @_; + + return $self->{+CUSTOM_MATCHES}->($self, @_) + if $self->{+CUSTOM_MATCHES}; + + return unless $input =~ $pattern; + my ($no, $key) = ($1, $2); + return ($self, 1, [$key => $no ? 0 : 1]); + }; +} + +sub doc_forms { + my $self = shift; + my %params = @_; + + my ($forms, $no_forms) = $self->SUPER::doc_forms(%params); + + my $inner = "" . $self->{+PATTERN}; + $inner =~ s{^\Q(?^:\E}{}; + $inner =~ s{\)$}{}; + + return ($forms, $no_forms, ["/^--(no-)?$inner\$/"]); +} + +1; From 6f802be30e647763a929304af3fa3a00ef9e7930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C5=8Dan?= Date: Fri, 13 Mar 2026 01:37:09 -0600 Subject: [PATCH 3/4] rebase: apply review feedback on #304 --- {deplib => lib}/Getopt/Yath/Option/BoolMap.pm | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {deplib => lib}/Getopt/Yath/Option/BoolMap.pm (100%) diff --git a/deplib/Getopt/Yath/Option/BoolMap.pm b/lib/Getopt/Yath/Option/BoolMap.pm similarity index 100% rename from deplib/Getopt/Yath/Option/BoolMap.pm rename to lib/Getopt/Yath/Option/BoolMap.pm From 66918b434fbafda7a4ef52e0de8587617c6514ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C5=8Dan?= Date: Fri, 13 Mar 2026 13:34:24 -0600 Subject: [PATCH 4/4] fix: use Settings->maybe() for orig_tmp in IPC dir fallback When yath auto-detects the command (no explicit command given), it creates an IPC object with partial settings from process_args(). These partial settings lack 'orig_tmp' which is only set by args_to_settings_data(). This causes a crash: The 'orig_tmp' option does not exist Use Settings->maybe() with File::Spec->tmpdir() as fallback, matching the same pattern used in Logger.pm's default sub. This fixes 'make test' when Getopt::Yath is installed as an external dependency (post Getopt::Yath extraction). --- lib/App/Yath/IPC.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/App/Yath/IPC.pm b/lib/App/Yath/IPC.pm index 01fda8836..1ff7dc416 100644 --- a/lib/App/Yath/IPC.pm +++ b/lib/App/Yath/IPC.pm @@ -46,7 +46,8 @@ sub dir { my $base = clean_path($settings->yath->base_dir); my $sha = sha1_hex($base); - $ipc_dir = File::Spec->catdir($settings->yath->orig_tmp, "yath-ipc-$ENV{USER}-$sha"); + my $tmp = $settings->maybe('yath', 'orig_tmp', File::Spec->tmpdir()); + $ipc_dir = File::Spec->catdir($tmp, "yath-ipc-$ENV{USER}-$sha"); make_path($ipc_dir) unless -e $ipc_dir;