Open p5pRT opened 6 years ago
When abs2rel gets a path argument with ..s that are crossing over the ..s trailing the base argument\, the result is wrong.
Example PATH: /home/goal/test/.. BASE: /home/goal/test/../../base Good result: ../goal Bad result: ../..
Tested in File::Spec versions - 3.6301 - 3.74
On Wed\, 22 Aug 2018 09:12:39 GMT\, martin.peylo@nokia.com wrote:
Does the program attached correctly describe your problem?
(When run as 'prove -v 133465-abs2rel-func.t'\, the 4th test fails while the 5th test unexpectedly passes.)
Thank you very much.
-- James E Keenan (jkeenan@cpan.org)
#!/usr/bin/env perl use 5.10.0; use warnings; use Carp; use File::Path 2.15 qw(make_path); use File::Spec; use File::Spec::Functions qw(abs2rel); use File::Temp qw(tempdir); use Cwd; use Test::More;
my $tdir = tempdir(CLEANUP => 1); my $testingdir = File::Spec->catdir($tdir\, 'testing'); my @created = make_path($testingdir\, { mode => 0711 }); chdir $testingdir or croak "AAA: Unable to chdir to $testingdir";
my $startdir = cwd(); pass("Starting out from $startdir");
@created = make_path('goal/test'\, { mode => 0711 }); my $testdir = File::Spec->catdir($startdir\, 'goal'\, 'test'); croak "Unable to locate $testdir" unless -d $testdir; chdir_test($startdir\, $testdir\, 'BBB');
my $goaldir = File::Spec->catdir($startdir\, 'goal'); chdir_test($startdir\, $goaldir\, 'CCC');
my $dest = "$testingdir/goal/test/.."; chdir_test($startdir\, $dest\, 'DDD');
@created = make_path('base'\, { mode => 0711 }); my $bdir = File::Spec->catdir($startdir\, 'base'); croak "Unable to locate $bdir" unless -d $bdir; chdir_test($startdir\, $bdir\, 'EEE');
my $base = "$testingdir/goal/test/../../base"; chdir $base or croak "FFF: Unable to chdir to $base"; my $thisdir = cwd(); is($thisdir\, $bdir\, "Having chdir-ed to $base\, I'm now in $thisdir");
my $rel_path = abs2rel($dest\, $base); pass("relative path as calculated by abs2rel(): $rel_path"); chdir $rel_path or croak "GGG: Unable to chdir to $rel_path"; my $enddir = cwd(); is($enddir\, $goaldir\, "Having chdir-ed to $rel_path\, I'm now in $goaldir as expected"); is($enddir\, $tdir\, "Having chdir-ed to $rel_path\, I'm now in $tdir -- contrary to expectation");
done_testing();
sub chdir_test { my ($startdir\, $d\, $str) = @_; chdir $d or croak "$str: Unable to chdir to $d"; chdir $startdir or croak "${str}1: Unable to chdir back to $startdir"; return 1; } __END__
The RT System itself - Status changed from 'new' to 'open'
On Wed\, 22 Aug 2018 15:15:15 GMT\, jkeenan wrote:
On Wed\, 22 Aug 2018 09:12:39 GMT\, martin.peylo@nokia.com wrote:
Does the program attached correctly describe your problem?
(When run as 'prove -v 133465-abs2rel-func.t'\, the 4th test fails while the 5th test unexpectedly passes.)
Thank you very much.
Attached is another test file\, written with directories named after the style used in dist/PathTools/t/Spec.t\, which confirms the problem.
The problem lies in this part of the definition of abs2rel() in lib/File/Spec/Unix.pm:
##### while( defined(my $dir= shift @basechunks) ) { if( $dir ne $self->updir ) { unshift @reverse_base\, $self->updir; push @common\, $dir; } elsif( @common ) { if( @reverse_base && $reverse_base[0] eq $self->updir ) { shift @reverse_base; pop @common; } else { unshift @reverse_base\, pop @common; } } } #####
To see a version of this block with some debugging code added\, see: https://github.com/jkeenan/PathTools/tree/rt-133465-abs2rel
Thank you very much. -- James E Keenan (jkeenan@cpan.org)
#!/usr/bin/env perl use strict; use warnings; use File::Path 2.15 qw(make_path); use File::Spec; use File::Temp qw(tempdir); use Cwd; use Test::More; #use Data::Dump qw(dd pp);
my $od = cwd();
{
my $tdir = tempdir(CLEANUP => 1);
my $testingdir = File::Spec->catdir($tdir\, 'testing');
my @created = make_path($testingdir\, { mode => 0711 });
chdir $testingdir or die "Unable to chdir to $testingdir: $!";
my $startdir = cwd();
pass("Starting out from $startdir");
my @d = map { File::Spec->catdir($startdir\, File::Spec->splitdir($_)) } ('t1/t2/t3'\, 't1/t4');
@created = make_path(@d\, { mode => 0711 });
my $destdir = File::Spec->catdir($startdir\, File::Spec->splitdir('t1/t2'));
for my $d (@d\, $destdir) {
ok(-d $d\, "Created $d for testing");
}
chdir $d[1] or die "Unable to chdir to $d[1]: $!";
my $expected_relpath = File::Spec->catdir(".."\, "t2");
chdir $expected_relpath or die "Unable to chdir via relative path: $!";
my $thisdir = cwd();
is($thisdir\, $destdir\,
"chdir via relative path brought us to $destdir\, as expected");
chdir $startdir or die "Unable to get back to $startdir: $!";
my @e = map { File::Spec->catdir($startdir\, File::Spec->splitdir($_)) }
('t1/t2/t3/..'\, 't1/t2/t3/../../t4');
for my $e (@e) {
ok(-d $e\, "Previously created $e for testing");
}
chdir $e[1] or die "Unable to chdir to $e[1]: $!";
chdir $expected_relpath or die "Unable to chdir via relative path: $!";
$thisdir = cwd();
my $expected_thisdir = File::Spec->catdir($startdir\, File::Spec->splitdir('t1/t2'));
is($thisdir\, $expected_thisdir\,
"chdir via relative path brought us to $expected_thisdir\, as expected");
chdir $startdir or die "Unable to get back to $startdir: $!";
chdir $e[1] or die "Unable to chdir to $e[1]: $!"; my $calculated_relpath = File::Spec->abs2rel($e[1]\, $e[0]); is($calculated_relpath\, $expected_relpath\, "abs2rel() calculated relative path as expected ($expected_relpath)"); chdir $calculated_relpath or die "Unable to chdir via calculated relative path: $!"; $thisdir = cwd(); is($thisdir\, $expected_thisdir\, "chdir via relative path brought us to $expected_thisdir\, as expected"); chdir $startdir or die "Unable to get back to $startdir: $!";
chdir $od or die "Unable to get back to where we started: $!"; }
done_testing;
Hi\,
Yes\, I guess so - it seems to come to the same conclusion "in real life" as my sample did "virtually".
When run as you instruct\, it also fails in my environment as you describe.
Thank you for picking that up so fast\, Martin
-----Original Message----- From: James E Keenan via RT \perlbug\-followup@​perl\.org Sent: Wednesday\, August 22\, 2018 8:45 PM To: Peylo\, Martin (Nokia - FI/Espoo) \martin\.peylo@​nokia\.com Subject: [perl #133465] File::Spec::Functions abs2rel confused by trailing ..s
On Wed\, 22 Aug 2018 09:12:39 GMT\, martin.peylo@nokia.com wrote:
Does the program attached correctly describe your problem?
(When run as 'prove -v 133465-abs2rel-func.t'\, the 4th test fails while the 5th test unexpectedly passes.)
Thank you very much.
-- James E Keenan (jkeenan@cpan.org)
On Thu\, 23 Aug 2018 14:46:49 GMT\, jkeenan wrote:
On Wed\, 22 Aug 2018 15:15:15 GMT\, jkeenan wrote:
On Wed\, 22 Aug 2018 09:12:39 GMT\, martin.peylo@nokia.com wrote:
Does the program attached correctly describe your problem?
(When run as 'prove -v 133465-abs2rel-func.t'\, the 4th test fails while the 5th test unexpectedly passes.)
Thank you very much.
Attached is another test file\, written with directories named after the style used in dist/PathTools/t/Spec.t\, which confirms the problem.
The problem lies in this part of the definition of abs2rel() in lib/File/Spec/Unix.pm:
##### while( defined(my $dir= shift @basechunks) ) { if( $dir ne $self->updir ) { unshift @reverse_base\, $self->updir; push @common\, $dir; } elsif( @common ) { if( @reverse_base && $reverse_base[0] eq $self->updir ) { shift @reverse_base; pop @common; } else { unshift @reverse_base\, pop @common; } } } #####
To see a version of this block with some debugging code added\, see: https://github.com/jkeenan/PathTools/tree/rt-133465-abs2rel
Thank you very much.
1. There was one conceptual error in the test file\, 133465-spec-abs2rel.t\, that I attached to this RT yesterday. So please treat that as superseded. I am attaching a new test file\, 2-133465-spec-abs2rel.t\, which (a) corrects that error; (b) refactors a lot of the code into subroutines for readability; and (c) adds an additional test case.
2. Sadly\, the additional test case added in 1(c) shows that we have even more problems with File::Spec->abs2rel() than that reported originally by Martin Peylo. In the case he reported\, there were updirs ('..') in the middle of the base path and an updir at the end of the destination path. The second test case in the attachment pertains to no updirs in the base path and an updir at the end of the destination path. In that case abs2rel() calculates a *valid* relative path -- valid in the sense that if you're in the base directory and use the relative path as the argument to 'chdir'\, you will get to the expected location -- but not the *simplest* relative path. Instead\, in this case abs2rel() calculates a relative path with updirs in it.
3. Not yet examined: cases where there are updirs in the base path.
Thank you very much. -- James E Keenan (jkeenan@cpan.org)
#!/usr/bin/env perl use strict; use warnings; use File::Path 2.15 qw(make_path); use File::Spec; use File::Temp qw(tempdir); use Cwd; use Test::More; #use Data::Dump qw(dd pp);
my $od = cwd(); { # Elaboration of case reported in RT 133465: # ('t1/t2/t3/..'\, 't1/t2/t3/../../t4'); # i.e.\, updir at end of dest path and in middle of base path
my $tdir = tempdir(CLEANUP => 1); my $startdir = startdir_setup($tdir);
my $setup_args = {
startdir => $startdir\,
dest_needed => 't1/t2/t3'\,
base_needed => 't1/t4'\,
dest_real => 't1/t2'\,
relpath_components => [ ".."\, "t2" ]\,
};
my $expected_relpath = manual_directory_setup($setup_args);
my $test_args = {
startdir => $startdir\,
test_dest => 't1/t2/t3/..'\,
test_base => 't1/t2/t3/../../t4'\,
};
my @e = confirm_test_paths_created($test_args);
my $chdir_args = { startdir => $startdir\, expected_relpath => $expected_relpath\, e => [ @e ]\, %{$setup_args}\, }; my $expected_thisdir = confirm_chdir_via_expected_relpath($chdir_args);
my $use_abs2rel_args = { startdir => $startdir\, e => [ @e ]\, expected_relpath => $expected_relpath\, expected_thisdir => $expected_thisdir\, }; calculate_relpath_via_abs2rel($use_abs2rel_args);
chdir $od or die "Unable to get back to where we started: $!"; }
{ # Case where updirs are at end of dest path\, none in base path: # (('t1/t2/t3/..'\, 't1/t5/t6')); # abs2rel() calculates a *valid* relative path but not the # *simplest* relative path
my $tdir = tempdir(CLEANUP => 1); my $startdir = startdir_setup($tdir);
my $setup_args = { startdir => $startdir\, dest_needed => 't1/t2/t3'\, base_needed => 't1/t5/t6'\, dest_real => 't1/t2'\, relpath_components => [ ".."\, ".."\, "t2" ]\, }; my $expected_relpath = manual_directory_setup($setup_args);
my $test_args = { startdir => $startdir\, test_dest => 't1/t2/t3/..'\, test_base => 't1/t5/t6'\, }; my @e = confirm_test_paths_created($test_args);
my $chdir_args = { startdir => $startdir\, expected_relpath => $expected_relpath\, e => [ @e ]\, %{$setup_args}\, }; my $expected_thisdir = confirm_chdir_via_expected_relpath($chdir_args);
my $use_abs2rel_args = { startdir => $startdir\, e => [ @e ]\, expected_relpath => $expected_relpath\, expected_thisdir => $expected_thisdir\, }; calculate_relpath_via_abs2rel($use_abs2rel_args); chdir $od or die "Unable to get back to where we started: $!"; }
done_testing;
#################### SUBROUTINES ####################
sub startdir_setup { my $tdir = shift; my $testingdir = File::Spec->catdir($tdir\, 'testing'); my @created = make_path($testingdir\, { mode => 0711 }); chdir $testingdir or die "Unable to chdir to $testingdir: $!"; my $startdir = cwd(); pass("Starting out from $startdir"); return $startdir; }
sub manual_directory_setup { my $args = shift; my @d = map { File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($_)) } ($args->{dest_needed}\, $args->{base_needed}); my @created = make_path(@d\, { mode => 0711 }); my $destdir = File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($args->{dest_real})); for my $d (@d\, $destdir) { ok(-d $d\, "Created $d for testing"); } chdir $d[1] or die "Unable to chdir to $d[1]: $!"; my $expected_relpath = File::Spec->catdir(@{$args->{relpath_components}}); chdir $expected_relpath or die "Unable to chdir via relative path: $!"; my $thisdir = cwd(); is($thisdir\, $destdir\, "chdir via relative path '$expected_relpath' brought us to $destdir\, as expected"); chdir $args->{startdir} or die "Unable to get back to $args->{startdir}: $!"; return $expected_relpath; }
sub confirm_test_paths_created { my $args = shift; my @e = map { File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($_)) } ($args->{test_dest}\, $args->{test_base}); # destination # starting point for my $e (@e) { ok(-d $e\, "Previously created $e for testing"); } return @e; }
sub confirm_chdir_via_expected_relpath { my $args = shift; chdir $args->{e}->[1] or die "Unable to chdir to $args->{e}->[1]: $!"; chdir $args->{expected_relpath} or die "Unable to chdir via relative path: $!"; my $thisdir = cwd(); my $expected_thisdir = File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($args->{dest_real})); is($thisdir\, $expected_thisdir\, "chdir via relative path brought us to $expected_thisdir\, as expected"); chdir $args->{startdir} or die "Unable to get back to $args->{startdir}: $!"; return $expected_thisdir; }
sub calculate_relpath_via_abs2rel { my $args = shift; chdir $args->{e}->[1] or die "Unable to chdir to $args->{e}->[1]: $!"; my $calculated_relpath = File::Spec->abs2rel(@{$args->{e}}); is($calculated_relpath\, $args->{expected_relpath}\, "abs2rel() calculated relative path ($calculated_relpath) as expected ($args->{expected_relpath})"); chdir $calculated_relpath or die "Unable to chdir via calculated relative path: $!"; my $thisdir = cwd(); is($thisdir\, $args->{expected_thisdir}\, "chdir via calculated relative path ($calculated_relpath) brought us to $args->{expected_thisdir}\, as expected"); chdir $args->{startdir} or die "Unable to get back to $args->{startdir}: $!"; return 1; }
On Fri\, 24 Aug 2018 16:09:33 GMT\, jkeenan wrote:
On Thu\, 23 Aug 2018 14:46:49 GMT\, jkeenan wrote:
On Wed\, 22 Aug 2018 15:15:15 GMT\, jkeenan wrote:
On Wed\, 22 Aug 2018 09:12:39 GMT\, martin.peylo@nokia.com wrote:
Does the program attached correctly describe your problem?
(When run as 'prove -v 133465-abs2rel-func.t'\, the 4th test fails while the 5th test unexpectedly passes.)
Thank you very much.
Attached is another test file\, written with directories named after the style used in dist/PathTools/t/Spec.t\, which confirms the problem.
The problem lies in this part of the definition of abs2rel() in lib/File/Spec/Unix.pm:
##### while( defined(my $dir= shift @basechunks) ) { if( $dir ne $self->updir ) { unshift @reverse_base\, $self->updir; push @common\, $dir; } elsif( @common ) { if( @reverse_base && $reverse_base[0] eq $self->updir ) { shift @reverse_base; pop @common; } else { unshift @reverse_base\, pop @common; } } } #####
To see a version of this block with some debugging code added\, see: https://github.com/jkeenan/PathTools/tree/rt-133465-abs2rel
Thank you very much.
1. There was one conceptual error in the test file\, 133465-spec- abs2rel.t\, that I attached to this RT yesterday. So please treat that as superseded. I am attaching a new test file\, 2-133465-spec- abs2rel.t\, which (a) corrects that error; (b) refactors a lot of the code into subroutines for readability; and (c) adds an additional test case.
2. Sadly\, the additional test case added in 1(c) shows that we have even more problems with File::Spec->abs2rel() than that reported originally by Martin Peylo. In the case he reported\, there were updirs ('..') in the middle of the base path and an updir at the end of the destination path. The second test case in the attachment pertains to no updirs in the base path and an updir at the end of the destination path. In that case abs2rel() calculates a *valid* relative path -- valid in the sense that if you're in the base directory and use the relative path as the argument to 'chdir'\, you will get to the expected location -- but not the *simplest* relative path. Instead\, in this case abs2rel() calculates a relative path with updirs in it.
3. Not yet examined: cases where there are updirs in the base path.
Thank you very much.
For good measure\, in attachment 3-133465-spec-abs2rel.t\, I have added two more test cases\, in each of which the destination path contains updirs ('..') in the middle of the path.
These cases give results similar to those in the second block\, i.e.\, abs2rel() composes a relative path which is *valid* for the purpose of chdir-ing from the base path to the destination path but which is not the *simplest* possible spelling of that relative path.
Thank you very much. Jim Keenan
-- James E Keenan (jkeenan@cpan.org)
#!/usr/bin/env perl use strict; use warnings; use File::Path 2.15 qw(make_path); use File::Spec; use File::Temp qw(tempdir); use Cwd; use Test::More; #use Data::Dump qw(dd pp);
my $od = cwd(); { my $msg = \<\<END_OF_NOTE; Case 1: Elaboration of case reported in RT 133465: ('t1/t2/t3/..'\, 't1/t2/t3/../../t4') i.e.\, updir at end of dest path and in middle of base path END_OF_NOTE
note($msg);
my $tdir = tempdir(CLEANUP => 1); my $startdir = startdir_setup($tdir);
my $setup_args = {
startdir => $startdir\,
dest_needed => [ 't1/t2/t3' ]\,
base_needed => 't1/t4'\,
dest_real => 't1/t2'\,
relpath_components => [ ".."\, "t2" ]\,
};
my $expected_relpath = manual_directory_setup($setup_args);
my $test_args = {
startdir => $startdir\,
test_dest => 't1/t2/t3/..'\,
test_base => 't1/t2/t3/../../t4'\,
};
my @e = confirm_test_paths_created($test_args);
my $chdir_args = { startdir => $startdir\, expected_relpath => $expected_relpath\, e => [ @e ]\, %{$setup_args}\, }; my $expected_thisdir = confirm_chdir_via_expected_relpath($chdir_args);
my $use_abs2rel_args = { startdir => $startdir\, e => [ @e ]\, expected_relpath => $expected_relpath\, expected_thisdir => $expected_thisdir\, }; calculate_relpath_via_abs2rel($use_abs2rel_args);
chdir $od or die "Unable to get back to where we started: $!"; }
{ my $msg = \<\<END_OF_NOTE; Case 2: updirs are at end of dest path; none in base path: ('t1/t2/t3/..'\, 't1/t5/t6') abs2rel() calculates *valid* relative path but not *simplest* relative path END_OF_NOTE
note($msg);
my $tdir = tempdir(CLEANUP => 1); my $startdir = startdir_setup($tdir);
my $setup_args = { startdir => $startdir\, dest_needed => [ 't1/t2/t3' ]\, base_needed => 't1/t5/t6'\, dest_real => 't1/t2'\, relpath_components => [ ".."\, ".."\, "t2" ]\, }; my $expected_relpath = manual_directory_setup($setup_args);
my $test_args = { startdir => $startdir\, test_dest => 't1/t2/t3/..'\, test_base => 't1/t5/t6'\, }; my @e = confirm_test_paths_created($test_args);
my $chdir_args = { startdir => $startdir\, expected_relpath => $expected_relpath\, e => [ @e ]\, %{$setup_args}\, }; my $expected_thisdir = confirm_chdir_via_expected_relpath($chdir_args);
my $use_abs2rel_args = {
startdir => $startdir\,
e => [ @e ]\,
expected_relpath => $expected_relpath\,
expected_thisdir => $expected_thisdir\,
};
calculate_relpath_via_abs2rel($use_abs2rel_args);
chdir $od or die "Unable to get back to where we started: $!";
}
{ my $msg = \<\<END_OF_NOTE; Case 3: updirs are in middle of dest path; none in base path: ('t1/t2/t3/../../t4/t5'\, 't1/t6/t7') abs2rel() calculates *valid* relative path but not *simplest* relative path END_OF_NOTE
note($msg);
my $tdir = tempdir(CLEANUP => 1); my $startdir = startdir_setup($tdir);
my $setup_args = { startdir => $startdir\, dest_needed => [ 't1/t2/t3'\, 't1/t4/t5' ]\, base_needed => 't1/t6/t7'\, dest_real => 't1/t4/t5'\, relpath_components => [ ".."\, ".."\, "t4"\, "t5" ]\, }; my $expected_relpath = manual_directory_setup($setup_args);
my $test_args = { startdir => $startdir\, test_dest => 't1/t2/t3/../../t4/t5'\, test_base => 't1/t6/t7'\, }; my @e = confirm_test_paths_created($test_args);
my $chdir_args = { startdir => $startdir\, expected_relpath => $expected_relpath\, e => [ @e ]\, %{$setup_args}\, }; my $expected_thisdir = confirm_chdir_via_expected_relpath($chdir_args);
my $use_abs2rel_args = { startdir => $startdir\, e => [ @e ]\, expected_relpath => $expected_relpath\, expected_thisdir => $expected_thisdir\, }; calculate_relpath_via_abs2rel($use_abs2rel_args);
chdir $od or die "Unable to get back to where we started: $!"; }
{ my $msg = \<\<END_OF_NOTE; Case 4: updirs are both in middle of\, and at end of dest path; none in base path: ('t1/t2/t3/../../t4/t5/..'\, 't1/t6/t7') abs2rel() calculates *valid* relative path but not *simplest* relative path END_OF_NOTE
note($msg);
my $tdir = tempdir(CLEANUP => 1); my $startdir = startdir_setup($tdir);
my $setup_args = { startdir => $startdir\, dest_needed => [ 't1/t2/t3'\, 't1/t4/t5' ]\, base_needed => 't1/t6/t7'\, dest_real => 't1/t4'\, relpath_components => [ ".."\, ".."\, "t4"\, "t5"\, ".." ]\, }; my $expected_relpath = manual_directory_setup($setup_args);
my $test_args = { startdir => $startdir\, test_dest => 't1/t2/t3/../../t4/t5/..'\, test_base => 't1/t6/t7'\, }; my @e = confirm_test_paths_created($test_args);
my $chdir_args = { startdir => $startdir\, expected_relpath => $expected_relpath\, e => [ @e ]\, %{$setup_args}\, }; my $expected_thisdir = confirm_chdir_via_expected_relpath($chdir_args);
my $use_abs2rel_args = { startdir => $startdir\, e => [ @e ]\, expected_relpath => $expected_relpath\, expected_thisdir => $expected_thisdir\, }; calculate_relpath_via_abs2rel($use_abs2rel_args);
chdir $od or die "Unable to get back to where we started: $!"; }
done_testing;
#################### SUBROUTINES ####################
sub startdir_setup { my $tdir = shift; my $testingdir = File::Spec->catdir($tdir\, 'testing'); my @created = make_path($testingdir\, { mode => 0711 }); chdir $testingdir or die "Unable to chdir to $testingdir: $!"; my $startdir = cwd(); pass("Starting out from $startdir"); return $startdir; }
sub manual_directory_setup { my $args = shift; my @d = map { File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($_)) } (@{$args->{dest_needed}}\, $args->{base_needed}); my @created = make_path(@d\, { mode => 0711 }); my $destdir = File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($args->{dest_real})); for my $d (@d\, $destdir) { ok(-d $d\, "Created $d for testing"); } chdir $d[1] or die "Unable to chdir to $d[1]: $!"; my $expected_relpath = File::Spec->catdir(@{$args->{relpath_components}}); chdir $expected_relpath or die "Unable to chdir via relative path: $!"; my $thisdir = cwd(); is($thisdir\, $destdir\, "chdir via relative path '$expected_relpath' brought us to $destdir\, as expected"); chdir $args->{startdir} or die "Unable to get back to $args->{startdir}: $!"; return $expected_relpath; }
sub confirm_test_paths_created { my $args = shift; my @e = map { File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($_)) } ($args->{test_dest}\, $args->{test_base}); # destination # starting point for my $e (@e) { ok(-d $e\, "Previously created $e for testing"); } return @e; }
sub confirm_chdir_via_expected_relpath { my $args = shift; chdir $args->{e}->[1] or die "Unable to chdir to $args->{e}->[1]: $!"; chdir $args->{expected_relpath} or die "Unable to chdir via relative path: $!"; my $thisdir = cwd(); my $expected_thisdir = File::Spec->catdir($args->{startdir}\, File::Spec->splitdir($args->{dest_real})); is($thisdir\, $expected_thisdir\, "chdir via relative path brought us to $expected_thisdir\, as expected"); chdir $args->{startdir} or die "Unable to get back to $args->{startdir}: $!"; return $expected_thisdir; }
sub calculate_relpath_via_abs2rel { my $args = shift; chdir $args->{e}->[1] or die "Unable to chdir to $args->{e}->[1]: $!"; my $calculated_relpath = File::Spec->abs2rel(@{$args->{e}}); is($calculated_relpath\, $args->{expected_relpath}\, "abs2rel() calculated relative path ($calculated_relpath) as expected ($args->{expected_relpath})"); chdir $calculated_relpath or die "Unable to chdir via calculated relative path: $!"; my $thisdir = cwd(); is($thisdir\, $args->{expected_thisdir}\, "chdir via calculated relative path ($calculated_relpath) brought us to $args->{expected_thisdir}\, as expected"); chdir $args->{startdir} or die "Unable to get back to $args->{startdir}: $!"; return 1; }
Migrated from rt.perl.org#133465 (status was 'open')
Searchable as RT133465$