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
