]> err.no Git - dpkg/commitdiff
Deperecate a symbol only when the history of version matches.
authorRaphael Hertzog <hertzog@debian.org>
Tue, 14 Aug 2007 13:22:23 +0000 (15:22 +0200)
committerRaphael Hertzog <hertzog@debian.org>
Tue, 14 Aug 2007 13:22:23 +0000 (15:22 +0200)
When merging symbols in a SymbolFile, a symbol is deprecated when it has
disappeared from the new set of symbols. However when the new set of
symbols dates back to before the current one, deprecating doesn't make
sense. This patch corrects this behaviour. Also add a test to verify that
symbols got correctly marked as deprecated.

scripts/Dpkg/Shlibs/SymbolFile.pm
scripts/t/200_Dpkg_Shlibs.t

index f1d0bedeea709b8052afc0f07dc77fc34ff4bd57..051e7eb947fbd1febbef88f90bf5dd44f084436f 100644 (file)
@@ -223,10 +223,14 @@ sub merge_symbols {
     }
 
     # Scan all symbols in the file and mark as deprecated those that are
-    # no more provided
+    # no more provided (only if the minver is bigger than the version where
+    # the symbol was introduced)
     foreach my $sym (keys %{$self->{objects}{$soname}{syms}}) {
        if (! exists $dynsyms{$sym}) {
-           $self->{objects}{$soname}{syms}{$sym}{deprecated} = $minver;
+           my $info = $self->{objects}{$soname}{syms}{$sym};
+           if (vercmp($minver, $info->{minver}) > 0) {
+               $self->{objects}{$soname}{syms}{$sym}{deprecated} = $minver;
+           }
        }
     }
 }
@@ -256,11 +260,13 @@ sub get_dependency {
 }
 
 sub lookup_symbol {
-    my ($self, $name, $sonames) = @_;
+    my ($self, $name, $sonames, $inc_deprecated) = @_;
+    $inc_deprecated = 0 unless defined($inc_deprecated);
     foreach my $so (@{$sonames}) {
        next if (! exists $self->{objects}{$so});
        if (exists $self->{objects}{$so}{syms}{$name} and
-           not $self->{objects}{$so}{syms}{$name}{deprecated})
+           ($inc_deprecated or not
+           $self->{objects}{$so}{syms}{$name}{deprecated}))
        {
            my $dep_id = $self->{objects}{$so}{syms}{$name}{dep_id};
            return {
index ec12a8c87e4fbdd3292bdfc3aeb569c3d0809a79..b2e3fef78100952ae945830ab72cb82c1a1a5551 100644 (file)
@@ -1,6 +1,6 @@
 # -*- mode: cperl;-*-
 
-use Test::More tests => 25;
+use Test::More tests => 26;
 
 use strict;
 use warnings;
@@ -79,6 +79,10 @@ ok( $sym_file_old->has_lost_symbols($sym_file), 'has lost symbols' );
 is( $sym_file_old->lookup_symbol('__bss_start@Base', ['libc.so.6']),
     undef, 'internal symbols are blacklisted');
 
+$sym = $sym_file->lookup_symbol('_errno@GLIBC_2.0', ['libc.so.6'], 1);
+is_deeply($sym, { 'minver' => '2.3.6.ds1-13', 'dep_id' => 0, 
+                 'deprecated' => '2.6-1', 'depends' => '', 
+                 'soname' => 'libc.so.6' }, 'deprecated symbol');
 
 use File::Temp;