$App::Embra::App::Command::listdeps::VERSION
=
'0.001'
;
sub
abstract {
'list required plugins'
}
sub
opt_spec {
return
(
[
'root=s'
=>
'where to find embra.ini; defaults to .'
],
[
'missing'
=>
'list only the missing dependencies'
],
[
'versions'
=>
'include required version numbers in listing'
],
);
}
sub
execute {
my
(
$self
,
$opt
,
$arg
) =
@_
;
my
$deps
= _format_deps(
_extract_deps(
Path::Class::dir(
defined
$opt
->root ?
$opt
->root :
'.'
),
$opt
->missing,
),
$opt
->versions
);
if
(
$deps
) {
print
$deps
,
"\n"
;
}
}
sub
_extract_deps {
my
(
$root
,
$missing
) =
@_
;
my
$ini
=
$root
->file(
'embra.ini'
);
die
"embra listdeps only works on embra.ini files, and I couldn't find one at: $ini\n"
unless
-e
$ini
;
my
$fh
=
$ini
->openr;
my
$config
= Config::INI::Reader->read_handle(
$fh
);
my
$reqs
= CPAN::Meta::Requirements->new;
delete
$config
->{_};
for
my
$sec
(
keys
%$config
) {
my
(
$p
,
$n
) =
split
qr{ [ ]* / [ ]* }
xms,
$sec
;
if
(
defined
$n
) {
my
$v
=
delete
$config
->{
$sec
};
$v
->{_name} ||=
$n
;
$config
->{
$p
} =
$v
;
}
}
my
@packs
=
keys
%$config
;
foreach
my
$pack
(
@packs
) {
my
$version
= 0;
if
(
exists
$config
->{
$pack
} &&
exists
$config
->{
$pack
}->{
':version'
}) {
$version
=
$config
->{
$pack
}->{
':version'
};
}
my
$realname
= App::Embra::Util->expand_config_package_name(
$pack
);
$reqs
->add_minimum(
$realname
=>
$version
);
if
( not Class::Inspector->loaded(
$realname
) ) {
Module::Runtime::require_module
$realname
;
}
if
(
$realname
->does(
'App::Embra::Role::ExtraListDeps'
) ) {
$realname
->add_extra_deps(
config
=>
$config
->{
$pack
},
reqs
=>
$reqs
)
}
}
seek
$fh
, 0, 0;
my
$in_filter
= 0;
while
(<
$fh
>) {
next
unless
$in_filter
or /^\[\s*\
@Filter
/;
$in_filter
= 0,
next
if
/^\[/ and ! /^\[\s*\
@Filter
/;
$in_filter
= 1;
next
unless
/\A-bundle\s*=\s*([^;\s]+)/;
my
$pname
= $1;
chomp
(
$pname
);
$reqs
->add_minimum(App::Embra::Util->expand_config_package_name($1) => 0)
}
seek
$fh
, 0, 0;
my
@packages
;
while
(<
$fh
>) {
chomp
;
next
unless
/\A\s*;\s
*extradep
\s*(\S+)\s*(=\s*(\S+))?\s*\z/;
my
$ver
=
defined
$3 ? $3 :
"0"
;
push
@packages
, $1;
$reqs
->add_minimum($
1
=>
$ver
);
}
my
$vermap
=
$reqs
->as_string_hash;
push
(
@packages
,
sort
keys
%{
$vermap
});
@packages
= ((
sort
grep
/^inc::/,
@packages
), (
grep
!/^inc::/,
@packages
));
my
@final
=
map
{ {
$_
=>
$vermap
->{
$_
} } }
grep
{
$missing
? (! Class::Load::try_load_class(
$_
, (
$vermap
->{
$_
} ? {
-version
=>
$vermap
->{
$_
}} : ()))) : 1 }
List::MoreUtils::uniq(
@packages
);
return
\
@final
;
}
sub
_format_deps {
my
(
$reqs
,
$versions
) =
@_
;
my
$formatted
=
''
;
foreach
my
$rec
(@{
$reqs
}) {
my
(
$mod
,
$ver
) =
each
(%{
$rec
});
$formatted
.=
$versions
?
"$mod = $ver\n"
:
"$mod\n"
;
}
chomp
(
$formatted
);
return
$formatted
;
}
1;