ppisar pushed to perl-PathTools (master). "3.59 bump"
notifications at fedoraproject.org
notifications at fedoraproject.org
Mon Nov 16 07:57:23 UTC 2015
From f0026de48c093b5a193d57ef3893abb8eb747e02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar at redhat.com>
Date: Mon, 16 Nov 2015 08:56:51 +0100
Subject: 3.59 bump
---
.gitignore | 1 +
PathTools-3.47-Update-to-3.56.patch | 4832 -----------------------------------
perl-PathTools.spec | 27 +-
sources | 2 +-
4 files changed, 19 insertions(+), 4843 deletions(-)
delete mode 100644 PathTools-3.47-Update-to-3.56.patch
diff --git a/.gitignore b/.gitignore
index cb5fa48..748aa5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
/PathTools-3.39_01.tar.gz
/PathTools-3.40.tar.gz
/PathTools-3.47.tar.gz
+/PathTools-3.59.tar.gz
diff --git a/PathTools-3.47-Update-to-3.56.patch b/PathTools-3.47-Update-to-3.56.patch
deleted file mode 100644
index a671395..0000000
--- a/PathTools-3.47-Update-to-3.56.patch
+++ /dev/null
@@ -1,4832 +0,0 @@
-diff -ruN PathTools-3.47/lib/File/Spec/Cygwin.pm PathTools-core/lib/File/Spec/Cygwin.pm
---- PathTools-3.47/lib/File/Spec/Cygwin.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/Cygwin.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -4,7 +4,7 @@
- use vars qw(@ISA $VERSION);
- require File::Spec::Unix;
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- @ISA = qw(File::Spec::Unix);
-diff -ruN PathTools-3.47/lib/File/Spec/Epoc.pm PathTools-core/lib/File/Spec/Epoc.pm
---- PathTools-3.47/lib/File/Spec/Epoc.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/Epoc.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -3,7 +3,7 @@
- use strict;
- use vars qw($VERSION @ISA);
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- require File::Spec::Unix;
-diff -ruN PathTools-3.47/lib/File/Spec/Functions.pm PathTools-core/lib/File/Spec/Functions.pm
---- PathTools-3.47/lib/File/Spec/Functions.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/Functions.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -5,7 +5,7 @@
-
- use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- require Exporter;
-diff -ruN PathTools-3.47/lib/File/Spec/Mac.pm PathTools-core/lib/File/Spec/Mac.pm
---- PathTools-3.47/lib/File/Spec/Mac.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/Mac.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -4,7 +4,7 @@
- use vars qw(@ISA $VERSION);
- require File::Spec::Unix;
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- @ISA = qw(File::Spec::Unix);
-diff -ruN PathTools-3.47/lib/File/Spec/OS2.pm PathTools-core/lib/File/Spec/OS2.pm
---- PathTools-3.47/lib/File/Spec/OS2.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/OS2.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -4,7 +4,7 @@
- use vars qw(@ISA $VERSION);
- require File::Spec::Unix;
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- @ISA = qw(File::Spec::Unix);
-diff -ruN PathTools-3.47/lib/File/Spec/Unix.pm PathTools-core/lib/File/Spec/Unix.pm
---- PathTools-3.47/lib/File/Spec/Unix.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/Unix.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -3,12 +3,15 @@
- use strict;
- use vars qw($VERSION);
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- my $xs_version = $VERSION;
- $VERSION =~ tr/_//;
-
--unless (defined &canonpath) {
-- eval {
-+#dont try to load XSLoader and DynaLoader only to ultimately fail on miniperl
-+if(!defined &canonpath && defined &DynaLoader::boot_DynaLoader) {
-+ eval {#eval is questionable since we are handling potential errors like
-+ #"Cwd object version 3.48 does not match bootstrap parameter 3.50
-+ #at lib/DynaLoader.pm line 216." by having this eval
- if ( $] >= 5.006 ) {
- require XSLoader;
- XSLoader::load("Cwd", $xs_version);
-diff -ruN PathTools-3.47/lib/File/Spec/VMS.pm PathTools-core/lib/File/Spec/VMS.pm
---- PathTools-3.47/lib/File/Spec/VMS.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/VMS.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -4,7 +4,7 @@
- use vars qw(@ISA $VERSION);
- require File::Spec::Unix;
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- @ISA = qw(File::Spec::Unix);
-@@ -144,8 +144,7 @@
- return $self->SUPER::catdir($spath, $sdir)
- }
-
-- $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+\Z(?!\n)/s;
-- $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
-+ $rslt = vmspath( unixify($spath) . '/' . unixify($sdir));
-
- # Special case for VMS absolute directory specs: these will have
- # had device prepended during trip through Unix syntax in
-@@ -195,7 +194,7 @@
- if ($spath =~ /^(?<!\^)[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) {
- $rslt = "$spath$file";
- } else {
-- $rslt = $self->eliminate_macros($spath);
-+ $rslt = unixify($spath);
- $rslt .= (defined($rslt) && length($rslt) ? '/' : '') . unixify($file);
- $rslt = vmsify($rslt) unless $unix_rpt;
- }
-@@ -204,7 +203,7 @@
- # Only passed a single file?
- my $xfile = (defined($file) && length($file)) ? $file : '';
-
-- $rslt = $unix_rpt ? $file : vmsify($file);
-+ $rslt = $unix_rpt ? $xfile : vmsify($xfile);
- }
- return $self->canonpath($rslt) unless $unix_rpt;
-
-@@ -439,12 +438,16 @@
- sub abs2rel {
- my $self = shift;
- return vmspath(File::Spec::Unix::abs2rel( $self, @_ ))
-- if grep m{/}, @_;
-+ if ((grep m{/}, @_) && !(grep m{(?<!\^)[\[<:]}, @_));
-
- my($path,$base) = @_;
- $base = $self->_cwd() unless defined $base and length $base;
-
-- for ($path, $base) { $_ = $self->canonpath($_) }
-+ # If there is no device or directory syntax on $base, make sure it
-+ # is treated as a directory.
-+ $base = VMS::Filespec::vmspath($base) unless $base =~ m{(?<!\^)[\[<:]};
-+
-+ for ($path, $base) { $_ = $self->rel2abs($_) }
-
- # Are we even starting $path on the same (node::)device as $base? Note that
- # logical paths or nodename differences may be on the "same device"
-@@ -460,8 +463,6 @@
- my ($base_volume, $base_directories, $base_file) = $self->splitpath($base);
- return $path unless lc($path_volume) eq lc($base_volume);
-
-- for ($path, $base) { $_ = $self->rel2abs($_) }
--
- # Now, remove all leading components that are the same
- my @pathchunks = $self->splitdir( $path_directories );
- my $pathchunks = @pathchunks;
-@@ -545,123 +546,11 @@
- }
-
-
--# eliminate_macros() and fixpath() are MakeMaker-specific methods
--# which are used inside catfile() and catdir(). MakeMaker has its own
--# copies as of 6.06_03 which are the canonical ones. We leave these
--# here, in peace, so that File::Spec continues to work with MakeMakers
--# prior to 6.06_03.
--#
--# Please consider these two methods deprecated. Do not patch them,
--# patch the ones in ExtUtils::MM_VMS instead.
--#
--# Update: MakeMaker 6.48 is still using these routines on VMS.
--# so they need to be kept up to date with ExtUtils::MM_VMS.
--
--sub eliminate_macros {
-- my($self,$path) = @_;
-- return '' unless (defined $path) && ($path ne '');
-- $self = {} unless ref $self;
--
-- if ($path =~ /\s/) {
-- return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
-- }
--
-- my $npath = unixify($path);
-- # sometimes unixify will return a string with an off-by-one trailing null
-- $npath =~ s{\0$}{};
--
-- my($complex) = 0;
-- my($head,$macro,$tail);
--
-- # perform m##g in scalar context so it acts as an iterator
-- while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
-- if (defined $self->{$2}) {
-- ($head,$macro,$tail) = ($1,$2,$3);
-- if (ref $self->{$macro}) {
-- if (ref $self->{$macro} eq 'ARRAY') {
-- $macro = join ' ', @{$self->{$macro}};
-- }
-- else {
-- print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
-- "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
-- $macro = "\cB$macro\cB";
-- $complex = 1;
-- }
-- }
-- else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
-- $npath = "$head$macro$tail";
-- }
-- }
-- if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
-- $npath;
--}
--
--# Deprecated. See the note above for eliminate_macros().
--
--# Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
--# in any directory specification, in order to avoid juxtaposing two
--# VMS-syntax directories when MM[SK] is run. Also expands expressions which
--# are all macro, so that we can tell how long the expansion is, and avoid
--# overrunning DCL's command buffer when MM[KS] is running.
--
--# fixpath() checks to see whether the result matches the name of a
--# directory in the current default directory and returns a directory or
--# file specification accordingly. C<$is_dir> can be set to true to
--# force fixpath() to consider the path to be a directory or false to force
--# it to be a file.
--
--sub fixpath {
-- my($self,$path,$force_path) = @_;
-- return '' unless $path;
-- $self = bless {}, $self unless ref $self;
-- my($fixedpath,$prefix,$name);
--
-- if ($path =~ /\s/) {
-- return join ' ',
-- map { $self->fixpath($_,$force_path) }
-- split /\s+/, $path;
-- }
--
-- if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
-- if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
-- $fixedpath = vmspath($self->eliminate_macros($path));
-- }
-- else {
-- $fixedpath = vmsify($self->eliminate_macros($path));
-- }
-- }
-- elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
-- my($vmspre) = $self->eliminate_macros("\$($prefix)");
-- # is it a dir or just a name?
-- $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
-- $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
-- $fixedpath = vmspath($fixedpath) if $force_path;
-- }
-- else {
-- $fixedpath = $path;
-- $fixedpath = vmspath($fixedpath) if $force_path;
-- }
-- # No hints, so we try to guess
-- if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
-- $fixedpath = vmspath($fixedpath) if -d $fixedpath;
-- }
--
-- # Trim off root dirname if it's had other dirs inserted in front of it.
-- $fixedpath =~ s/\.000000([\]>])/$1/;
-- # Special case for VMS absolute directory specs: these will have had device
-- # prepended during trip through Unix syntax in eliminate_macros(), since
-- # Unix syntax has no way to express "absolute from the top of this device's
-- # directory tree".
-- if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
-- $fixedpath;
--}
--
--
- =back
-
- =head1 COPYRIGHT
-
--Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
-+Copyright (c) 2004-14 by the Perl 5 Porters. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the same terms as Perl itself.
-diff -ruN PathTools-3.47/lib/File/Spec/Win32.pm PathTools-core/lib/File/Spec/Win32.pm
---- PathTools-3.47/lib/File/Spec/Win32.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec/Win32.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -5,7 +5,7 @@
- use vars qw(@ISA $VERSION);
- require File::Spec::Unix;
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- @ISA = qw(File::Spec::Unix);
-diff -ruN PathTools-3.47/lib/File/Spec.pm PathTools-core/lib/File/Spec.pm
---- PathTools-3.47/lib/File/Spec.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/lib/File/Spec.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -3,7 +3,7 @@
- use strict;
- use vars qw(@ISA $VERSION);
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- $VERSION =~ tr/_//;
-
- my %module = (MacOS => 'Mac',
---- PathTools-3.47/Cwd.pm 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/Cwd.pm 2015-03-30 23:20:34.000000000 +0200
-@@ -1,177 +1,9 @@
- package Cwd;
--
--=head1 NAME
--
--Cwd - get pathname of current working directory
--
--=head1 SYNOPSIS
--
-- use Cwd;
-- my $dir = getcwd;
--
-- use Cwd 'abs_path';
-- my $abs_path = abs_path($file);
--
--=head1 DESCRIPTION
--
--This module provides functions for determining the pathname of the
--current working directory. It is recommended that getcwd (or another
--*cwd() function) be used in I<all> code to ensure portability.
--
--By default, it exports the functions cwd(), getcwd(), fastcwd(), and
--fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.
--
--
--=head2 getcwd and friends
--
--Each of these functions are called without arguments and return the
--absolute path of the current working directory.
--
--=over 4
--
--=item getcwd
--
-- my $cwd = getcwd();
--
--Returns the current working directory.
--
--Exposes the POSIX function getcwd(3) or re-implements it if it's not
--available.
--
--=item cwd
--
-- my $cwd = cwd();
--
--The cwd() is the most natural form for the current architecture. For
--most systems it is identical to `pwd` (but without the trailing line
--terminator).
--
--=item fastcwd
--
-- my $cwd = fastcwd();
--
--A more dangerous version of getcwd(), but potentially faster.
--
--It might conceivably chdir() you out of a directory that it can't
--chdir() you back into. If fastcwd encounters a problem it will return
--undef but will probably leave you in a different directory. For a
--measure of extra security, if everything appears to have worked, the
--fastcwd() function will check that it leaves you in the same directory
--that it started in. If it has changed it will C<die> with the message
--"Unstable directory path, current directory changed
--unexpectedly". That should never happen.
--
--=item fastgetcwd
--
-- my $cwd = fastgetcwd();
--
--The fastgetcwd() function is provided as a synonym for cwd().
--
--=item getdcwd
--
-- my $cwd = getdcwd();
-- my $cwd = getdcwd('C:');
--
--The getdcwd() function is also provided on Win32 to get the current working
--directory on the specified drive, since Windows maintains a separate current
--working directory for each drive. If no drive is specified then the current
--drive is assumed.
--
--This function simply calls the Microsoft C library _getdcwd() function.
--
--=back
--
--
--=head2 abs_path and friends
--
--These functions are exported only on request. They each take a single
--argument and return the absolute pathname for it. If no argument is
--given they'll use the current working directory.
--
--=over 4
--
--=item abs_path
--
-- my $abs_path = abs_path($file);
--
--Uses the same algorithm as getcwd(). Symbolic links and relative-path
--components ("." and "..") are resolved to return the canonical
--pathname, just like realpath(3).
--
--=item realpath
--
-- my $abs_path = realpath($file);
--
--A synonym for abs_path().
--
--=item fast_abs_path
--
-- my $abs_path = fast_abs_path($file);
--
--A more dangerous, but potentially faster version of abs_path.
--
--=back
--
--=head2 $ENV{PWD}
--
--If you ask to override your chdir() built-in function,
--
-- use Cwd qw(chdir);
--
--then your PWD environment variable will be kept up to date. Note that
--it will only be kept up to date if all packages which use chdir import
--it from Cwd.
--
--
--=head1 NOTES
--
--=over 4
--
--=item *
--
--Since the path separators are different on some operating systems ('/'
--on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
--modules wherever portability is a concern.
--
--=item *
--
--Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
--functions are all aliases for the C<cwd()> function, which, on Mac OS,
--calls `pwd`. Likewise, the C<abs_path()> function is an alias for
--C<fast_abs_path()>.
--
--=back
--
--=head1 AUTHOR
--
--Originally by the perl5-porters.
--
--Maintained by Ken Williams <KWILLIAMS at cpan.org>
--
--=head1 COPYRIGHT
--
--Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
--
--This program is free software; you can redistribute it and/or modify
--it under the same terms as Perl itself.
--
--Portions of the C code in this library are copyright (c) 1994 by the
--Regents of the University of California. All rights reserved. The
--license on this code is compatible with the licensing of the rest of
--the distribution - please see the source code in F<Cwd.xs> for the
--details.
--
--=head1 SEE ALSO
--
--L<File::chdir>
--
--=cut
--
- use strict;
- use Exporter;
- use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
-
--$VERSION = '3.47';
-+$VERSION = '3.56';
- my $xs_version = $VERSION;
- $VERSION =~ tr/_//;
-
-@@ -242,8 +74,10 @@
-
-
- # If loading the XS stuff doesn't work, we can fall back to pure perl
--unless (defined &getcwd) {
-- eval {
-+if(! defined &getcwd && defined &DynaLoader::boot_DynaLoader) {
-+ eval {#eval is questionable since we are handling potential errors like
-+ #"Cwd object version 3.48 does not match bootstrap parameter 3.50
-+ #at lib/DynaLoader.pm line 216." by having this eval
- if ( $] >= 5.006 ) {
- require XSLoader;
- XSLoader::load( __PACKAGE__, $xs_version);
-@@ -333,14 +167,15 @@
- # are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
- # so everything works under taint mode.
- my $pwd_cmd;
--foreach my $try ('/bin/pwd',
-- '/usr/bin/pwd',
-- '/QOpenSys/bin/pwd', # OS/400 PASE.
-- ) {
--
-- if( -x $try ) {
-- $pwd_cmd = $try;
-- last;
-+if($^O ne 'MSWin32') {
-+ foreach my $try ('/bin/pwd',
-+ '/usr/bin/pwd',
-+ '/QOpenSys/bin/pwd', # OS/400 PASE.
-+ ) {
-+ if( -x $try ) {
-+ $pwd_cmd = $try;
-+ last;
-+ }
- }
- }
-
-@@ -356,7 +191,8 @@
- $pwd_cmd = "$Config::Config{targetsh} -c pwd"
- }
- else {
-- $pwd_cmd = "$Config::Config{sh} -c pwd"
-+ my $sh = $Config::Config{sh} || (-x '/system/bin/sh' ? '/system/bin/sh' : 'sh');
-+ $pwd_cmd = "$sh -c pwd"
- }
- }
-
-@@ -515,7 +351,13 @@
-
- sub chdir {
- my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir)
-- $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';
-+ if ($^O eq "cygwin") {
-+ $newdir =~ s|\A///+|//|;
-+ $newdir =~ s|(?<=[^/])//+|/|g;
-+ }
-+ elsif ($^O ne 'MSWin32') {
-+ $newdir =~ s|///*|/|g;
-+ }
- chdir_init() unless $chdir_init;
- my $newpwd;
- if ($^O eq 'MSWin32') {
-@@ -853,3 +695,171 @@
- *realpath = \&abs_path;
-
- 1;
-+__END__
-+
-+=head1 NAME
-+
-+Cwd - get pathname of current working directory
-+
-+=head1 SYNOPSIS
-+
-+ use Cwd;
-+ my $dir = getcwd;
-+
-+ use Cwd 'abs_path';
-+ my $abs_path = abs_path($file);
-+
-+=head1 DESCRIPTION
-+
-+This module provides functions for determining the pathname of the
-+current working directory. It is recommended that getcwd (or another
-+*cwd() function) be used in I<all> code to ensure portability.
-+
-+By default, it exports the functions cwd(), getcwd(), fastcwd(), and
-+fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.
-+
-+
-+=head2 getcwd and friends
-+
-+Each of these functions are called without arguments and return the
-+absolute path of the current working directory.
-+
-+=over 4
-+
-+=item getcwd
-+
-+ my $cwd = getcwd();
-+
-+Returns the current working directory.
-+
-+Exposes the POSIX function getcwd(3) or re-implements it if it's not
-+available.
-+
-+=item cwd
-+
-+ my $cwd = cwd();
-+
-+The cwd() is the most natural form for the current architecture. For
-+most systems it is identical to `pwd` (but without the trailing line
-+terminator).
-+
-+=item fastcwd
-+
-+ my $cwd = fastcwd();
-+
-+A more dangerous version of getcwd(), but potentially faster.
-+
-+It might conceivably chdir() you out of a directory that it can't
-+chdir() you back into. If fastcwd encounters a problem it will return
-+undef but will probably leave you in a different directory. For a
-+measure of extra security, if everything appears to have worked, the
-+fastcwd() function will check that it leaves you in the same directory
-+that it started in. If it has changed it will C<die> with the message
-+"Unstable directory path, current directory changed
-+unexpectedly". That should never happen.
-+
-+=item fastgetcwd
-+
-+ my $cwd = fastgetcwd();
-+
-+The fastgetcwd() function is provided as a synonym for cwd().
-+
-+=item getdcwd
-+
-+ my $cwd = getdcwd();
-+ my $cwd = getdcwd('C:');
-+
-+The getdcwd() function is also provided on Win32 to get the current working
-+directory on the specified drive, since Windows maintains a separate current
-+working directory for each drive. If no drive is specified then the current
-+drive is assumed.
-+
-+This function simply calls the Microsoft C library _getdcwd() function.
-+
-+=back
-+
-+
-+=head2 abs_path and friends
-+
-+These functions are exported only on request. They each take a single
-+argument and return the absolute pathname for it. If no argument is
-+given they'll use the current working directory.
-+
-+=over 4
-+
-+=item abs_path
-+
-+ my $abs_path = abs_path($file);
-+
-+Uses the same algorithm as getcwd(). Symbolic links and relative-path
-+components ("." and "..") are resolved to return the canonical
-+pathname, just like realpath(3).
-+
-+=item realpath
-+
-+ my $abs_path = realpath($file);
-+
-+A synonym for abs_path().
-+
-+=item fast_abs_path
-+
-+ my $abs_path = fast_abs_path($file);
-+
-+A more dangerous, but potentially faster version of abs_path.
-+
-+=back
-+
-+=head2 $ENV{PWD}
-+
-+If you ask to override your chdir() built-in function,
-+
-+ use Cwd qw(chdir);
-+
-+then your PWD environment variable will be kept up to date. Note that
-+it will only be kept up to date if all packages which use chdir import
-+it from Cwd.
-+
-+
-+=head1 NOTES
-+
-+=over 4
-+
-+=item *
-+
-+Since the path separators are different on some operating systems ('/'
-+on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
-+modules wherever portability is a concern.
-+
-+=item *
-+
-+Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
-+functions are all aliases for the C<cwd()> function, which, on Mac OS,
-+calls `pwd`. Likewise, the C<abs_path()> function is an alias for
-+C<fast_abs_path()>.
-+
-+=back
-+
-+=head1 AUTHOR
-+
-+Originally by the perl5-porters.
-+
-+Maintained by Ken Williams <KWILLIAMS at cpan.org>
-+
-+=head1 COPYRIGHT
-+
-+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the same terms as Perl itself.
-+
-+Portions of the C code in this library are copyright (c) 1994 by the
-+Regents of the University of California. All rights reserved. The
-+license on this code is compatible with the licensing of the rest of
-+the distribution - please see the source code in F<Cwd.xs> for the
-+details.
-+
-+=head1 SEE ALSO
-+
-+L<File::chdir>
-+
-+=cut
---- PathTools-3.47/Cwd.xs 2014-05-23 18:39:28.000000000 +0200
-+++ PathTools-core/Cwd.xs 2015-03-30 23:20:34.000000000 +0200
-@@ -1,3 +1,7 @@
-+/*
-+ * ex: set ts=8 sts=4 sw=4 et:
-+ */
-+
- #define PERL_NO_GET_CONTEXT
-
- #include "EXTERN.h"
-@@ -11,6 +15,10 @@
- # include <unistd.h>
- #endif
-
-+/* For special handling of os390 sysplexed systems */
-+#define SYSNAME "$SYSNAME"
-+#define SYSNAME_LEN (sizeof(SYSNAME) - 1)
-+
- /* The realpath() implementation from OpenBSD 3.9 to 4.2 (realpath.c 1.13)
- * Renamed here to bsd_realpath() to avoid library conflicts.
- */
-@@ -68,144 +76,159 @@
- bsd_realpath(const char *path, char resolved[MAXPATHLEN])
- {
- char *p, *q, *s;
-- size_t left_len, resolved_len;
-+ size_t remaining_len, resolved_len;
- unsigned symlinks;
- int serrno;
-- char left[MAXPATHLEN], next_token[MAXPATHLEN];
-+ char remaining[MAXPATHLEN], next_token[MAXPATHLEN];
-
- serrno = errno;
- symlinks = 0;
- if (path[0] == '/') {
-- resolved[0] = '/';
-- resolved[1] = '\0';
-- if (path[1] == '\0')
-- return (resolved);
-- resolved_len = 1;
-- left_len = my_strlcpy(left, path + 1, sizeof(left));
-+ resolved[0] = '/';
-+ resolved[1] = '\0';
-+ if (path[1] == '\0')
-+ return (resolved);
-+ resolved_len = 1;
-+ remaining_len = my_strlcpy(remaining, path + 1, sizeof(remaining));
- } else {
-- if (getcwd(resolved, MAXPATHLEN) == NULL) {
-- my_strlcpy(resolved, ".", MAXPATHLEN);
-- return (NULL);
-- }
-- resolved_len = strlen(resolved);
-- left_len = my_strlcpy(left, path, sizeof(left));
-+ if (getcwd(resolved, MAXPATHLEN) == NULL) {
-+ my_strlcpy(resolved, ".", MAXPATHLEN);
-+ return (NULL);
-+ }
-+ resolved_len = strlen(resolved);
-+ remaining_len = my_strlcpy(remaining, path, sizeof(remaining));
- }
-- if (left_len >= sizeof(left) || resolved_len >= MAXPATHLEN) {
-- errno = ENAMETOOLONG;
-- return (NULL);
-+ if (remaining_len >= sizeof(remaining) || resolved_len >= MAXPATHLEN) {
-+ errno = ENAMETOOLONG;
-+ return (NULL);
- }
-
- /*
-- * Iterate over path components in 'left'.
-+ * Iterate over path components in 'remaining'.
- */
-- while (left_len != 0) {
-- /*
-- * Extract the next path component and adjust 'left'
-- * and its length.
-- */
-- p = strchr(left, '/');
-- s = p ? p : left + left_len;
-- if ((STRLEN)(s - left) >= (STRLEN)sizeof(next_token)) {
-- errno = ENAMETOOLONG;
-- return (NULL);
-- }
-- memcpy(next_token, left, s - left);
-- next_token[s - left] = '\0';
-- left_len -= s - left;
-- if (p != NULL)
-- memmove(left, s + 1, left_len + 1);
-- if (resolved[resolved_len - 1] != '/') {
-- if (resolved_len + 1 >= MAXPATHLEN) {
-- errno = ENAMETOOLONG;
-- return (NULL);
-- }
-- resolved[resolved_len++] = '/';
-- resolved[resolved_len] = '\0';
-- }
-- if (next_token[0] == '\0')
-- continue;
-- else if (strcmp(next_token, ".") == 0)
-- continue;
-- else if (strcmp(next_token, "..") == 0) {
-- /*
-- * Strip the last path component except when we have
-- * single "/"
-- */
-- if (resolved_len > 1) {
-- resolved[resolved_len - 1] = '\0';
-- q = strrchr(resolved, '/') + 1;
-- *q = '\0';
-- resolved_len = q - resolved;
-- }
-- continue;
-- }
-+ while (remaining_len != 0) {
-
-- /*
-- * Append the next path component and lstat() it. If
-- * lstat() fails we still can return successfully if
-- * there are no more path components left.
-- */
-- resolved_len = my_strlcat(resolved, next_token, MAXPATHLEN);
-- if (resolved_len >= MAXPATHLEN) {
-- errno = ENAMETOOLONG;
-- return (NULL);
-- }
-+ /*
-+ * Extract the next path component and adjust 'remaining'
-+ * and its length.
-+ */
-+
-+ p = strchr(remaining, '/');
-+ s = p ? p : remaining + remaining_len;
-+ if ((STRLEN)(s - remaining) >= (STRLEN)sizeof(next_token)) {
-+ errno = ENAMETOOLONG;
-+ return (NULL);
-+ }
-+ memcpy(next_token, remaining, s - remaining);
-+ next_token[s - remaining] = '\0';
-+ remaining_len -= s - remaining;
-+ if (p != NULL)
-+ memmove(remaining, s + 1, remaining_len + 1);
-+ if (resolved[resolved_len - 1] != '/') {
-+ if (resolved_len + 1 >= MAXPATHLEN) {
-+ errno = ENAMETOOLONG;
-+ return (NULL);
-+ }
-+ resolved[resolved_len++] = '/';
-+ resolved[resolved_len] = '\0';
-+ }
-+ if (next_token[0] == '\0')
-+ continue;
-+ else if (strcmp(next_token, ".") == 0)
-+ continue;
-+ else if (strcmp(next_token, "..") == 0) {
-+ /*
-+ * Strip the last path component except when we have
-+ * single "/"
-+ */
-+ if (resolved_len > 1) {
-+ resolved[resolved_len - 1] = '\0';
-+ q = strrchr(resolved, '/') + 1;
-+ *q = '\0';
-+ resolved_len = q - resolved;
-+ }
-+ continue;
-+ }
-+
-+ /*
-+ * Append the next path component and lstat() it. If
-+ * lstat() fails we still can return successfully if
-+ * there are no more path components left.
-+ */
-+ resolved_len = my_strlcat(resolved, next_token, MAXPATHLEN);
-+ if (resolved_len >= MAXPATHLEN) {
-+ errno = ENAMETOOLONG;
-+ return (NULL);
-+ }
- #if defined(HAS_LSTAT) && defined(HAS_READLINK) && defined(HAS_SYMLINK)
-- {
-- struct stat sb;
-- if (lstat(resolved, &sb) != 0) {
-- if (errno == ENOENT && p == NULL) {
-- errno = serrno;
-- return (resolved);
-- }
-- return (NULL);
-- }
-- if (S_ISLNK(sb.st_mode)) {
-- int slen;
-- char symlink[MAXPATHLEN];
--
-- if (symlinks++ > MAXSYMLINKS) {
-- errno = ELOOP;
-- return (NULL);
-- }
-- slen = readlink(resolved, symlink, sizeof(symlink) - 1);
-- if (slen < 0)
-- return (NULL);
-- symlink[slen] = '\0';
-- if (symlink[0] == '/') {
-- resolved[1] = 0;
-- resolved_len = 1;
-- } else if (resolved_len > 1) {
-- /* Strip the last path component. */
-- resolved[resolved_len - 1] = '\0';
-- q = strrchr(resolved, '/') + 1;
-- *q = '\0';
-- resolved_len = q - resolved;
-- }
--
-- /*
-- * If there are any path components left, then
-- * append them to symlink. The result is placed
-- * in 'left'.
-- */
-- if (p != NULL) {
-- if (symlink[slen - 1] != '/') {
-- if ((STRLEN)(slen + 1) >= (STRLEN)sizeof(symlink)) {
-- errno = ENAMETOOLONG;
-- return (NULL);
-- }
-- symlink[slen] = '/';
-- symlink[slen + 1] = 0;
-- }
-- left_len = my_strlcat(symlink, left, sizeof(left));
-- if (left_len >= sizeof(left)) {
-- errno = ENAMETOOLONG;
-- return (NULL);
-- }
-- }
-- left_len = my_strlcpy(left, symlink, sizeof(left));
-- }
-- }
-+ {
-+ struct stat sb;
-+ if (lstat(resolved, &sb) != 0) {
-+ if (errno == ENOENT && p == NULL) {
-+ errno = serrno;
-+ return (resolved);
-+ }
-+ return (NULL);
-+ }
-+ if (S_ISLNK(sb.st_mode)) {
-+ int slen;
-+ char symlink[MAXPATHLEN];
-+
-+ if (symlinks++ > MAXSYMLINKS) {
-+ errno = ELOOP;
-+ return (NULL);
-+ }
-+ slen = readlink(resolved, symlink, sizeof(symlink) - 1);
-+ if (slen < 0)
-+ return (NULL);
-+ symlink[slen] = '\0';
-+# ifdef EBCDIC /* XXX Probably this should be only os390 */
-+ /* Replace all instances of $SYSNAME/foo simply by /foo */
-+ if (slen > SYSNAME_LEN + strlen(next_token)
-+ && strnEQ(symlink, SYSNAME, SYSNAME_LEN)
-+ && *(symlink + SYSNAME_LEN) == '/'
-+ && strEQ(symlink + SYSNAME_LEN + 1, next_token))
-+ {
-+ goto not_symlink;
-+ }
-+# endif
-+ if (symlink[0] == '/') {
-+ resolved[1] = 0;
-+ resolved_len = 1;
-+ } else if (resolved_len > 1) {
-+ /* Strip the last path component. */
-+ resolved[resolved_len - 1] = '\0';
-+ q = strrchr(resolved, '/') + 1;
-+ *q = '\0';
-+ resolved_len = q - resolved;
-+ }
-+
-+ /*
-+ * If there are any path components left, then
-+ * append them to symlink. The result is placed
-+ * in 'remaining'.
-+ */
-+ if (p != NULL) {
-+ if (symlink[slen - 1] != '/') {
-+ if ((STRLEN)(slen + 1) >= (STRLEN)sizeof(symlink)) {
-+ errno = ENAMETOOLONG;
-+ return (NULL);
-+ }
-+ symlink[slen] = '/';
-+ symlink[slen + 1] = 0;
-+ }
-+ remaining_len = my_strlcat(symlink, remaining, sizeof(symlink));
-+ if (remaining_len >= sizeof(remaining)) {
-+ errno = ENAMETOOLONG;
-+ return (NULL);
-+ }
-+ }
-+ remaining_len = my_strlcpy(remaining, symlink, sizeof(remaining));
-+ }
-+# ifdef EBCDIC
-+ not_symlink: ;
-+# endif
-+ }
- #endif
- }
-
-@@ -214,7 +237,7 @@
- * is a single "/".
- */
- if (resolved_len > 1 && resolved[resolved_len - 1] == '/')
-- resolved[resolved_len - 1] = '\0';
-+ resolved[resolved_len - 1] = '\0';
- return (resolved);
- }
- #endif
-diff -ruN PathTools-3.47/t/abs2rel.t PathTools-core/t/abs2rel.t
---- PathTools-3.47/t/abs2rel.t 1970-01-01 01:00:00.000000000 +0100
-+++ PathTools-core/t/abs2rel.t 2015-01-24 16:02:08.000000000 +0100
-@@ -0,0 +1,76 @@
-+#!/usr/bin/perl -w
-+
-+use strict;
-+use Test::More;
-+
-+use Cwd qw(cwd getcwd abs_path);
-+use File::Spec();
-+use File::Temp qw(tempdir);
-+use File::Path qw(make_path);
-+
-+my $startdir = cwd();
-+my @files = ( 'anyfile', './anyfile', '../first_sub_dir/anyfile', '../second_sub_dir/second_file' );
-+
-+for my $file (@files) {
-+ test_rel2abs($file);
-+}
-+
-+sub test_rel2abs {
-+ my $first_file = shift;
-+ my $tdir = tempdir( CLEANUP => 1 );
-+ chdir $tdir or die "Unable to change to $tdir: $!";
-+
-+ my @subdirs = (
-+ 'first_sub_dir',
-+ File::Spec->catdir('first_sub_dir', 'sub_sub_dir'),
-+ 'second_sub_dir'
-+ );
-+ make_path(@subdirs, { mode => 0711 })
-+ or die "Unable to make_path: $!";
-+
-+ open my $OUT2, '>',
-+ File::Spec->catfile('second_sub_dir', 'second_file')
-+ or die "Unable to open 'second_file' for writing: $!";
-+ print $OUT2 "Attempting to resolve RT #121360\n";
-+ close $OUT2 or die "Unable to close 'second_file' after writing: $!";
-+
-+ chdir 'first_sub_dir'
-+ or die "Unable to change to 'first_sub_dir': $!";
-+ open my $OUT1, '>', $first_file
-+ or die "Unable to open $first_file for writing: $!";
-+ print $OUT1 "Attempting to resolve RT #121360\n";
-+ close $OUT1 or die "Unable to close $first_file after writing: $!";
-+
-+ my $rel_path = $first_file;
-+ my $rel_base = File::Spec->catdir(File::Spec->curdir(), 'sub_sub_dir');
-+ my $abs_path = File::Spec->rel2abs($rel_path);
-+ my $abs_base = File::Spec->rel2abs($rel_base);
-+ ok(-f $rel_path, "'$rel_path' is readable by effective uid/gid");
-+ ok(-f $abs_path, "'$abs_path' is readable by effective uid/gid");
-+ is_deeply(
-+ [ (stat $rel_path)[0..5] ],
-+ [ (stat $abs_path)[0..5] ],
-+ "rel_path and abs_path stat same"
-+ );
-+ ok(-d $rel_base, "'$rel_base' is a directory");
-+ ok(-d $abs_base, "'$abs_base' is a directory");
-+ is_deeply(
-+ [ (stat $rel_base)[0..5] ],
-+ [ (stat $abs_base)[0..5] ],
-+ "rel_base and abs_base stat same"
-+ );
-+ my $rr_link = File::Spec->abs2rel($rel_path, $rel_base);
-+ my $ra_link = File::Spec->abs2rel($rel_path, $abs_base);
-+ my $ar_link = File::Spec->abs2rel($abs_path, $rel_base);
-+ my $aa_link = File::Spec->abs2rel($abs_path, $abs_base);
-+ is($rr_link, $ra_link,
-+ "rel_path-rel_base '$rr_link' = rel_path-abs_base '$ra_link'");
-+ is($ar_link, $aa_link,
-+ "abs_path-rel_base '$ar_link' = abs_path-abs_base '$aa_link'");
-+ is($rr_link, $aa_link,
-+ "rel_path-rel_base '$rr_link' = abs_path-abs_base '$aa_link'");
-+
-+ chdir $startdir or die "Unable to change back to $startdir: $!";
-+}
-+
-+done_testing();
-diff -ruN PathTools-3.47/t/lib/Test/Builder.pm PathTools-core/t/lib/Test/Builder.pm
---- PathTools-3.47/t/lib/Test/Builder.pm 2011-12-20 08:15:58.000000000 +0100
-+++ PathTools-core/t/lib/Test/Builder.pm 1970-01-01 01:00:00.000000000 +0100
-@@ -1,1499 +0,0 @@
--package Test::Builder;
--
--use 5.004;
--
--# $^C was only introduced in 5.005-ish. We do this to prevent
--# use of uninitialized value warnings in older perls.
--$^C ||= 0;
--
--use strict;
--use vars qw($VERSION);
--$VERSION = '0.19';
--
--my $IsVMS = $^O eq 'VMS';
--
--# Make Test::Builder thread-safe for ithreads.
--BEGIN {
-- use Config;
-- # Load threads::shared when threads are turned on
-- if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) {
-- require threads::shared;
-- threads::shared->import;
-- }
-- # 5.8.0's threads::shared is busted when threads are off.
-- # We emulate it here.
-- else {
-- *share = sub { return $_[0] };
-- *lock = sub { 0 };
-- }
--}
--
--
--=head1 NAME
--
--Test::Builder - Backend for building test libraries
--
--=head1 SYNOPSIS
--
-- package My::Test::Module;
-- use Test::Builder;
-- require Exporter;
-- @ISA = qw(Exporter);
-- @EXPORT = qw(ok);
--
-- my $Test = Test::Builder->new;
-- $Test->output('my_logfile');
--
-- sub import {
-- my($self) = shift;
-- my $pack = caller;
--
-- $Test->exported_to($pack);
-- $Test->plan(@_);
--
-- $self->export_to_level(1, $self, 'ok');
-- }
--
-- sub ok {
-- my($test, $name) = @_;
--
-- $Test->ok($test, $name);
-- }
--
--
--=head1 DESCRIPTION
--
--Test::Simple and Test::More have proven to be popular testing modules,
--but they're not always flexible enough. Test::Builder provides the a
--building block upon which to write your own test libraries I<which can
--work together>.
--
--=head2 Construction
--
--=over 4
--
--=item B<new>
--
-- my $Test = Test::Builder->new;
--
--Returns a Test::Builder object representing the current state of the
--test.
--
--Since you only run one test per program, there is B<one and only one>
--Test::Builder object. No matter how many times you call new(), you're
--getting the same object. (This is called a singleton).
--
--=cut
--
--my $Test = Test::Builder->new;
--sub new {
-- my($class) = shift;
-- $Test ||= bless ['Move along, nothing to see here'], $class;
-- return $Test;
--}
--
--=item B<reset>
--
-- $Test->reset;
--
--Reinitializes the Test::Builder singleton to its original state.
--Mostly useful for tests run in persistent environments where the same
--test might be run multiple times in the same process.
--
--=cut
--
--my $Test_Died;
--my $Have_Plan;
--my $No_Plan;
--my $Curr_Test; share($Curr_Test);
--use vars qw($Level);
--my $Original_Pid;
--my @Test_Results; share(@Test_Results);
--my @Test_Details; share(@Test_Details);
--
--my $Exported_To;
--my $Expected_Tests;
--
--my $Skip_All;
--
--my $Use_Nums;
--
--my($No_Header, $No_Ending);
--
--$Test->reset;
--
--sub reset {
-- my ($self) = @_;
--
-- $Test_Died = 0;
-- $Have_Plan = 0;
-- $No_Plan = 0;
-- $Curr_Test = 0;
-- $Level = 1;
-- $Original_Pid = $$;
-- @Test_Results = ();
-- @Test_Details = ();
--
-- $Exported_To = undef;
-- $Expected_Tests = 0;
--
-- $Skip_All = 0;
--
-- $Use_Nums = 1;
--
-- ($No_Header, $No_Ending) = (0,0);
--
-- $self->_dup_stdhandles unless $^C;
--
-- return undef;
--}
--
--=back
--
--=head2 Setting up tests
--
--These methods are for setting up tests and declaring how many there
--are. You usually only want to call one of these methods.
--
--=over 4
--
--=item B<exported_to>
--
-- my $pack = $Test->exported_to;
-- $Test->exported_to($pack);
--
--Tells Test::Builder what package you exported your functions to.
--This is important for getting TODO tests right.
--
--=cut
--
--sub exported_to {
-- my($self, $pack) = @_;
--
-- if( defined $pack ) {
-- $Exported_To = $pack;
-- }
-- return $Exported_To;
--}
--
--=item B<plan>
--
-- $Test->plan('no_plan');
-- $Test->plan( skip_all => $reason );
-- $Test->plan( tests => $num_tests );
--
--A convenient way to set up your tests. Call this and Test::Builder
--will print the appropriate headers and take the appropriate actions.
--
--If you call plan(), don't call any of the other methods below.
--
--=cut
--
--sub plan {
-- my($self, $cmd, $arg) = @_;
--
-- return unless $cmd;
--
-- if( $Have_Plan ) {
-- die sprintf "You tried to plan twice! Second plan at %s line %d\n",
-- ($self->caller)[1,2];
-- }
--
-- if( $cmd eq 'no_plan' ) {
-- $self->no_plan;
-- }
-- elsif( $cmd eq 'skip_all' ) {
-- return $self->skip_all($arg);
-- }
-- elsif( $cmd eq 'tests' ) {
-- if( $arg ) {
-- return $self->expected_tests($arg);
-- }
-- elsif( !defined $arg ) {
-- die "Got an undefined number of tests. Looks like you tried to ".
-- "say how many tests you plan to run but made a mistake.\n";
-- }
-- elsif( !$arg ) {
-- die "You said to run 0 tests! You've got to run something.\n";
-- }
-- }
-- else {
-- require Carp;
-- my @args = grep { defined } ($cmd, $arg);
-- Carp::croak("plan() doesn't understand @args");
-- }
--
-- return 1;
--}
--
--=item B<expected_tests>
--
-- my $max = $Test->expected_tests;
-- $Test->expected_tests($max);
--
--Gets/sets the # of tests we expect this test to run and prints out
--the appropriate headers.
--
--=cut
--
--sub expected_tests {
-- my($self, $max) = @_;
--
-- if( defined $max ) {
-- $Expected_Tests = $max;
-- $Have_Plan = 1;
--
-- $self->_print("1..$max\n") unless $self->no_header;
-- }
-- return $Expected_Tests;
--}
--
--
--=item B<no_plan>
--
-- $Test->no_plan;
--
--Declares that this test will run an indeterminate # of tests.
--
--=cut
--
--sub no_plan {
-- $No_Plan = 1;
-- $Have_Plan = 1;
--}
--
--=item B<has_plan>
--
-- $plan = $Test->has_plan
--
--Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (indeterminate # of tests) or an integer (the number of expected tests).
--
--=cut
--
--sub has_plan {
-- return($Expected_Tests) if $Expected_Tests;
-- return('no_plan') if $No_Plan;
-- return(undef);
--};
--
--
--=item B<skip_all>
--
-- $Test->skip_all;
-- $Test->skip_all($reason);
--
--Skips all the tests, using the given $reason. Exits immediately with 0.
--
--=cut
--
--sub skip_all {
-- my($self, $reason) = @_;
--
-- my $out = "1..0";
-- $out .= " # Skip $reason" if $reason;
-- $out .= "\n";
--
-- $Skip_All = 1;
--
-- $self->_print($out) unless $self->no_header;
-- exit(0);
--}
--
--=back
--
--=head2 Running tests
--
--These actually run the tests, analogous to the functions in
--Test::More.
--
--$name is always optional.
--
--=over 4
--
--=item B<ok>
--
-- $Test->ok($test, $name);
--
--Your basic test. Pass if $test is true, fail if $test is false. Just
--like Test::Simple's ok().
--
--=cut
--
--sub ok {
-- my($self, $test, $name) = @_;
--
-- # $test might contain an object which we don't want to accidentally
-- # store, so we turn it into a boolean.
-- $test = $test ? 1 : 0;
--
-- unless( $Have_Plan ) {
-- require Carp;
-- Carp::croak("You tried to run a test without a plan! Gotta have a plan.");
-- }
--
-- lock $Curr_Test;
-- $Curr_Test++;
--
-- # In case $name is a string overloaded object, force it to stringify.
-- local($@,$!);
-- eval {
-- if( defined $name ) {
-- require overload;
-- if( my $string_meth = overload::Method($name, '""') ) {
-- $name = $name->$string_meth();
-- }
-- }
-- };
--
-- $self->diag(<<ERR) if defined $name and $name =~ /^[\d\s]+$/;
-- You named your test '$name'. You shouldn't use numbers for your test names.
-- Very confusing.
--ERR
--
-- my($pack, $file, $line) = $self->caller;
--
-- my $todo = $self->todo($pack);
--
-- my $out;
-- my $result = &share({});
--
-- unless( $test ) {
-- $out .= "not ";
-- @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 );
-- }
-- else {
-- @$result{ 'ok', 'actual_ok' } = ( 1, $test );
-- }
--
-- $out .= "ok";
-- $out .= " $Curr_Test" if $self->use_numbers;
--
-- if( defined $name ) {
-- $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness.
-- $out .= " - $name";
-- $result->{name} = $name;
-- }
-- else {
-- $result->{name} = '';
-- }
--
-- if( $todo ) {
-- my $what_todo = $todo;
-- $out .= " # TODO $what_todo";
-- $result->{reason} = $what_todo;
-- $result->{type} = 'todo';
-- }
-- else {
-- $result->{reason} = '';
-- $result->{type} = '';
-- }
--
-- $Test_Results[$Curr_Test-1] = $result;
-- $out .= "\n";
--
-- $self->_print($out);
--
-- unless( $test ) {
-- my $msg = $todo ? "Failed (TODO)" : "Failed";
-- $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE};
-- $self->diag(" $msg test ($file at line $line)\n");
-- }
--
-- return $test ? 1 : 0;
--}
--
--=item B<is_eq>
--
-- $Test->is_eq($got, $expected, $name);
--
--Like Test::More's is(). Checks if $got eq $expected. This is the
--string version.
--
--=item B<is_num>
--
-- $Test->is_num($got, $expected, $name);
--
--Like Test::More's is(). Checks if $got == $expected. This is the
--numeric version.
--
--=cut
--
--sub is_eq {
-- my($self, $got, $expect, $name) = @_;
-- local $Level = $Level + 1;
--
-- if( !defined $got || !defined $expect ) {
-- # undef only matches undef and nothing else
-- my $test = !defined $got && !defined $expect;
--
-- $self->ok($test, $name);
-- $self->_is_diag($got, 'eq', $expect) unless $test;
-- return $test;
-- }
--
-- return $self->cmp_ok($got, 'eq', $expect, $name);
--}
--
--sub is_num {
-- my($self, $got, $expect, $name) = @_;
-- local $Level = $Level + 1;
--
-- if( !defined $got || !defined $expect ) {
-- # undef only matches undef and nothing else
-- my $test = !defined $got && !defined $expect;
--
-- $self->ok($test, $name);
-- $self->_is_diag($got, '==', $expect) unless $test;
-- return $test;
-- }
--
-- return $self->cmp_ok($got, '==', $expect, $name);
--}
--
--sub _is_diag {
-- my($self, $got, $type, $expect) = @_;
--
-- foreach my $val (\$got, \$expect) {
-- if( defined $$val ) {
-- if( $type eq 'eq' ) {
-- # quote and force string context
-- $$val = "'$$val'"
-- }
-- else {
-- # force numeric context
-- $$val = $$val+0;
-- }
-- }
-- else {
-- $$val = 'undef';
-- }
-- }
--
-- return $self->diag(sprintf <<DIAGNOSTIC, $got, $expect);
-- got: %s
-- expected: %s
--DIAGNOSTIC
--
--}
--
--=item B<isnt_eq>
--
-- $Test->isnt_eq($got, $dont_expect, $name);
--
--Like Test::More's isnt(). Checks if $got ne $dont_expect. This is
--the string version.
--
--=item B<isnt_num>
--
-- $Test->is_num($got, $dont_expect, $name);
--
--Like Test::More's isnt(). Checks if $got ne $dont_expect. This is
--the numeric version.
--
--=cut
--
--sub isnt_eq {
-- my($self, $got, $dont_expect, $name) = @_;
-- local $Level = $Level + 1;
--
-- if( !defined $got || !defined $dont_expect ) {
-- # undef only matches undef and nothing else
-- my $test = defined $got || defined $dont_expect;
--
-- $self->ok($test, $name);
-- $self->_cmp_diag($got, 'ne', $dont_expect) unless $test;
-- return $test;
-- }
--
-- return $self->cmp_ok($got, 'ne', $dont_expect, $name);
--}
--
--sub isnt_num {
-- my($self, $got, $dont_expect, $name) = @_;
-- local $Level = $Level + 1;
--
-- if( !defined $got || !defined $dont_expect ) {
-- # undef only matches undef and nothing else
-- my $test = defined $got || defined $dont_expect;
--
-- $self->ok($test, $name);
-- $self->_cmp_diag($got, '!=', $dont_expect) unless $test;
-- return $test;
-- }
--
-- return $self->cmp_ok($got, '!=', $dont_expect, $name);
--}
--
--
--=item B<like>
--
-- $Test->like($this, qr/$regex/, $name);
-- $Test->like($this, '/$regex/', $name);
--
--Like Test::More's like(). Checks if $this matches the given $regex.
--
--You'll want to avoid qr// if you want your tests to work before 5.005.
--
--=item B<unlike>
--
-- $Test->unlike($this, qr/$regex/, $name);
-- $Test->unlike($this, '/$regex/', $name);
--
--Like Test::More's unlike(). Checks if $this B<does not match> the
--given $regex.
--
--=cut
--
--sub like {
-- my($self, $this, $regex, $name) = @_;
--
-- local $Level = $Level + 1;
-- $self->_regex_ok($this, $regex, '=~', $name);
--}
--
--sub unlike {
-- my($self, $this, $regex, $name) = @_;
--
-- local $Level = $Level + 1;
-- $self->_regex_ok($this, $regex, '!~', $name);
--}
--
--=item B<maybe_regex>
--
-- $Test->maybe_regex(qr/$regex/);
-- $Test->maybe_regex('/$regex/');
--
--Convenience method for building testing functions that take regular
--expressions as arguments, but need to work before perl 5.005.
--
--Takes a quoted regular expression produced by qr//, or a string
--representing a regular expression.
--
--Returns a Perl value which may be used instead of the corresponding
--regular expression, or undef if it's argument is not recognised.
--
--For example, a version of like(), sans the useful diagnostic messages,
--could be written as:
--
-- sub laconic_like {
-- my ($self, $this, $regex, $name) = @_;
-- my $usable_regex = $self->maybe_regex($regex);
-- die "expecting regex, found '$regex'\n"
-- unless $usable_regex;
-- $self->ok($this =~ m/$usable_regex/, $name);
-- }
--
--=cut
--
--
--sub maybe_regex {
-- my ($self, $regex) = @_;
-- my $usable_regex = undef;
-- if( ref $regex eq 'Regexp' ) {
-- $usable_regex = $regex;
-- }
-- # Check if it looks like '/foo/'
-- elsif( my($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx ) {
-- $usable_regex = length $opts ? "(?$opts)$re" : $re;
-- };
-- return($usable_regex)
--};
--
--sub _regex_ok {
-- my($self, $this, $regex, $cmp, $name) = @_;
--
-- local $Level = $Level + 1;
--
-- my $ok = 0;
-- my $usable_regex = $self->maybe_regex($regex);
-- unless (defined $usable_regex) {
-- $ok = $self->ok( 0, $name );
-- $self->diag(" '$regex' doesn't look much like a regex to me.");
-- return $ok;
-- }
--
-- {
-- local $^W = 0;
-- my $test = $this =~ /$usable_regex/ ? 1 : 0;
-- $test = !$test if $cmp eq '!~';
-- $ok = $self->ok( $test, $name );
-- }
--
-- unless( $ok ) {
-- $this = defined $this ? "'$this'" : 'undef';
-- my $match = $cmp eq '=~' ? "doesn't match" : "matches";
-- $self->diag(sprintf <<DIAGNOSTIC, $this, $match, $regex);
-- %s
-- %13s '%s'
--DIAGNOSTIC
--
-- }
--
-- return $ok;
--}
--
--=item B<cmp_ok>
--
-- $Test->cmp_ok($this, $type, $that, $name);
--
--Works just like Test::More's cmp_ok().
--
-- $Test->cmp_ok($big_num, '!=', $other_big_num);
--
--=cut
--
--sub cmp_ok {
-- my($self, $got, $type, $expect, $name) = @_;
--
-- my $test;
-- {
-- local $^W = 0;
-- local($@,$!); # don't interfere with $@
-- # eval() sometimes resets $!
-- $test = eval "\$got $type \$expect";
-- }
-- local $Level = $Level + 1;
-- my $ok = $self->ok($test, $name);
--
-- unless( $ok ) {
-- if( $type =~ /^(eq|==)$/ ) {
-- $self->_is_diag($got, $type, $expect);
-- }
-- else {
-- $self->_cmp_diag($got, $type, $expect);
-- }
-- }
-- return $ok;
--}
--
--sub _cmp_diag {
-- my($self, $got, $type, $expect) = @_;
--
-- $got = defined $got ? "'$got'" : 'undef';
-- $expect = defined $expect ? "'$expect'" : 'undef';
-- return $self->diag(sprintf <<DIAGNOSTIC, $got, $type, $expect);
-- %s
-- %s
-- %s
--DIAGNOSTIC
--}
--
--=item B<BAILOUT>
--
-- $Test->BAILOUT($reason);
--
--Indicates to the Test::Harness that things are going so badly all
--testing should terminate. This includes running any additional test
--scripts.
--
--It will exit with 255.
--
--=cut
--
--sub BAILOUT {
-- my($self, $reason) = @_;
--
-- $self->_print("Bail out! $reason");
-- exit 255;
--}
--
--=item B<skip>
--
-- $Test->skip;
-- $Test->skip($why);
--
--Skips the current test, reporting $why.
--
--=cut
--
--sub skip {
-- my($self, $why) = @_;
-- $why ||= '';
--
-- unless( $Have_Plan ) {
-- require Carp;
-- Carp::croak("You tried to run tests without a plan! Gotta have a plan.");
-- }
--
-- lock($Curr_Test);
-- $Curr_Test++;
--
-- $Test_Results[$Curr_Test-1] = &share({
-- 'ok' => 1,
-- actual_ok => 1,
-- name => '',
-- type => 'skip',
-- reason => $why,
-- });
--
-- my $out = "ok";
-- $out .= " $Curr_Test" if $self->use_numbers;
-- $out .= " # skip $why\n";
--
-- $Test->_print($out);
--
-- return 1;
--}
--
--
--=item B<todo_skip>
--
-- $Test->todo_skip;
-- $Test->todo_skip($why);
--
--Like skip(), only it will declare the test as failing and TODO. Similar
--to
--
-- print "not ok $tnum # TODO $why\n";
--
--=cut
--
--sub todo_skip {
-- my($self, $why) = @_;
-- $why ||= '';
--
-- unless( $Have_Plan ) {
-- require Carp;
-- Carp::croak("You tried to run tests without a plan! Gotta have a plan.");
-- }
--
-- lock($Curr_Test);
-- $Curr_Test++;
--
-- $Test_Results[$Curr_Test-1] = &share({
-- 'ok' => 1,
-- actual_ok => 0,
-- name => '',
-- type => 'todo_skip',
-- reason => $why,
-- });
--
-- my $out = "not ok";
-- $out .= " $Curr_Test" if $self->use_numbers;
-- $out .= " # TODO & SKIP $why\n";
--
-- $Test->_print($out);
--
-- return 1;
--}
--
--
--=begin _unimplemented
--
--=item B<skip_rest>
--
-- $Test->skip_rest;
-- $Test->skip_rest($reason);
--
--Like skip(), only it skips all the rest of the tests you plan to run
--and terminates the test.
--
--If you're running under no_plan, it skips once and terminates the
--test.
--
--=end _unimplemented
--
--=back
--
--
--=head2 Test style
--
--=over 4
--
--=item B<level>
--
-- $Test->level($how_high);
--
--How far up the call stack should $Test look when reporting where the
--test failed.
--
--Defaults to 1.
--
--Setting $Test::Builder::Level overrides. This is typically useful
--localized:
--
-- {
-- local $Test::Builder::Level = 2;
-- $Test->ok($test);
-- }
--
--=cut
--
--sub level {
-- my($self, $level) = @_;
--
-- if( defined $level ) {
-- $Level = $level;
-- }
-- return $Level;
--}
--
--
--=item B<use_numbers>
--
-- $Test->use_numbers($on_or_off);
--
--Whether or not the test should output numbers. That is, this if true:
--
-- ok 1
-- ok 2
-- ok 3
--
--or this if false
--
-- ok
-- ok
-- ok
--
--Most useful when you can't depend on the test output order, such as
--when threads or forking is involved.
--
--Test::Harness will accept either, but avoid mixing the two styles.
--
--Defaults to on.
--
--=cut
--
--sub use_numbers {
-- my($self, $use_nums) = @_;
--
-- if( defined $use_nums ) {
-- $Use_Nums = $use_nums;
-- }
-- return $Use_Nums;
--}
--
--=item B<no_header>
--
-- $Test->no_header($no_header);
--
--If set to true, no "1..N" header will be printed.
--
--=item B<no_ending>
--
-- $Test->no_ending($no_ending);
--
--Normally, Test::Builder does some extra diagnostics when the test
--ends. It also changes the exit code as described below.
--
--If this is true, none of that will be done.
--
--=cut
--
--sub no_header {
-- my($self, $no_header) = @_;
--
-- if( defined $no_header ) {
-- $No_Header = $no_header;
-- }
-- return $No_Header;
--}
--
--sub no_ending {
-- my($self, $no_ending) = @_;
--
-- if( defined $no_ending ) {
-- $No_Ending = $no_ending;
-- }
-- return $No_Ending;
--}
--
--
--=back
--
--=head2 Output
--
--Controlling where the test output goes.
--
--It's ok for your test to change where STDOUT and STDERR point to,
--Test::Builder's default output settings will not be affected.
--
--=over 4
--
--=item B<diag>
--
-- $Test->diag(@msgs);
--
--Prints out the given $message. Normally, it uses the failure_output()
--handle, but if this is for a TODO test, the todo_output() handle is
--used.
--
--Output will be indented and marked with a # so as not to interfere
--with test output. A newline will be put on the end if there isn't one
--already.
--
--We encourage using this rather than calling print directly.
--
--Returns false. Why? Because diag() is often used in conjunction with
--a failing test (C<ok() || diag()>) it "passes through" the failure.
--
-- return ok(...) || diag(...);
--
--=for blame transfer
--Mark Fowler <mark at twoshortplanks.com>
--
--=cut
--
--sub diag {
-- my($self, @msgs) = @_;
-- return unless @msgs;
--
-- # Prevent printing headers when compiling (i.e. -c)
-- return if $^C;
--
-- # Escape each line with a #.
-- foreach (@msgs) {
-- $_ = 'undef' unless defined;
-- s/^/# /gms;
-- }
--
-- push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/;
--
-- local $Level = $Level + 1;
-- $self->_print_diag(@msgs);
--
-- return 0;
--}
--
--=begin _private
--
--=item B<_print>
--
-- $Test->_print(@msgs);
--
--Prints to the output() filehandle.
--
--=end _private
--
--=cut
--
--sub _print {
-- my($self, @msgs) = @_;
--
-- # Prevent printing headers when only compiling. Mostly for when
-- # tests are deparsed with B::Deparse
-- return if $^C;
--
-- local($\, $", $,) = (undef, ' ', '');
-- my $fh = $self->output;
--
-- # Escape each line after the first with a # so we don't
-- # confuse Test::Harness.
-- foreach (@msgs) {
-- s/\n(.)/\n# $1/sg;
-- }
--
-- push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/;
--
-- print $fh @msgs;
--}
--
--
--=item B<_print_diag>
--
-- $Test->_print_diag(@msg);
--
--Like _print, but prints to the current diagnostic filehandle.
--
--=cut
--
--sub _print_diag {
-- my $self = shift;
--
-- local($\, $", $,) = (undef, ' ', '');
-- my $fh = $self->todo ? $self->todo_output : $self->failure_output;
-- print $fh @_;
--}
--
--=item B<output>
--
-- $Test->output($fh);
-- $Test->output($file);
--
--Where normal "ok/not ok" test output should go.
--
--Defaults to STDOUT.
--
--=item B<failure_output>
--
-- $Test->failure_output($fh);
-- $Test->failure_output($file);
--
--Where diagnostic output on test failures and diag() should go.
--
--Defaults to STDERR.
--
--=item B<todo_output>
--
-- $Test->todo_output($fh);
-- $Test->todo_output($file);
--
--Where diagnostics about todo test failures and diag() should go.
--
--Defaults to STDOUT.
--
--=cut
--
--my($Out_FH, $Fail_FH, $Todo_FH);
--sub output {
-- my($self, $fh) = @_;
--
-- if( defined $fh ) {
-- $Out_FH = _new_fh($fh);
-- }
-- return $Out_FH;
--}
--
--sub failure_output {
-- my($self, $fh) = @_;
--
-- if( defined $fh ) {
-- $Fail_FH = _new_fh($fh);
-- }
-- return $Fail_FH;
--}
--
--sub todo_output {
-- my($self, $fh) = @_;
--
-- if( defined $fh ) {
-- $Todo_FH = _new_fh($fh);
-- }
-- return $Todo_FH;
--}
--
--sub _new_fh {
-- my($file_or_fh) = shift;
--
-- my $fh;
-- unless( UNIVERSAL::isa($file_or_fh, 'GLOB') ) {
-- $fh = do { local *FH };
-- open $fh, ">$file_or_fh" or
-- die "Can't open test output log $file_or_fh: $!";
-- }
-- else {
-- $fh = $file_or_fh;
-- }
--
-- return $fh;
--}
--
--sub _autoflush {
-- my($fh) = shift;
-- my $old_fh = select $fh;
-- $| = 1;
-- select $old_fh;
--}
--
--
--my $Opened_Testhandles = 0;
--sub _dup_stdhandles {
-- my $self = shift;
--
-- $self->_open_testhandles unless $Opened_Testhandles;
--
-- # Set everything to unbuffered else plain prints to STDOUT will
-- # come out in the wrong order from our own prints.
-- _autoflush(\*TESTOUT);
-- _autoflush(\*STDOUT);
-- _autoflush(\*TESTERR);
-- _autoflush(\*STDERR);
--
-- $Test->output(\*TESTOUT);
-- $Test->failure_output(\*TESTERR);
-- $Test->todo_output(\*TESTOUT);
--}
--
--sub _open_testhandles {
-- # We dup STDOUT and STDERR so people can change them in their
-- # test suites while still getting normal test output.
-- open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!";
-- open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!";
-- $Opened_Testhandles = 1;
--}
--
--
--=back
--
--
--=head2 Test Status and Info
--
--=over 4
--
--=item B<current_test>
--
-- my $curr_test = $Test->current_test;
-- $Test->current_test($num);
--
--Gets/sets the current test # we're on.
--
--You usually shouldn't have to set this.
--
--=cut
--
--sub current_test {
-- my($self, $num) = @_;
--
-- lock($Curr_Test);
-- if( defined $num ) {
-- unless( $Have_Plan ) {
-- require Carp;
-- Carp::croak("Can't change the current test number without a plan!");
-- }
--
-- $Curr_Test = $num;
-- if( $num > @Test_Results ) {
-- my $start = @Test_Results ? $#Test_Results + 1 : 0;
-- for ($start..$num-1) {
-- $Test_Results[$_] = &share({
-- 'ok' => 1,
-- actual_ok => undef,
-- reason => 'incrementing test number',
-- type => 'unknown',
-- name => undef
-- });
-- }
-- }
-- }
-- return $Curr_Test;
--}
--
--
--=item B<summary>
--
-- my @tests = $Test->summary;
--
--A simple summary of the tests so far. True for pass, false for fail.
--This is a logical pass/fail, so todos are passes.
--
--Of course, test #1 is $tests[0], etc...
--
--=cut
--
--sub summary {
-- my($self) = shift;
--
-- return map { $_->{'ok'} } @Test_Results;
--}
--
--=item B<details>
--
-- my @tests = $Test->details;
--
--Like summary(), but with a lot more detail.
--
-- $tests[$test_num - 1] =
-- { 'ok' => is the test considered a pass?
-- actual_ok => did it literally say 'ok'?
-- name => name of the test (if any)
-- type => type of test (if any, see below).
-- reason => reason for the above (if any)
-- };
--
--'ok' is true if Test::Harness will consider the test to be a pass.
--
--'actual_ok' is a reflection of whether or not the test literally
--printed 'ok' or 'not ok'. This is for examining the result of 'todo'
--tests.
--
--'name' is the name of the test.
--
--'type' indicates if it was a special test. Normal tests have a type
--of ''. Type can be one of the following:
--
-- skip see skip()
-- todo see todo()
-- todo_skip see todo_skip()
-- unknown see below
--
--Sometimes the Test::Builder test counter is incremented without it
--printing any test output, for example, when current_test() is changed.
--In these cases, Test::Builder doesn't know the result of the test, so
--it's type is 'unkown'. These details for these tests are filled in.
--They are considered ok, but the name and actual_ok is left undef.
--
--For example "not ok 23 - hole count # TODO insufficient donuts" would
--result in this structure:
--
-- $tests[22] = # 23 - 1, since arrays start from 0.
-- { ok => 1, # logically, the test passed since it's todo
-- actual_ok => 0, # in absolute terms, it failed
-- name => 'hole count',
-- type => 'todo',
-- reason => 'insufficient donuts'
-- };
--
--=cut
--
--sub details {
-- return @Test_Results;
--}
--
--=item B<todo>
--
-- my $todo_reason = $Test->todo;
-- my $todo_reason = $Test->todo($pack);
--
--todo() looks for a $TODO variable in your tests. If set, all tests
--will be considered 'todo' (see Test::More and Test::Harness for
--details). Returns the reason (ie. the value of $TODO) if running as
--todo tests, false otherwise.
--
--todo() is pretty part about finding the right package to look for
--$TODO in. It uses the exported_to() package to find it. If that's
--not set, it's pretty good at guessing the right package to look at.
--
--Sometimes there is some confusion about where todo() should be looking
--for the $TODO variable. If you want to be sure, tell it explicitly
--what $pack to use.
--
--=cut
--
--sub todo {
-- my($self, $pack) = @_;
--
-- $pack = $pack || $self->exported_to || $self->caller(1);
--
-- no strict 'refs';
-- return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
-- : 0;
--}
--
--=item B<caller>
--
-- my $package = $Test->caller;
-- my($pack, $file, $line) = $Test->caller;
-- my($pack, $file, $line) = $Test->caller($height);
--
--Like the normal caller(), except it reports according to your level().
--
--=cut
--
--sub caller {
-- my($self, $height) = @_;
-- $height ||= 0;
--
-- my @caller = CORE::caller($self->level + $height + 1);
-- return wantarray ? @caller : $caller[0];
--}
--
--=back
--
--=cut
--
--=begin _private
--
--=over 4
--
--=item B<_sanity_check>
--
-- _sanity_check();
--
--Runs a bunch of end of test sanity checks to make sure reality came
--through ok. If anything is wrong it will die with a fairly friendly
--error message.
--
--=cut
--
--#'#
--sub _sanity_check {
-- _whoa($Curr_Test < 0, 'Says here you ran a negative number of tests!');
-- _whoa(!$Have_Plan and $Curr_Test,
-- 'Somehow your tests ran without a plan!');
-- _whoa($Curr_Test != @Test_Results,
-- 'Somehow you got a different number of results than tests ran!');
--}
--
--=item B<_whoa>
--
-- _whoa($check, $description);
--
--A sanity check, similar to assert(). If the $check is true, something
--has gone horribly wrong. It will die with the given $description and
--a note to contact the author.
--
--=cut
--
--sub _whoa {
-- my($check, $desc) = @_;
-- if( $check ) {
-- die <<WHOA;
--WHOA! $desc
--This should never happen! Please contact the author immediately!
--WHOA
-- }
--}
--
--=item B<_my_exit>
--
-- _my_exit($exit_num);
--
--Perl seems to have some trouble with exiting inside an END block. 5.005_03
--and 5.6.1 both seem to do odd things. Instead, this function edits $?
--directly. It should ONLY be called from inside an END block. It
--doesn't actually exit, that's your job.
--
--=cut
--
--sub _my_exit {
-- $? = $_[0];
--
-- return 1;
--}
--
--
--=back
--
--=end _private
--
--=cut
--
--$SIG{__DIE__} = sub {
-- # We don't want to muck with death in an eval, but $^S isn't
-- # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing
-- # with it. Instead, we use caller. This also means it runs under
-- # 5.004!
-- my $in_eval = 0;
-- for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) {
-- $in_eval = 1 if $sub =~ /^\(eval\)/;
-- }
-- $Test_Died = 1 unless $in_eval;
--};
--
--sub _ending {
-- my $self = shift;
--
-- _sanity_check();
--
-- # Don't bother with an ending if this is a forked copy. Only the parent
-- # should do the ending.
-- do{ _my_exit($?) && return } if $Original_Pid != $$;
--
-- # Bailout if plan() was never called. This is so
-- # "require Test::Simple" doesn't puke.
-- do{ _my_exit(0) && return } if !$Have_Plan && !$Test_Died;
--
-- # Figure out if we passed or failed and print helpful messages.
-- if( @Test_Results ) {
-- # The plan? We have no plan.
-- if( $No_Plan ) {
-- $self->_print("1..$Curr_Test\n") unless $self->no_header;
-- $Expected_Tests = $Curr_Test;
-- }
--
-- # Auto-extended arrays and elements which aren't explicitly
-- # filled in with a shared reference will puke under 5.8.0
-- # ithreads. So we have to fill them in by hand. :(
-- my $empty_result = &share({});
-- for my $idx ( 0..$Expected_Tests-1 ) {
-- $Test_Results[$idx] = $empty_result
-- unless defined $Test_Results[$idx];
-- }
--
-- my $num_failed = grep !$_->{'ok'}, @Test_Results[0..$Expected_Tests-1];
-- $num_failed += abs($Expected_Tests - @Test_Results);
--
-- if( $Curr_Test < $Expected_Tests ) {
-- my $s = $Expected_Tests == 1 ? '' : 's';
-- $self->diag(<<"FAIL");
--Looks like you planned $Expected_Tests test$s but only ran $Curr_Test.
--FAIL
-- }
-- elsif( $Curr_Test > $Expected_Tests ) {
-- my $num_extra = $Curr_Test - $Expected_Tests;
-- my $s = $Expected_Tests == 1 ? '' : 's';
-- $self->diag(<<"FAIL");
--Looks like you planned $Expected_Tests test$s but ran $num_extra extra.
--FAIL
-- }
-- elsif ( $num_failed ) {
-- my $s = $num_failed == 1 ? '' : 's';
-- $self->diag(<<"FAIL");
--Looks like you failed $num_failed test$s of $Expected_Tests.
--FAIL
-- }
--
-- if( $Test_Died ) {
-- $self->diag(<<"FAIL");
--Looks like your test died just after $Curr_Test.
--FAIL
--
-- _my_exit( 255 ) && return;
-- }
--
-- _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return;
-- }
-- elsif ( $Skip_All ) {
-- _my_exit( 0 ) && return;
-- }
-- elsif ( $Test_Died ) {
-- $self->diag(<<'FAIL');
--Looks like your test died before it could output anything.
--FAIL
-- _my_exit( 255 ) && return;
-- }
-- else {
-- $self->diag("No tests run!\n");
-- _my_exit( 255 ) && return;
-- }
--}
--
--END {
-- $Test->_ending if defined $Test and !$Test->no_ending;
--}
--
--=head1 EXIT CODES
--
--If all your tests passed, Test::Builder will exit with zero (which is
--normal). If anything failed it will exit with how many failed. If
--you run less (or more) tests than you planned, the missing (or extras)
--will be considered failures. If no tests were ever run Test::Builder
--will throw a warning and exit with 255. If the test died, even after
--having successfully completed all its tests, it will still be
--considered a failure and will exit with 255.
--
--So the exit codes are...
--
-- 0 all tests successful
-- 255 test died
-- any other number how many failed (including missing or extras)
--
--If you fail more than 254 tests, it will be reported as 254.
--
--
--=head1 THREADS
--
--In perl 5.8.0 and later, Test::Builder is thread-safe. The test
--number is shared amongst all threads. This means if one thread sets
--the test number using current_test() they will all be effected.
--
--Test::Builder is only thread-aware if threads.pm is loaded I<before>
--Test::Builder.
--
--=head1 EXAMPLES
--
--CPAN can provide the best examples. Test::Simple, Test::More,
--Test::Exception and Test::Differences all use Test::Builder.
--
--=head1 SEE ALSO
--
--Test::Simple, Test::More, Test::Harness
--
--=head1 AUTHORS
--
--Original code by chromatic, maintained by Michael G Schwern
--E<lt>schwern at pobox.comE<gt>
--
--=head1 COPYRIGHT
--
--Copyright 2002 by chromatic E<lt>chromatic at wgz.orgE<gt>,
-- Michael G Schwern E<lt>schwern at pobox.comE<gt>.
--
--This program is free software; you can redistribute it and/or
--modify it under the same terms as Perl itself.
--
--See F<http://www.perl.com/perl/misc/Artistic.html>
--
--=cut
--
--1;
-diff -ruN PathTools-3.47/t/lib/Test/More.pm PathTools-core/t/lib/Test/More.pm
---- PathTools-3.47/t/lib/Test/More.pm 2011-12-20 08:15:58.000000000 +0100
-+++ PathTools-core/t/lib/Test/More.pm 1970-01-01 01:00:00.000000000 +0100
-@@ -1,1330 +0,0 @@
--package Test::More;
--
--use 5.004;
--
--use strict;
--use Test::Builder;
--
--
--# Can't use Carp because it might cause use_ok() to accidentally succeed
--# even though the module being used forgot to use Carp. Yes, this
--# actually happened.
--sub _carp {
-- my($file, $line) = (caller(1))[1,2];
-- warn @_, " at $file line $line\n";
--}
--
--
--
--require Exporter;
--use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO);
--$VERSION = '0.49';
-- at ISA = qw(Exporter);
-- at EXPORT = qw(ok use_ok require_ok
-- is isnt like unlike is_deeply
-- cmp_ok
-- skip todo todo_skip
-- pass fail
-- eq_array eq_hash eq_set
-- $TODO
-- plan
-- can_ok isa_ok
-- diag
-- );
--
--my $Test = Test::Builder->new;
--my $Show_Diag = 1;
--
--
--# 5.004's Exporter doesn't have export_to_level.
--sub _export_to_level
--{
-- my $pkg = shift;
-- my $level = shift;
-- (undef) = shift; # redundant arg
-- my $callpkg = caller($level);
-- $pkg->export($callpkg, @_);
--}
--
--
--=head1 NAME
--
--Test::More - yet another framework for writing test scripts
--
--=head1 SYNOPSIS
--
-- use Test::More tests => $Num_Tests;
-- # or
-- use Test::More qw(no_plan);
-- # or
-- use Test::More skip_all => $reason;
--
-- BEGIN { use_ok( 'Some::Module' ); }
-- require_ok( 'Some::Module' );
--
-- # Various ways to say "ok"
-- ok($this eq $that, $test_name);
--
-- is ($this, $that, $test_name);
-- isnt($this, $that, $test_name);
--
-- # Rather than print STDERR "# here's what went wrong\n"
-- diag("here's what went wrong");
--
-- like ($this, qr/that/, $test_name);
-- unlike($this, qr/that/, $test_name);
--
-- cmp_ok($this, '==', $that, $test_name);
--
-- is_deeply($complex_structure1, $complex_structure2, $test_name);
--
-- SKIP: {
-- skip $why, $how_many unless $have_some_feature;
--
-- ok( foo(), $test_name );
-- is( foo(42), 23, $test_name );
-- };
--
-- TODO: {
-- local $TODO = $why;
--
-- ok( foo(), $test_name );
-- is( foo(42), 23, $test_name );
-- };
--
-- can_ok($module, @methods);
-- isa_ok($object, $class);
--
-- pass($test_name);
-- fail($test_name);
--
-- # Utility comparison functions.
-- eq_array(\@this, \@that);
-- eq_hash(\%this, \%that);
-- eq_set(\@this, \@that);
--
-- # UNIMPLEMENTED!!!
-- my @status = Test::More::status;
--
-- # UNIMPLEMENTED!!!
-- BAIL_OUT($why);
--
--
--=head1 DESCRIPTION
--
--B<STOP!> If you're just getting started writing tests, have a look at
--Test::Simple first. This is a drop in replacement for Test::Simple
--which you can switch to once you get the hang of basic testing.
--
--The purpose of this module is to provide a wide range of testing
--utilities. Various ways to say "ok" with better diagnostics,
--facilities to skip tests, test future features and compare complicated
--data structures. While you can do almost anything with a simple
--C<ok()> function, it doesn't provide good diagnostic output.
--
--
--=head2 I love it when a plan comes together
--
--Before anything else, you need a testing plan. This basically declares
--how many tests your script is going to run to protect against premature
--failure.
--
--The preferred way to do this is to declare a plan when you C<use Test::More>.
--
-- use Test::More tests => $Num_Tests;
--
--There are rare cases when you will not know beforehand how many tests
--your script is going to run. In this case, you can declare that you
--have no plan. (Try to avoid using this as it weakens your test.)
--
-- use Test::More qw(no_plan);
--
--B<NOTE>: using no_plan requires a Test::Harness upgrade else it will
--think everything has failed. See L<BUGS and CAVEATS>)
--
--In some cases, you'll want to completely skip an entire testing script.
--
-- use Test::More skip_all => $skip_reason;
--
--Your script will declare a skip with the reason why you skipped and
--exit immediately with a zero (success). See L<Test::Harness> for
--details.
--
--If you want to control what functions Test::More will export, you
--have to use the 'import' option. For example, to import everything
--but 'fail', you'd do:
--
-- use Test::More tests => 23, import => ['!fail'];
--
--Alternatively, you can use the plan() function. Useful for when you
--have to calculate the number of tests.
--
-- use Test::More;
-- plan tests => keys %Stuff * 3;
--
--or for deciding between running the tests at all:
--
-- use Test::More;
-- if( $^O eq 'MacOS' ) {
-- plan skip_all => 'Test irrelevant on MacOS';
-- }
-- else {
-- plan tests => 42;
-- }
--
--=cut
--
--sub plan {
-- my(@plan) = @_;
--
-- my $caller = caller;
--
-- $Test->exported_to($caller);
--
-- my @cleaned_plan;
-- my @imports = ();
-- my $idx = 0;
-- while( $idx <= $#plan ) {
-- if( $plan[$idx] eq 'import' ) {
-- @imports = @{$plan[$idx+1]};
-- $idx += 2;
-- }
-- elsif( $plan[$idx] eq 'no_diag' ) {
-- $Show_Diag = 0;
-- $idx++;
-- }
-- else {
-- push @cleaned_plan, $plan[$idx];
-- $idx++;
-- }
-- }
--
-- $Test->plan(@cleaned_plan);
--
-- __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports);
--}
--
--sub import {
-- my($class) = shift;
-- goto &plan;
--}
--
--
--=head2 Test names
--
--By convention, each test is assigned a number in order. This is
--largely done automatically for you. However, it's often very useful to
--assign a name to each test. Which would you rather see:
--
-- ok 4
-- not ok 5
-- ok 6
--
--or
--
-- ok 4 - basic multi-variable
-- not ok 5 - simple exponential
-- ok 6 - force == mass * acceleration
--
--The later gives you some idea of what failed. It also makes it easier
--to find the test in your script, simply search for "simple
--exponential".
--
--All test functions take a name argument. It's optional, but highly
--suggested that you use it.
--
--
--=head2 I'm ok, you're not ok.
--
--The basic purpose of this module is to print out either "ok #" or "not
--ok #" depending on if a given test succeeded or failed. Everything
--else is just gravy.
--
--All of the following print "ok" or "not ok" depending on if the test
--succeeded or failed. They all also return true or false,
--respectively.
--
--=over 4
--
--=item B<ok>
--
-- ok($this eq $that, $test_name);
--
--This simply evaluates any expression (C<$this eq $that> is just a
--simple example) and uses that to determine if the test succeeded or
--failed. A true expression passes, a false one fails. Very simple.
--
--For example:
--
-- ok( $exp{9} == 81, 'simple exponential' );
-- ok( Film->can('db_Main'), 'set_db()' );
-- ok( $p->tests == 4, 'saw tests' );
-- ok( !grep !defined $_, @items, 'items populated' );
--
--(Mnemonic: "This is ok.")
--
--$test_name is a very short description of the test that will be printed
--out. It makes it very easy to find a test in your script when it fails
--and gives others an idea of your intentions. $test_name is optional,
--but we B<very> strongly encourage its use.
--
--Should an ok() fail, it will produce some diagnostics:
--
-- not ok 18 - sufficient mucus
-- # Failed test 18 (foo.t at line 42)
--
--This is actually Test::Simple's ok() routine.
--
--=cut
--
--sub ok ($;$) {
-- my($test, $name) = @_;
-- $Test->ok($test, $name);
--}
--
--=item B<is>
--
--=item B<isnt>
--
-- is ( $this, $that, $test_name );
-- isnt( $this, $that, $test_name );
--
--Similar to ok(), is() and isnt() compare their two arguments
--with C<eq> and C<ne> respectively and use the result of that to
--determine if the test succeeded or failed. So these:
--
-- # Is the ultimate answer 42?
-- is( ultimate_answer(), 42, "Meaning of Life" );
--
-- # $foo isn't empty
-- isnt( $foo, '', "Got some foo" );
--
--are similar to these:
--
-- ok( ultimate_answer() eq 42, "Meaning of Life" );
-- ok( $foo ne '', "Got some foo" );
--
--(Mnemonic: "This is that." "This isn't that.")
--
--So why use these? They produce better diagnostics on failure. ok()
--cannot know what you are testing for (beyond the name), but is() and
--isnt() know what the test was and why it failed. For example this
--test:
--
-- my $foo = 'waffle'; my $bar = 'yarblokos';
-- is( $foo, $bar, 'Is foo the same as bar?' );
--
--Will produce something like this:
--
-- not ok 17 - Is foo the same as bar?
-- # Failed test (foo.t at line 139)
-- # got: 'waffle'
-- # expected: 'yarblokos'
--
--So you can figure out what went wrong without rerunning the test.
--
--You are encouraged to use is() and isnt() over ok() where possible,
--however do not be tempted to use them to find out if something is
--true or false!
--
-- # XXX BAD!
-- is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' );
--
--This does not check if C<exists $brooklyn{tree}> is true, it checks if
--it returns 1. Very different. Similar caveats exist for false and 0.
--In these cases, use ok().
--
-- ok( exists $brooklyn{tree}, 'A tree grows in Brooklyn' );
--
--For those grammatical pedants out there, there's an C<isn't()>
--function which is an alias of isnt().
--
--=cut
--
--sub is ($$;$) {
-- $Test->is_eq(@_);
--}
--
--sub isnt ($$;$) {
-- $Test->isnt_eq(@_);
--}
--
--*isn't = \&isnt;
--
--
--=item B<like>
--
-- like( $this, qr/that/, $test_name );
--
--Similar to ok(), like() matches $this against the regex C<qr/that/>.
--
--So this:
--
-- like($this, qr/that/, 'this is like that');
--
--is similar to:
--
-- ok( $this =~ /that/, 'this is like that');
--
--(Mnemonic "This is like that".)
--
--The second argument is a regular expression. It may be given as a
--regex reference (i.e. C<qr//>) or (for better compatibility with older
--perls) as a string that looks like a regex (alternative delimiters are
--currently not supported):
--
-- like( $this, '/that/', 'this is like that' );
--
--Regex options may be placed on the end (C<'/that/i'>).
--
--Its advantages over ok() are similar to that of is() and isnt(). Better
--diagnostics on failure.
--
--=cut
--
--sub like ($$;$) {
-- $Test->like(@_);
--}
--
--
--=item B<unlike>
--
-- unlike( $this, qr/that/, $test_name );
--
--Works exactly as like(), only it checks if $this B<does not> match the
--given pattern.
--
--=cut
--
--sub unlike ($$;$) {
-- $Test->unlike(@_);
--}
--
--
--=item B<cmp_ok>
--
-- cmp_ok( $this, $op, $that, $test_name );
--
--Halfway between ok() and is() lies cmp_ok(). This allows you to
--compare two arguments using any binary perl operator.
--
-- # ok( $this eq $that );
-- cmp_ok( $this, 'eq', $that, 'this eq that' );
--
-- # ok( $this == $that );
-- cmp_ok( $this, '==', $that, 'this == that' );
--
-- # ok( $this && $that );
-- cmp_ok( $this, '&&', $that, 'this && that' );
-- ...etc...
--
--Its advantage over ok() is when the test fails you'll know what $this
--and $that were:
--
-- not ok 1
-- # Failed test (foo.t at line 12)
-- # '23'
-- # &&
-- # undef
--
--It's also useful in those cases where you are comparing numbers and
--is()'s use of C<eq> will interfere:
--
-- cmp_ok( $big_hairy_number, '==', $another_big_hairy_number );
--
--=cut
--
--sub cmp_ok($$$;$) {
-- $Test->cmp_ok(@_);
--}
--
--
--=item B<can_ok>
--
-- can_ok($module, @methods);
-- can_ok($object, @methods);
--
--Checks to make sure the $module or $object can do these @methods
--(works with functions, too).
--
-- can_ok('Foo', qw(this that whatever));
--
--is almost exactly like saying:
--
-- ok( Foo->can('this') &&
-- Foo->can('that') &&
-- Foo->can('whatever')
-- );
--
--only without all the typing and with a better interface. Handy for
--quickly testing an interface.
--
--No matter how many @methods you check, a single can_ok() call counts
--as one test. If you desire otherwise, use:
--
-- foreach my $meth (@methods) {
-- can_ok('Foo', $meth);
-- }
--
--=cut
--
--sub can_ok ($@) {
-- my($proto, @methods) = @_;
-- my $class = ref $proto || $proto;
--
-- unless( @methods ) {
-- my $ok = $Test->ok( 0, "$class->can(...)" );
-- $Test->diag(' can_ok() called with no methods');
-- return $ok;
-- }
--
-- my @nok = ();
-- foreach my $method (@methods) {
-- local($!, $@); # don't interfere with caller's $@
-- # eval sometimes resets $!
-- eval { $proto->can($method) } || push @nok, $method;
-- }
--
-- my $name;
-- $name = @methods == 1 ? "$class->can('$methods[0]')"
-- : "$class->can(...)";
--
-- my $ok = $Test->ok( !@nok, $name );
--
-- $Test->diag(map " $class->can('$_') failed\n", @nok);
--
-- return $ok;
--}
--
--=item B<isa_ok>
--
-- isa_ok($object, $class, $object_name);
-- isa_ok($ref, $type, $ref_name);
--
--Checks to see if the given C<< $object->isa($class) >>. Also checks to make
--sure the object was defined in the first place. Handy for this sort
--of thing:
--
-- my $obj = Some::Module->new;
-- isa_ok( $obj, 'Some::Module' );
--
--where you'd otherwise have to write
--
-- my $obj = Some::Module->new;
-- ok( defined $obj && $obj->isa('Some::Module') );
--
--to safeguard against your test script blowing up.
--
--It works on references, too:
--
-- isa_ok( $array_ref, 'ARRAY' );
--
--The diagnostics of this test normally just refer to 'the object'. If
--you'd like them to be more specific, you can supply an $object_name
--(for example 'Test customer').
--
--=cut
--
--sub isa_ok ($$;$) {
-- my($object, $class, $obj_name) = @_;
--
-- my $diag;
-- $obj_name = 'The object' unless defined $obj_name;
-- my $name = "$obj_name isa $class";
-- if( !defined $object ) {
-- $diag = "$obj_name isn't defined";
-- }
-- elsif( !ref $object ) {
-- $diag = "$obj_name isn't a reference";
-- }
-- else {
-- # We can't use UNIVERSAL::isa because we want to honor isa() overrides
-- local($@, $!); # eval sometimes resets $!
-- my $rslt = eval { $object->isa($class) };
-- if( $@ ) {
-- if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) {
-- if( !UNIVERSAL::isa($object, $class) ) {
-- my $ref = ref $object;
-- $diag = "$obj_name isn't a '$class' it's a '$ref'";
-- }
-- } else {
-- die <<WHOA;
--WHOA! I tried to call ->isa on your object and got some weird error.
--This should never happen. Please contact the author immediately.
--Here's the error.
--$@
--WHOA
-- }
-- }
-- elsif( !$rslt ) {
-- my $ref = ref $object;
-- $diag = "$obj_name isn't a '$class' it's a '$ref'";
-- }
-- }
--
--
--
-- my $ok;
-- if( $diag ) {
-- $ok = $Test->ok( 0, $name );
-- $Test->diag(" $diag\n");
-- }
-- else {
-- $ok = $Test->ok( 1, $name );
-- }
--
-- return $ok;
--}
--
--
--=item B<pass>
--
--=item B<fail>
--
-- pass($test_name);
-- fail($test_name);
--
--Sometimes you just want to say that the tests have passed. Usually
--the case is you've got some complicated condition that is difficult to
--wedge into an ok(). In this case, you can simply use pass() (to
--declare the test ok) or fail (for not ok). They are synonyms for
--ok(1) and ok(0).
--
--Use these very, very, very sparingly.
--
--=cut
--
--sub pass (;$) {
-- $Test->ok(1, @_);
--}
--
--sub fail (;$) {
-- $Test->ok(0, @_);
--}
--
--=back
--
--=head2 Diagnostics
--
--If you pick the right test function, you'll usually get a good idea of
--what went wrong when it failed. But sometimes it doesn't work out
--that way. So here we have ways for you to write your own diagnostic
--messages which are safer than just C<print STDERR>.
--
--=over 4
--
--=item B<diag>
--
-- diag(@diagnostic_message);
--
--Prints a diagnostic message which is guaranteed not to interfere with
--test output. Handy for this sort of thing:
--
-- ok( grep(/foo/, @users), "There's a foo user" ) or
-- diag("Since there's no foo, check that /etc/bar is set up right");
--
--which would produce:
--
-- not ok 42 - There's a foo user
-- # Failed test (foo.t at line 52)
-- # Since there's no foo, check that /etc/bar is set up right.
--
--You might remember C<ok() or diag()> with the mnemonic C<open() or
--die()>.
--
--All diag()s can be made silent by passing the "no_diag" option to
--Test::More. C<use Test::More tests => 1, 'no_diag'>. This is useful
--if you have diagnostics for personal testing but then wish to make
--them silent for release without commenting out each individual
--statement.
--
--B<NOTE> The exact formatting of the diagnostic output is still
--changing, but it is guaranteed that whatever you throw at it it won't
--interfere with the test.
--
--=cut
--
--sub diag {
-- return unless $Show_Diag;
-- $Test->diag(@_);
--}
--
--
--=back
--
--=head2 Module tests
--
--You usually want to test if the module you're testing loads ok, rather
--than just vomiting if its load fails. For such purposes we have
--C<use_ok> and C<require_ok>.
--
--=over 4
--
--=item B<use_ok>
--
-- BEGIN { use_ok($module); }
-- BEGIN { use_ok($module, @imports); }
--
--These simply use the given $module and test to make sure the load
--happened ok. It's recommended that you run use_ok() inside a BEGIN
--block so its functions are exported at compile-time and prototypes are
--properly honored.
--
--If @imports are given, they are passed through to the use. So this:
--
-- BEGIN { use_ok('Some::Module', qw(foo bar)) }
--
--is like doing this:
--
-- use Some::Module qw(foo bar);
--
--Version numbers can be checked like so:
--
-- # Just like "use Some::Module 1.02"
-- BEGIN { use_ok('Some::Module', 1.02) }
--
--Don't try to do this:
--
-- BEGIN {
-- use_ok('Some::Module');
--
-- ...some code that depends on the use...
-- ...happening at compile time...
-- }
--
--because the notion of "compile-time" is relative. Instead, you want:
--
-- BEGIN { use_ok('Some::Module') }
-- BEGIN { ...some code that depends on the use... }
--
--
--=cut
--
--sub use_ok ($;@) {
-- my($module, @imports) = @_;
-- @imports = () unless @imports;
--
-- my($pack,$filename,$line) = caller;
--
-- local($@,$!); # eval sometimes interferes with $!
--
-- if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
-- # probably a version check. Perl needs to see the bare number
-- # for it to work with non-Exporter based modules.
-- eval <<USE;
--package $pack;
--use $module $imports[0];
--USE
-- }
-- else {
-- eval <<USE;
--package $pack;
--use $module \@imports;
--USE
-- }
--
-- my $ok = $Test->ok( !$@, "use $module;" );
--
-- unless( $ok ) {
-- chomp $@;
-- $@ =~ s{^BEGIN failed--compilation aborted at .*$}
-- {BEGIN failed--compilation aborted at $filename line $line.}m;
-- $Test->diag(<<DIAGNOSTIC);
-- Tried to use '$module'.
-- Error: $@
--DIAGNOSTIC
--
-- }
--
-- return $ok;
--}
--
--=item B<require_ok>
--
-- require_ok($module);
--
--Like use_ok(), except it requires the $module.
--
--=cut
--
--sub require_ok ($) {
-- my($module) = shift;
--
-- my $pack = caller;
--
-- local($!, $@); # eval sometimes interferes with $!
-- eval <<REQUIRE;
--package $pack;
--require $module;
--REQUIRE
--
-- my $ok = $Test->ok( !$@, "require $module;" );
--
-- unless( $ok ) {
-- chomp $@;
-- $Test->diag(<<DIAGNOSTIC);
-- Tried to require '$module'.
-- Error: $@
--DIAGNOSTIC
--
-- }
--
-- return $ok;
--}
--
--=back
--
--=head2 Conditional tests
--
--Sometimes running a test under certain conditions will cause the
--test script to die. A certain function or method isn't implemented
--(such as fork() on MacOS), some resource isn't available (like a
--net connection) or a module isn't available. In these cases it's
--necessary to skip tests, or declare that they are supposed to fail
--but will work in the future (a todo test).
--
--For more details on the mechanics of skip and todo tests see
--L<Test::Harness>.
--
--The way Test::More handles this is with a named block. Basically, a
--block of tests which can be skipped over or made todo. It's best if I
--just show you...
--
--=over 4
--
--=item B<SKIP: BLOCK>
--
-- SKIP: {
-- skip $why, $how_many if $condition;
--
-- ...normal testing code goes here...
-- }
--
--This declares a block of tests that might be skipped, $how_many tests
--there are, $why and under what $condition to skip them. An example is
--the easiest way to illustrate:
--
-- SKIP: {
-- eval { require HTML::Lint };
--
-- skip "HTML::Lint not installed", 2 if $@;
--
-- my $lint = new HTML::Lint;
-- isa_ok( $lint, "HTML::Lint" );
--
-- $lint->parse( $html );
-- is( $lint->errors, 0, "No errors found in HTML" );
-- }
--
--If the user does not have HTML::Lint installed, the whole block of
--code I<won't be run at all>. Test::More will output special ok's
--which Test::Harness interprets as skipped, but passing, tests.
--It's important that $how_many accurately reflects the number of tests
--in the SKIP block so the # of tests run will match up with your plan.
--
--It's perfectly safe to nest SKIP blocks. Each SKIP block must have
--the label C<SKIP>, or Test::More can't work its magic.
--
--You don't skip tests which are failing because there's a bug in your
--program, or for which you don't yet have code written. For that you
--use TODO. Read on.
--
--=cut
--
--#'#
--sub skip {
-- my($why, $how_many) = @_;
--
-- unless( defined $how_many ) {
-- # $how_many can only be avoided when no_plan is in use.
-- _carp "skip() needs to know \$how_many tests are in the block"
-- unless $Test::Builder::No_Plan;
-- $how_many = 1;
-- }
--
-- for( 1..$how_many ) {
-- $Test->skip($why);
-- }
--
-- local $^W = 0;
-- last SKIP;
--}
--
--
--=item B<TODO: BLOCK>
--
-- TODO: {
-- local $TODO = $why if $condition;
--
-- ...normal testing code goes here...
-- }
--
--Declares a block of tests you expect to fail and $why. Perhaps it's
--because you haven't fixed a bug or haven't finished a new feature:
--
-- TODO: {
-- local $TODO = "URI::Geller not finished";
--
-- my $card = "Eight of clubs";
-- is( URI::Geller->your_card, $card, 'Is THIS your card?' );
--
-- my $spoon;
-- URI::Geller->bend_spoon;
-- is( $spoon, 'bent', "Spoon bending, that's original" );
-- }
--
--With a todo block, the tests inside are expected to fail. Test::More
--will run the tests normally, but print out special flags indicating
--they are "todo". Test::Harness will interpret failures as being ok.
--Should anything succeed, it will report it as an unexpected success.
--You then know the thing you had todo is done and can remove the
--TODO flag.
--
--The nice part about todo tests, as opposed to simply commenting out a
--block of tests, is it's like having a programmatic todo list. You know
--how much work is left to be done, you're aware of what bugs there are,
--and you'll know immediately when they're fixed.
--
--Once a todo test starts succeeding, simply move it outside the block.
--When the block is empty, delete it.
--
--B<NOTE>: TODO tests require a Test::Harness upgrade else it will
--treat it as a normal failure. See L<BUGS and CAVEATS>)
--
--
--=item B<todo_skip>
--
-- TODO: {
-- todo_skip $why, $how_many if $condition;
--
-- ...normal testing code...
-- }
--
--With todo tests, it's best to have the tests actually run. That way
--you'll know when they start passing. Sometimes this isn't possible.
--Often a failing test will cause the whole program to die or hang, even
--inside an C<eval BLOCK> with and using C<alarm>. In these extreme
--cases you have no choice but to skip over the broken tests entirely.
--
--The syntax and behavior is similar to a C<SKIP: BLOCK> except the
--tests will be marked as failing but todo. Test::Harness will
--interpret them as passing.
--
--=cut
--
--sub todo_skip {
-- my($why, $how_many) = @_;
--
-- unless( defined $how_many ) {
-- # $how_many can only be avoided when no_plan is in use.
-- _carp "todo_skip() needs to know \$how_many tests are in the block"
-- unless $Test::Builder::No_Plan;
-- $how_many = 1;
-- }
--
-- for( 1..$how_many ) {
-- $Test->todo_skip($why);
-- }
--
-- local $^W = 0;
-- last TODO;
--}
--
--=item When do I use SKIP vs. TODO?
--
--B<If it's something the user might not be able to do>, use SKIP.
--This includes optional modules that aren't installed, running under
--an OS that doesn't have some feature (like fork() or symlinks), or maybe
--you need an Internet connection and one isn't available.
--
--B<If it's something the programmer hasn't done yet>, use TODO. This
--is for any code you haven't written yet, or bugs you have yet to fix,
--but want to put tests in your testing script (always a good idea).
--
--
--=back
--
--=head2 Comparison functions
--
--Not everything is a simple eq check or regex. There are times you
--need to see if two arrays are equivalent, for instance. For these
--instances, Test::More provides a handful of useful functions.
--
--B<NOTE> These are NOT well-tested on circular references. Nor am I
--quite sure what will happen with filehandles.
--
--=over 4
--
--=item B<is_deeply>
--
-- is_deeply( $this, $that, $test_name );
--
--Similar to is(), except that if $this and $that are hash or array
--references, it does a deep comparison walking each data structure to
--see if they are equivalent. If the two structures are different, it
--will display the place where they start differing.
--
--Test::Differences and Test::Deep provide more in-depth functionality
--along these lines.
--
--=cut
--
--use vars qw(@Data_Stack);
--my $DNE = bless [], 'Does::Not::Exist';
--sub is_deeply {
-- unless( @_ == 2 or @_ == 3 ) {
-- my $msg = <<WARNING;
--is_deeply() takes two or three args, you gave %d.
--This usually means you passed an array or hash instead
--of a reference to it
--WARNING
-- chop $msg; # clip off newline so carp() will put in line/file
--
-- _carp sprintf $msg, scalar @_;
-- }
--
-- my($this, $that, $name) = @_;
--
-- my $ok;
-- if( !ref $this || !ref $that ) {
-- $ok = $Test->is_eq($this, $that, $name);
-- }
-- else {
-- local @Data_Stack = ();
-- if( _deep_check($this, $that) ) {
-- $ok = $Test->ok(1, $name);
-- }
-- else {
-- $ok = $Test->ok(0, $name);
-- $ok = $Test->diag(_format_stack(@Data_Stack));
-- }
-- }
--
-- return $ok;
--}
--
--sub _format_stack {
-- my(@Stack) = @_;
--
-- my $var = '$FOO';
-- my $did_arrow = 0;
-- foreach my $entry (@Stack) {
-- my $type = $entry->{type} || '';
-- my $idx = $entry->{'idx'};
-- if( $type eq 'HASH' ) {
-- $var .= "->" unless $did_arrow++;
-- $var .= "{$idx}";
-- }
-- elsif( $type eq 'ARRAY' ) {
-- $var .= "->" unless $did_arrow++;
-- $var .= "[$idx]";
-- }
-- elsif( $type eq 'REF' ) {
-- $var = "\${$var}";
-- }
-- }
--
-- my @vals = @{$Stack[-1]{vals}}[0,1];
-- my @vars = ();
-- ($vars[0] = $var) =~ s/\$FOO/ \$got/;
-- ($vars[1] = $var) =~ s/\$FOO/\$expected/;
--
-- my $out = "Structures begin differing at:\n";
-- foreach my $idx (0..$#vals) {
-- my $val = $vals[$idx];
-- $vals[$idx] = !defined $val ? 'undef' :
-- $val eq $DNE ? "Does not exist"
-- : "'$val'";
-- }
--
-- $out .= "$vars[0] = $vals[0]\n";
-- $out .= "$vars[1] = $vals[1]\n";
--
-- $out =~ s/^/ /msg;
-- return $out;
--}
--
--
--=item B<eq_array>
--
-- eq_array(\@this, \@that);
--
--Checks if two arrays are equivalent. This is a deep check, so
--multi-level structures are handled correctly.
--
--=cut
--
--#'#
--sub eq_array {
-- my($a1, $a2) = @_;
-- return 1 if $a1 eq $a2;
--
-- my $ok = 1;
-- my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2;
-- for (0..$max) {
-- my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_];
-- my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_];
--
-- push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] };
-- $ok = _deep_check($e1,$e2);
-- pop @Data_Stack if $ok;
--
-- last unless $ok;
-- }
-- return $ok;
--}
--
--sub _deep_check {
-- my($e1, $e2) = @_;
-- my $ok = 0;
--
-- my $eq;
-- {
-- # Quiet uninitialized value warnings when comparing undefs.
-- local $^W = 0;
--
-- if( $e1 eq $e2 ) {
-- $ok = 1;
-- }
-- else {
-- if( UNIVERSAL::isa($e1, 'ARRAY') and
-- UNIVERSAL::isa($e2, 'ARRAY') )
-- {
-- $ok = eq_array($e1, $e2);
-- }
-- elsif( UNIVERSAL::isa($e1, 'HASH') and
-- UNIVERSAL::isa($e2, 'HASH') )
-- {
-- $ok = eq_hash($e1, $e2);
-- }
-- elsif( UNIVERSAL::isa($e1, 'REF') and
-- UNIVERSAL::isa($e2, 'REF') )
-- {
-- push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
-- $ok = _deep_check($$e1, $$e2);
-- pop @Data_Stack if $ok;
-- }
-- elsif( UNIVERSAL::isa($e1, 'SCALAR') and
-- UNIVERSAL::isa($e2, 'SCALAR') )
-- {
-- push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
-- $ok = _deep_check($$e1, $$e2);
-- }
-- else {
-- push @Data_Stack, { vals => [$e1, $e2] };
-- $ok = 0;
-- }
-- }
-- }
--
-- return $ok;
--}
--
--
--=item B<eq_hash>
--
-- eq_hash(\%this, \%that);
--
--Determines if the two hashes contain the same keys and values. This
--is a deep check.
--
--=cut
--
--sub eq_hash {
-- my($a1, $a2) = @_;
-- return 1 if $a1 eq $a2;
--
-- my $ok = 1;
-- my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2;
-- foreach my $k (keys %$bigger) {
-- my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE;
-- my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE;
--
-- push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] };
-- $ok = _deep_check($e1, $e2);
-- pop @Data_Stack if $ok;
--
-- last unless $ok;
-- }
--
-- return $ok;
--}
--
--=item B<eq_set>
--
-- eq_set(\@this, \@that);
--
--Similar to eq_array(), except the order of the elements is B<not>
--important. This is a deep check, but the irrelevancy of order only
--applies to the top level.
--
--B<NOTE> By historical accident, this is not a true set comparision.
--While the order of elements does not matter, duplicate elements do.
--
--=cut
--
--# We must make sure that references are treated neutrally. It really
--# doesn't matter how we sort them, as long as both arrays are sorted
--# with the same algorithm.
--sub _bogus_sort { local $^W = 0; ref $a ? -1 : ref $b ? 1 : $a cmp $b }
--
--sub eq_set {
-- my($a1, $a2) = @_;
-- return 0 unless @$a1 == @$a2;
--
-- # There's faster ways to do this, but this is easiest.
-- return eq_array( [sort _bogus_sort @$a1], [sort _bogus_sort @$a2] );
--}
--
--=back
--
--
--=head2 Extending and Embedding Test::More
--
--Sometimes the Test::More interface isn't quite enough. Fortunately,
--Test::More is built on top of Test::Builder which provides a single,
--unified backend for any test library to use. This means two test
--libraries which both use Test::Builder B<can be used together in the
--same program>.
--
--If you simply want to do a little tweaking of how the tests behave,
--you can access the underlying Test::Builder object like so:
--
--=over 4
--
--=item B<builder>
--
-- my $test_builder = Test::More->builder;
--
--Returns the Test::Builder object underlying Test::More for you to play
--with.
--
--=cut
--
--sub builder {
-- return Test::Builder->new;
--}
--
--=back
--
--
--=head1 EXIT CODES
--
--If all your tests passed, Test::Builder will exit with zero (which is
--normal). If anything failed it will exit with how many failed. If
--you run less (or more) tests than you planned, the missing (or extras)
--will be considered failures. If no tests were ever run Test::Builder
--will throw a warning and exit with 255. If the test died, even after
--having successfully completed all its tests, it will still be
--considered a failure and will exit with 255.
--
--So the exit codes are...
--
-- 0 all tests successful
-- 255 test died
-- any other number how many failed (including missing or extras)
--
--If you fail more than 254 tests, it will be reported as 254.
--
--
--=head1 NOTES
--
--Test::More is B<explicitly> tested all the way back to perl 5.004.
--
--=head1 BUGS and CAVEATS
--
--=over 4
--
--=item Threads
--
--Test::More will only be aware of threads if "use threads" has been done
--I<before> Test::More is loaded. This is ok:
--
-- use threads;
-- use Test::More;
--
--This may cause problems:
--
-- use Test::More
-- use threads;
--
--=item Making your own ok()
--
--If you are trying to extend Test::More, don't. Use Test::Builder
--instead.
--
--=item The eq_* family has some caveats.
--
--=item Test::Harness upgrade
--
--no_plan and todo depend on new Test::Harness features and fixes. If
--you're going to distribute tests that use no_plan or todo your
--end-users will have to upgrade Test::Harness to the latest one on
--CPAN. If you avoid no_plan and TODO tests, the stock Test::Harness
--will work fine.
--
--Installing Test::More should also upgrade Test::Harness.
--
--=back
--
--
--=head1 HISTORY
--
--This is a case of convergent evolution with Joshua Pritikin's Test
--module. I was largely unaware of its existence when I'd first
--written my own ok() routines. This module exists because I can't
--figure out how to easily wedge test names into Test's interface (along
--with a few other problems).
--
--The goal here is to have a testing utility that's simple to learn,
--quick to use and difficult to trip yourself up with while still
--providing more flexibility than the existing Test.pm. As such, the
--names of the most common routines are kept tiny, special cases and
--magic side-effects are kept to a minimum. WYSIWYG.
--
--
--=head1 SEE ALSO
--
--L<Test::Simple> if all this confuses you and you just want to write
--some tests. You can upgrade to Test::More later (it's forward
--compatible).
--
--L<Test> is the old testing module. Its main benefit is that it has
--been distributed with Perl since 5.004_05.
--
--L<Test::Harness> for details on how your test results are interpreted
--by Perl.
--
--L<Test::Differences> for more ways to test complex data structures.
--And it plays well with Test::More.
--
--L<Test::Class> is like XUnit but more perlish.
--
--L<Test::Deep> gives you more powerful complex data structure testing.
--
--L<Test::Unit> is XUnit style testing.
--
--L<Test::Inline> shows the idea of embedded testing.
--
--L<Bundle::Test> installs a whole bunch of useful test modules.
--
--
--=head1 AUTHORS
--
--Michael G Schwern E<lt>schwern at pobox.comE<gt> with much inspiration
--from Joshua Pritikin's Test module and lots of help from Barrie
--Slaymaker, Tony Bowden, blackstar.co.uk, chromatic and the perl-qa gang.
--
--
--=head1 COPYRIGHT
--
--Copyright 2001, 2002 by Michael G Schwern E<lt>schwern at pobox.comE<gt>.
--
--This program is free software; you can redistribute it and/or
--modify it under the same terms as Perl itself.
--
--See F<http://www.perl.com/perl/misc/Artistic.html>
--
--=cut
--
--1;
-diff -ruN PathTools-3.47/t/lib/Test/Simple.pm PathTools-core/t/lib/Test/Simple.pm
---- PathTools-3.47/t/lib/Test/Simple.pm 2011-12-20 08:15:58.000000000 +0100
-+++ PathTools-core/t/lib/Test/Simple.pm 1970-01-01 01:00:00.000000000 +0100
-@@ -1,235 +0,0 @@
--package Test::Simple;
--
--use 5.004;
--
--use strict 'vars';
--use vars qw($VERSION);
--$VERSION = '0.49';
--
--
--use Test::Builder;
--my $Test = Test::Builder->new;
--
--sub import {
-- my $self = shift;
-- my $caller = caller;
-- *{$caller.'::ok'} = \&ok;
--
-- $Test->exported_to($caller);
-- $Test->plan(@_);
--}
--
--
--=head1 NAME
--
--Test::Simple - Basic utilities for writing tests.
--
--=head1 SYNOPSIS
--
-- use Test::Simple tests => 1;
--
-- ok( $foo eq $bar, 'foo is bar' );
--
--
--=head1 DESCRIPTION
--
--** If you are unfamiliar with testing B<read Test::Tutorial> first! **
--
--This is an extremely simple, extremely basic module for writing tests
--suitable for CPAN modules and other pursuits. If you wish to do more
--complicated testing, use the Test::More module (a drop-in replacement
--for this one).
--
--The basic unit of Perl testing is the ok. For each thing you want to
--test your program will print out an "ok" or "not ok" to indicate pass
--or fail. You do this with the ok() function (see below).
--
--The only other constraint is you must pre-declare how many tests you
--plan to run. This is in case something goes horribly wrong during the
--test and your test program aborts, or skips a test or whatever. You
--do this like so:
--
-- use Test::Simple tests => 23;
--
--You must have a plan.
--
--
--=over 4
--
--=item B<ok>
--
-- ok( $foo eq $bar, $name );
-- ok( $foo eq $bar );
--
--ok() is given an expression (in this case C<$foo eq $bar>). If it's
--true, the test passed. If it's false, it didn't. That's about it.
--
--ok() prints out either "ok" or "not ok" along with a test number (it
--keeps track of that for you).
--
-- # This produces "ok 1 - Hell not yet frozen over" (or not ok)
-- ok( get_temperature($hell) > 0, 'Hell not yet frozen over' );
--
--If you provide a $name, that will be printed along with the "ok/not
--ok" to make it easier to find your test when if fails (just search for
--the name). It also makes it easier for the next guy to understand
--what your test is for. It's highly recommended you use test names.
--
--All tests are run in scalar context. So this:
--
-- ok( @stuff, 'I have some stuff' );
--
--will do what you mean (fail if stuff is empty)
--
--=cut
--
--sub ok ($;$) {
-- $Test->ok(@_);
--}
--
--
--=back
--
--Test::Simple will start by printing number of tests run in the form
--"1..M" (so "1..5" means you're going to run 5 tests). This strange
--format lets Test::Harness know how many tests you plan on running in
--case something goes horribly wrong.
--
--If all your tests passed, Test::Simple will exit with zero (which is
--normal). If anything failed it will exit with how many failed. If
--you run less (or more) tests than you planned, the missing (or extras)
--will be considered failures. If no tests were ever run Test::Simple
--will throw a warning and exit with 255. If the test died, even after
--having successfully completed all its tests, it will still be
--considered a failure and will exit with 255.
--
--So the exit codes are...
--
-- 0 all tests successful
-- 255 test died
-- any other number how many failed (including missing or extras)
--
--If you fail more than 254 tests, it will be reported as 254.
--
--This module is by no means trying to be a complete testing system.
--It's just to get you started. Once you're off the ground its
--recommended you look at L<Test::More>.
--
--
--=head1 EXAMPLE
--
--Here's an example of a simple .t file for the fictional Film module.
--
-- use Test::Simple tests => 5;
--
-- use Film; # What you're testing.
--
-- my $btaste = Film->new({ Title => 'Bad Taste',
-- Director => 'Peter Jackson',
-- Rating => 'R',
-- NumExplodingSheep => 1
-- });
-- ok( defined($btaste) and ref $btaste eq 'Film', 'new() works' );
--
-- ok( $btaste->Title eq 'Bad Taste', 'Title() get' );
-- ok( $btaste->Director eq 'Peter Jackson', 'Director() get' );
-- ok( $btaste->Rating eq 'R', 'Rating() get' );
-- ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' );
--
--It will produce output like this:
--
-- 1..5
-- ok 1 - new() works
-- ok 2 - Title() get
-- ok 3 - Director() get
-- not ok 4 - Rating() get
-- # Failed test (t/film.t at line 14)
-- ok 5 - NumExplodingSheep() get
-- # Looks like you failed 1 tests of 5
--
--Indicating the Film::Rating() method is broken.
--
--
--=head1 CAVEATS
--
--Test::Simple will only report a maximum of 254 failures in its exit
--code. If this is a problem, you probably have a huge test script.
--Split it into multiple files. (Otherwise blame the Unix folks for
--using an unsigned short integer as the exit status).
--
--Because VMS's exit codes are much, much different than the rest of the
--universe, and perl does horrible mangling to them that gets in my way,
--it works like this on VMS.
--
-- 0 SS$_NORMAL all tests successful
-- 4 SS$_ABORT something went wrong
--
--Unfortunately, I can't differentiate any further.
--
--
--=head1 NOTES
--
--Test::Simple is B<explicitly> tested all the way back to perl 5.004.
--
--Test::Simple is thread-safe in perl 5.8.0 and up.
--
--=head1 HISTORY
--
--This module was conceived while talking with Tony Bowden in his
--kitchen one night about the problems I was having writing some really
--complicated feature into the new Testing module. He observed that the
--main problem is not dealing with these edge cases but that people hate
--to write tests B<at all>. What was needed was a dead simple module
--that took all the hard work out of testing and was really, really easy
--to learn. Paul Johnson simultaneously had this idea (unfortunately,
--he wasn't in Tony's kitchen). This is it.
--
--
--=head1 SEE ALSO
--
--=over 4
--
--=item L<Test::More>
--
--More testing functions! Once you outgrow Test::Simple, look at
--Test::More. Test::Simple is 100% forward compatible with Test::More
--(i.e. you can just use Test::More instead of Test::Simple in your
--programs and things will still work).
--
--=item L<Test>
--
--The original Perl testing module.
--
--=item L<Test::Unit>
--
--Elaborate unit testing.
--
--=item L<Test::Inline>, L<SelfTest>
--
--Embed tests in your code!
--
--=item L<Test::Harness>
--
--Interprets the output of your test program.
--
--=back
--
--
--=head1 AUTHORS
--
--Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
--E<lt>schwern at pobox.comE<gt>, wardrobe by Calvin Klein.
--
--
--=head1 COPYRIGHT
--
--Copyright 2001 by Michael G Schwern E<lt>schwern at pobox.comE<gt>.
--
--This program is free software; you can redistribute it and/or
--modify it under the same terms as Perl itself.
--
--See F<http://www.perl.com/perl/misc/Artistic.html>
--
--=cut
--
--1;
-diff -ruN PathTools-3.47/t/lib/Test/Tutorial.pod PathTools-core/t/lib/Test/Tutorial.pod
---- PathTools-3.47/t/lib/Test/Tutorial.pod 2011-12-20 08:15:58.000000000 +0100
-+++ PathTools-core/t/lib/Test/Tutorial.pod 1970-01-01 01:00:00.000000000 +0100
-@@ -1,603 +0,0 @@
--=head1 NAME
--
--Test::Tutorial - A tutorial about writing really basic tests
--
--=head1 DESCRIPTION
--
--
--I<AHHHHHHH!!!! NOT TESTING! Anything but testing!
--Beat me, whip me, send me to Detroit, but don't make
--me write tests!>
--
--I<*sob*>
--
--I<Besides, I don't know how to write the damned things.>
--
--
--Is this you? Is writing tests right up there with writing
--documentation and having your fingernails pulled out? Did you open up
--a test and read
--
-- ######## We start with some black magic
--
--and decide that's quite enough for you?
--
--It's ok. That's all gone now. We've done all the black magic for
--you. And here are the tricks...
--
--
--=head2 Nuts and bolts of testing.
--
--Here's the most basic test program.
--
-- #!/usr/bin/perl -w
--
-- print "1..1\n";
--
-- print 1 + 1 == 2 ? "ok 1\n" : "not ok 1\n";
--
--since 1 + 1 is 2, it prints:
--
-- 1..1
-- ok 1
--
--What this says is: C<1..1> "I'm going to run one test." [1] C<ok 1>
--"The first test passed". And that's about all magic there is to
--testing. Your basic unit of testing is the I<ok>. For each thing you
--test, an C<ok> is printed. Simple. B<Test::Harness> interprets your test
--results to determine if you succeeded or failed (more on that later).
--
--Writing all these print statements rapidly gets tedious. Fortunately,
--there's B<Test::Simple>. It has one function, C<ok()>.
--
-- #!/usr/bin/perl -w
--
-- use Test::Simple tests => 1;
--
-- ok( 1 + 1 == 2 );
--
--and that does the same thing as the code above. C<ok()> is the backbone
--of Perl testing, and we'll be using it instead of roll-your-own from
--here on. If C<ok()> gets a true value, the test passes. False, it
--fails.
--
-- #!/usr/bin/perl -w
--
-- use Test::Simple tests => 2;
-- ok( 1 + 1 == 2 );
-- ok( 2 + 2 == 5 );
--
--from that comes
--
-- 1..2
-- ok 1
-- not ok 2
-- # Failed test (test.pl at line 5)
-- # Looks like you failed 1 tests of 2.
--
--C<1..2> "I'm going to run two tests." This number is used to ensure
--your test program ran all the way through and didn't die or skip some
--tests. C<ok 1> "The first test passed." C<not ok 2> "The second test
--failed". Test::Simple helpfully prints out some extra commentary about
--your tests.
--
--It's not scary. Come, hold my hand. We're going to give an example
--of testing a module. For our example, we'll be testing a date
--library, B<Date::ICal>. It's on CPAN, so download a copy and follow
--along. [2]
--
--
--=head2 Where to start?
--
--This is the hardest part of testing, where do you start? People often
--get overwhelmed at the apparent enormity of the task of testing a
--whole module. Best place to start is at the beginning. Date::ICal is
--an object-oriented module, and that means you start by making an
--object. So we test C<new()>.
--
-- #!/usr/bin/perl -w
--
-- use Test::Simple tests => 2;
--
-- use Date::ICal;
--
-- my $ical = Date::ICal->new; # create an object
-- ok( defined $ical ); # check that we got something
-- ok( $ical->isa('Date::ICal') ); # and it's the right class
--
--run that and you should get:
--
-- 1..2
-- ok 1
-- ok 2
--
--congratulations, you've written your first useful test.
--
--
--=head2 Names
--
--That output isn't terribly descriptive, is it? When you have two
--tests you can figure out which one is #2, but what if you have 102?
--
--Each test can be given a little descriptive name as the second
--argument to C<ok()>.
--
-- use Test::Simple tests => 2;
--
-- ok( defined $ical, 'new() returned something' );
-- ok( $ical->isa('Date::ICal'), " and it's the right class" );
--
--So now you'd see...
--
-- 1..2
-- ok 1 - new() returned something
-- ok 2 - and it's the right class
--
--
--=head2 Test the manual
--
--Simplest way to build up a decent testing suite is to just test what
--the manual says it does. [3] Let's pull something out of the
--L<Date::ICal/SYNOPSIS> and test that all its bits work.
--
-- #!/usr/bin/perl -w
--
-- use Test::Simple tests => 8;
--
-- use Date::ICal;
--
-- $ical = Date::ICal->new( year => 1964, month => 10, day => 16,
-- hour => 16, min => 12, sec => 47,
-- tz => '0530' );
--
-- ok( defined $ical, 'new() returned something' );
-- ok( $ical->isa('Date::ICal'), " and it's the right class" );
-- ok( $ical->sec == 47, ' sec()' );
-- ok( $ical->min == 12, ' min()' );
-- ok( $ical->hour == 16, ' hour()' );
-- ok( $ical->day == 17, ' day()' );
-- ok( $ical->month == 10, ' month()' );
-- ok( $ical->year == 1964, ' year()' );
--
--run that and you get:
--
-- 1..8
-- ok 1 - new() returned something
-- ok 2 - and it's the right class
-- ok 3 - sec()
-- ok 4 - min()
-- ok 5 - hour()
-- not ok 6 - day()
-- # Failed test (- at line 16)
-- ok 7 - month()
-- ok 8 - year()
-- # Looks like you failed 1 tests of 8.
--
--Whoops, a failure! [4] Test::Simple helpfully lets us know on what line
--the failure occured, but not much else. We were supposed to get 17,
--but we didn't. What did we get?? Dunno. We'll have to re-run the
--test in the debugger or throw in some print statements to find out.
--
--Instead, we'll switch from B<Test::Simple> to B<Test::More>. B<Test::More>
--does everything B<Test::Simple> does, and more! In fact, Test::More does
--things I<exactly> the way Test::Simple does. You can literally swap
--Test::Simple out and put Test::More in its place. That's just what
--we're going to do.
--
--Test::More does more than Test::Simple. The most important difference
--at this point is it provides more informative ways to say "ok".
--Although you can write almost any test with a generic C<ok()>, it
--can't tell you what went wrong. Instead, we'll use the C<is()>
--function, which lets us declare that something is supposed to be the
--same as something else:
--
-- #!/usr/bin/perl -w
--
-- use Test::More tests => 8;
--
-- use Date::ICal;
--
-- $ical = Date::ICal->new( year => 1964, month => 10, day => 16,
-- hour => 16, min => 12, sec => 47,
-- tz => '0530' );
--
-- ok( defined $ical, 'new() returned something' );
-- ok( $ical->isa('Date::ICal'), " and it's the right class" );
-- is( $ical->sec, 47, ' sec()' );
-- is( $ical->min, 12, ' min()' );
-- is( $ical->hour, 16, ' hour()' );
-- is( $ical->day, 17, ' day()' );
-- is( $ical->month, 10, ' month()' );
-- is( $ical->year, 1964, ' year()' );
--
--"Is C<$ical-E<gt>sec> 47?" "Is C<$ical-E<gt>min> 12?" With C<is()> in place,
--you get some more information
--
-- 1..8
-- ok 1 - new() returned something
-- ok 2 - and it's the right class
-- ok 3 - sec()
-- ok 4 - min()
-- ok 5 - hour()
-- not ok 6 - day()
-- # Failed test (- at line 16)
-- # got: '16'
-- # expected: '17'
-- ok 7 - month()
-- ok 8 - year()
-- # Looks like you failed 1 tests of 8.
--
--letting us know that C<$ical-E<gt>day> returned 16, but we expected 17. A
--quick check shows that the code is working fine, we made a mistake
--when writing up the tests. Just change it to:
--
-- is( $ical->day, 16, ' day()' );
--
--and everything works.
--
--So any time you're doing a "this equals that" sort of test, use C<is()>.
--It even works on arrays. The test is always in scalar context, so you
--can test how many elements are in a list this way. [5]
--
-- is( @foo, 5, 'foo has 5 elements' );
--
--
--=head2 Sometimes the tests are wrong
--
--Which brings us to a very important lesson. Code has bugs. Tests are
--code. Ergo, tests have bugs. A failing test could mean a bug in the
--code, but don't discount the possibility that the test is wrong.
--
--On the flip side, don't be tempted to prematurely declare a test
--incorrect just because you're having trouble finding the bug.
--Invalidating a test isn't something to be taken lightly, and don't use
--it as a cop out to avoid work.
--
--
--=head2 Testing lots of values
--
--We're going to be wanting to test a lot of dates here, trying to trick
--the code with lots of different edge cases. Does it work before 1970?
--After 2038? Before 1904? Do years after 10,000 give it trouble?
--Does it get leap years right? We could keep repeating the code above,
--or we could set up a little try/expect loop.
--
-- use Test::More tests => 32;
-- use Date::ICal;
--
-- my %ICal_Dates = (
-- # An ICal string And the year, month, date
-- # hour, minute and second we expect.
-- '19971024T120000' => # from the docs.
-- [ 1997, 10, 24, 12, 0, 0 ],
-- '20390123T232832' => # after the Unix epoch
-- [ 2039, 1, 23, 23, 28, 32 ],
-- '19671225T000000' => # before the Unix epoch
-- [ 1967, 12, 25, 0, 0, 0 ],
-- '18990505T232323' => # before the MacOS epoch
-- [ 1899, 5, 5, 23, 23, 23 ],
-- );
--
--
-- while( my($ical_str, $expect) = each %ICal_Dates ) {
-- my $ical = Date::ICal->new( ical => $ical_str );
--
-- ok( defined $ical, "new(ical => '$ical_str')" );
-- ok( $ical->isa('Date::ICal'), " and it's the right class" );
--
-- is( $ical->year, $expect->[0], ' year()' );
-- is( $ical->month, $expect->[1], ' month()' );
-- is( $ical->day, $expect->[2], ' day()' );
-- is( $ical->hour, $expect->[3], ' hour()' );
-- is( $ical->min, $expect->[4], ' min()' );
-- is( $ical->sec, $expect->[5], ' sec()' );
-- }
--
--So now we can test bunches of dates by just adding them to
--C<%ICal_Dates>. Now that it's less work to test with more dates, you'll
--be inclined to just throw more in as you think of them.
--Only problem is, every time we add to that we have to keep adjusting
--the C<use Test::More tests =E<gt> ##> line. That can rapidly get
--annoying. There's two ways to make this work better.
--
--First, we can calculate the plan dynamically using the C<plan()>
--function.
--
-- use Test::More;
-- use Date::ICal;
--
-- my %ICal_Dates = (
-- ...same as before...
-- );
--
-- # For each key in the hash we're running 8 tests.
-- plan tests => keys %ICal_Dates * 8;
--
--Or to be even more flexible, we use C<no_plan>. This means we're just
--running some tests, don't know how many. [6]
--
-- use Test::More 'no_plan'; # instead of tests => 32
--
--now we can just add tests and not have to do all sorts of math to
--figure out how many we're running.
--
--
--=head2 Informative names
--
--Take a look at this line here
--
-- ok( defined $ical, "new(ical => '$ical_str')" );
--
--we've added more detail about what we're testing and the ICal string
--itself we're trying out to the name. So you get results like:
--
-- ok 25 - new(ical => '19971024T120000')
-- ok 26 - and it's the right class
-- ok 27 - year()
-- ok 28 - month()
-- ok 29 - day()
-- ok 30 - hour()
-- ok 31 - min()
-- ok 32 - sec()
--
--if something in there fails, you'll know which one it was and that
--will make tracking down the problem easier. So try to put a bit of
--debugging information into the test names.
--
--Describe what the tests test, to make debugging a failed test easier
--for you or for the next person who runs your test.
--
--
--=head2 Skipping tests
--
--Poking around in the existing Date::ICal tests, I found this in
--F<t/01sanity.t> [7]
--
-- #!/usr/bin/perl -w
--
-- use Test::More tests => 7;
-- use Date::ICal;
--
-- # Make sure epoch time is being handled sanely.
-- my $t1 = Date::ICal->new( epoch => 0 );
-- is( $t1->epoch, 0, "Epoch time of 0" );
--
-- # XXX This will only work on unix systems.
-- is( $t1->ical, '19700101Z', " epoch to ical" );
--
-- is( $t1->year, 1970, " year()" );
-- is( $t1->month, 1, " month()" );
-- is( $t1->day, 1, " day()" );
--
-- # like the tests above, but starting with ical instead of epoch
-- my $t2 = Date::ICal->new( ical => '19700101Z' );
-- is( $t2->ical, '19700101Z', "Start of epoch in ICal notation" );
--
-- is( $t2->epoch, 0, " and back to ICal" );
--
--The beginning of the epoch is different on most non-Unix operating
--systems [8]. Even though Perl smooths out the differences for the most
--part, certain ports do it differently. MacPerl is one off the top of
--my head. [9] We I<know> this will never work on MacOS. So rather than
--just putting a comment in the test, we can explicitly say it's never
--going to work and skip the test.
--
-- use Test::More tests => 7;
-- use Date::ICal;
--
-- # Make sure epoch time is being handled sanely.
-- my $t1 = Date::ICal->new( epoch => 0 );
-- is( $t1->epoch, 0, "Epoch time of 0" );
--
-- SKIP: {
-- skip('epoch to ICal not working on MacOS', 6)
-- if $^O eq 'MacOS';
--
-- is( $t1->ical, '19700101Z', " epoch to ical" );
--
-- is( $t1->year, 1970, " year()" );
-- is( $t1->month, 1, " month()" );
-- is( $t1->day, 1, " day()" );
--
-- # like the tests above, but starting with ical instead of epoch
-- my $t2 = Date::ICal->new( ical => '19700101Z' );
-- is( $t2->ical, '19700101Z', "Start of epoch in ICal notation" );
--
-- is( $t2->epoch, 0, " and back to ICal" );
-- }
--
--A little bit of magic happens here. When running on anything but
--MacOS, all the tests run normally. But when on MacOS, C<skip()> causes
--the entire contents of the SKIP block to be jumped over. It's never
--run. Instead, it prints special output that tells Test::Harness that
--the tests have been skipped.
--
-- 1..7
-- ok 1 - Epoch time of 0
-- ok 2 # skip epoch to ICal not working on MacOS
-- ok 3 # skip epoch to ICal not working on MacOS
-- ok 4 # skip epoch to ICal not working on MacOS
-- ok 5 # skip epoch to ICal not working on MacOS
-- ok 6 # skip epoch to ICal not working on MacOS
-- ok 7 # skip epoch to ICal not working on MacOS
--
--This means your tests won't fail on MacOS. This means less emails
--from MacPerl users telling you about failing tests that you know will
--never work. You've got to be careful with skip tests. These are for
--tests which don't work and I<never will>. It is not for skipping
--genuine bugs (we'll get to that in a moment).
--
--The tests are wholly and completely skipped. [10] This will work.
--
-- SKIP: {
-- skip("I don't wanna die!");
--
-- die, die, die, die, die;
-- }
--
--
--=head2 Todo tests
--
--Thumbing through the Date::ICal man page, I came across this:
--
-- ical
--
-- $ical_string = $ical->ical;
--
-- Retrieves, or sets, the date on the object, using any
-- valid ICal date/time string.
--
--"Retrieves or sets". Hmmm, didn't see a test for using C<ical()> to set
--the date in the Date::ICal test suite. So I'll write one.
--
-- use Test::More tests => 1;
-- use Date::ICal;
--
-- my $ical = Date::ICal->new;
-- $ical->ical('20201231Z');
-- is( $ical->ical, '20201231Z', 'Setting via ical()' );
--
--run that and I get
--
-- 1..1
-- not ok 1 - Setting via ical()
-- # Failed test (- at line 6)
-- # got: '20010814T233649Z'
-- # expected: '20201231Z'
-- # Looks like you failed 1 tests of 1.
--
--Whoops! Looks like it's unimplemented. Let's assume we don't have
--the time to fix this. [11] Normally, you'd just comment out the test
--and put a note in a todo list somewhere. Instead, we're going to
--explicitly state "this test will fail" by wrapping it in a C<TODO> block.
--
-- use Test::More tests => 1;
--
-- TODO: {
-- local $TODO = 'ical($ical) not yet implemented';
--
-- my $ical = Date::ICal->new;
-- $ical->ical('20201231Z');
--
-- is( $ical->ical, '20201231Z', 'Setting via ical()' );
-- }
--
--Now when you run, it's a little different:
--
-- 1..1
-- not ok 1 - Setting via ical() # TODO ical($ical) not yet implemented
-- # got: '20010822T201551Z'
-- # expected: '20201231Z'
--
--Test::More doesn't say "Looks like you failed 1 tests of 1". That '#
--TODO' tells Test::Harness "this is supposed to fail" and it treats a
--failure as a successful test. So you can write tests even before
--you've fixed the underlying code.
--
--If a TODO test passes, Test::Harness will report it "UNEXPECTEDLY
--SUCCEEDED". When that happens, you simply remove the TODO block with
--C<local $TODO> and turn it into a real test.
--
--
--=head2 Testing with taint mode.
--
--Taint mode is a funny thing. It's the globalest of all global
--features. Once you turn it on, it affects I<all> code in your program
--and I<all> modules used (and all the modules they use). If a single
--piece of code isn't taint clean, the whole thing explodes. With that
--in mind, it's very important to ensure your module works under taint
--mode.
--
--It's very simple to have your tests run under taint mode. Just throw
--a C<-T> into the C<#!> line. Test::Harness will read the switches
--in C<#!> and use them to run your tests.
--
-- #!/usr/bin/perl -Tw
--
-- ...test normally here...
--
--So when you say C<make test> it will be run with taint mode and
--warnings on.
--
--
--=head1 FOOTNOTES
--
--=over 4
--
--=item 1
--
--The first number doesn't really mean anything, but it has to be 1.
--It's the second number that's important.
--
--=item 2
--
--For those following along at home, I'm using version 1.31. It has
--some bugs, which is good -- we'll uncover them with our tests.
--
--=item 3
--
--You can actually take this one step further and test the manual
--itself. Have a look at B<Test::Inline> (formerly B<Pod::Tests>).
--
--=item 4
--
--Yes, there's a mistake in the test suite. What! Me, contrived?
--
--=item 5
--
--We'll get to testing the contents of lists later.
--
--=item 6
--
--But what happens if your test program dies halfway through?! Since we
--didn't say how many tests we're going to run, how can we know it
--failed? No problem, Test::More employs some magic to catch that death
--and turn the test into a failure, even if every test passed up to that
--point.
--
--=item 7
--
--I cleaned it up a little.
--
--=item 8
--
--Most Operating Systems record time as the number of seconds since a
--certain date. This date is the beginning of the epoch. Unix's starts
--at midnight January 1st, 1970 GMT.
--
--=item 9
--
--MacOS's epoch is midnight January 1st, 1904. VMS's is midnight,
--November 17th, 1858, but vmsperl emulates the Unix epoch so it's not a
--problem.
--
--=item 10
--
--As long as the code inside the SKIP block at least compiles. Please
--don't ask how. No, it's not a filter.
--
--=item 11
--
--Do NOT be tempted to use TODO tests as a way to avoid fixing simple
--bugs!
--
--=back
--
--=head1 AUTHORS
--
--Michael G Schwern E<lt>schwern at pobox.comE<gt> and the perl-qa dancers!
--
--=head1 COPYRIGHT
--
--Copyright 2001 by Michael G Schwern E<lt>schwern at pobox.comE<gt>.
--
--This documentation is free; you can redistribute it and/or modify it
--under the same terms as Perl itself.
--
--Irrespective of its distribution, all code examples in these files
--are hereby placed into the public domain. You are permitted and
--encouraged to use this code in your own programs for fun
--or for profit as you see fit. A simple comment in the code giving
--credit would be courteous but is not required.
--
--=cut
-diff -ruN PathTools-3.47/t/rel2abs_vs_symlink.t PathTools-core/t/rel2abs_vs_symlink.t
---- PathTools-3.47/t/rel2abs_vs_symlink.t 2011-12-20 08:15:58.000000000 +0100
-+++ PathTools-core/t/rel2abs_vs_symlink.t 1970-01-01 01:00:00.000000000 +0100
-@@ -1,37 +0,0 @@
--#!/usr/bin/perl -w
--
--# Test that rel2abs() works correctly when the process is under a symlink
--# See [rt.cpan.org 47637]
--
--use strict;
--
--use File::Path;
--use File::Spec;
--
--# Do this to simulate already being inside a symlinked directory
--# and having $ENV{PWD} set.
--use Cwd qw(chdir);
--
--use Test::More;
--
--plan skip_all => "needs symlink()" if !eval { symlink("", ""); 1 };
--
--plan tests => 1;
--
--my $real_dir = "for_rel2abs_test";
--my $symlink = "link_for_rel2abs_test";
--mkdir $real_dir or die "Can't make $real_dir: $!";
--END { rmtree $real_dir }
--
--symlink $real_dir, $symlink or die "Can't symlink $real_dir => $symlink: $!";
--END { unlink $symlink }
--
--chdir $symlink or die "Can't chdir into $symlink: $!";
--
--TODO: {
-- local $TODO = 'Need to find a way to make cwd work reliably under symlinks"';
-- like( File::Spec->rel2abs("."), qr/$symlink/ );
--}
--
--# So the unlinking works
--chdir "..";
diff --git a/perl-PathTools.spec b/perl-PathTools.spec
index 06da724..8636d3c 100644
--- a/perl-PathTools.spec
+++ b/perl-PathTools.spec
@@ -1,18 +1,19 @@
-%global base_version 3.47
Name: perl-PathTools
-Version: 3.56
-Release: 346%{?dist}
+Version: 3.59
+Release: 1%{?dist}
Summary: PathTools Perl module (Cwd, File::Spec)
License: (GPL+ or Artistic) and BSD
Group: Development/Libraries
URL: http://search.cpan.org/dist/PathTools/
-Source0: http://www.cpan.org/authors/id/S/SM/SMUELLER/PathTools-%{base_version}.tar.gz
-# Unbundled from perl 5.21.11
-Patch0: PathTools-3.47-Update-to-3.56.patch
+Source0: http://www.cpan.org/authors/id/R/RJ/RJBS/PathTools-%{version}.tar.gz
# Disable VMS test (bug #973713)
-Patch1: PathTools-3.47-Disable-VMS-tests.patch
+Patch0: PathTools-3.47-Disable-VMS-tests.patch
+BuildRequires: coreutils
+BuildRequires: findutils
+BuildRequires: make
BuildRequires: perl
BuildRequires: perl(ExtUtils::MakeMaker)
+BuildRequires: sed
# Run-time:
BuildRequires: perl(Carp)
BuildRequires: perl(constant)
@@ -27,7 +28,7 @@ BuildRequires: perl(Config)
BuildRequires: perl(File::Path)
BuildRequires: perl(File::Temp)
BuildRequires: perl(lib)
-BuildRequires: perl(Test::More)
+BuildRequires: perl(Test::More) >= 0.88
Requires: perl(:MODULE_COMPAT_%(eval "`perl -V:version`"; echo $version))
Requires: perl(Carp)
Requires: perl(Scalar::Util)
@@ -38,14 +39,17 @@ Requires: perl(Scalar::Util)
This is the combined distribution for the File::Spec and Cwd modules.
%prep
-%setup -q -n PathTools-%{base_version}
+%setup -q -n PathTools-%{version}
%patch0 -p1
-%patch1 -p1
# Do not distribute File::Spec::VMS as it works on VMS only (bug #973713)
rm lib/File/Spec/VMS.pm
sed -i -e '/^lib\/File\/Spec\/VMS.pm/d' MANIFEST
+# Remove bundled modules
+rm -rf t/lib
+sed -i -e '/t\/lib\//d' MANIFEST
+
%build
perl Makefile.PL INSTALLDIRS=vendor OPTIMIZE="$RPM_OPT_FLAGS"
make %{?_smp_mflags}
@@ -67,6 +71,9 @@ make test
%{_mandir}/man3/*
%changelog
+* Mon Nov 16 2015 Petr Pisar <ppisar at redhat.com> - 3.59-1
+- 3.59 bump
+
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 3.56-346
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
diff --git a/sources b/sources
index 2d30358..4540633 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-5b97a7f64ab964aa470919ca11133809 PathTools-3.47.tar.gz
+f6c07a32c7b219257385d13ac594f3d5 PathTools-3.59.tar.gz
--
cgit v0.11.2
http://pkgs.fedoraproject.org/cgit/perl-PathTools.git/commit/?h=master&id=f0026de48c093b5a193d57ef3893abb8eb747e02
More information about the perl-devel
mailing list