[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: