summaryrefslogtreecommitdiffstats
path: root/Bugzilla.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla.pm')
-rw-r--r--Bugzilla.pm55
1 files changed, 13 insertions, 42 deletions
diff --git a/Bugzilla.pm b/Bugzilla.pm
index 032d08355..4c983bd1f 100644
--- a/Bugzilla.pm
+++ b/Bugzilla.pm
@@ -35,6 +35,7 @@ use Bugzilla::Field;
use Bugzilla::Flag;
use Bugzilla::Install::Localconfig qw(read_localconfig);
use Bugzilla::Install::Util qw(init_console include_languages i_am_persistent);
+use Bugzilla::Install::Requirements qw(load_cpan_meta check_cpan_feature);
use Bugzilla::Memcached;
use Bugzilla::Template;
use Bugzilla::Token;
@@ -243,28 +244,19 @@ sub api_server {
return $cache->{api_server};
}
-use constant _CAN_HAS_FEATURE => eval {
- require CPAN::Meta;
- require Module::Runtime;
- require CPAN::Meta::Check;
- Module::Runtime->import(qw(require_module));
- CPAN::Meta::Check->import(qw(verify_dependencies));
- 1;
- };
-
sub feature {
my ($class, $feature_name) = @_;
- return 0 unless _CAN_HAS_FEATURE;
- return unless $class->has_feature($feature_name);
+ return 0 unless CAN_HAS_FEATURE;
+ return 0 unless $class->has_feature($feature_name);
- my $cache = $class->request_cache;
- my $feature = $cache->{feature_map}{$feature_name};
+ my $cache = $class->process_cache;
+ my $feature = $cache->{cpan_meta}->feature($feature_name);
# Bugzilla expects this will also load all the modules.. so we have to do that.
# Later we should put a deprecation warning here, and favor calling has_feature().
return 1 if $cache->{feature_loaded}{$feature_name};
- my @modules = $feature->requirements_for('runtime', 'requires')->required_modules;
- require_module($_) foreach @modules;
+ my @modules = $feature->prereqs->merged_requirements->required_modules;
+ Module::Runtime::require_module($_) foreach @modules;
$cache->{feature_loaded}{$feature_name} = 1;
return 1;
}
@@ -272,38 +264,17 @@ sub feature {
sub has_feature {
my ($class, $feature_name) = @_;
- return 0 unless _CAN_HAS_FEATURE;
+ return 0 unless CAN_HAS_FEATURE;
- my $cache = $class->request_cache;
+ my $cache = $class->process_cache;
return $cache->{feature}->{$feature_name}
if exists $cache->{feature}->{$feature_name};
- my $dir = bz_locations()->{libpath};
- my $feature_map = $cache->{feature_map} //= do {
- my @meta_json = map { File::Spec->catfile($dir, $_) } qw( MYMETA.json META.json );
- my $file = first { -f $_ } @meta_json;
- my %map;
- if ($file) {
- open my $meta_fh, '<', $file or die "unable to open $file: $!";
- my $str = do { local $/ = undef; scalar <$meta_fh> };
- trick_taint($str);
- close $meta_fh;
-
- my $meta = CPAN::Meta->load_json_string($str);
-
- foreach my $feature ($meta->features) {
- $map{$feature->identifier} = $feature->prereqs;
- }
- }
-
- \%map;
- };
-
- ThrowCodeError('invalid_feature', { feature => $feature_name }) if !$feature_map->{$feature_name};
- my $success = !verify_dependencies($feature_map->{$feature_name}, 'runtime', 'requires');
+ my $meta = $cache->{cpan_meta} //= load_cpan_meta();
+ my $feature = eval { $meta->feature($feature_name) }
+ or ThrowCodeError('invalid_feature', { feature => $feature_name });
- $cache->{feature}{$feature_name} = $success;
- return $success;
+ return $cache->{feature}{$feature_name} = check_cpan_feature($feature)->{ok};
}
sub cgi {