sub
run {
my
$self
=
shift
;
$self
->name(
$self
->just_name(
$self
->path ) )
unless
$self
->name;
$self
->version(
$self
->just_version(
$self
->path ) )
unless
$self
->version;
$self
->
log
->info(
'run source '
.
$self
->name .
': '
.
$self
->source );
$self
->_update_version(
$self
->name,
$self
->version );
$self
->_update_url(
$self
->name,
'file:'
.
$self
->source )
unless
$self
->{_no_update_url};
my
$newer
=
$self
->_cmd;
my
$ret
=
$self
->SUPER::run(
@_
);
$self
->_follow( catdir(
$self
->directory,
$self
->name ) )
if
$self
->follow &&
$newer
;
return
catdir(
$self
->directory,
$self
->name );
}
sub
path {
my
$self
=
shift
;
return
$self
->{_path}
if
$self
->{_path};
my
$source
=
$self
->source;
my
$ae
= Archive::Extract->new(
archive
=>
$source
);
my
$tmp_dir
= tempdir(
'shipwright_tmp_XXXXXX'
,
CLEANUP
=> 1,
TMPDIR
=> 1 );
$ae
->extract(
to
=>
$tmp_dir
);
my
$files
=
$ae
->files;
my
$base_dir
=
$files
->[0];
if
(
@$files
!=
grep
{ /^\Q
$base_dir
\E/ }
@$files
) {
croak
'only support compressed file which contains only one directory'
;
}
$base_dir
=~ s![/\\]$!!;
$self
->{_path} =
$base_dir
;
return
$base_dir
;
}
sub
_cmd {
my
$self
=
shift
;
my
$arg
;
my
(
$from
,
$to
);
$from
= catdir(
$self
->directory,
$self
->path );
$to
= catdir(
$self
->directory,
$self
->name );
return
if
-e
$to
;
my
$ae
= Archive::Extract->new(
archive
=>
$self
->source );
my
@cmds
;
push
@cmds
,
sub
{
$ae
->extract(
to
=>
$self
->directory ) };
if
(
$from
ne
$to
) {
push
@cmds
, [
'mv'
,
$from
,
$to
];
}
return
@cmds
;
}
1;