Hello community,
here is the log from the commit of package perl-Path-Tiny for openSUSE:Factory checked in at 2013-12-10 17:44:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Path-Tiny (Old)
and /work/SRC/openSUSE:Factory/.perl-Path-Tiny.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Path-Tiny"
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Path-Tiny/perl-Path-Tiny.changes 2013-10-21 15:14:23.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.perl-Path-Tiny.new/perl-Path-Tiny.changes 2013-12-10 17:44:42.000000000 +0100
@@ -1,0 +2,24 @@
+Mon Dec 9 13:31:53 UTC 2013 - opensuse@dstoecker.de
+
+- update to 0.047
+ - Revised locking tests for portability again: locks are now tested
+ from a separate process
+ - Fixed child path construction against the root path.
+ - Fixed t/00-report-prereqs.t for use with older versions of
+ CPAN::Meta::Requirements
+ - When 'realpath' can't be resolved (because intermediate directories
+ don't exist), the exception now explains the error clearly instead of
+ complaining about path() needing a defined, positive-length argument.
+ - Removes duplicate test dependency on File::Spec that triggers
+ a CPAN.pm bug
+ - When using 'filehandle' to request a locked handle that truncates an
+ existing file and has a binmode starting with ":unix", this fixes a
+ bug where pseudo-layers weren't being cleared properly.
+ - The 'filehandle' method now offers an option to return locked handles
+ based on the file mode. Input-output methods now rely on this
+ feature internally. Truncating file modes defer truncation until
+ after an exclusive lock is acquired.
+ - The 'filehandle' method now respects default encoding set by
+ the caller's open pragma.
+
+-------------------------------------------------------------------
Old:
----
Path-Tiny-0.038.tar.gz
New:
----
Path-Tiny-0.047.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Path-Tiny.spec ++++++
--- /var/tmp/diff_new_pack.SdoupN/_old 2013-12-10 17:44:43.000000000 +0100
+++ /var/tmp/diff_new_pack.SdoupN/_new 2013-12-10 17:44:43.000000000 +0100
@@ -17,7 +17,7 @@
Name: perl-Path-Tiny
-Version: 0.038
+Version: 0.047
Release: 0
%define cpan_name Path-Tiny
Summary: File path utility
++++++ Path-Tiny-0.038.tar.gz -> Path-Tiny-0.047.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/Changes new/Path-Tiny-0.047/Changes
--- old/Path-Tiny-0.038/Changes 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/Changes 2013-11-26 21:11:22.000000000 +0100
@@ -1,5 +1,94 @@
Revision history for Path-Tiny
+0.047 2013-11-26 15:11:13 America/New_York
+
+ [FIXED]
+
+ - Previous lock testing fixes broke on Windows (sigh); now fixed,
+ I hope.
+
+0.046 2013-11-22 17:07:24 America/New_York
+
+ [FIXED]
+
+ - Revised locking tests for portability again: locks are now tested
+ from a separate process
+
+0.045 2013-11-22 15:28:50 America/New_York
+
+ [FIXED]
+
+ - Fixed locking test on AIX
+
+0.044 2013-10-17 17:00:41 America/New_York
+
+ [FIXED]
+
+ - Fixed child path construction against the root path.
+
+ - Fixed path construction when a relative volume is provided as the
+ first argument on Windows; e.g. path("C:", "lib") must be like
+ path("C:lib"), not path("C:/lib").
+
+ - On AIX, shared locking is replaced by exclusive locking on a R/W
+ filehandle, as locking read handles is not supported
+
+0.043 2013-10-14 06:24:06 America/New_York
+
+ [CHANGED]
+
+ - Calling 'absolute' on Windows will add the volume if it is missing
+ (E.g. "/foo" will become "C:/foo"). This matches the behavior
+ of File::Spec->rel2abs.
+
+ [FIXED]
+
+ - Fixed t/00-report-prereqs.t for use with older versions of
+ CPAN::Meta::Requirements
+
+0.042 2013-10-13 11:02:02 America/New_York
+
+ [FIXED]
+
+ - When 'realpath' can't be resolved (because intermediate directories
+ don't exist), the exception now explains the error clearly instead of
+ complaining about path() needing a defined, positive-length argument.
+
+ - On Windows, fixed resolution of relative paths with a volume.
+ E.g. "C:foo" is now correctly translated into getdcwd on "C:"
+ plus "foo".
+
+0.041 2013-10-11 08:56:31 America/New_York
+
+ [FIXES]
+
+ - Removes duplicate test dependency on File::Spec that triggers
+ a CPAN.pm bug
+
+0.040 2013-10-08 22:01:50 America/New_York
+
+ [FIXES]
+
+ - Fixed broken locking test on *bsd
+
+ - When using 'filehandle' to request a locked handle that truncates an
+ existing file and has a binmode starting with ":unix", this fixes a
+ bug where pseudo-layers weren't being cleared properly.
+
+0.039 2013-10-08 16:39:23 America/New_York
+
+ [ADDITIONS]
+
+ - The 'filehandle' method now offers an option to return locked handles
+ based on the file mode. Input-output methods now rely on this
+ feature internally. Truncating file modes defer truncation until
+ after an exclusive lock is acquired.
+
+ [FIXES]
+
+ - The 'filehandle' method now respects default encoding set by
+ the caller's open pragma.
+
0.038 2013-10-01 18:20:05 America/New_York
[ADDITIONS]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/MANIFEST new/Path-Tiny-0.047/MANIFEST
--- old/Path-Tiny-0.038/MANIFEST 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/MANIFEST 2013-11-26 21:11:22.000000000 +0100
@@ -10,7 +10,6 @@
dist.ini
lib/Path/Tiny.pm
perlcritic.rc
-t/00-compile.t
t/00-report-prereqs.t
t/README
t/basic.t
@@ -22,6 +21,7 @@
t/input_output.t
t/input_output_no_UU.t
t/lib/TestUtils.pm
+t/locking.t
t/mkpath.t
t/normalize.t
t/overloading.t
@@ -31,6 +31,7 @@
t/temp.t
t/zzz-spec.t
tidyall.ini
+xt/author/00-compile.t
xt/author/critic.t
xt/author/pod-spell.t
xt/release/distmeta.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/META.json new/Path-Tiny-0.047/META.json
--- old/Path-Tiny-0.038/META.json 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/META.json 2013-11-26 21:11:22.000000000 +0100
@@ -4,7 +4,7 @@
"David Golden "
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 4.300039, CPAN::Meta::Converter version 2.132620",
+ "generated_by" : "Dist::Zilla version 5.006, CPAN::Meta::Converter version 2.132830",
"license" : [
"apache_2_0"
],
@@ -32,8 +32,19 @@
},
"develop" : {
"requires" : {
+ "Dist::Zilla" : "5.006",
+ "Dist::Zilla::Plugin::MakeMaker" : "0",
+ "Dist::Zilla::Plugin::OnlyCorePrereqs" : "0",
+ "Dist::Zilla::Plugin::Prereqs" : "0",
+ "Dist::Zilla::Plugin::RemovePrereqs" : "0",
+ "Dist::Zilla::PluginBundle::DAGOLDEN" : "0.055",
+ "File::Spec" : "0",
+ "File::Temp" : "0",
+ "IO::Handle" : "0",
+ "IPC::Open3" : "0",
"Pod::Coverage::TrustPod" : "0",
"Test::CPAN::Meta" : "0",
+ "Test::More" : "0",
"Test::Pod" : "1.41",
"Test::Pod::Coverage" : "1.08"
}
@@ -52,7 +63,7 @@
"File::Copy" : "0",
"File::Path" : "2.07",
"File::Spec" : "3.40",
- "File::Temp" : "0.18",
+ "File::Temp" : "0.19",
"File::stat" : "0",
"constant" : "0",
"if" : "0",
@@ -64,17 +75,16 @@
},
"test" : {
"recommends" : {
+ "CPAN::Meta" : "0",
+ "CPAN::Meta::Requirements" : "0",
"Test::FailWarnings" : "0"
},
"requires" : {
"ExtUtils::MakeMaker" : "0",
"File::Basename" : "0",
- "File::Spec" : "0",
"File::Spec::Functions" : "0",
"File::Spec::Unix" : "0",
"File::Temp" : "0.19",
- "IO::Handle" : "0",
- "IPC::Open3" : "0",
"List::Util" : "0",
"Test::More" : "0.96",
"lib" : "0",
@@ -85,15 +95,15 @@
"provides" : {
"Path::Tiny" : {
"file" : "lib/Path/Tiny.pm",
- "version" : "0.038"
+ "version" : "0.047"
},
"Path::Tiny::Error" : {
"file" : "lib/Path/Tiny.pm",
- "version" : "0.038"
+ "version" : "0.047"
},
"flock" : {
"file" : "lib/Path/Tiny.pm",
- "version" : "0.038"
+ "version" : "0.047"
}
},
"release_status" : "stable",
@@ -108,7 +118,7 @@
"web" : "https://github.com/dagolden/Path-Tiny"
}
},
- "version" : "0.038",
+ "version" : "0.047",
"x_authority" : "cpan:DAGOLDEN",
"x_contributors" : [
"Chris Williams ",
@@ -116,12 +126,14 @@
"Gabor Szabo ",
"Gabriel Andrade ",
"George Hartzell ",
+ "Geraud Continsouzas ",
"Goro Fuji ",
"Karen Etheridge ",
"Keedi Kim ",
"Martin Kjeldsen ",
"Michael G. Schwern ",
- "Toby Inkster "
+ "Toby Inkster ",
+ "\uae40\ub3c4\ud615 - Keedi Kim "
]
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/META.yml new/Path-Tiny-0.047/META.yml
--- old/Path-Tiny-0.038/META.yml 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/META.yml 2013-11-26 21:11:22.000000000 +0100
@@ -5,12 +5,9 @@
build_requires:
ExtUtils::MakeMaker: 0
File::Basename: 0
- File::Spec: 0
File::Spec::Functions: 0
File::Spec::Unix: 0
File::Temp: 0.19
- IO::Handle: 0
- IPC::Open3: 0
List::Util: 0
Test::More: 0.96
lib: 0
@@ -18,7 +15,7 @@
configure_requires:
ExtUtils::MakeMaker: 6.17
dynamic_config: 0
-generated_by: 'Dist::Zilla version 4.300039, CPAN::Meta::Converter version 2.132620'
+generated_by: 'Dist::Zilla version 5.006, CPAN::Meta::Converter version 2.132830'
license: apache
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -35,13 +32,13 @@
provides:
Path::Tiny:
file: lib/Path/Tiny.pm
- version: 0.038
+ version: 0.047
Path::Tiny::Error:
file: lib/Path/Tiny.pm
- version: 0.038
+ version: 0.047
flock:
file: lib/Path/Tiny.pm
- version: 0.038
+ version: 0.047
recommends:
Unicode::UTF8: 0.58
requires:
@@ -54,7 +51,7 @@
File::Copy: 0
File::Path: 2.07
File::Spec: 3.40
- File::Temp: 0.18
+ File::Temp: 0.19
File::stat: 0
constant: 0
if: 0
@@ -66,7 +63,7 @@
bugtracker: https://github.com/dagolden/Path-Tiny/issues
homepage: https://github.com/dagolden/Path-Tiny
repository: https://github.com/dagolden/Path-Tiny.git
-version: 0.038
+version: 0.047
x_authority: cpan:DAGOLDEN
x_contributors:
- 'Chris Williams '
@@ -74,9 +71,11 @@
- 'Gabor Szabo '
- 'Gabriel Andrade '
- 'George Hartzell '
+ - 'Geraud Continsouzas '
- 'Goro Fuji '
- 'Karen Etheridge '
- 'Keedi Kim '
- 'Martin Kjeldsen '
- 'Michael G. Schwern '
- 'Toby Inkster '
+ - '김도형 - Keedi Kim '
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/Makefile.PL new/Path-Tiny-0.047/Makefile.PL
--- old/Path-Tiny-0.038/Makefile.PL 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/Makefile.PL 2013-11-26 21:11:22.000000000 +0100
@@ -29,7 +29,7 @@
"File::Copy" => 0,
"File::Path" => "2.07",
"File::Spec" => "3.40",
- "File::Temp" => "0.18",
+ "File::Temp" => "0.19",
"File::stat" => 0,
"constant" => 0,
"if" => 0,
@@ -40,48 +40,53 @@
"TEST_REQUIRES" => {
"ExtUtils::MakeMaker" => 0,
"File::Basename" => 0,
- "File::Spec" => 0,
"File::Spec::Functions" => 0,
"File::Spec::Unix" => 0,
"File::Temp" => "0.19",
- "IO::Handle" => 0,
- "IPC::Open3" => 0,
"List::Util" => 0,
"Test::More" => "0.96",
"lib" => 0,
"open" => 0
},
- "VERSION" => "0.038",
+ "VERSION" => "0.047",
"test" => {
"TESTS" => "t/*.t"
}
);
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
- my $tr = delete $WriteMakefileArgs{TEST_REQUIRES};
- my $br = $WriteMakefileArgs{BUILD_REQUIRES};
- for my $mod ( keys %$tr ) {
- if ( exists $br->{$mod} ) {
- $br->{$mod} = $tr->{$mod} if $tr->{$mod} > $br->{$mod};
- }
- else {
- $br->{$mod} = $tr->{$mod};
- }
- }
-}
+my %FallbackPrereqs = (
+ "Carp" => 0,
+ "Cwd" => 0,
+ "Digest" => "1.03",
+ "Digest::SHA" => "5.45",
+ "Exporter" => "5.57",
+ "ExtUtils::MakeMaker" => 0,
+ "Fcntl" => 0,
+ "File::Basename" => 0,
+ "File::Copy" => 0,
+ "File::Path" => "2.07",
+ "File::Spec" => "3.40",
+ "File::Spec::Functions" => 0,
+ "File::Spec::Unix" => 0,
+ "File::Temp" => "0.19",
+ "File::stat" => 0,
+ "List::Util" => 0,
+ "Test::More" => "0.96",
+ "constant" => 0,
+ "if" => 0,
+ "lib" => 0,
+ "open" => 0,
+ "overload" => 0,
+ "strict" => 0,
+ "warnings" => 0
+);
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
- my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
- my $pp = $WriteMakefileArgs{PREREQ_PM};
- for my $mod ( keys %$br ) {
- if ( exists $pp->{$mod} ) {
- $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
- }
- else {
- $pp->{$mod} = $br->{$mod};
- }
- }
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+ delete $WriteMakefileArgs{TEST_REQUIRES};
+ delete $WriteMakefileArgs{BUILD_REQUIRES};
+ $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
}
delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/README new/Path-Tiny-0.047/README
--- old/Path-Tiny-0.038/README 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/README 2013-11-26 21:11:22.000000000 +0100
@@ -2,7 +2,7 @@
Path::Tiny - File path utility
VERSION
- version 0.038
+ version 0.047
SYNOPSIS
use Path::Tiny;
@@ -57,7 +57,7 @@
the object gives you back the path (after some clean up).
File input/output methods "flock" handles before reading or writing, as
- appropriate.
+ appropriate (if supported by the platform).
The *_utf8 methods ("slurp_utf8", "lines_utf8", etc.) operate in raw
mode without CRLF translation. Installing Unicode::UTF8 0.58 or later
@@ -150,15 +150,19 @@
$abs = path("foo/bar")->absolute;
$abs = path("foo/bar")->absolute("/tmp");
- Returns a new "Path::Tiny" object with an absolute path. Unless an
- argument is given, the current directory is used as the absolute base
- path. The argument must be absolute or you won't get an absolute result.
+ Returns a new "Path::Tiny" object with an absolute path (or itself if
+ already absolute). Unless an argument is given, the current directory is
+ used as the absolute base path. The argument must be absolute or you
+ won't get an absolute result.
This will not resolve upward directories ("foo/../bar") unless
"canonpath" in File::Spec would normally do so on your platform. If you
need them resolved, you must call the more expensive "realpath" method
instead.
+ On Windows, an absolute path without a volume component will have it
+ added based on the current drive.
+
append, append_raw, append_utf8
path("foo.txt")->append(@data);
path("foo.txt")->append(\@data);
@@ -243,11 +247,18 @@
filehandle
$fh = path("/tmp/foo.txt")->filehandle($mode, $binmode);
+ $fh = path("/tmp/foo.txt")->filehandle({ locked => 1 }, $mode, $binmode);
Returns an open file handle. The $mode argument must be a Perl-style
read/write mode string ("<" ,">", "<<", etc.). If a $binmode is given,
it is set during the "open" call.
+ An optional hash reference may be used to pass options. The only option
+ is "locked". If true, handles opened for writing, appending or
+ read-write are locked with "LOCK_EX"; otherwise, they are locked with
+ "LOCK_SH". When using "locked", ">" or "+>" modes will delay truncation
+ until after the lock is acquired.
+
See "openr", "openw", "openrw", and "opena" for sugar.
is_absolute, is_relative
@@ -363,6 +374,15 @@
have "open*_raw" and "open*_utf8" equivalents that use ":raw" and
":raw:encoding(UTF-8)", respectively.
+ An optional hash reference may be used to pass options. The only option
+ is "locked". If true, handles opened for writing, appending or
+ read-write are locked with "LOCK_EX"; otherwise, they are locked for
+ "LOCK_SH".
+
+ $fh = path("foo.txt")->openrw_utf8( { locked => 1 } );
+
+ See "filehandle" for more on locking.
+
parent
$parent = path("foo/bar/baz")->parent; # foo/bar
$parent = path("foo/wibble.txt")->parent; # foo
@@ -382,6 +402,11 @@
directory parts resolved using Cwd's "realpath". Compared to "absolute",
this is more expensive as it must actually consult the filesystem.
+ If the path can't be resolved (e.g. if it includes directories that
+ don't exist), an exception will be thrown:
+
+ $real = path("doesnt_exist/foo")->realpath; # dies
+
relative
$rel = path("/tmp/foo/bar")->relative("/tmp"); # foo/bar
@@ -498,20 +523,26 @@
The object will be a hash reference with the following fields:
- * "op" â a description of the operation, usually function call and
- any extra info
+ * "op" — a description of the operation, usually function call and any
+ extra info
- * "file" â the file or directory relating to the error
+ * "file" — the file or directory relating to the error
- * "err" â hold $! at the time the error was thrown
+ * "err" — hold $! at the time the error was thrown
- * "msg" â a string combining the above data and a Carp-like short
+ * "msg" — a string combining the above data and a Carp-like short
stack trace
Exception objects will stringify as the "msg" field.
CAVEATS
- NFS and BSD
+ File locking
+ If flock is not supported on a platform, it will not be used, even if
+ locking is requested.
+
+ See additional caveats below.
+
+ NFS and BSD
On BSD, Perl's flock implementation may not work to lock files on an NFS
filesystem. Path::Tiny has some heuristics to detect this and will warn
once and let you continue in an unsafe mode. If you want this failure to
@@ -519,6 +550,11 @@
use warnings FATAL => 'flock';
+ AIX and locking
+ AIX requires a write handle for locking. Therefore, calls that normally
+ open a read handle and take a shared lock instead will open a read-write
+ handle and take an exclusive lock.
+
utf8 vs UTF-8
All the *_utf8 methods use ":encoding(UTF-8)" -- either as
":unix:encoding(UTF-8)" (unbuffered) or ":raw:encoding(UTF-8)"
@@ -547,15 +583,16 @@
Default IO layers and the open pragma
If you have Perl 5.10 or later, file input/output methods ("slurp",
- "spew", etc.) and high-level handle opening methods ( "openr", "openw",
- etc. but not "filehandle") respect default encodings set by the "-C"
+ "spew", etc.) and high-level handle opening methods ( "filehandle",
+ "openr", "openw", etc. ) respect default encodings set by the "-C"
switch or lexical open settings of the caller. For UTF-8, this is almost
certainly slower than using the dedicated "_utf8" methods if you have
Unicode::UTF8.
TYPE CONSTRAINTS AND COERCION
A standard MooseX::Types library is available at
- MooseX::Types::Path::Tiny.
+ MooseX::Types::Path::Tiny. A Type::Tiny equivalent is available as
+ Types::Path::Tiny.
SEE ALSO
These are other file/path utilities, which may offer a different feature
@@ -605,6 +642,8 @@
* George Hartzell
+ * Geraud Continsouzas
+
* Goro Fuji
* Karen Etheridge
@@ -617,6 +656,8 @@
* Toby Inkster
+ * 김도형 - Keedi Kim
+
COPYRIGHT AND LICENSE
This software is Copyright (c) 2013 by David Golden.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/cpanfile new/Path-Tiny-0.047/cpanfile
--- old/Path-Tiny-0.038/cpanfile 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/cpanfile 2013-11-26 21:11:22.000000000 +0100
@@ -7,7 +7,7 @@
requires "File::Copy" => "0";
requires "File::Path" => "2.07";
requires "File::Spec" => "3.40";
-requires "File::Temp" => "0.18";
+requires "File::Temp" => "0.19";
requires "File::stat" => "0";
requires "constant" => "0";
requires "if" => "0";
@@ -20,12 +20,9 @@
on 'test' => sub {
requires "ExtUtils::MakeMaker" => "0";
requires "File::Basename" => "0";
- requires "File::Spec" => "0";
requires "File::Spec::Functions" => "0";
requires "File::Spec::Unix" => "0";
requires "File::Temp" => "0.19";
- requires "IO::Handle" => "0";
- requires "IPC::Open3" => "0";
requires "List::Util" => "0";
requires "Test::More" => "0.96";
requires "lib" => "0";
@@ -33,6 +30,8 @@
};
on 'test' => sub {
+ recommends "CPAN::Meta" => "0";
+ recommends "CPAN::Meta::Requirements" => "0";
recommends "Test::FailWarnings" => "0";
};
@@ -41,8 +40,19 @@
};
on 'develop' => sub {
+ requires "Dist::Zilla" => "5.006";
+ requires "Dist::Zilla::Plugin::MakeMaker" => "0";
+ requires "Dist::Zilla::Plugin::OnlyCorePrereqs" => "0";
+ requires "Dist::Zilla::Plugin::Prereqs" => "0";
+ requires "Dist::Zilla::Plugin::RemovePrereqs" => "0";
+ requires "Dist::Zilla::PluginBundle::DAGOLDEN" => "0.055";
+ requires "File::Spec" => "0";
+ requires "File::Temp" => "0";
+ requires "IO::Handle" => "0";
+ requires "IPC::Open3" => "0";
requires "Pod::Coverage::TrustPod" => "0";
requires "Test::CPAN::Meta" => "0";
+ requires "Test::More" => "0";
requires "Test::Pod" => "1.41";
requires "Test::Pod::Coverage" => "1.08";
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/dist.ini new/Path-Tiny-0.047/dist.ini
--- old/Path-Tiny-0.038/dist.ini 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/dist.ini 2013-11-26 21:11:22.000000000 +0100
@@ -5,8 +5,9 @@
copyright_year = 2013
[@DAGOLDEN]
-:version = 0.050
+:version = 0.055
-remove = MakeMaker
+stopwords = AIX
stopwords = BENCHMARKING
stopwords = CRLF
stopwords = SHA
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/lib/Path/Tiny.pm new/Path-Tiny-0.047/lib/Path/Tiny.pm
--- old/Path-Tiny-0.038/lib/Path/Tiny.pm 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/lib/Path/Tiny.pm 2013-11-26 21:11:22.000000000 +0100
@@ -4,9 +4,10 @@
package Path::Tiny;
# ABSTRACT: File path utility
-our $VERSION = '0.038'; # VERSION
+our $VERSION = '0.047'; # VERSION
# Dependencies
+use Config;
use Exporter 5.57 (qw/import/);
use File::Spec 3.40 ();
use Carp ();
@@ -15,12 +16,14 @@
our @EXPORT_OK = qw/cwd rootdir tempfile tempdir/;
use constant {
- PATH => 0,
- CANON => 1,
- VOL => 2,
- DIR => 3,
- FILE => 4,
- TEMP => 5,
+ PATH => 0,
+ CANON => 1,
+ VOL => 2,
+ DIR => 3,
+ FILE => 4,
+ TEMP => 5,
+ IS_BSD => ( scalar $^O =~ /bsd$/ ),
+ IS_WIN32 => ( $^O eq 'MSWin32' ),
};
use overload (
@@ -29,10 +32,6 @@
fallback => 1,
);
-my $IS_BSD;
-
-BEGIN { $IS_BSD = $^O =~ /bsd$/ }
-
# if cloning, threads should already be loaded, but Win32 pseudoforks
# don't do that so we have to be sure it's loaded anyway
my $TID = 0; # for thread safe atomic writes
@@ -45,43 +44,48 @@
eval { require Unicode::UTF8; Unicode::UTF8->VERSION(0.58); 1 };
}
+my $HAS_FLOCK = $Config{d_flock} || $Config{d_fcntl_can_lock} || $Config{d_lockf};
+
# notions of "root" directories differ on Win32: \\server\dir\ or C:\ or \
my $SLASH = qr{[\\/]};
-my $NOTSLASH = qr{[^\\/]+};
+my $NOTSLASH = qr{[^\\/]};
my $DRV_VOL = qr{[a-z]:}i;
-my $UNC_VOL = qr{$SLASH $SLASH $NOTSLASH $SLASH $NOTSLASH}x;
+my $UNC_VOL = qr{$SLASH $SLASH $NOTSLASH+ $SLASH $NOTSLASH+}x;
my $WIN32_ROOT = qr{(?: $UNC_VOL $SLASH | $DRV_VOL $SLASH | $SLASH )}x;
-sub _normalize_win32_path {
- my ($path) = @_;
- if ( $path =~ /^$DRV_VOL$/ ) {
- require Cwd;
- my $fullpath = Cwd::getdcwd($path); # C: -> C:\some\cwd
- # getdcwd on non-existent drive returns empty string
- $path = length $fullpath ? $fullpath : $path . "/";
- }
- elsif ( $path =~ /^$UNC_VOL$/ ) {
- $path .= "/"; # canonpath currently strips it and we want it
- }
- # hack to make splitpath give us a basename; might not be necessary
- # since canonpath should do this for non-root paths, but I don't trust it
- $path =~ s{/$}{} if $path !~ /^$WIN32_ROOT$/;
+sub _win32_vol {
+ my ( $path, $drv ) = @_;
+ require Cwd;
+ my $dcwd = Cwd::getdcwd($drv); # C: -> C:\some\cwd
+ # getdcwd on non-existent drive returns empty string
+ # so just use the original drive Z: -> Z:
+ $dcwd = "$drv" unless length $dcwd;
+ # normalize dwcd to end with a slash: might be C:\some\cwd or D:\ or Z:
+ $dcwd =~ s{$SLASH?$}{/};
+ # make the path absolute with dcwd
+ $path =~ s{^$DRV_VOL}{$dcwd};
return $path;
}
+# This is a string test for before we have the object; see is_rootdir for well-formed
+# object test
+sub _is_root {
+ return IS_WIN32() ? ( $_[0] =~ /^$WIN32_ROOT$/ ) : ( $_[0] eq '/' );
+}
+
# flock doesn't work on NFS on BSD. Since program authors often can't control
# or detect that, we warn once instead of being fatal if we can detect it and
# people who need it strict can fatalize the 'flock' category
#<<< No perltidy
-{ package flock; use if $IS_BSD, 'warnings::register' }
+{ package flock; use if Path::Tiny::IS_BSD(), 'warnings::register' }
#>>>
my $WARNED_BSD_NFS = 0;
sub _throw {
my ( $self, $function, $file ) = @_;
- if ( $IS_BSD
+ if ( IS_BSD()
&& $function =~ /^flock/
&& $! =~ /operation not supported/i
&& !warnings::fatal_enabled('flock') )
@@ -126,22 +130,42 @@
my $path = shift;
Carp::croak("path() requires a defined, positive-length argument")
unless defined $path && length $path;
- # join stringifies any objects, too, which is handy :-)
- $path = join( "/", ( $path eq '/' ? "" : $path ), @_ ) if @_;
+
+ # stringify initial path
+ $path = "$path";
+
+ # expand relative volume paths on windows; put trailing slash on UNC root
+ if ( IS_WIN32() ) {
+ $path = _win32_vol( $path, $1 ) if $path =~ m{^($DRV_VOL)(?:$NOTSLASH|$)};
+ $path .= "/" if $path =~ m{^$UNC_VOL$};
+ }
+
+ # concatenate more arguments (stringifies any objects, too)
+ if (@_) {
+ $path .= ( _is_root($path) ? "" : "/" ) . join( "/", @_ );
+ }
+
+ # canonicalize paths
my $cpath = $path = File::Spec->canonpath($path); # ugh, but probably worth it
- if ( $^O eq 'MSWin32' ) {
- $path = _normalize_win32_path($path);
+ $path =~ tr[\\][/]; # unix convention enforced
+ $path .= "/" if IS_WIN32() && $path =~ m{^$UNC_VOL$}; # canonpath strips it
+
+ # hack to make splitpath give us a basename; root paths must always have
+ # a trailing slash, but other paths must not
+ if ( _is_root($path) ) {
+ $path =~ s{/?$}{/};
}
else {
- # hack to make splitpath give us a basename; might not be necessary
- # since canonpath should do this for non-root paths, but I don't trust it
- $path =~ s{/$}{} if $path ne '/';
- }
- $path =~ tr[\\][/]; # unix convention enforced
- if ( $path =~ m{^(~[^/]*).*} ) { # expand a tilde
- my ($homedir) = glob($1); # glob without list context == heisenbug!
+ $path =~ s{/$}{};
+ }
+
+ # do any tilde expansions
+ if ( $path =~ m{^(~[^/]*).*} ) {
+ my ($homedir) = glob($1); # glob without list context == heisenbug!
$path =~ s{^(~[^/]*)}{$homedir};
}
+
+ # and we're finally done
bless [ $path, $cpath ], __PACKAGE__;
}
@@ -213,10 +237,24 @@
sub absolute {
my ( $self, $base ) = @_;
- return $self if $self->is_absolute;
+ # absolute paths handled differently by OS
+ if (IS_WIN32) {
+ return $self if length $self->volume;
+ # add missing volume
+ if ( $self->is_absolute ) {
+ require Cwd;
+ my ($drv) = Cwd::getdcwd() =~ /^($DRV_VOL | $UNC_VOL)/x;
+ return path( $drv . $self->[PATH] );
+ }
+ }
+ else {
+ return $self if $self->is_absolute;
+ }
+
+ # relative path on any OS
require Cwd;
- return path( join "/", ( defined($base) ? $base : Cwd::getcwd() ), $_[0]->[PATH] );
+ return path( ( defined($base) ? $base : Cwd::getcwd() ), $_[0]->[PATH] );
}
@@ -226,17 +264,8 @@
$args = _get_args( $args, qw/binmode/ );
my $binmode = $args->{binmode};
$binmode = ( ( caller(0) )[10] || {} )->{'open>'} unless defined $binmode;
- my $fh = $self->filehandle( ">>", $binmode );
-
- require Fcntl;
- flock( $fh, Fcntl::LOCK_EX() ) or $self->_throw('flock (LOCK_EX)');
-
- # Ensure we're at the end after the lock
- seek( $fh, 0, Fcntl::SEEK_END() ) or $self->_throw('seek');
-
+ my $fh = $self->filehandle( { locked => 1 }, ">>", $binmode );
print {$fh} map { ref eq 'ARRAY' ? @$_ : $_ } @data;
-
- # For immediate flush
close $fh or $self->_throw('close');
}
@@ -266,8 +295,7 @@
sub child {
my ( $self, @parts ) = @_;
- my $path = $self->[PATH];
- return path( join( "/", ( $path eq '/' ? "" : $path ), @parts ) );
+ return path( $self->[PATH], @parts );
}
@@ -288,7 +316,7 @@
Carp::croak("Invalid argument '$filter' for children()");
}
- return map { path( $self->[PATH] . "/$_" ) } @children;
+ return map { path( $self->[PATH], $_ ) } @children;
}
@@ -327,13 +355,66 @@
# like ":unix" actually stop perlio/crlf from being added
sub filehandle {
- my ( $self, $opentype, $binmode ) = @_;
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ my ( $opentype, $binmode ) = @args;
+
$opentype = "<" unless defined $opentype;
- $binmode = "" unless defined $binmode;
+ Carp::croak("Invalid file mode '$opentype'")
+ unless grep { $opentype eq $_ } qw/< +< > +> >> +>>/;
+
+ $binmode = ( ( caller(0) )[10] || {} )->{ 'open' . substr( $opentype, -1, 1 ) }
+ unless defined $binmode;
+ $binmode = "" unless defined $binmode;
+
+ my ( $fh, $lock, $trunc );
+ if ( $HAS_FLOCK && $args->{locked} ) {
+ require Fcntl;
+ # truncating file modes shouldn't truncate until lock acquired
+ if ( grep { $opentype eq $_ } qw( > +> ) ) {
+ # sysopen in write mode without truncation
+ my $flags = $opentype eq ">" ? Fcntl::O_WRONLY() : Fcntl::O_RDWR();
+ $flags |= Fcntl::O_CREAT();
+ sysopen( $fh, $self->[PATH], $flags ) or $self->_throw("sysopen");
+
+ # fix up the binmode since sysopen() can't specify layers like
+ # open() and binmode() can't start with just :unix like open()
+ if ( $binmode =~ s/^:unix// ) {
+ # eliminate pseudo-layers
+ binmode( $fh, ":raw" ) or $self->_throw("binmode (:raw)");
+ # strip off real layers until only :unix is left
+ while ( 1 < ( my $layers =()= PerlIO::get_layers( $fh, output => 1 ) ) ) {
+ binmode( $fh, ":pop" ) or $self->_throw("binmode (:pop)");
+ }
+ }
+
+ # apply any remaining binmode layers
+ if ( length $binmode ) {
+ binmode( $fh, $binmode ) or $self->_throw("binmode ($binmode)");
+ }
+
+ # ask for lock and truncation
+ $lock = Fcntl::LOCK_EX();
+ $trunc = 1;
+ }
+ elsif ( $^O eq 'aix' && $opentype eq "<" ) {
+ # AIX can only lock write handles, so upgrade to RW and LOCK_EX
+ $opentype = "+<";
+ $lock = Fcntl::LOCK_EX();
+ }
+ else {
+ $lock = $opentype eq "<" ? Fcntl::LOCK_SH() : Fcntl::LOCK_EX();
+ }
+ }
- my $mode = $opentype . $binmode;
- my $fh;
- open $fh, $mode, $self->[PATH] or $self->_throw('open ($mode)');
+ unless ($fh) {
+ my $mode = $opentype . $binmode;
+ open $fh, $mode, $self->[PATH] or $self->_throw("open ($mode)");
+ }
+
+ do { flock( $fh, $lock ) or $self->_throw("flock ($lock)") } if $lock;
+ do { truncate( $fh, 0 ) or $self->_throw("truncate") } if $trunc;
return $fh;
}
@@ -392,9 +473,7 @@
my $args = _get_args( shift, qw/binmode chomp count/ );
my $binmode = $args->{binmode};
$binmode = ( ( caller(0) )[10] || {} )->{'open<'} unless defined $binmode;
- my $fh = $self->filehandle( "<", $binmode );
- require Fcntl;
- flock( $fh, Fcntl::LOCK_SH() ) or $self->_throw('flock (LOCK_SH)');
+ my $fh = $self->filehandle( { locked => 1 }, "<", $binmode );
my $chomp = $args->{chomp};
# XXX more efficient to read @lines then chomp(@lines) vs map?
if ( $args->{count} ) {
@@ -465,6 +544,7 @@
}
+# map method names to corresponding open mode
my %opens = (
opena => ">>",
openr => "<",
@@ -476,13 +556,26 @@
no strict 'refs';
# must check for lexical IO mode hint
*{$k} = sub {
- my ( $self, $binmode ) = @_;
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ my ($binmode) = @args;
$binmode = ( ( caller(0) )[10] || {} )->{ 'open' . substr( $v, -1, 1 ) }
unless defined $binmode;
- $self->filehandle( $v, $binmode );
+ $self->filehandle( $args, $v, $binmode );
+ };
+ *{ $k . "_raw" } = sub {
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ $self->filehandle( $args, $v, ":raw" );
+ };
+ *{ $k . "_utf8" } = sub {
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ $self->filehandle( $args, $v, ":raw:encoding(UTF-8)" );
};
- *{ $k . "_raw" } = sub { $_[0]->filehandle( $v, ":raw" ) };
- *{ $k . "_utf8" } = sub { $_[0]->filehandle( $v, ":raw:encoding(UTF-8)" ) };
}
@@ -525,8 +618,11 @@
sub realpath {
+ my $self = shift;
require Cwd;
- return path( Cwd::realpath( $_[0]->[PATH] ) );
+ my $realpath = eval { Cwd::realpath( $self->[PATH] ) };
+ $self->_throw("resolving realpath") unless defined $realpath and length $realpath;
+ return path($realpath);
}
@@ -566,9 +662,7 @@
my $args = _get_args( shift, qw/binmode/ );
my $binmode = $args->{binmode};
$binmode = ( ( caller(0) )[10] || {} )->{'open<'} unless defined $binmode;
- my $fh = $self->filehandle( "<", $binmode );
- require Fcntl;
- flock( $fh, Fcntl::LOCK_SH() ) or $self->_throw('flock (LOCK_SH)');
+ my $fh = $self->filehandle( { locked => 1 }, "<", $binmode );
if ( ( defined($binmode) ? $binmode : "" ) eq ":unix"
and my $size = -s $fh )
{
@@ -601,15 +695,11 @@
my $args = ( @data && ref $data[0] eq 'HASH' ) ? shift @data : {};
$args = _get_args( $args, qw/binmode/ );
my $binmode = $args->{binmode};
+ # get default binmode from caller's lexical scope (see "perldoc open")
$binmode = ( ( caller(0) )[10] || {} )->{'open>'} unless defined $binmode;
my $temp = path( $self->[PATH] . $TID . $$ );
- my $fh = $temp->filehandle( ">", $binmode );
- require Fcntl;
- flock( $fh, Fcntl::LOCK_EX() ) or $self->_throw( 'flock (LOCK_EX)', $temp->[PATH] );
- seek( $fh, 0, Fcntl::SEEK_SET() ) or $self->_throw( 'seek', $temp->[PATH] );
- truncate( $fh, 0 ) or $self->_throw( 'truncate', $temp->[PATH] );
+ my $fh = $temp->filehandle( { locked => 1 }, ">", $binmode );
print {$fh} map { ref eq 'ARRAY' ? @$_ : $_ } @data;
- flock( $fh, Fcntl::LOCK_UN() ) or $self->_throw( 'flock (LOCK_UN)', $temp->[PATH] );
close $fh or $self->_throw( 'close', $temp->[PATH] );
# spewing need to follow the link
@@ -699,7 +789,7 @@
=pod
-=encoding utf-8
+=encoding UTF-8
=head1 NAME
@@ -707,7 +797,7 @@
=head1 VERSION
-version 0.038
+version 0.047
=head1 SYNOPSIS
@@ -764,7 +854,7 @@
the object gives you back the path (after some clean up).
File input/output methods C<flock> handles before reading or writing,
-as appropriate.
+as appropriate (if supported by the platform).
The C<*_utf8> methods (C, C, etc.) operate in raw
mode without CRLF translation. Installing LUnicode::UTF8 0.58 or later
@@ -864,14 +954,18 @@
$abs = path("foo/bar")->absolute;
$abs = path("foo/bar")->absolute("/tmp");
-Returns a new CPath::Tiny object with an absolute path. Unless
-an argument is given, the current directory is used as the absolute base path.
-The argument must be absolute or you won't get an absolute result.
+Returns a new CPath::Tiny object with an absolute path (or itself if already
+absolute). Unless an argument is given, the current directory is used as the
+absolute base path. The argument must be absolute or you won't get an absolute
+result.
This will not resolve upward directories ("foo/../bar") unless C<canonpath>
in LFile::Spec would normally do so on your platform. If you need them
resolved, you must call the more expensive C<realpath> method instead.
+On Windows, an absolute path without a volume component will have it added
+based on the current drive.
+
=head2 append, append_raw, append_utf8
path("foo.txt")->append(@data);
@@ -965,11 +1059,18 @@
=head2 filehandle
$fh = path("/tmp/foo.txt")->filehandle($mode, $binmode);
+ $fh = path("/tmp/foo.txt")->filehandle({ locked => 1 }, $mode, $binmode);
Returns an open file handle. The C<$mode> argument must be a Perl-style
read/write mode string ("<" ,">", "<<", etc.). If a C<$binmode>
is given, it is set during the C<open> call.
+An optional hash reference may be used to pass options. The only option is
+C<locked>. If true, handles opened for writing, appending or read-write are
+locked with C; otherwise, they are locked with C. When using
+C<locked>, ">" or "+>" modes will delay truncation until after the lock is
+acquired.
+
See C<openr>, C<openw>, C<openrw>, and C<opena> for sugar.
=head2 is_absolute, is_relative
@@ -1093,6 +1194,14 @@
C and C equivalents that use C<:raw> and
C<:raw:encoding(UTF-8)>, respectively.
+An optional hash reference may be used to pass options. The only option is
+C<locked>. If true, handles opened for writing, appending or read-write are
+locked with C; otherwise, they are locked for C.
+
+ $fh = path("foo.txt")->openrw_utf8( { locked => 1 } );
+
+See L</filehandle> for more on locking.
+
=head2 parent
$parent = path("foo/bar/baz")->parent; # foo/bar
@@ -1114,6 +1223,11 @@
parts resolved using L<Cwd>'s C<realpath>. Compared to C<absolute>, this is
more expensive as it must actually consult the filesystem.
+If the path can't be resolved (e.g. if it includes directories that don't exist),
+an exception will be thrown:
+
+ $real = path("doesnt_exist/foo")->realpath; # dies
+
=head2 relative
$rel = path("/tmp/foo/bar")->relative("/tmp"); # foo/bar
@@ -1235,7 +1349,7 @@
=for Pod::Coverage openr_utf8 opena_utf8 openw_utf8 openrw_utf8
openr_raw opena_raw openw_raw openrw_raw
-DOES
+IS_BSD IS_WIN32
=head1 EXCEPTION HANDLING
@@ -1267,7 +1381,14 @@
=head1 CAVEATS
-=head2 NFS and BSD
+=head2 File locking
+
+If flock is not supported on a platform, it will not be used, even if
+locking is requested.
+
+See additional caveats below.
+
+=head3 NFS and BSD
On BSD, Perl's flock implementation may not work to lock files on an
NFS filesystem. Path::Tiny has some heuristics to detect this
@@ -1277,6 +1398,12 @@
use warnings FATAL => 'flock';
+=head3 AIX and locking
+
+AIX requires a write handle for locking. Therefore, calls that normally
+open a read handle and take a shared lock instead will open a read-write
+handle and take an exclusive lock.
+
=head2 utf8 vs UTF-8
All the C<*_utf8> methods use C<:encoding(UTF-8)> -- either as
@@ -1307,15 +1434,16 @@
=head2 Default IO layers and the open pragma
If you have Perl 5.10 or later, file input/output methods (C<slurp>, C<spew>,
-etc.) and high-level handle opening methods ( C<openr>, C<openw>, etc. but not
-C<filehandle>) respect default encodings set by the C<-C> switch or lexical
+etc.) and high-level handle opening methods ( C<filehandle>, C<openr>,
+C<openw>, etc. ) respect default encodings set by the C<-C> switch or lexical
L<open> settings of the caller. For UTF-8, this is almost certainly slower
than using the dedicated C<_utf8> methods if you have LUnicode::UTF8.
=head1 TYPE CONSTRAINTS AND COERCION
A standard LMooseX::Types library is available at
-LMooseX::Types::Path::Tiny.
+LMooseX::Types::Path::Tiny. A LType::Tiny equivalent is available as
+LTypes::Path::Tiny.
=head1 SEE ALSO
@@ -1405,6 +1533,10 @@
=item *
+Geraud Continsouzas
+
+=item *
+
Goro Fuji
=item *
@@ -1427,6 +1559,10 @@
Toby Inkster
+=item *
+
+김도형 - Keedi Kim
+
=back
=head1 COPYRIGHT AND LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/t/00-compile.t new/Path-Tiny-0.047/t/00-compile.t
--- old/Path-Tiny-0.038/t/00-compile.t 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/t/00-compile.t 1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-use strict;
-use warnings;
-
-# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.033
-
-use Test::More tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0);
-
-
-
-my @module_files = (
- 'Path/Tiny.pm'
-);
-
-
-
-# fake home for cpan-testers
-use File::Temp;
-local $ENV{HOME} = File::Temp::tempdir( CLEANUP => 1 );
-
-
-use File::Spec;
-use IPC::Open3;
-use IO::Handle;
-
-my @warnings;
-for my $lib (@module_files)
-{
- # see L
- open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!";
- my $stderr = IO::Handle->new;
-
- my $pid = open3($stdin, '>&STDERR', $stderr, $^X, '-Mblib', '-e', "require q[$lib]");
- binmode $stderr, ':crlf' if $^O eq 'MSWin32';
- my @_warnings = <$stderr>;
- waitpid($pid, 0);
- is($? >> 8, 0, "$lib loaded ok");
-
- if (@_warnings)
- {
- warn @_warnings;
- push @warnings, @_warnings;
- }
-}
-
-
-
-is(scalar(@warnings), 0, 'no warnings found') if $ENV{AUTHOR_TESTING};
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/t/00-report-prereqs.t new/Path-Tiny-0.047/t/00-report-prereqs.t
--- old/Path-Tiny-0.038/t/00-report-prereqs.t 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/t/00-report-prereqs.t 2013-11-26 21:11:22.000000000 +0100
@@ -3,6 +3,8 @@
use strict;
use warnings;
+# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.010
+
use Test::More tests => 1;
use ExtUtils::MakeMaker;
@@ -10,6 +12,8 @@
use List::Util qw/max/;
my @modules = qw(
+ CPAN::Meta
+ CPAN::Meta::Requirements
Carp
Cwd
Digest
@@ -25,8 +29,6 @@
File::Spec::Unix
File::Temp
File::stat
- IO::Handle
- IPC::Open3
List::Util
Test::FailWarnings
Test::More
@@ -41,20 +43,46 @@
warnings
);
+my %exclude = map {; $_ => 1 } qw(
+
+);
+
+my ($source) = grep { -f $_ } qw/MYMETA.json MYMETA.yml META.json/;
+$source = "META.yml" unless defined $source;
+
# replace modules with dynamic results from MYMETA.json if we can
# (hide CPAN::Meta from prereq scanner)
my $cpan_meta = "CPAN::Meta";
-if ( -f "MYMETA.json" && eval "require $cpan_meta" ) { ## no critic
- if ( my $meta = eval { CPAN::Meta->load_file("MYMETA.json") } ) {
+my $cpan_meta_req = "CPAN::Meta::Requirements";
+my $all_requires;
+if ( -f $source && eval "require $cpan_meta" ) { ## no critic
+ if ( my $meta = eval { CPAN::Meta->load_file($source) } ) {
+
+ # Get ALL modules mentioned in META (any phase/type)
my $prereqs = $meta->prereqs;
- delete $prereqs->{develop};
+ delete $prereqs->{develop} if not $ENV{AUTHOR_TESTING};
my %uniq = map {$_ => 1} map { keys %$_ } map { values %$_ } values %$prereqs;
$uniq{$_} = 1 for @modules; # don't lose any static ones
- @modules = sort keys %uniq;
+ @modules = sort grep { ! $exclude{$_} } keys %uniq;
+
+ # If verifying, merge 'requires' only for major phases
+ if ( 1 ) {
+ $prereqs = $meta->effective_prereqs; # get the object, not the hash
+ if (eval "require $cpan_meta_req; 1") { ## no critic
+ $all_requires = $cpan_meta_req->new;
+ for my $phase ( qw/configure build test runtime/ ) {
+ $all_requires->add_requirements(
+ $prereqs->requirements_for($phase, 'requires')
+ );
+ }
+ }
+ }
}
}
my @reports = [qw/Version Module/];
+my @dep_errors;
+my $req_hash = defined($all_requires) ? $all_requires->as_string_hash : {};
for my $mod ( @modules ) {
next if $mod eq 'perl';
@@ -66,9 +94,29 @@
my $ver = MM->parse_version( catfile($prefix, $file) );
$ver = "undef" unless defined $ver; # Newer MM should do this anyway
push @reports, [$ver, $mod];
+
+ if ( 1 && $all_requires ) {
+ my $req = $req_hash->{$mod};
+ if ( defined $req && length $req ) {
+ if ( ! defined eval { version->parse($ver) } ) {
+ push @dep_errors, "$mod version '$ver' cannot be parsed (version '$req' required)";
+ }
+ elsif ( ! $all_requires->accepts_module( $mod => $ver ) ) {
+ push @dep_errors, "$mod version '$ver' is not in required range '$req'";
+ }
+ }
+ }
+
}
else {
push @reports, ["missing", $mod];
+
+ if ( 1 && $all_requires ) {
+ my $req = $req_hash->{$mod};
+ if ( defined $req && length $req ) {
+ push @dep_errors, "$mod is not installed (version '$req' required)";
+ }
+ }
}
}
@@ -76,7 +124,17 @@
my $vl = max map { length $_->[0] } @reports;
my $ml = max map { length $_->[1] } @reports;
splice @reports, 1, 0, ["-" x $vl, "-" x $ml];
- diag "Prerequisite Report:\n", map {sprintf(" %*s %*s\n",$vl,$_->[0],-$ml,$_->[1])} @reports;
+ diag "\nVersions for all modules listed in $source (including optional ones):\n",
+ map {sprintf(" %*s %*s\n",$vl,$_->[0],-$ml,$_->[1])} @reports;
+}
+
+if ( @dep_errors ) {
+ diag join("\n",
+ "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n",
+ "The following REQUIRED prerequisites were not satisfied:\n",
+ @dep_errors,
+ "\n"
+ );
}
pass;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/t/filesystem.t new/Path-Tiny-0.047/t/filesystem.t
--- old/Path-Tiny-0.038/t/filesystem.t 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/t/filesystem.t 2013-11-26 21:11:22.000000000 +0100
@@ -229,6 +229,14 @@
my $abs_t = path("t")->absolute;
my $case = $abs_t->child("../lib");
is( $case->realpath, $lib->realpath, "realpath on absolute" );
+
+ # non-existent realpath should throw error
+ eval { path("lkajdfak/djslakdj")->realpath };
+ like(
+ $@,
+ qr/Error resolving realpath/,
+ "caught error from realpath on non-existent file"
+ );
}
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/t/locking.t new/Path-Tiny-0.047/t/locking.t
--- old/Path-Tiny-0.038/t/locking.t 1970-01-01 01:00:00.000000000 +0100
+++ new/Path-Tiny-0.047/t/locking.t 2013-11-26 21:11:22.000000000 +0100
@@ -0,0 +1,45 @@
+use 5.008001;
+use strict;
+use warnings;
+use Test::More 0.96;
+use File::Spec;
+use Cwd;
+
+use lib 't/lib';
+use TestUtils qw/exception/;
+
+use Fcntl ':flock';
+use Path::Tiny;
+
+my $IS_BSD = $^O =~ /bsd$/;
+
+if ($IS_BSD) {
+ # is temp partition lockable?
+ my $file = Path::Tiny->tempfile;
+ open my $fh, ">>", $file;
+ flock $fh, LOCK_EX
+ or plan skip_all => "Can't lock tempfiles on this OS/filesystem";
+}
+
+subtest 'write locks blocks read lock' => sub {
+ my $file = Path::Tiny->tempfile;
+ ok $file, "Got a tempfile";
+ my $fh = $file->openw( { locked => 1 } );
+ ok $fh, "Opened file for writing with lock";
+ $fh->autoflush(1);
+ print {$fh} "hello";
+ # check if a different process can get a lock; use RW mode for AIX
+ my $locktester = Path::Tiny->tempfile;
+ $locktester->spew(<<"HERE");
+use strict;
+use warnings;
+use Fcntl ':flock';
+open my \$fh, "+<", "$file";
+exit flock( \$fh, LOCK_SH|LOCK_NB );
+HERE
+ my $rc = system( $^X, $locktester );
+ isnt( $rc, -1, "ran process to try to get lock" );
+ is( $rc >> 8, 0, "process failed to get lock" );
+};
+
+done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/t/zzz-spec.t new/Path-Tiny-0.047/t/zzz-spec.t
--- old/Path-Tiny-0.038/t/zzz-spec.t 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/t/zzz-spec.t 2013-11-26 21:11:22.000000000 +0100
@@ -58,11 +58,12 @@
[ "path('t4')->absolute('/t1/t2/t3')", '/t1/t2/t3/t4' ],
[ "path('t4/t5')->absolute('/t1/t2/t3')", '/t1/t2/t3/t4/t5' ],
[ "path('.')->absolute('/t1/t2/t3')", '/t1/t2/t3' ],
- [ "path('/t1')->absolute('/t1/t2/t3')", '/t1' ],
[ "path('///../../..//./././a//b/.././c/././')", '/a/b/../c', '/a/c' ],
[ "path('a/../../b/c')", 'a/../../b/c', '../b/c' ],
[ "path('..')->absolute('/t1/t2/t3')", '/t1/t2/t3/..', '/t1/t2' ],
[ "path('../t4')->absolute('/t1/t2/t3')", '/t1/t2/t3/../t4', '/t1/t2/t4' ],
+ # need to wash through rootdir->absolute->child to pick up volume on Windows
+ [ "path('/t1')->absolute('/t1/t2/t3')", Path::Tiny->rootdir->absolute->child("t1") ],
);
my @win32_tests;
@@ -96,7 +97,7 @@
[ "path('a/..','../b')", '../b' ],
[ "path('A:', 'foo')", 'A:/foo' ],
[ "path('a:/')", 'A:/' ],
- [ "path('A:f')", 'A:f' ],
+ [ "path('A:f')", 'A:/f' ],
[ "path('A:/')", 'A:/' ],
[ "path('a\\..\\..\\b\\c')", '../b/c' ],
[ "path('//a\\b//c')", '//a/b/c' ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/xt/author/00-compile.t new/Path-Tiny-0.047/xt/author/00-compile.t
--- old/Path-Tiny-0.038/xt/author/00-compile.t 1970-01-01 01:00:00.000000000 +0100
+++ new/Path-Tiny-0.047/xt/author/00-compile.t 2013-11-26 21:11:22.000000000 +0100
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.037
+
+use Test::More tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0);
+
+
+
+my @module_files = (
+ 'Path/Tiny.pm'
+);
+
+
+
+# fake home for cpan-testers
+use File::Temp;
+local $ENV{HOME} = File::Temp::tempdir( CLEANUP => 1 );
+
+
+my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib';
+
+use File::Spec;
+use IPC::Open3;
+use IO::Handle;
+
+my @warnings;
+for my $lib (@module_files)
+{
+ # see L
+ open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!";
+ my $stderr = IO::Handle->new;
+
+ my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]");
+ binmode $stderr, ':crlf' if $^O eq 'MSWin32';
+ my @_warnings = <$stderr>;
+ waitpid($pid, 0);
+ is($?, 0, "$lib loaded ok");
+
+ if (@_warnings)
+ {
+ warn @_warnings;
+ push @warnings, @_warnings;
+ }
+}
+
+
+
+is(scalar(@warnings), 0, 'no warnings found') if $ENV{AUTHOR_TESTING};
+
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Path-Tiny-0.038/xt/author/pod-spell.t new/Path-Tiny-0.047/xt/author/pod-spell.t
--- old/Path-Tiny-0.038/xt/author/pod-spell.t 2013-10-02 00:20:18.000000000 +0200
+++ new/Path-Tiny-0.047/xt/author/pod-spell.t 2013-11-26 21:11:22.000000000 +0100
@@ -10,6 +10,7 @@
add_stopwords(<DATA>);
all_pod_files_spelling_ok( qw( bin lib ) );
__DATA__
+AIX
BENCHMARKING
CRLF
SHA
@@ -49,6 +50,9 @@
George
Hartzell
hartzell
+Geraud
+Continsouzas
+geraud
Goro
Fuji
gfuji
@@ -67,6 +71,7 @@
Toby
Inkster
tobyink
+김도형
lib
Path
Tiny
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org