[SCM] Debian package checker branch, master, updated. 2.5.10-159-g7b8db3d
The following commit has been merged in the master branch:
commit 7facd696bfcce54539dcfa41f963453c01ea2f36
Author: Niels Thykier <niels@thykier.net>
Date: Fri Sep 21 15:08:17 2012 +0200
L::Lab: Split "processable" and "get" case in get_package
Split the "processable" case (where a processable is passed) from the
"directly look up" case. Rewrite L::Lab::Entry's old constructor to
handle the "processable" case.
Signed-off-by: Niels Thykier <niels@thykier.net>
diff --git a/lib/Lintian/Lab.pm b/lib/Lintian/Lab.pm
index 8eca5d6..450a80c 100644
--- a/lib/Lintian/Lab.pm
+++ b/lib/Lintian/Lab.pm
@@ -251,7 +251,6 @@ L<create|Lintian::Lab::Entry/create> method on the entry.
sub get_package {
my ($self, $pkg, $pkg_type, $pkg_version, $pkg_arch) = @_;
my $pkg_name;
- my $pkg_path;
my @entries;
my $index;
my $proc;
@@ -263,11 +262,14 @@ sub get_package {
# circular references (and weaken may be un-available)
if (blessed $pkg && $pkg->isa ('Lintian::Processable')) {
+ if ($pkg->isa ('Lintian::Lab::Entry') and $pkg->from_lab ($self)) {
+ # Shouldn't happen too often, but ...
+ return $pkg;
+ }
$pkg_name = $pkg->pkg_name;
$pkg_type = $pkg->pkg_type;
$pkg_version = $pkg->pkg_version;
$pkg_arch = $pkg->pkg_arch;
- $pkg_path = $pkg->pkg_path;
$proc = $pkg;
} else {
$pkg_name = $pkg;
@@ -276,24 +278,22 @@ sub get_package {
$index = $self->_get_lab_index ($pkg_type);
- if (defined $pkg_version && (defined $pkg_arch || $pkg_type eq 'source')) {
+ if ($proc) {
+ my $pkg_src = $proc->pkg_src;
+ my $dir = $self->_pool_path ($pkg_src, $pkg_type, $pkg_name, $pkg_version, $pkg_arch);
+ push @entries, Lintian::Lab::Entry->_new_from_proc ($proc, $self, $dir);
+ } elsif (defined $pkg_version && (defined $pkg_arch || $pkg_type eq 'source')) {
# We know everything - just do a regular look up
my $dir;
my @keys = ($pkg_name, $pkg_version);
- my $e;
- my ($pkg_src, $pkg_src_version);
+ my $entry;
+ my $pkg_src;
push @keys, $pkg_arch if $pkg_type ne 'source';
- if ($proc) {
- $pkg_src = $proc->pkg_src;
- $pkg_src_version = $proc->pkg_src_version;
- } else {
- $e = $index->get (@keys);
- return unless $e;
- $pkg_src = $e->{'source'};
- $pkg_src_version = $e->{'source-version'};
- }
+ $entry = $index->get (@keys);
+ return unless $entry;
+ $pkg_src = $entry->{'source'};
$dir = $self->_pool_path ($pkg_src, $pkg_type, $pkg_name, $pkg_version, $pkg_arch);
- push @entries, Lintian::Lab::Entry->_new ($self, $pkg_name, $pkg_version, $pkg_arch, $pkg_type, $pkg_path, $pkg_src, $pkg_src_version, $dir);
+ push @entries, Lintian::Lab::Entry->new_from_metadata ($pkg_type, $entry, $self, $dir);
} else {
# clear $pkg_arch if it is a source package - it simplifies
# the search code below
diff --git a/lib/Lintian/Lab/Entry.pm b/lib/Lintian/Lab/Entry.pm
index 792d0e7..ea3aa45 100644
--- a/lib/Lintian/Lab/Entry.pm
+++ b/lib/Lintian/Lab/Entry.pm
@@ -116,20 +116,21 @@ sub new_from_metadata {
}
# private constructor (called by Lintian::Lab)
-sub _new {
- my ($type, $lab, $pkg_name, $pkg_version, $pkg_arch, $pkg_type, $pkg_path, $pkg_src, $pkg_src_version, $base_dir) = @_;
+sub _new_from_proc {
+ my ($type, $proc, $lab, $base_dir) = @_;
my $self = {};
+ my $pkg_path = $proc->pkg_path;
bless $self, $type;
- $self->{pkg_name} = $pkg_name;
- $self->{pkg_version} = $pkg_version;
- $self->{pkg_type} = $pkg_type;
- $self->{pkg_src} = $pkg_src;
- $self->{pkg_src_version} = $pkg_src_version;
+ $self->{pkg_name} = $proc->pkg_name;
+ $self->{pkg_version} = $proc->pkg_version;
+ $self->{pkg_type} = $proc->pkg_type;
+ $self->{pkg_src} = $proc->pkg_src;
+ $self->{pkg_src_version} = $proc->pkg_src_version;
$self->{lab} = $lab;
$self->{info} = undef; # load on demand.
$self->{coll} = {};
- if ($pkg_type ne 'source') {
- $self->{pkg_arch} = $pkg_arch;
+ if ($self->pkg_type ne 'source') {
+ $self->{pkg_arch} = $proc->pkg_arch;
} else {
$self->{pkg_arch} = 'source';
}
@@ -139,6 +140,15 @@ sub _new {
$self->_init ($pkg_path);
$self->_make_identifier;
+ if ($proc->isa ('Lintian::Processable::Package')) {
+ my $ctrl = $proc->_ctrl_fields;
+ if ($ctrl) {
+ # The processable has already loaded the fields, cache them to save
+ # info from doing it later...
+ $self->{info} = Lintian::Collect->new ($self->pkg_name, $self->pkg_type,
+ $self->base_dir, $ctrl);
+ }
+ }
return $self;
}
diff --git a/lib/Lintian/Processable/Package.pm b/lib/Lintian/Processable/Package.pm
index 1ac0101..af47004 100644
--- a/lib/Lintian/Processable/Package.pm
+++ b/lib/Lintian/Processable/Package.pm
@@ -207,6 +207,17 @@ sub _derive_name {
return $name;
}
+# $proc->_ctrl_fields
+#
+# Return a hashref of the control fields if available. Used by
+# L::Lab::Entry to avoid (re-)loading the fields from the control
+# file.
+sub _ctrl_fields {
+ my ($self) = @_;
+ return $self->{'extra-fields'} if exists $self->{'extra-fields'};
+ return;
+}
+
=item $proc->info
Overrides info from L<Lintian::Processable>.
--
Debian package checker
Reply to: