———package
Test::Smoke::Syncer::Hardlink;
use
warnings;
use
strict;
our
$VERSION
=
'0.029'
;
=head1 Test::Smoke::Syncer::Hardlink
This handles syncing by copying the source-tree from a local directory
using the B<link> function. This can be used as an alternative for
B<make distclean>.
Thanks to Nicholas Clark for donating this suggestion!
=cut
require
File::Find;
=head2 Test::Smoke::Syncer::Hardlink->new( %args )
Keys for C<%args>:
* ddir: destination directory
* hdir: source directory
* v: verbose
=cut
=head2 $syncer->sync( )
C<sync()> uses the B<File::Find> module to make the hardlink forest in {ddir}.
=cut
sub
sync {
my
$self
=
shift
;
$self
->pre_sync;
-d
$self
->{ddir} or File::Path::mkpath(
$self
->{ddir} );
my
$source_dir
= File::Spec->canonpath(
$self
->{hdir} );
File::Find::find(
sub
{
my
$dest
= File::Spec->abs2rel(
$File::Find::name
,
$source_dir
);
# nasty thing in older File::Spec::Win32::abs2rel()
$^O eq
'MSWin32'
and
$dest
=~ s|^[a-z]:(?![/\\])||i;
$dest
= File::Spec->catfile(
$self
->{ddir},
$dest
);
if
( -d ) {
mkdir
$dest
, (
stat
_)[2] & 07777;
}
else
{
-e
$dest
and 1
while
unlink
$dest
;
$self
->{v} > 1 and
"link $_ $dest"
;
my
$ok
=
$self
->{haslink}
?
link
$_
,
$dest
: File::Copy::copy(
$_
,
$dest
);
if
(
$self
->{v} > 1 ) {
$ok
?
" OK\n"
:
" $!\n"
;
}
}
},
$source_dir
);
$self
->clean_from_directory(
$source_dir
);
$self
->post_sync;
return
$self
->check_dot_patch();
}
1;
=head1 COPYRIGHT
(c) 2002-2013, All rights reserved.
* Abe Timmerman <abeltje@cpan.org>
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
See:
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
=cut