Use make_invalid_link() to reliably setup symlink fixtures.
This commit is contained in:
parent
af4557c543
commit
91c816e32d
7 changed files with 46 additions and 17 deletions
4
NEWS
4
NEWS
|
@ -2,6 +2,10 @@ News file for Stow.
|
||||||
|
|
||||||
* Changes in version 2.1.4
|
* Changes in version 2.1.4
|
||||||
|
|
||||||
|
** Test suite improvements
|
||||||
|
|
||||||
|
The test suite has been tightened up slightly.
|
||||||
|
|
||||||
** Documentation improvements
|
** Documentation improvements
|
||||||
|
|
||||||
Various fixes and cosmetic improvements have been made in the manual.
|
Various fixes and cosmetic improvements have been made in the manual.
|
||||||
|
|
|
@ -98,7 +98,7 @@ stdout_like(
|
||||||
qr{Unstowed\ file:\ ./bin/alien}xms,
|
qr{Unstowed\ file:\ ./bin/alien}xms,
|
||||||
"Aliens exist");
|
"Aliens exist");
|
||||||
|
|
||||||
make_link('bin/link', 'ireallyhopethisfiledoesn/t.exist');
|
make_invalid_link('bin/link', 'ireallyhopethisfiledoesn/t.exist');
|
||||||
@ARGV = ('-t', '.', '-b');
|
@ARGV = ('-t', '.', '-b');
|
||||||
stdout_like(
|
stdout_like(
|
||||||
\&run_chkstow,
|
\&run_chkstow,
|
||||||
|
|
|
@ -42,7 +42,7 @@ make_dir('bin2');
|
||||||
make_dir('../stow/pkg2/bin2');
|
make_dir('../stow/pkg2/bin2');
|
||||||
make_file('../stow/pkg2/bin2/file2a');
|
make_file('../stow/pkg2/bin2/file2a');
|
||||||
make_link('bin2/file2a', '../../stow/pkg2/bin2/file2a');
|
make_link('bin2/file2a', '../../stow/pkg2/bin2/file2a');
|
||||||
make_link('bin2/file2b', '../../stow/pkg2/bin2/file2b');
|
make_invalid_link('bin2/file2b', '../../stow/pkg2/bin2/file2b');
|
||||||
|
|
||||||
$stow = new_Stow();
|
$stow = new_Stow();
|
||||||
$stow->cleanup_invalid_links('bin2');
|
$stow->cleanup_invalid_links('bin2');
|
||||||
|
@ -58,7 +58,7 @@ make_dir('bin3');
|
||||||
make_dir('../stow/pkg3/bin3');
|
make_dir('../stow/pkg3/bin3');
|
||||||
make_file('../stow/pkg3/bin3/file3a');
|
make_file('../stow/pkg3/bin3/file3a');
|
||||||
make_link('bin3/file3a', '../../stow/pkg3/bin3/file3a');
|
make_link('bin3/file3a', '../../stow/pkg3/bin3/file3a');
|
||||||
make_link('bin3/file3b', '../../empty');
|
make_invalid_link('bin3/file3b', '../../empty');
|
||||||
|
|
||||||
$stow = new_Stow();
|
$stow = new_Stow();
|
||||||
$stow->cleanup_invalid_links('bin3');
|
$stow->cleanup_invalid_links('bin3');
|
||||||
|
|
4
t/stow.t
4
t/stow.t
|
@ -180,7 +180,7 @@ for my $file ('file4c', 'bin4c/file4c') {
|
||||||
$stow = new_Stow();
|
$stow = new_Stow();
|
||||||
|
|
||||||
make_dir('bin5');
|
make_dir('bin5');
|
||||||
make_link('bin5/file5','../../empty');
|
make_invalid_link('bin5/file5','../../empty');
|
||||||
make_dir('../stow/pkg5/bin5/file5');
|
make_dir('../stow/pkg5/bin5/file5');
|
||||||
|
|
||||||
$stow->plan_stow('pkg5');
|
$stow->plan_stow('pkg5');
|
||||||
|
@ -196,7 +196,7 @@ like(
|
||||||
#
|
#
|
||||||
$stow = new_Stow();
|
$stow = new_Stow();
|
||||||
|
|
||||||
make_link('file6','../stow/path-does-not-exist');
|
make_invalid_link('file6','../stow/path-does-not-exist');
|
||||||
make_dir('../stow/pkg6');
|
make_dir('../stow/pkg6');
|
||||||
make_file('../stow/pkg6/file6');
|
make_file('../stow/pkg6/file6');
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,10 @@ package testutil;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
use Carp qw(croak);
|
||||||
|
use File::Basename;
|
||||||
use File::Path qw(remove_tree);
|
use File::Path qw(remove_tree);
|
||||||
|
use File::Spec;
|
||||||
|
|
||||||
use Stow;
|
use Stow;
|
||||||
use Stow::Util qw(parent canon_path);
|
use Stow::Util qw(parent canon_path);
|
||||||
|
@ -20,7 +23,7 @@ our @EXPORT = qw(
|
||||||
init_test_dirs
|
init_test_dirs
|
||||||
cd
|
cd
|
||||||
new_Stow new_compat_Stow
|
new_Stow new_compat_Stow
|
||||||
make_dir make_link make_file
|
make_dir make_link make_invalid_link make_file
|
||||||
remove_dir remove_link
|
remove_dir remove_link
|
||||||
cat_file
|
cat_file
|
||||||
);
|
);
|
||||||
|
@ -56,28 +59,50 @@ sub new_compat_Stow {
|
||||||
# Purpose : safely create a link
|
# Purpose : safely create a link
|
||||||
# Parameters: $target => path to the link
|
# Parameters: $target => path to the link
|
||||||
# : $source => where the new link should point
|
# : $source => where the new link should point
|
||||||
|
# : $invalid => true iff $source refers to non-existent file
|
||||||
# Returns : n/a
|
# Returns : n/a
|
||||||
# Throws : fatal error if the link can not be safely created
|
# Throws : fatal error if the link can not be safely created
|
||||||
# Comments : checks for existing nodes
|
# Comments : checks for existing nodes
|
||||||
#============================================================================
|
#============================================================================
|
||||||
sub make_link {
|
sub make_link {
|
||||||
my ($target, $source) = @_;
|
my ($target, $source, $invalid) = @_;
|
||||||
|
|
||||||
if (-l $target) {
|
if (-l $target) {
|
||||||
my $old_source = readlink join('/', parent($target), $source)
|
my $old_source = readlink join('/', parent($target), $source)
|
||||||
or die "could not read link $target/$source";
|
or die "$target is already a link but could not read link $target/$source";
|
||||||
if ($old_source ne $source) {
|
if ($old_source ne $source) {
|
||||||
die "$target already exists but points elsewhere\n";
|
die "$target already exists but points elsewhere\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif (-e $target) {
|
die "$target already exists and is not a link\n" if -e $target;
|
||||||
die "$target already exists and is not a link\n";
|
my $abs_target = File::Spec->rel2abs($target);
|
||||||
|
my $target_container = dirname($abs_target);
|
||||||
|
my $abs_source = File::Spec->rel2abs($source, $target_container);
|
||||||
|
#warn "t $target c $target_container as $abs_source";
|
||||||
|
if (-e $abs_source) {
|
||||||
|
croak "Won't make invalid link pointing to existing $abs_target"
|
||||||
|
if $invalid;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
croak "Won't make link pointing to non-existent $abs_target"
|
||||||
|
unless $invalid;
|
||||||
|
}
|
||||||
symlink $source, $target
|
symlink $source, $target
|
||||||
or die "could not create link $target => $source ($!)\n";
|
or die "could not create link $target => $source ($!)\n";
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
|
#===== SUBROUTINE ===========================================================
|
||||||
|
# Name : make_invalid_link()
|
||||||
|
# Purpose : safely create an invalid link
|
||||||
|
# Parameters: $target => path to the link
|
||||||
|
# : $source => the non-existent source where the new link should point
|
||||||
|
# Returns : n/a
|
||||||
|
# Throws : fatal error if the link can not be safely created
|
||||||
|
# Comments : checks for existing nodes
|
||||||
|
#============================================================================
|
||||||
|
sub make_invalid_link {
|
||||||
|
my ($target, $source, $allow_invalid) = @_;
|
||||||
|
make_link($target, $source, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#===== SUBROUTINE ===========================================================
|
#===== SUBROUTINE ===========================================================
|
||||||
|
|
|
@ -87,7 +87,7 @@ $stow = new_Stow();
|
||||||
make_dir('bin4');
|
make_dir('bin4');
|
||||||
make_dir('../stow/pkg4/bin4');
|
make_dir('../stow/pkg4/bin4');
|
||||||
make_file('../stow/pkg4/bin4/file4');
|
make_file('../stow/pkg4/bin4/file4');
|
||||||
make_link('bin4/file4', '../../stow/pkg4/bin4/does-not-exist');
|
make_invalid_link('bin4/file4', '../../stow/pkg4/bin4/does-not-exist');
|
||||||
|
|
||||||
$stow->plan_unstow('pkg4');
|
$stow->plan_unstow('pkg4');
|
||||||
$stow->process_tasks();
|
$stow->process_tasks();
|
||||||
|
@ -103,7 +103,7 @@ ok(
|
||||||
$stow = new_Stow();
|
$stow = new_Stow();
|
||||||
|
|
||||||
make_dir('../stow/pkg5/bin5');
|
make_dir('../stow/pkg5/bin5');
|
||||||
make_link('bin5', '../not-stow');
|
make_invalid_link('bin5', '../not-stow');
|
||||||
|
|
||||||
$stow->plan_unstow('pkg5');
|
$stow->plan_unstow('pkg5');
|
||||||
%conflicts = $stow->get_conflicts;
|
%conflicts = $stow->get_conflicts;
|
||||||
|
|
|
@ -88,7 +88,7 @@ $stow = new_compat_Stow();
|
||||||
make_dir('bin4');
|
make_dir('bin4');
|
||||||
make_dir('../stow/pkg4/bin4');
|
make_dir('../stow/pkg4/bin4');
|
||||||
make_file('../stow/pkg4/bin4/file4');
|
make_file('../stow/pkg4/bin4/file4');
|
||||||
make_link('bin4/file4', '../../stow/pkg4/bin4/does-not-exist');
|
make_invalid_link('bin4/file4', '../../stow/pkg4/bin4/does-not-exist');
|
||||||
|
|
||||||
$stow->plan_unstow('pkg4');
|
$stow->plan_unstow('pkg4');
|
||||||
$stow->process_tasks();
|
$stow->process_tasks();
|
||||||
|
@ -104,7 +104,7 @@ ok(
|
||||||
$stow = new_compat_Stow();
|
$stow = new_compat_Stow();
|
||||||
|
|
||||||
make_dir('../stow/pkg5/bin5');
|
make_dir('../stow/pkg5/bin5');
|
||||||
make_link('bin5', '../not-stow');
|
make_invalid_link('bin5', '../not-stow');
|
||||||
|
|
||||||
$stow->plan_unstow('pkg5');
|
$stow->plan_unstow('pkg5');
|
||||||
# Unlike the corresponding stow_contents.t test, this doesn't
|
# Unlike the corresponding stow_contents.t test, this doesn't
|
||||||
|
|
Loading…
Reference in a new issue