This is an automated email from the git hooks/post-receive script.

jamessan pushed a commit to branch master
in repository devscripts.

commit e14703c3f193f8e091430aaa2c542f328c52333a
Author: James McCoy <[email protected]>
Date:   Sun Jan 31 15:22:09 2016 -0500

    dd-list: Use apt interfaces to access Sources files
    
    As described in <[email protected]>, directly accessing
    the files under /var/lib/apt/lists is error prone.  APT provides
    command-line interfaces to both determine the names of files and get
    their contents, regardless of whether or how they're compressed.
    
    Signed-off-by: James McCoy <[email protected]>
---
 debian/changelog   |  3 +++
 scripts/dd-list.pl | 67 +++++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 59 insertions(+), 11 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 868cd21..164640c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -29,6 +29,9 @@ devscripts (2.16.1) UNRELEASED; urgency=medium
     The specific commands aren't interesting, so much as the steps that the
     build goes through.  Fixes FTBFS due to new dh_update_autotools_config
     command.  (Closes: #812661)
+  * dd-list:
+    + Use apt interfaces to find sources files and extract their contents,
+      instead of globbing and directly reading files.
 
   [ Christoph Berg ]
   * debcheckout: Add auth mapping for https://github.com.
diff --git a/scripts/dd-list.pl b/scripts/dd-list.pl
index fb5721f..b450795 100755
--- a/scripts/dd-list.pl
+++ b/scripts/dd-list.pl
@@ -25,6 +25,7 @@ use warnings;
 use FileHandle;
 use Getopt::Long qw(:config gnu_getopt);
 use Dpkg::Version;
+use Dpkg::IPC;
 
 my $uncompress;
 
@@ -241,25 +242,69 @@ else {
        $package_name{normalize_package($name)} = 1;
     }
 
+    my $apt_version;
+    spawn(exec => ['dpkg-query', '-W', '-f', '${source:Version}', 'apt'],
+         to_string => \$apt_version,
+         wait_child => 1,
+         nocheck => 1);
+
+    my $useAptHelper = 0;
+    if (defined $apt_version)
+    {
+       $useAptHelper = version_compare_relation($apt_version, REL_GE, '1.1.8');
+    }
+
     unless (@{$source_files}) {
-       $source_files = [glob('/var/lib/apt/lists/*_source_Sources')];
+       if ($useAptHelper)
+       {
+           my ($sources, $err);
+           spawn(exec => ['apt-get', 'indextargets', '--format', '$(FILENAME)',
+                          'Created-By: Sources'],
+                 to_string => \$sources,
+                 error_to_string => \$err,
+                 wait_child => 1,
+                 nocheck => 1);
+           if ($? >> 8)
+           {
+               die "Unable to get list of Sources files from apt: $err\n";
+           }
+
+           $source_files = [split(/\n/, $sources)];
+       }
+       else
+       {
+           $source_files = [glob('/var/lib/apt/lists/*_source_Sources')];
+       }
     }
 
     foreach my $source (@{$source_files}) {
        my $fh;
-       if ($opt_uncompress || ($uncompress && $source =~ m/\.(?:gz|bz2)$/)) {
-           $fh = IO::Uncompress::AnyUncompress->new($source);
-       }
-       else {
-           $fh = FileHandle->new("<$source");
+       if ($useAptHelper)
+       {
+           my $good = open($fh, '-|', '/usr/lib/apt/apt-helper', 'cat-file', 
$source);
+           if (!$good)
+           {
+               warn "E: Couldn't run apt-helper to get contents of '$source': 
$!\n";
+               $errors = 1;
+               next;
+           }
        }
-       unless (defined $fh) {
-           warn "E: Couldn't open $source\n";
-           $errors = 1;
-           next;
+       else
+       {
+           if ($opt_uncompress || ($uncompress && $source =~ 
m/\.(?:gz|bz2)$/)) {
+               $fh = IO::Uncompress::AnyUncompress->new($source);
+           }
+           else {
+               $fh = FileHandle->new("<$source");
+           }
+           unless (defined $fh) {
+               warn "E: Couldn't open $source\n";
+               $errors = 1;
+               next;
+           }
        }
        parsefh($fh, $source, 1);
-       $fh->close;
+       close $fh;
     }
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/collab-maint/devscripts.git

_______________________________________________
devscripts-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/devscripts-devel

Reply via email to