Archive-Tar-Builder
view release on metacpan or search on metacpan
t/lib-Archive-Tar-Builder.t view on Meta::CPAN
'posix_extensions' => 1
);
$builder->set_handle($fh);
lives_ok {
$builder->archive_as( '/etc/hosts' => 'BLEH' x 60 );
}
'$builder->archive_as() will NOT croak() on long filenames when posix_extensions is passed';
}
close $fh;
}
#
# Test hardlink preservation support
#
{
my $src = File::Temp::tempdir( 'CLEANUP' => 1 );
my $dest = File::Temp::tempdir( 'CLEANUP' => 1 );
open my $fh, '>', "$src/foo" or die "Unable to open $src/foo for writing: $!";
print {$fh} "test\n";
close $fh;
link "$src/foo" => "$src/bar" or die "Unable to link $src/foo to $src/bar: $!";
my @FLAG_SETS = (
[ 'ustar' => [ 'preserve_hardlinks' => 1 ] ],
[ 'PAX' => [ 'preserve_hardlinks' => 1, 'posix_extensions' => 1 ] ],
[ 'GNU' => [ 'preserve_hardlinks' => 1, 'gnu_extensions' => 1 ] ]
);
foreach my $flag_set (@FLAG_SETS) {
my ( $format, $flags ) = @{$flag_set};
note("Testing 'preserve_hardlinks' flag with $format output");
my $builder = Archive::Tar::Builder->new( @{$flags} );
my $reader_pid = IPC::Open3::open3( my $in, undef, undef, $tar, '-C', $dest, '-xf', '-' );
my $writer_pid = fork;
die "Unable to fork(): $!" unless defined $writer_pid;
if ( $writer_pid == 0 ) {
chdir $src or die "Unable to chdir() to $src: $!";
$builder->set_handle($in);
$builder->archive('.');
$builder->finish;
exit 0;
}
close $in;
waitpid $writer_pid, 0 or die "Unable to waitpid() on $writer_pid: $!";
waitpid $reader_pid, 0 or die "Unable to waitpid() on $reader_pid: $!";
my @st1 = stat "$dest/foo" or die "Unable to stat() $dest/foo: $!";
my @st2 = stat "$dest/bar" or die "Unable to stat() $dest/bar: $!";
is( $st1[0] => $st2[0], "st_dev of $dest/foo matches $dest/bar" );
is( $st1[1] => $st2[1], "st_ino of $dest/foo matches $dest/bar" );
}
}
#
# Test for fix to CPANEL-29859; segfaulting when archiving certain numbers of
# hardlinked files
#
{
my $tmp = File::Temp::tempdir( 'CLEANUP' => 1 );
for ( my $i = 1; $i < 200; $i++ ) {
my $orig = sprintf "$tmp/orig-%04d", $i;
my $link = sprintf "$tmp/link-%04d", $i;
open my $fh, '>', $orig or die "Unable to open() $orig for writing: $!";
close $fh;
link $orig => $link or die "Unable to link() $orig to $link: $!";
}
my $status = system $^X, "$FindBin::Bin/scripts/CPANEL-29859.pl", $tmp;
my $signal = $? & 0x7f;
is( $signal => 0, "\$builder->archive() exits with no signal when archiving large numbers of hardlinked files" );
}
( run in 1.406 second using v1.01-cache-2.11-cpan-302cb4679cc )