[Pkg-asv-commits] r44 - in trunk: . debian
Andreas Hoenen
ahoenen-guest at alioth.debian.org
Sun May 17 09:22:18 UTC 2009
Author: ahoenen-guest
Date: 2009-05-17 09:22:18 +0000 (Sun, 17 May 2009)
New Revision: 44
Modified:
trunk/apt-show-versions
trunk/debian/changelog
Log:
BTS #515328:
Fix "use of uninitialized value" warnings:
Improve call strategy of determine_pkgfile_release(), that is augmentation of
missing values of the %releasenames structure:
Obviously the previous strategy of calling the augmentation function at the
start of print_package() for each %apackages release of the current package is
not sufficient in special situations: some structure records keep missing
afterwards, but get refered, resulting in the observed warnings.
Thus protect each access of the %releasenames structure with functions
get_ret_(codename|name|suite) that augment missing values on the fly.
PLEASE NOTE:
Unfortunately I have not managed to reproduce the error scenario depite of both
extensive trials and deep code analysis. I just don't understand what happens
exactly to let the previous strategy become insufficient. Thus I'm not able to
test the fix against the error scenario, but have to rely on the error messages
and their analysis.
Observations regarding the error scenario:
- The error scenario seems to be related to a stale $apackagescachefile, which
is caused by removing a repository from sources.list followed by 'apt-get
update', but before the next rebuild of the a-s-v cache files.
- The error scenario gets resolved with the next rebuild of the a-s-v cache
files (e.g. triggered by the daily cron run), thus the patch can't be tested
against the error scenario even by the reporters.
Modified: trunk/apt-show-versions
===================================================================
--- trunk/apt-show-versions 2008-09-16 08:24:10 UTC (rev 43)
+++ trunk/apt-show-versions 2009-05-17 09:22:18 UTC (rev 44)
@@ -323,9 +323,7 @@
sub print_package {
my ($package) = @_;
- # Guarantee existence of %releasenames records for all releases of package
- # and sort the releases according to this information.
- &determine_pkgfile_release($_) foreach (keys(%{$apackages->{$package}}));
+ # Sort all releases of package.
my @pkg_releases = sort sort_pkg_releases values(%{$apackages->{$package}});
# All print information of package must be buffered, as the decision
@@ -358,8 +356,7 @@
foreach my $pkg (@pkg_releases) {
# First handle missing official suites to be listed before current
# release.
- my $cur_idx =
- $official_suites{$releasenames{$pkg->{$RELEASE}}{$SUITE}};
+ my $cur_idx = $official_suites{&get_rel_suite($pkg->{$RELEASE})};
if (defined $cur_idx) {
# Current release is an official one:
# List prepending missing suites.
@@ -375,11 +372,11 @@
(my $archive = $pkg->{$RELEASE}) =~ s/_.*//;
push @print_info, {$PACKAGE => $pkg->{$PACKAGE},
$VERSION => $pkg->{$VERSION},
- $NAME => $releasenames{$pkg->{$RELEASE}}{$NAME},
+ $NAME => &get_rel_name($pkg->{$RELEASE}),
$ARCHIVE => $archive};
$max_package_len = &max(length($pkg->{$PACKAGE}), $max_package_len);
$max_version_len = &max(length($pkg->{$VERSION}), $max_version_len);
- $max_name_len = &max(length($releasenames{$pkg->{$RELEASE}}{$NAME}),
+ $max_name_len = &max(length(&get_rel_name($pkg->{$RELEASE})),
$max_name_len);
}
# Finally handle missing official suites after last existing release.
@@ -409,7 +406,7 @@
if ($version) {
my @version_info;
($found, @version_info) =
- &print_version($releasenames{$_->{$RELEASE}}{$NAME},
+ &print_version(&get_rel_name($_->{$RELEASE}),
$package, $iversion, $version, $cand);
push @print_info, @version_info if ($found);
$aversion = $version;
@@ -451,7 +448,7 @@
push(@print_info,
$package,
'/',
- $releasenames{$release->{$RELEASE}}{$NAME},
+ &get_rel_name($release->{$RELEASE}),
(defined($opts{'brief'})) ? "\n" :
" *manually* upgradeable from $iversion to " .
"$aversion\n");
@@ -678,9 +675,8 @@
if ($releases[$idx]->{$VERSION} eq
$releases[$move_idx]->{$VERSION}) {
# Current release is of same version as move candidate.
- if ($releasenames{$rel_key}{$SUITE} eq $default_release or
- $releasenames{$rel_key}{$CODENAME}
- eq $default_release) {
+ if (&get_rel_suite($rel_key) eq $default_release
+ or &get_rel_codename($rel_key) eq $default_release) {
# Move current release before move candidate in order to
# place default release first.
my $rel = splice @releases, $idx, 1;
@@ -695,8 +691,8 @@
}
unless (defined $move_idx) {
# Test whether current release is move candidate.
- if ($releasenames{$rel_key}{$SUITE} ne $default_release and
- $releasenames{$rel_key}{$CODENAME} ne $default_release) {
+ if (&get_rel_suite($rel_key) ne $default_release
+ and &get_rel_codename($rel_key) ne $default_release) {
$move_idx = $idx;
}
}
@@ -715,11 +711,10 @@
sub sort_pkg_releases {
my $cmp_versions = $vs->compare($a->{$VERSION}, $b->{$VERSION});
return $cmp_versions if ($cmp_versions);
- my $cmp_suites = (&suite_idx($releasenames{$a->{$RELEASE}}{$SUITE}) <=>
- &suite_idx($releasenames{$b->{$RELEASE}}{$SUITE}));
+ my $cmp_suites = (&suite_idx(&get_rel_suite($a->{$RELEASE})) <=>
+ &suite_idx(&get_rel_suite($b->{$RELEASE})));
return $cmp_suites if ($cmp_suites);
- return($releasenames{$a->{$RELEASE}}{$NAME} cmp
- $releasenames{$b->{$RELEASE}}{$NAME});
+ return(&get_rel_name($a->{$RELEASE}) cmp &get_rel_name($b->{$RELEASE}));
}
################################################################################
@@ -741,6 +736,26 @@
die @_;
}
+################################################################################
+# Access function for the fields of the %releasenames structure
+# Missing fields are augmented on the fly (compare BTS report #515328).
+################################################################################
+sub get_rel_codename {
+ my $rel_key = shift;
+ &determine_pkgfile_release($rel_key) unless $releasenames{$rel_key};
+ return $releasenames{$rel_key}{$CODENAME};
+}
+sub get_rel_name {
+ my $rel_key = shift;
+ &determine_pkgfile_release($rel_key) unless $releasenames{$rel_key};
+ return $releasenames{$rel_key}{$NAME};
+}
+sub get_rel_suite {
+ my $rel_key = shift;
+ &determine_pkgfile_release($rel_key) unless $releasenames{$rel_key};
+ return $releasenames{$rel_key}{$SUITE};
+}
+
# script documentation (POD style)
=head1 NAME
Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog 2008-09-16 08:24:10 UTC (rev 43)
+++ trunk/debian/changelog 2009-05-17 09:22:18 UTC (rev 44)
@@ -1,3 +1,11 @@
+apt-show-versions (0.16) UNRELEASED; urgency=low
+
+ * Harden code regarding releases for which properties like their name are
+ unknown, thus avoiding perl warnings about uninitialized values. Thanks to
+ John V. Belmonte and Anders Boström for reporting. (Closes: #515328)
+
+ -- Andreas Hoenen <andreas at hoenen-terstappen.de> Sun, 17 May 2009 09:36:24 +0200
+
apt-show-versions (0.15) unstable; urgency=low
[ Christoph Martin ]
More information about the Pkg-asv-commits
mailing list