From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/env perl
use v5.12.5;
our $VERSION = '9999.99.99_99'; # VERSION
use File::Temp qw(tempdir);
use Rex -base;
if ( $^O =~ m/^MSWin/ ) {
plan skip_all => 'No symlink support on Windows';
}
$::QUIET = 1;
my $tmp_dir = tempdir( CLEANUP => 1 );
my $file = File::Spec->catfile( $tmp_dir, 'file' );
my $symlink = File::Spec->catfile( $tmp_dir, 'symlink' );
my $nested_symlink = File::Spec->catfile( $tmp_dir, 'nested_symlink' );
sub setup {
file $file, ensure => 'present';
symlink $file, $symlink;
symlink $symlink, $nested_symlink;
is( is_file($file), TRUE, 'temp file is a file' );
is( is_symlink($symlink), TRUE, 'temp symlink is a symlink' );
is( is_symlink($nested_symlink), TRUE, 'temp nested symlink is a symlink' );
}
sub check_still_symlink {
is( is_symlink($symlink), TRUE, 'temp symlink is still a symlink' );
is( resolve_symlink($symlink), $file, 'symlink is still resolved to file' );
}
subtest 'resolve symlinks' => sub {
setup();
is( resolve_symlink($symlink), $file, 'symlink is resolved to file' );
is( resolve_symlink($nested_symlink),
$file, 'nested symlink is resolved to file' );
is( resolve_symlink('not a symlink'),
undef, 'non-existing symlink is unresolved' );
};
subtest 'file command with symlinks' => sub {
setup();
file $symlink, content => '1';
is( cat($file), "1\n", 'file content written' );
check_still_symlink();
file $symlink, ensure => 'absent';
is( is_file($file), TRUE, 'file is still present' );
ok( !-e $symlink, 'symlink is gone' );
};
subtest 'delete_lines_matching with symlinks' => sub {
setup();
delete_lines_matching $symlink, '1';
is( cat($file), "", 'line deleted' );
check_still_symlink();
};
subtest 'append_or_amend_line with symlinks' => sub {
setup();
append_or_amend_line $symlink,
line => '2',
regexp => qr{1};
is( cat($file), "2\n", 'line updated' );
check_still_symlink();
};
subtest 'sed with symlinks' => sub {
setup();
sed qr{1}, '2', $symlink;
is( cat($file), "2\n", 'line updated' );
check_still_symlink();
};
subtest 'file_write with symlinks' => sub {
setup();
my $fh = file_write $symlink;
$fh->write('');
$fh->close;
is( cat($file), '', 'file is empty' );
check_still_symlink();
};
subtest 'file_append with symlinks' => sub {
setup();
my $fh = file_append $symlink;
$fh->write("1\n");
$fh->close;
is( cat($file), "1\n", 'file has been appended' );
check_still_symlink();
};
done_testing();