]> err.no Git - dpkg/commitdiff
dpkg-shlibdeps: optimize "dpkg -S" lookups by caching results
authorRaphael Hertzog <hertzog@debian.org>
Fri, 23 Nov 2007 21:41:29 +0000 (22:41 +0100)
committerRaphael Hertzog <hertzog@debian.org>
Fri, 23 Nov 2007 21:41:29 +0000 (22:41 +0100)
ChangeLog
debian/changelog
scripts/dpkg-shlibdeps.pl

index 93b370bc0b77bbfc80e05370f83677b2719e3829..d62de5a6e3ef4fb0d464360319bcbbe9a0143638 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-23  Raphael Hertzog  <hertzog@debian.org>
+
+       * scripts/dpkg-shlibdeps.pl: Apply patch from Aaron M. Ucko
+       <ucko@debian.org> to optimize "dpkg -S" lookups by caching
+       results.
+
 2007-11-23  Raphael Hertzog  <hertzog@debian.org>
 
        * scripts/dpkg-shlibdeps.pl: Limit the number of warnings
index 3634d4b5c45af2d18318fca4ee2252fe9f17de97..02f82aea60349d8c7c93785ec60cadf8a29fc5a6 100644 (file)
@@ -1,11 +1,14 @@
 dpkg (1.14.11) UNRELEASED; urgency=low
 
+  [ Raphael Hertzog ]
   * dpkg-shlibdeps now ignores the lack of dependency information in some
     specific cases (instead of failing):
     - when the library is in the same package than the binary analyzed
     - when the library is not versionned and can't have a shlibs file
   * dpkg-shlibdeps now only displays 10 warnings about symbols not found for
     each binary and a count of skipped warnings. Closes: #452318
+  * dpkg-shlibdeps: optimize "dpkg -S" lookups by caching results, patch
+    from Aaron M. Ucko <ucko@debian.org>. Closes: #452577
 
  -- Guillem Jover <guillem@debian.org>  Fri, 23 Nov 2007 06:50:02 +0200
 
index fa81c2367fe38f2ac84bc675a26a4c4eb682e067..438eaaceeef4420f6bb195ace99dbe4ea6c6438e 100755 (executable)
@@ -518,9 +518,22 @@ sub my_find_library {
     return undef;
 }
 
+my %cached_pkgmatch = ();
+
 sub find_packages {
-    my @files = (@_);
+    my @files;
     my $pkgmatch = {};
+
+    foreach (@_) {
+       if (exists $cached_pkgmatch{$_}) {
+           $pkgmatch->{$_} = $cached_pkgmatch{$_};
+       } else {
+           push @files, $_;
+           $cached_pkgmatch{$_} = [""]; # placeholder to cache misses too.
+       }
+    }
+    return $pkgmatch unless scalar(@files);
+
     my $pid = open(DPKG, "-|");
     syserr(_g("cannot fork for dpkg --search")) unless defined($pid);
     if (!$pid) {
@@ -538,7 +551,7 @@ sub find_packages {
            print(STDERR " $_\n")
                || syserr(_g("write diversion info to stderr"));
        } elsif (m/^([^:]+): (\S+)$/) {
-           $pkgmatch->{$2} = [ split(/, /, $1) ];
+           $cached_pkgmatch{$2} = $pkgmatch->{$2} = [ split(/, /, $1) ];
        } else {
            warning(_g("unknown output from dpkg --search: '%s'"), $_);
        }