Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package perl-Mojo-IOLoop-ReadWriteProcess for openSUSE:Factory checked in at 2022-12-13 18:55:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Mojo-IOLoop-ReadWriteProcess (Old) and /work/SRC/openSUSE:Factory/.perl-Mojo-IOLoop-ReadWriteProcess.new.1835 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojo-IOLoop-ReadWriteProcess" Tue Dec 13 18:55:18 2022 rev:18 rq:1042463 version:0.33 Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Mojo-IOLoop-ReadWriteProcess/perl-Mojo-IOLoop-ReadWriteProcess.changes 2021-12-13 20:51:13.952667016 +0100 +++ /work/SRC/openSUSE:Factory/.perl-Mojo-IOLoop-ReadWriteProcess.new.1835/perl-Mojo-IOLoop-ReadWriteProcess.changes 2022-12-13 18:55:33.571232790 +0100 @@ -1,0 +2,16 @@ +Mon Dec 12 20:21:31 UTC 2022 - Tina Müller <timueller+p...@suse.de> + +- updated to 0.33 + see /usr/share/doc/packages/perl-Mojo-IOLoop-ReadWriteProcess/Changes + + 0.33 2022-12-12T12:22:13Z + - Apply perltidy v20221112 + - remove hard-coding of OABI syscall entry point + - Fix typos detected by lintian (Debian) (#47) + - tests: Check executable, before using it in tests + - Fix sporadic 01_run.t failure -- "process is still running" + - Fix all .perltidyrc violations + - Run perltidy for pull requests + - Add test for SIG_CHLD handler in spawned process + +------------------------------------------------------------------- Old: ---- Mojo-IOLoop-ReadWriteProcess-0.32.tar.gz New: ---- Mojo-IOLoop-ReadWriteProcess-0.33.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Mojo-IOLoop-ReadWriteProcess.spec ++++++ --- /var/tmp/diff_new_pack.d9NeYv/_old 2022-12-13 18:55:34.151235885 +0100 +++ /var/tmp/diff_new_pack.d9NeYv/_new 2022-12-13 18:55:34.155235907 +0100 @@ -1,7 +1,7 @@ # # spec file for package perl-Mojo-IOLoop-ReadWriteProcess # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,10 +18,10 @@ %define cpan_name Mojo-IOLoop-ReadWriteProcess Name: perl-Mojo-IOLoop-ReadWriteProcess -Version: 0.32 +Version: 0.33 Release: 0 -Summary: Execute external programs or internal code blocks as separate process License: Artistic-1.0 OR GPL-1.0-or-later +Summary: Execute external programs or internal code blocks as separate process URL: https://metacpan.org/release/%{cpan_name} Source0: https://cpan.metacpan.org/authors/id/S/SZ/SZARATE/%{cpan_name}-%{version}.tar.gz Source1: cpanspec.yml ++++++ Mojo-IOLoop-ReadWriteProcess-0.32.tar.gz -> Mojo-IOLoop-ReadWriteProcess-0.33.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/Changes new/Mojo-IOLoop-ReadWriteProcess-0.33/Changes --- old/Mojo-IOLoop-ReadWriteProcess-0.32/Changes 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/Changes 2022-12-12 13:24:02.000000000 +0100 @@ -1,6 +1,17 @@ Revision history for Perl extension Mojo-IOLoop-ReadWriteProcess +0.33 2022-12-12T12:22:13Z + - Apply perltidy v20221112 + - remove hard-coding of OABI syscall entry point + - Fix typos detected by lintian (Debian) (#47) + - tests: Check executable, before using it in tests + - Fix sporadic 01_run.t failure -- "process is still running" + - Fix all .perltidyrc violations + - Run perltidy for pull requests + - Add test for SIG_CHLD handler in spawned process + + 0.32 2021-12-09T18:03:02Z - Project moved to https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess - Introduce emit_from_sigchld() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/MANIFEST new/Mojo-IOLoop-ReadWriteProcess-0.33/MANIFEST --- old/Mojo-IOLoop-ReadWriteProcess-0.32/MANIFEST 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/MANIFEST 2022-12-12 13:24:02.000000000 +0100 @@ -50,7 +50,9 @@ t/12_mocked_container.t t/13_shared.t t/data/process_check.sh +t/data/sigchld_handler.pl t/data/simple_fork.pl +t/data/simple_rwp.pl t/data/subreaper/child.sh t/data/subreaper/dead_child.sh t/data/subreaper/dead_master.sh diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/META.json new/Mojo-IOLoop-ReadWriteProcess-0.33/META.json --- old/Mojo-IOLoop-ReadWriteProcess-0.32/META.json 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/META.json 2022-12-12 13:24:02.000000000 +0100 @@ -4,7 +4,7 @@ "Ettore Di Giacinto <edigiaci...@suse.com>" ], "dynamic_config" : 0, - "generated_by" : "Minilla/v3.1.12", + "generated_by" : "Minilla/v3.1.20", "license" : [ "perl_5" ], @@ -60,7 +60,7 @@ "provides" : { "Mojo::IOLoop::ReadWriteProcess" : { "file" : "lib/Mojo/IOLoop/ReadWriteProcess.pm", - "version" : "0.32" + "version" : "0.33" }, "Mojo::IOLoop::ReadWriteProcess::CGroup" : { "file" : "lib/Mojo/IOLoop/ReadWriteProcess/CGroup.pm" @@ -148,25 +148,30 @@ }, "homepage" : "https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess", "repository" : { - "url" : "git://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess.git", + "type" : "git", + "url" : "https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess.git", "web" : "https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess" } }, - "version" : "0.32", + "version" : "0.33", "x_contributors" : [ "Adam Williamson <awill...@redhat.com>", "Clemens Famulla-Conrad <cfamullacon...@suse.de>", "Ettore Di Giacinto <mud...@gentoo.org>", "Ettore Di Giacinto <mud...@users.noreply.github.com>", "Marius Kittler <mkitt...@suse.de>", + "Martchus <martc...@gmx.net>", "Mohammad S Anwar <mohammad.an...@yahoo.com>", + "Nick Morrott <knowledgejun...@gmail.com>", "Oliver Kurz <ok...@suse.de>", "Santiago Zarate <229240+foursixn...@users.noreply.github.com>", "Santiago Zarate <santiago+git...@zarate.co>", "Santiago Zarate <santi...@zarate.co>", + "Sebastian Riedel <s...@kraih.com>", "Sebastian Riedel <s...@cpan.org>", - "cfconrad <40127946+cfcon...@users.noreply.github.com>" + "cfconrad <40127946+cfcon...@users.noreply.github.com>", + "gregor herrmann <gre...@debian.org>" ], - "x_serialization_backend" : "JSON::PP version 4.06", + "x_serialization_backend" : "JSON::PP version 4.12", "x_static_install" : 0 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/META.yml new/Mojo-IOLoop-ReadWriteProcess-0.33/META.yml --- old/Mojo-IOLoop-ReadWriteProcess-0.32/META.yml 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/META.yml 2022-12-12 13:24:02.000000000 +0100 @@ -9,7 +9,7 @@ Module::Build: '0.4005' perl: '5.016' dynamic_config: 0 -generated_by: 'Minilla/v3.1.12, CPAN::Meta::Converter version 2.150010' +generated_by: 'Minilla/v3.1.20, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -28,7 +28,7 @@ provides: Mojo::IOLoop::ReadWriteProcess: file: lib/Mojo/IOLoop/ReadWriteProcess.pm - version: '0.32' + version: '0.33' Mojo::IOLoop::ReadWriteProcess::CGroup: file: lib/Mojo/IOLoop/ReadWriteProcess/CGroup.pm Mojo::IOLoop::ReadWriteProcess::CGroup::v1: @@ -87,20 +87,24 @@ resources: bugtracker: https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess/issues homepage: https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess - repository: git://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess.git -version: '0.32' + repository: https://github.com/openSUSE/Mojo-IOLoop-ReadWriteProcess.git +version: '0.33' x_contributors: - 'Adam Williamson <awill...@redhat.com>' - 'Clemens Famulla-Conrad <cfamullacon...@suse.de>' - 'Ettore Di Giacinto <mud...@gentoo.org>' - 'Ettore Di Giacinto <mud...@users.noreply.github.com>' - 'Marius Kittler <mkitt...@suse.de>' + - 'Martchus <martc...@gmx.net>' - 'Mohammad S Anwar <mohammad.an...@yahoo.com>' + - 'Nick Morrott <knowledgejun...@gmail.com>' - 'Oliver Kurz <ok...@suse.de>' - 'Santiago Zarate <229240+foursixn...@users.noreply.github.com>' - 'Santiago Zarate <santiago+git...@zarate.co>' - 'Santiago Zarate <santi...@zarate.co>' + - 'Sebastian Riedel <s...@kraih.com>' - 'Sebastian Riedel <s...@cpan.org>' - 'cfconrad <40127946+cfcon...@users.noreply.github.com>' + - 'gregor herrmann <gre...@debian.org>' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' x_static_install: 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/README.md new/Mojo-IOLoop-ReadWriteProcess-0.33/README.md --- old/Mojo-IOLoop-ReadWriteProcess-0.32/README.md 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/README.md 2022-12-12 13:24:02.000000000 +0100 @@ -266,7 +266,7 @@ ## kill\_sleeptime -Defaults to `1`, it's the seconds to wait before attempting SIGKILL when blocking\_stop is setted to 1. +Defaults to `1`, it's the seconds to wait before attempting SIGKILL when blocking\_stop is set to 1. ## separate\_err @@ -361,7 +361,7 @@ my $p = process()->enable_subreaper; Mark the current process (not the child) as subreaper. -This is used typically if you want to mark further childs as subreapers inside other forks. +This is used typically if you want to mark further children as subreapers inside other forks. my $master_p = process( sub { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v1/Cpuset.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v1/Cpuset.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v1/Cpuset.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v1/Cpuset.pm 2022-12-12 13:24:02.000000000 +0100 @@ -58,12 +58,12 @@ sub sched_load_balance { shift->cgroup->_flag(SCHED_LOAD_BALANCE_INTERFACE, @_); } -sub memory_spread_slab { shift->cgroup->_flag(MEM_SPREAD_SLAB_INTERFACE, @_) } -sub memory_spread_page { shift->cgroup->_flag(MEM_SPREAD_PAGE_INTERFACE, @_) } +sub memory_spread_slab { shift->cgroup->_flag(MEM_SPREAD_SLAB_INTERFACE, @_) } +sub memory_spread_page { shift->cgroup->_flag(MEM_SPREAD_PAGE_INTERFACE, @_) } sub get_memory_pressure { shift->cgroup->_list(MEM_PRESSURE_INTERFACE) } -sub mem_hardwall { shift->cgroup->_flag(MEM_HARDWALL_INTERFACE, @_) } -sub mem_exclusive { shift->cgroup->_flag(MEM_EXCLUSIVE_INTERFACE, @_) } -sub cpu_exclusive { shift->cgroup->_flag(CPU_EXCLUSIVE_INTERFACE, @_) } +sub mem_hardwall { shift->cgroup->_flag(MEM_HARDWALL_INTERFACE, @_) } +sub mem_exclusive { shift->cgroup->_flag(MEM_EXCLUSIVE_INTERFACE, @_) } +sub cpu_exclusive { shift->cgroup->_flag(CPU_EXCLUSIVE_INTERFACE, @_) } sub memory_migrate { shift->cgroup->_flag(MEMORY_MIGRATE_INTERFACE, @_) } 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/CPU.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/CPU.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/CPU.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/CPU.pm 2022-12-12 13:24:02.000000000 +0100 @@ -12,9 +12,9 @@ has cgroup => sub { Mojo::IOLoop::ReadWriteProcess::CGroup::v2->new }; sub stat { shift->cgroup->_list(STAT_INTERFACE) } -sub weight { shift->cgroup->_setget(WEIGHT_INTERFACE, @_) } +sub weight { shift->cgroup->_setget(WEIGHT_INTERFACE, @_) } sub weight_nice { shift->cgroup->_setget(WEIGHT_NICE_INTERFACE, @_) } -sub max { shift->cgroup->_setget(MAX_INTERFACE, @_) } +sub max { shift->cgroup->_setget(MAX_INTERFACE, @_) } 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/IO.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/IO.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/IO.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/IO.pm 2022-12-12 13:24:02.000000000 +0100 @@ -12,7 +12,7 @@ sub stat { shift->cgroup->_list(STAT_INTERFACE) } sub weight { shift->cgroup->_setget(WEIGHT_INTERFACE, @_) } -sub max { shift->cgroup->_setget(MAX_INTERFACE, @_) } +sub max { shift->cgroup->_setget(MAX_INTERFACE, @_) } 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/Memory.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/Memory.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/Memory.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/CGroup/v2/Memory.pm 2022-12-12 13:24:02.000000000 +0100 @@ -18,9 +18,9 @@ sub current { shift->cgroup->_list(CURRENT_INTERFACE) } sub swap_current { shift->cgroup->_list(SWAP_CURRENT_INTERFACE) } -sub low { shift->cgroup->_setget(LOW_INTERFACE, @_) } -sub high { shift->cgroup->_setget(HIGH_INTERFACE, @_) } -sub max { shift->cgroup->_setget(MAX_INTERFACE, @_) } +sub low { shift->cgroup->_setget(LOW_INTERFACE, @_) } +sub high { shift->cgroup->_setget(HIGH_INTERFACE, @_) } +sub max { shift->cgroup->_setget(MAX_INTERFACE, @_) } sub swap_max { shift->cgroup->_setget(SWAP_MAX_INTERFACE, @_) } sub events { shift->cgroup->_list(EVENTS_INTERFACE) } sub stat { shift->cgroup->_list(STAT_INTERFACE) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Container.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Container.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Container.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Container.pm 2022-12-12 13:24:02.000000000 +0100 @@ -197,7 +197,7 @@ =head1 DESCRIPTION -L<Mojo::IOLoop::ReadWriteProcess::Container> ties anonymous functions or a L<Mojo::IOLoop::ReadWriteProcess> object to differents +L<Mojo::IOLoop::ReadWriteProcess::Container> ties anonymous functions or a L<Mojo::IOLoop::ReadWriteProcess> object to different sets of L<Mojo::IOLoop::ReadWriteProcess::CGroup> implementations. When the C<pid_isolation> attribute is set, it needs special permissions (CAP_SYS_ADMIN capabilities). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Session.pm 2022-12-12 13:24:02.000000000 +0100 @@ -56,7 +56,8 @@ while ((my $pid = waitpid(-1, WNOHANG)) > 0) { $singleton->add_collected_info($pid, $?, $!); } - $singleton->consume_collected_info() if ($singleton->emit_from_sigchld()); + $singleton->consume_collected_info() + if ($singleton->emit_from_sigchld()); } }); } @@ -84,14 +85,14 @@ } sub consume_collected_info { - while(my $i = shift @{$singleton->collected_info}) { - $singleton->collect(@$i) - } + while (my $i = shift @{$singleton->collected_info}) { + $singleton->collect(@$i); + } } sub add_collected_info { - shift; - push @{$singleton->collected_info}, [@_]; + shift; + push @{$singleton->collected_info}, [@_]; } # Use as $pid => Mojo::IOLoop::ReadWriteProcess @@ -135,7 +136,11 @@ $singleton->all->grep(sub { $_->pid eq $pid })->size == 1; } -sub reset { @{+shift}{qw(events orphans process_table collected_info handler emit_from_sigchld)} = ({}, {}, {}, [], undef, 1) } +sub reset { + @{+shift} + {qw(events orphans process_table collected_info handler emit_from_sigchld)} + = ({}, {}, {}, [], undef, 1); +} # XXX: This should be replaced by PR_GET_CHILD_SUBREAPER sub disable_subreaper { @@ -170,7 +175,6 @@ : ($machine eq "ppc" || $machine eq "ppc64le") ? 171 : $machine eq "ia64" ? 1170 : $machine eq "alpha" ? 348 - : ($machine eq "arm" || $machine eq "armv7l") ? 0x900000 + 172 : $machine eq "avr32" ? 148 : $machine eq "mips" ? 4000 + 192 : $machine eq "mips64" ? 5000 + 153 @@ -361,7 +365,7 @@ session->enable_subreaper; Mark the current process (not the child) as subreaper. -This is used typically if you want to mark further childs as subreapers inside other forks. +This is used typically if you want to mark further children as subreapers inside other forks. use Mojo::IOLoop::ReadWriteProcess::Session qw(session); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Lock.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Lock.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Lock.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Lock.pm 2022-12-12 13:24:02.000000000 +0100 @@ -134,7 +134,7 @@ $l->locked; # is 0 -Executes a function inside a locked section. Errors are catched so lock is released in case of failures. +Executes a function inside a locked section. Errors are caught so lock is released in case of failures. =head1 ATTRIBUTES diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Memory.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Memory.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Memory.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Memory.pm 2022-12-12 13:24:02.000000000 +0100 @@ -15,8 +15,8 @@ has key => sub { Mojo::IOLoop::ReadWriteProcess::Shared::Semaphore::_genkey() }; has 'buffer'; -has destroy => 0; -has flags => S_IRWXU() | S_IRWXG() | IPC_CREAT(); +has destroy => 0; +has flags => S_IRWXU() | S_IRWXG() | IPC_CREAT(); has lock_flags => IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; has _size => 10 * 1024; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Semaphore.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Semaphore.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Semaphore.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess/Shared/Semaphore.pm 2022-12-12 13:24:02.000000000 +0100 @@ -10,11 +10,11 @@ use Exporter 'import'; use constant DEBUG => $ENV{MOJO_PROCESS_DEBUG}; -has key => sub { shift->_genkey }; -has _sem => sub { $_[0]->_create(shift->key) }; +has key => sub { shift->_genkey }; +has _sem => sub { $_[0]->_create(shift->key) }; has count => 1; has _value => 1; -has flags => IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP +has flags => IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; sub semaphore { __PACKAGE__->new(@_) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/lib/Mojo/IOLoop/ReadWriteProcess.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/lib/Mojo/IOLoop/ReadWriteProcess.pm 2022-12-12 13:24:02.000000000 +0100 @@ -1,6 +1,6 @@ package Mojo::IOLoop::ReadWriteProcess; -our $VERSION = '0.32'; +our $VERSION = '0.33'; use Mojo::Base 'Mojo::EventEmitter'; use Mojo::File 'path'; @@ -56,8 +56,8 @@ has _deparse => sub { B::Deparse->new } if DEBUG; -has _deserialize => sub { \&Storable::thaw }; -has _serialize => sub { \&Storable::freeze }; +has _deserialize => sub { \&Storable::thaw }; +has _serialize => sub { \&Storable::freeze }; has _default_kill_signal => POSIX::SIGTERM; has _default_blocking_signal => POSIX::SIGKILL; @@ -76,7 +76,7 @@ my $me = $$; $stream->on( close => sub { - return unless $$ == $me; + return unless $$ == $me; $self->_collect->stop unless defined $self->_status; }); return $stream; @@ -396,10 +396,11 @@ sub restart { $_[0]->is_running ? $_[0]->stop->start : $_[0]->start; } + sub is_running { - my ($self) = shift; - $self->session->consume_collected_info; - $self->process_id ? kill 0 => $self->process_id : 0; + my ($self) = shift; + $self->session->consume_collected_info; + $self->process_id ? kill 0 => $self->process_id : 0; } sub write_pidfile { @@ -513,7 +514,7 @@ my $self = shift; my $pid = $self->pid; - return $self unless defined $pid; + return $self unless defined $pid; return $self->_shutdown(1) unless $self->is_running; $self->_diag("Stopping $pid") if DEBUG; @@ -902,7 +903,7 @@ =head2 kill_sleeptime -Defaults to C<1>, it's the seconds to wait before attempting SIGKILL when blocking_stop is setted to 1. +Defaults to C<1>, it's the seconds to wait before attempting SIGKILL when blocking_stop is set to 1. =head2 separate_err @@ -998,7 +999,7 @@ my $p = process()->enable_subreaper; Mark the current process (not the child) as subreaper. -This is used typically if you want to mark further childs as subreapers inside other forks. +This is used typically if you want to mark further children as subreapers inside other forks. my $master_p = process( sub { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/01_run.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/01_run.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/01_run.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/01_run.t 2022-12-12 13:24:02.000000000 +0100 @@ -9,8 +9,8 @@ use IO::Select; use Mojo::File qw(tempfile path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); -use Mojo::IOLoop::ReadWriteProcess qw(process); -use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); +use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt check_bin); subtest process => sub { @@ -35,7 +35,7 @@ $p->start(); $p->stop(); }; - ok $@, "Error expected"; + ok $@, "Error expected"; like $@, qr/Nothing to do/, "Process with no code nor execute command, will fail"; @@ -88,8 +88,8 @@ close(PARENT); chomp @output; - is $output[0], "FOOBARFTW", 'right output from process'; - is $p->is_running, 0, "Process now is stopped"; + is $output[0], "FOOBARFTW", 'right output from process'; + is $p->is_running, 0, "Process now is stopped"; # Redefine new code and restart it. pipe(PARENT, CHILD); @@ -106,8 +106,8 @@ @output = scalar <PARENT>; $p->stop(); chomp @output; - is $output[0], "FOOBAZFTW", 'right output from process'; - is $p->is_running, 0, "Process now is not running"; + is $output[0], "FOOBAZFTW", 'right output from process'; + is $p->is_running, 0, "Process now is not running"; @output = (''); pipe(PARENT, CHILD); @@ -129,24 +129,15 @@ }; subtest 'process execute()' => sub { - my $test_script = "$FindBin::Bin/data/process_check.sh"; - my $test_script_sigtrap = "$FindBin::Bin/data/term_trap.sh"; - plan skip_all => - "You do not seem to have bash, which is required (as for now) for this test" - unless -e '/bin/bash'; - plan skip_all => -"You do not seem to have $test_script. The script is required to run the test" - unless -e $test_script; - plan skip_all => -"You do not seem to have $test_script_sigtrap. The script is required to run the test" - unless -e $test_script_sigtrap; - my $p = Mojo::IOLoop::ReadWriteProcess->new( + my $test_script = check_bin("$FindBin::Bin/data/process_check.sh"); + my $test_script_sigtrap = check_bin("$FindBin::Bin/data/term_trap.sh"); + my $p = Mojo::IOLoop::ReadWriteProcess->new( sleeptime_during_kill => 0.1, execute => $test_script )->start(); is $p->getline, "TEST normal print\n", 'Get right output from stdout'; is $p->err_getline, "TEST error print\n", 'Get right output from stderr'; - is $p->is_running, 1, 'process is still waiting for our input'; + is $p->is_running, 1, 'process is still waiting for our input'; $p->write("FOOBAR"); is $p->read, "you entered FOOBAR\n", 'process received input and printed it back'; @@ -163,7 +154,7 @@ ])->start(); is $p->stdout, "TEST normal print\n", 'Get right output from stdout'; is $p->err_getline, "TEST error print\n", 'Get right output from stderr'; - is $p->is_running, 1, 'process is still waiting for our input'; + is $p->is_running, 1, 'process is still waiting for our input'; $p->write("FOOBAR"); is $p->getline, "you entered FOOBAR\n", 'process received input and printed it back'; @@ -178,7 +169,7 @@ )->args([qw(FOO BAZ)])->start(); is $p->stdout, "TEST normal print\n", 'Get right output from stdout'; is $p->err_getline, "TEST error print\n", 'Get right output from stderr'; - is $p->is_running, 1, 'process is still waiting for our input'; + is $p->is_running, 1, 'process is still waiting for our input'; $p->write("FOOBAR"); is $p->getline, "you entered FOOBAR\n", 'process received input and printed it back'; @@ -223,9 +214,10 @@ max_kill_attempts => -4, ); # ;) $p->start(); + is($p->read_stdout(), "term_trap.sh started\n"); $p->stop(); - is $p->is_running, 1, 'process is still running'; - is $p->_status, undef, 'no status yet'; + is $p->is_running, 1, 'process is still running'; + is $p->_status, undef, 'no status yet'; my $err = ${(@{$p->error})[0]}; my $exp = qr/Could not kill process/; like $err, $exp, 'Error is not empty if process could not be killed'; @@ -266,8 +258,8 @@ pidfile => $pidfile )->start(); my $pid = path($pidfile)->slurp(); - is -e $pidfile, 1, 'Pidfile is there!'; - is $pid, $p->pid, "Pidfile was correctly written"; + is -e $pidfile, 1, 'Pidfile is there!'; + is $pid, $p->pid, "Pidfile was correctly written"; $p->stop(); is -e $pidfile, undef, 'Pidfile got removed after stop()'; @@ -283,8 +275,8 @@ )->start(); $p->write_pidfile($pidfile); $pid = path($pidfile)->slurp(); - is -e $pidfile, 1, 'Pidfile is there!'; - is $pid, $p->pid, "Pidfile was correctly written"; + is -e $pidfile, 1, 'Pidfile is there!'; + is $pid, $p->pid, "Pidfile was correctly written"; $p->stop(); is -e $pidfile, undef, 'Pidfile got removed after stop()'; @@ -301,10 +293,15 @@ $p->stop(); }; -subtest 'process(execute =>"/usr/bin/true")' => sub { - plan skip_all => "Missing '/usr/bin/true'" unless -e '/usr/bin/true'; +subtest 'process(execute => /bin/true)' => sub { + check_bin('/bin/true'); - is(process(execute => '/usr/bin/true')->quirkiness(1)->start()->wait_stop()->exit_status(), 0, 'Simple exec of "/usr/bin/true" return 0'); + is( + process(execute => '/bin/true')->quirkiness(1)->start()->wait_stop() + ->exit_status(), + 0, + 'Simple exec of /bin/true return 0' + ); }; subtest 'process code()' => sub { @@ -464,14 +461,11 @@ $p->write("a"); $p->wait_stop(); like $p->stderr_all, qr/TEST error print/, 'read all from stderr works'; - is $p->read_all, '', 'stdout is empty'; + is $p->read_all, '', 'stdout is empty'; }; subtest stop_whole_process_group_gracefully => sub { - my $test_script = "$FindBin::Bin/data/simple_fork.pl"; - plan skip_all => - "You do not seem to have $test_script which is required to run the test" - unless -e $test_script; + my $test_script = check_bin("$FindBin::Bin/data/simple_fork.pl"); # run the "term_trap.pl" script and its sub processes within its own # process group @@ -546,46 +540,88 @@ subtest 'process_args' => sub { my $code = sub { - shift; - print $_.$/ for(@_); + shift; + print "$_$/" for @_; }; - my $p = Mojo::IOLoop::ReadWriteProcess->new($code, args => '0' )->start->wait_stop(); + my $p = Mojo::IOLoop::ReadWriteProcess->new($code, args => '0') + ->start->wait_stop(); is($p->read_all_stdout(), "0$/", '1) False scalar value was given as args.'); - $p = Mojo::IOLoop::ReadWriteProcess->new($code)->args('0')->start->wait_stop(); + $p + = Mojo::IOLoop::ReadWriteProcess->new($code)->args('0')->start->wait_stop(); is($p->read_all_stdout(), "0$/", '2) False scalar value was given as args.'); - $p = Mojo::IOLoop::ReadWriteProcess->new($code, args => [(0..3)] )->start->wait_stop(); + $p = Mojo::IOLoop::ReadWriteProcess->new($code, args => [(0 .. 3)]) + ->start->wait_stop(); is($p->read_all_stdout(), "0$/1$/2$/3$/", '1) Args given as arrayref.'); - $p = Mojo::IOLoop::ReadWriteProcess->new($code)->args([(0..3)])->start->wait_stop(); + $p = Mojo::IOLoop::ReadWriteProcess->new($code)->args([(0 .. 3)]) + ->start->wait_stop(); is($p->read_all_stdout(), "0$/1$/2$/3$/", '2) Args given as arrayref.'); }; subtest 'process in process' => sub { - my $p = process(sub { - is( process(execute => '/usr/bin/true')->quirkiness(1)->start()->wait_stop()->exit_status(), 0, 'process(execute) from process(code) -- retval check true'); - is( process(execute => '/usr/bin/false')->quirkiness(1)->start()->wait_stop()->exit_status(), 1, 'process(execute) from process(code) -- retval check false'); - is( process(sub { print 'sub-sub-process'})->start()->wait_stop()->read_all_stdout, 'sub-sub-process', 'process(code) works from process(code)'); - print 'DONE'; + check_bin('/bin/true'); + check_bin('/bin/false'); + + my $p = process( + sub { + is( + process(execute => '/bin/true')->quirkiness(1)->start()->wait_stop() + ->exit_status(), + 0, + 'process(execute) from process(code) -- retval check true' + ); + is( + process(execute => '/bin/false')->quirkiness(1)->start()->wait_stop() + ->exit_status(), + 1, + 'process(execute) from process(code) -- retval check false' + ); + is( + process(sub { print 'sub-sub-process' })->start()->wait_stop() + ->read_all_stdout, + 'sub-sub-process', + 'process(code) works from process(code)' + ); + print 'DONE'; })->start()->wait_stop(); - is ($p->read_all_stdout(), 'DONE', "Use ReadWriteProcess inside of ReadWriteProcess(code=>'')"); + is($p->read_all_stdout(), 'DONE', + "Use ReadWriteProcess inside of ReadWriteProcess(code=>'')"); }; subtest 'execute exeption handling' => sub { - throws_ok { - process(execute => '/I/do/not/exist')->start()->wait_stop()->exit_status(); - } qr%/I/do/not/exist%, 'Execute throw exception, if executable does not exists'; - - my $p = process(execute => 'sleep 0.2')->start(); - attempt { - attempts => 20, - condition => sub { defined($p->exit_status)}, - }; - is ($p->is_running(), 0, 'Process not running'); - is ($p->exit_status(), 0, 'Exit status is 0'); + throws_ok { + process(execute => '/I/do/not/exist')->start()->wait_stop()->exit_status(); + } + qr%/I/do/not/exist%, 'Execute throw exception, if executable does not exists'; + + my $p = process(execute => 'sleep 0.2')->start(); + attempt {attempts => 20, condition => sub { defined($p->exit_status) },}; + is($p->is_running(), 0, 'Process not running'); + is($p->exit_status(), 0, 'Exit status is 0'); +}; + +subtest 'SIG_CHLD handler in spawned process' => sub { + my $simple_rwp = check_bin("$FindBin::Bin/data/simple_rwp.pl"); + my $sigchld_handler = check_bin("$FindBin::Bin/data/sigchld_handler.pl"); + + # use `perl <script>` here, as Github ci action place the used perl executable + # somewhere like /opt/hostedtoolcache/perl/<version>/<arch>/bin/perl so + # /usr/bin/perl wouldn't have all needed dependencies + is( + process(execute => 'perl')->args([$simple_rwp])->start()->wait_stop() + ->exit_status(), + 0, + 'simple_rwp.pl exit with 0' + ); + + my $p = process(execute => $sigchld_handler); + is($p->start()->wait_stop()->exit_status(), + 0, 'sigchld_handler.pl exit with 0'); + like($p->read_all_stdout, qr/SIG_CHLD/, "SIG_CHLD handler was executed"); }; done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/02_parallel.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/02_parallel.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/02_parallel.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/02_parallel.t 2022-12-12 13:24:02.000000000 +0100 @@ -62,7 +62,7 @@ $c->each(sub { my $p = shift; $p->wait; is $p->getline(), "Hello world\n"; }); $c->wait_stop; - is $fired, $n_proc; + is $fired, $n_proc; is scalar(@procs), $n_proc; $c->add( @@ -124,7 +124,7 @@ $p->add(sub { print "Hello\n" }); $p->add(sub { print "Wof\n" }); $p->add(sub { print "Wof2\n" }); - is $p->get(1), undef; + is $p->get(1), undef; is $p->size, 1; is $p->maximum_processes, 1; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/03_func.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/03_func.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/03_func.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/03_func.t 2022-12-12 13:24:02.000000000 +0100 @@ -7,7 +7,7 @@ use FindBin; use Mojo::File qw(tempfile path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); -use Mojo::IOLoop::ReadWriteProcess qw(process queue parallel); +use Mojo::IOLoop::ReadWriteProcess qw(process queue parallel); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); no warnings; # This test mocks a lot diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/04_queues.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/04_queues.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/04_queues.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/04_queues.t 2022-12-12 13:24:02.000000000 +0100 @@ -36,7 +36,7 @@ is $q->pool->size, 3; is $q->pool->maximum_processes, 3; $q->consume; - is $fired, $proc; + is $fired, $proc; is $q->queue->size, 0; is $q->pool->size, 0; is $q->done->size, $proc; @@ -72,7 +72,7 @@ is $q->pool->size, 2; is $q->pool->maximum_processes, 2; $q->consume; - is $fired, $proc; + is $fired, $proc; is $q->queue->size, 0; is $q->pool->size, 0; is $q->done->size, $proc; @@ -108,7 +108,7 @@ is $q->pool->size, 1; is $q->pool->maximum_processes, 1; $q->consume; - is $fired, $proc; + is $fired, $proc; is $q->queue->size, 0; is $q->pool->size, 0; is $q->done->size, $proc; @@ -147,7 +147,7 @@ is $q->queue->size, 0; is $q->pool->size, 0; is $q->done->size, $proc; - is $fired, $proc; + is $fired, $proc; $i = 1; for (1 .. $proc) { is $output{$i + 42}, 1 or diag explain \%output; @@ -189,7 +189,7 @@ is $q->queue->size, 0; is $q->pool->size, 0; is $q->done->size, $proc; - is $fired, $proc; + is $fired, $proc; $i = 1; for (1 .. $proc) { is $output{$i}, 1 or diag explain \%output; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/06_events.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/06_events.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/06_events.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/06_events.t 2022-12-12 13:24:02.000000000 +0100 @@ -7,18 +7,12 @@ use FindBin; use Mojo::File qw(tempfile path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); -use Mojo::IOLoop::ReadWriteProcess qw(process); -use Mojo::IOLoop::ReadWriteProcess::Session qw(session); -use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); +use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess::Session qw(session); +use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt check_bin); subtest SIG_CHLD => sub { - my $test_script = "$FindBin::Bin/data/process_check.sh"; - plan skip_all => - "You do not seem to have bash, which is required (as for now) for this test" - unless -e '/bin/bash'; - plan skip_all => -"You do not seem to have $test_script. The script is required to run the test" - unless -e $test_script; + my $test_script = check_bin("$FindBin::Bin/data/process_check.sh"); my $reached; my $collect = 0; @@ -98,81 +92,74 @@ }; subtest collect_from_signal_handler => sub { - my $p = process(execute => '/usr/bin/true'); + check_bin('/bin/true'); + my $p = process(execute => '/bin/true'); my $collected = 0; - my $orphan = 0; - my $sig_chld = 0; + my $orphan = 0; + my $sig_chld = 0; $p->session->reset(); - $p->session->collect_status(1); # needed, because previous test set it to 0 - $p->session->on(SIG_CHLD => sub { $sig_chld++}); - $p->session->on(collected => sub { $collected++ }); + $p->session->collect_status(1); # needed, because previous test set it to 0 + $p->session->on(SIG_CHLD => sub { $sig_chld++ }); + $p->session->on(collected => sub { $collected++ }); $p->session->on(collected_orphan => sub { $orphan++ }); $p->start(); attempt { attempts => 10, - condition => sub { $sig_chld > 0 && $collected > 0}, + condition => sub { $sig_chld > 0 && $collected > 0 }, }; - is($sig_chld, 1, "Event for SIG_CHILD was emitted"); + is($sig_chld, 1, "Event for SIG_CHILD was emitted"); is($collected, 1, "Event collected apear without doing active wait()"); - is($orphan, 0, "No orphans where collected"); + is($orphan, 0, "No orphans where collected"); $p->wait_stop(); - is($collected, 1, "No more collect events emitted"); - is($orphan, 0, "No more orphans events emitted"); - is($p->exit_status, 0 , '/usr/bin/true exited with 0'); + is($collected, 1, "No more collect events emitted"); + is($orphan, 0, "No more orphans events emitted"); + is($p->exit_status, 0, '/bin/true exited with 0'); - exec ('/usr/bin/true') if (fork() == 0); + exec('/bin/true') if (fork() == 0); - attempt { - attempts => 10, - condition => sub { $sig_chld > 1 && $orphan > 0}, - }; + attempt {attempts => 10, condition => sub { $sig_chld > 1 && $orphan > 0 },}; - is($sig_chld, 2, "Event for SIG_CHILD was emitted"); + is($sig_chld, 2, "Event for SIG_CHILD was emitted"); is($collected, 1, "No more collect events emitted (2)"); - is($orphan, 1, "Collect one orphan"); + is($orphan, 1, "Collect one orphan"); }; subtest emit_from_sigchld_off => sub { - my $p = process(execute => '/usr/bin/true'); + check_bin('/bin/true'); + my $p = process(execute => '/bin/true'); my $collected = 0; - my $orphan = 0; - my $sig_chld = 0; + my $orphan = 0; + my $sig_chld = 0; $p->session->reset(); $p->session->collect_status(1); $p->session->emit_from_sigchld(0); - $p->session->on(SIG_CHLD => sub { $sig_chld++}); - $p->session->on(collected => sub { $collected++ }); + $p->session->on(SIG_CHLD => sub { $sig_chld++ }); + $p->session->on(collected => sub { $collected++ }); $p->session->on(collected_orphan => sub { $orphan++ }); $p->start(); - attempt { - attempts => 10, - condition => sub { $sig_chld > 0}, - }; - is($sig_chld, 1, "Event for SIG_CHILD was emitted"); + attempt {attempts => 10, condition => sub { $sig_chld > 0 },}; + is($sig_chld, 1, "Event for SIG_CHILD was emitted"); is($collected, 0, "Event collected didn't appear from sighandler"); - is($orphan, 0, "No orphans where collected"); + is($orphan, 0, "No orphans where collected"); $p->wait_stop(); - is($collected, 1, "No more collect events emitted"); - is($orphan, 0, "No more orphans events emitted"); - is($p->exit_status, 0 , '/usr/bin/true exited with 0'); + is($collected, 1, "No more collect events emitted"); + is($orphan, 0, "No more orphans events emitted"); + is($p->exit_status, 0, '/bin/true exited with 0'); - exec ('/usr/bin/true') if (fork() == 0); - attempt { - attempts => 10, - condition => sub { $sig_chld > 1}, - }; + exec('/bin/true') if (fork() == 0); + attempt {attempts => 10, condition => sub { $sig_chld > 1 },}; is($collected, 1, "No more collect events emitted (2)"); - is($orphan, 0, "collect_orphan didn't appear from sighandler"); + is($orphan, 0, "collect_orphan didn't appear from sighandler"); $p->session->consume_collected_info(); - is($sig_chld, 2, "Event for SIG_CHILD was emitted"); + is($sig_chld, 2, "Event for SIG_CHILD was emitted"); is($collected, 1, "No more collect events emitted (3)"); - is($orphan, 1, "Collect one orphan"); + is($orphan, 1, "Collect one orphan"); }; done_testing(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/07_autodetect.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/07_autodetect.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/07_autodetect.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/07_autodetect.t 2022-12-12 13:24:02.000000000 +0100 @@ -8,7 +8,7 @@ use Mojo::File qw(tempfile path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Session; my $session = Mojo::IOLoop::ReadWriteProcess::Session->singleton; @@ -47,12 +47,12 @@ }; $p->stop; - is $status, 1, 'Status fired once'; + is $status, 1, 'Status fired once'; is $session->all_processes->size, 3, 'detection works' or die diag explain $p; ok $session->contains($orphan->pid), 'Orphan collected' or die diag explain $p->session->all; ok $session->contains($orphan2->pid), 'Orphan collected'; - ok !$session->contains(99999999), 'Session contain works as expected'; + ok !$session->contains(99999999), 'Session contain works as expected'; is $fired, 3, 'New subprocess event fired'; is $orphans, 0, 'New subprocess event fired'; @@ -103,8 +103,8 @@ $master_p->stop; is $master_p->exit_status, 20, 'Correct exit status from master process'; - is $status, 6, 'Status fired 6 times'; - is $fired, 1, 'Status fired 1 times'; + is $status, 6, 'Status fired 6 times'; + is $fired, 1, 'Status fired 1 times'; is $session->all->size, 7, 'detection works' or die diag explain $master_p; @@ -125,8 +125,7 @@ my $sys; eval { - $sys - = $session->_prctl( + $sys = $session->_prctl( Mojo::IOLoop::ReadWriteProcess::Session::PR_SET_CHILD_SUBREAPER(), 1); }; plan skip_all => "$@ : You do not seem to have subreaper capabilities" @@ -210,8 +209,7 @@ my $sys; eval { - $sys - = $session->_prctl( + $sys = $session->_prctl( Mojo::IOLoop::ReadWriteProcess::Session::PR_SET_CHILD_SUBREAPER(), 1); }; plan skip_all => "You do not seem to have subreaper capabilities" @@ -262,8 +260,7 @@ my $sys; eval { - $sys - = $session->_prctl( + $sys = $session->_prctl( Mojo::IOLoop::ReadWriteProcess::Session::PR_SET_CHILD_SUBREAPER(), 1); }; plan skip_all => "You do not seem to have subreaper capabilities" @@ -310,8 +307,7 @@ my $sys; eval { - $sys - = $session->_prctl( + $sys = $session->_prctl( Mojo::IOLoop::ReadWriteProcess::Session::PR_SET_CHILD_SUBREAPER(), 1); }; plan skip_all => "You do not seem to have subreaper capabilities" @@ -375,8 +371,7 @@ my $sys; eval { - $sys - = $session->_prctl( + $sys = $session->_prctl( Mojo::IOLoop::ReadWriteProcess::Session::PR_SET_CHILD_SUBREAPER(), 1); }; plan skip_all => "You do not seem to have subreaper capabilities" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/08_ioloop.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/08_ioloop.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/08_ioloop.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/08_ioloop.t 2022-12-12 13:24:02.000000000 +0100 @@ -8,7 +8,7 @@ use Mojo::File qw(tempfile path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); use Mojo::IOLoop; @@ -16,13 +16,13 @@ my $p = process(sub { print "Hello from first process\n"; sleep 1; exit 70 }); - $p->start(); # Start and sets the handlers + $p->start(); # Start and sets the handlers my $stream = $p->to_ioloop; # Get the stream my $output; $stream->on( read => sub { $output .= pop; is $p->is_running, 1, 'Process is running!' } - ); # Hook on Mojo::IOLoop::Stream events + ); # Hook on Mojo::IOLoop::Stream events Mojo::IOLoop->singleton->start() unless Mojo::IOLoop->singleton->is_running; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/09_session.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/09_session.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/09_session.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/09_session.t 2022-12-12 13:24:02.000000000 +0100 @@ -8,7 +8,7 @@ use Mojo::File qw(tempfile path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); use Mojo::IOLoop; @@ -41,7 +41,7 @@ session->unregister(1); is session->all()->size, 0; - is session->resolve(1), undef; + is session->resolve(1), undef; session->register(1 => $p); is session->all()->size, 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/10_cgroupv1.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/10_cgroupv1.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/10_cgroupv1.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/10_cgroupv1.t 2022-12-12 13:24:02.000000000 +0100 @@ -10,7 +10,7 @@ BEGIN { $ENV{MOJO_CGROUP_FS} = tempdir() } -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); use Mojo::IOLoop; use Mojo::IOLoop::ReadWriteProcess::CGroup qw(cgroupv1); @@ -22,12 +22,12 @@ my $child_cgroup = $cgroup->child('bar'); $child_cgroup->create(); - ok $child_cgroup->exists, 'Child cgroup exists'; + ok $child_cgroup->exists, 'Child cgroup exists'; ok -d $child_cgroup->_cgroup, 'Folder is created'; $child_cgroup->remove; is $child_cgroup->exists, undef, 'Child group does not exist anymore'; - ok $cgroup->exists, 'Parent CGroup exists'; + ok $cgroup->exists, 'Parent CGroup exists'; ok -d $cgroup->_cgroup, 'Parent CGroup folder exists'; ok $cgroup->_cgroup ne $child_cgroup->_cgroup, 'Child and parent has different CGroup path' @@ -42,8 +42,8 @@ "procs interface contains the added pids" or die diag explain $child_cgroup->process_list; - ok $child_cgroup->contains_process("3"), "Child contains pid 3"; - ok $child_cgroup->contains_process("5"), "Child contains pid 5"; + ok $child_cgroup->contains_process("3"), "Child contains pid 3"; + ok $child_cgroup->contains_process("5"), "Child contains pid 5"; ok !$child_cgroup->contains_process("10"), "Child does not contain pid 10"; ok !$child_cgroup->contains_process("20"), "Child does not contain pid 20"; @@ -66,8 +66,8 @@ "thread interface contains the added threads ID" or die diag explain $cgroup->thread_list; - ok $cgroup->contains_thread("20"), "Parent contains thread ID 20"; - ok $cgroup->contains_thread("40"), "Parent contains thread ID 40"; + ok $cgroup->contains_thread("20"), "Parent contains thread ID 20"; + ok $cgroup->contains_thread("40"), "Parent contains thread ID 40"; ok !$cgroup->contains_thread("30"), "Parent does not contain thread ID 30"; ok !$cgroup->contains_thread("50"), "Parent does not contain thread ID 50"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/10_cgroupv2.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/10_cgroupv2.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/10_cgroupv2.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/10_cgroupv2.t 2022-12-12 13:24:02.000000000 +0100 @@ -10,7 +10,7 @@ BEGIN { $ENV{MOJO_CGROUP_FS} = tempdir() } -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); use Mojo::IOLoop; use Mojo::IOLoop::ReadWriteProcess::CGroup qw(cgroupv2); @@ -22,12 +22,12 @@ my $child_cgroup = $cgroup->child('bar'); $child_cgroup->create(); - ok $child_cgroup->exists, 'Child cgroup exists'; + ok $child_cgroup->exists, 'Child cgroup exists'; ok -d $child_cgroup->_cgroup, 'Folder is created'; $child_cgroup->remove; is $child_cgroup->exists, undef, 'Child group does not exist anymore'; - ok $cgroup->exists, 'Parent CGroup exists'; + ok $cgroup->exists, 'Parent CGroup exists'; ok -d $cgroup->_cgroup, 'Parent CGroup folder exists'; ok $cgroup->_cgroup ne $child_cgroup->_cgroup, 'Child and parent has different CGroup path' @@ -42,8 +42,8 @@ "procs interface contains the added pids" or die diag explain $child_cgroup->process_list; - ok $child_cgroup->contains_process("3"), "Child contains pid 3"; - ok $child_cgroup->contains_process("5"), "Child contains pid 5"; + ok $child_cgroup->contains_process("3"), "Child contains pid 3"; + ok $child_cgroup->contains_process("5"), "Child contains pid 5"; ok !$child_cgroup->contains_process("10"), "Child does not contain pid 10"; ok !$child_cgroup->contains_process("20"), "Child does not contain pid 20"; @@ -79,8 +79,8 @@ "thread interface contains the added threads ID" or die diag explain $cgroup->thread_list; - ok $cgroup->contains_thread("20"), "Parent contains thread ID 20"; - ok $cgroup->contains_thread("40"), "Parent contains thread ID 40"; + ok $cgroup->contains_thread("20"), "Parent contains thread ID 20"; + ok $cgroup->contains_thread("40"), "Parent contains thread ID 40"; ok !$cgroup->contains_thread("30"), "Parent does not contain thread ID 30"; ok !$cgroup->contains_thread("50"), "Parent does not contain thread ID 50"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/11_containers.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/11_containers.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/11_containers.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/11_containers.t 2022-12-12 13:24:02.000000000 +0100 @@ -8,10 +8,10 @@ use Mojo::File qw(tempfile tempdir path); use lib ("$FindBin::Bin/lib", "../lib", "lib"); -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); -use Mojo::IOLoop::ReadWriteProcess::CGroup qw(cgroupv2 cgroupv1); -use Mojo::IOLoop::ReadWriteProcess::Container qw(container); +use Mojo::IOLoop::ReadWriteProcess::CGroup qw(cgroupv2 cgroupv1); +use Mojo::IOLoop::ReadWriteProcess::Container qw(container); eval { my $try_cgroup @@ -54,7 +54,7 @@ }; -subtest childs => sub { +subtest children => sub { my $cgroup = cgroupv1(controller => 'pids', name => 'group')->child('test'); isa_ok $cgroup, 'Mojo::IOLoop::ReadWriteProcess::CGroup::v1'; is $cgroup->exists(), 1, 'Cgroup exists'; @@ -233,7 +233,7 @@ $c->stop(); is $cgroup->processes->size, 0; - is $cgroup->process_list, '' or die diag explain $cgroup->process_list; + is $cgroup->process_list, '' or die diag explain $cgroup->process_list; $cgroup->remove(); is scalar(@pids), 5 or diag explain \@pids; isnt $virtual_pid, '1', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/12_mocked_container.t new/Mojo-IOLoop-ReadWriteProcess-0.33/t/12_mocked_container.t --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/12_mocked_container.t 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/12_mocked_container.t 2022-12-12 13:24:02.000000000 +0100 @@ -10,10 +10,10 @@ BEGIN { $ENV{MOJO_CGROUP_FS} = tempdir() } -use Mojo::IOLoop::ReadWriteProcess qw(process); +use Mojo::IOLoop::ReadWriteProcess qw(process); use Mojo::IOLoop::ReadWriteProcess::Test::Utils qw(attempt); -use Mojo::IOLoop::ReadWriteProcess::CGroup qw(cgroupv2 cgroupv1); -use Mojo::IOLoop::ReadWriteProcess::Container qw(container); +use Mojo::IOLoop::ReadWriteProcess::CGroup qw(cgroupv2 cgroupv1); +use Mojo::IOLoop::ReadWriteProcess::Container qw(container); use Mojo::Util 'monkey_patch'; use Mojo::IOLoop::ReadWriteProcess::Namespace; @@ -51,8 +51,8 @@ is $cgroups->first->process_list, $p->pid . "\n" or die diag explain $cgroups->first->process_list; - unlink $cgroups->first->_cgroup - ->child(Mojo::IOLoop::ReadWriteProcess::CGroup::v1::PROCS_INTERFACE); + unlink $cgroups->first->_cgroup->child( + Mojo::IOLoop::ReadWriteProcess::CGroup::v1::PROCS_INTERFACE); $cgroups->first->remove(); ok !$cgroups->first->exists(); is $fired, 1; @@ -69,7 +69,7 @@ subreaper => 1, group => "group", name => "test", - process => + process => sub { sleep 5; Devel::Cover::report() if Devel::Cover->can('report'); }, ); @@ -98,8 +98,8 @@ is $cgroups->first->process_list, $p->pid . "\n" or die diag explain $cgroups->first->process_list; - unlink $cgroups->first->_cgroup - ->child(Mojo::IOLoop::ReadWriteProcess::CGroup::v1::PROCS_INTERFACE); + unlink $cgroups->first->_cgroup->child( + Mojo::IOLoop::ReadWriteProcess::CGroup::v1::PROCS_INTERFACE); $cgroups->first->remove(); ok !$cgroups->first->exists(); is $fired, 1; @@ -140,8 +140,8 @@ is $cgroups->first->process_list, $p->pid . "\n" or die diag explain $cgroups->first->process_list; - unlink $cgroups->first->_cgroup - ->child(Mojo::IOLoop::ReadWriteProcess::CGroup::v1::PROCS_INTERFACE); + unlink $cgroups->first->_cgroup->child( + Mojo::IOLoop::ReadWriteProcess::CGroup::v1::PROCS_INTERFACE); $cgroups->first->remove(); ok !$cgroups->first->exists(); is $fired, 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/data/sigchld_handler.pl new/Mojo-IOLoop-ReadWriteProcess-0.33/t/data/sigchld_handler.pl --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/data/sigchld_handler.pl 1970-01-01 01:00:00.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/data/sigchld_handler.pl 2022-12-12 13:24:02.000000000 +0100 @@ -0,0 +1,20 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Time::HiRes 'sleep'; + +my $collected_pid = -1; +$SIG{CHLD} = sub { + $collected_pid = waitpid(-1, 0); + print "SIG_CHLD $collected_pid exit:" . ($? >> 8) . "\n"; +}; + +my $pid = fork(); +if ($pid == 0) { + print "I'm the child $$\n"; + exit 0; +} +print "Forked child is $pid\n"; +sleep 0.1 while ($collected_pid != $pid); +print "Exit graceful\n"; +exit 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/data/simple_rwp.pl new/Mojo-IOLoop-ReadWriteProcess-0.33/t/data/simple_rwp.pl --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/data/simple_rwp.pl 1970-01-01 01:00:00.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/data/simple_rwp.pl 2022-12-12 13:24:02.000000000 +0100 @@ -0,0 +1,6 @@ +#!/usr/bin/perl +use FindBin; +use lib ("$FindBin::Bin/../../lib"); +use Mojo::IOLoop::ReadWriteProcess 'process'; + +exit process(execute => '/bin/true')->start()->wait_stop()->exit_status(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/data/term_trap.sh new/Mojo-IOLoop-ReadWriteProcess-0.33/t/data/term_trap.sh --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/data/term_trap.sh 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/data/term_trap.sh 2022-12-12 13:24:02.000000000 +0100 @@ -1,6 +1,7 @@ #!/bin/bash -(sleep 25; echo "Hello World") & trap "echo I ALWAYS WIN" SIGINT SIGTERM +echo "term_trap.sh started" +(sleep 25; echo "Hello World") & echo "pid is $$" while : diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojo-IOLoop-ReadWriteProcess-0.32/t/lib/Mojo/IOLoop/ReadWriteProcess/Test/Utils.pm new/Mojo-IOLoop-ReadWriteProcess-0.33/t/lib/Mojo/IOLoop/ReadWriteProcess/Test/Utils.pm --- old/Mojo-IOLoop-ReadWriteProcess-0.32/t/lib/Mojo/IOLoop/ReadWriteProcess/Test/Utils.pm 2021-12-09 19:04:50.000000000 +0100 +++ new/Mojo-IOLoop-ReadWriteProcess-0.33/t/lib/Mojo/IOLoop/ReadWriteProcess/Test/Utils.pm 2022-12-12 13:24:02.000000000 +0100 @@ -1,15 +1,17 @@ package Mojo::IOLoop::ReadWriteProcess::Test::Utils; -our @EXPORT_OK = qw(attempt); +our @EXPORT_OK = qw(attempt check_bin); use Time::HiRes qw(sleep); use Exporter 'import'; +use Test::More; +use Mojo::File qw(path); use constant DEBUG => $ENV{MOJO_PROCESS_DEBUG}; sub attempt { my $attempts = 0; my ($total_attempts, $condition, $cb, $or) = ref $_[0] eq 'HASH' ? (@{$_[0]}{qw(attempts condition cb or)}) : @_; - $cb //= sub {1}; + $cb //= sub { 1 }; until ($condition->() || $attempts >= $total_attempts) { warn "Attempt $attempts" if DEBUG; $cb->(); @@ -20,5 +22,20 @@ warn "Attempts terminated!" if DEBUG; } +sub check_bin { + my $script = shift; + + plan skip_all => + "You do not seem to have $script. The script is required to run the test" + unless -e $script; + + if (-T $script) { + my ($shebang) = path($script)->slurp =~ m/^#!(\S+)/; + plan skip_all => + "You do not seem to have $shebang wich is required for $script" + if ($shebang && !-e $shebang); + } + return $script; +} 1;