[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#178203: patch for178203 - dpkg-dev: dpkg-shlibdeps should report only the strictest of multiple versioned dependencies on the same package



I've tried to put together a patch for this.
It gets the dependencies right for my /usr/bin/*, but might need more review.

Cheers

T.
--- /usr/bin/dpkg-shlibdeps	Sun Sep 15 20:36:46 2002
+++ /semitmp/dpkg/dpkg-shlibdeps	Thu Mar 27 18:51:31 2003
@@ -221,6 +221,11 @@
           "dependency field $libf[$i])");
 }
 
+sub doesmatch {
+    my ($ver1, $cmp, $ver2) = @_;
+    return ! system("dpkg", "--compare-versions",$ver1,$cmp,$ver2);
+}
+
 sub scanshlibsfile {
     my ($fn,$ln,$lsn,$lf) = @_;
     my ($da,$dv,$dk);
@@ -241,10 +246,63 @@
         $da= $';
         for $dv (split(/,/,$da)) {
             $dv =~ s/^\s+//; $dv =~ s/\s+$//;
+            (my $dv_pkg, my $dv_vercmp, my $dv_version) = $dv =~ /^([a-zA-Z0-9+-.]+)(?:\s*\(([<>=]+)\s*([^)\s]+)\s*\))?/;
+            my $dv_cmpfirst = substr($dv_vercmp,0,1);
             if (defined($depstrength{$lf})) {
-                if (!defined($predefdepfdep{$dv}) ||
-                    $depstrength{$predefdepfdep{$dv}} < $depstrength{$lf}) {
-                    $predefdepfdep{$dv}= $lf;
+                if ($dv !~ m/\|/) {
+                my $issubstantial = 1; # is this really new information?
+                for my $adepfield (@depfields[$depstrength{$lf}-1..$#depfields-1]) {
+                  if (defined($newdep{$adepfield}) && defined($newdep{$adepfield}{$dv_pkg})) {
+                    if ($dv_vercmp eq "") { $issubstantial = 0; }
+                    if ($issubstantial && defined($newdep{$adepfield}{$dv_pkg}{"="})
+                        && doesmatch($newdep{$adepfield}{$dv_pkg}{"="}[1], $dv_vercmp, $dv_version)) {
+                      $issubstantial = 0;
+                    }
+                    if ($issubstantial && $dv_cmpfirst ne "=" && 
+                        defined($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst})) {
+                      my $neededcmp = $dv_vercmp;
+                      if ($dv_cercmp eq $newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}) {
+                        $neededcmp = $dv_cmpfirst."=";
+                      }
+                      if (doesmatch($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}[1],
+                                   $neededcmp, $dv_version)) {
+                        $issubstantial = 0;
+                      }
+                    }
+                  }
+                }
+                if ($issubstantial) {
+                  $newdep{$lf}{$dv_pkg}{$dv_cmpfirst} = [$dv_vercmp,$dv_version];
+                  # Delete Obsolete
+                  # only unversined dependcy could be left to delete at depstrength of current version
+                  if ($dv_vercmp ne "" && defined($newdep{$lf}{$dv_pkg}{""})) {
+                    undefine($newdep{$lf}{$dv_pkg}{""});
+                  }
+                  for my $adepfield (@depfields[0..$depstrength{$lf}-2]) {
+                    if (defined($newdep{$adepfield}) && defined($newdep{$adepfield}{$dv_pkg})) {
+                      if (defined($newdep{$adepfield}{$dv_pkg}{""})) {
+                        undefine($newdep{$adepfield}{$dv_pkg}{""});
+                      }
+                      if ($dv_vercmp eq "=" && defined($newdep{$adepfield}{$dv_pkg}{"="})
+                          && doesmatch($newdep{$adepfield}{$dv_pkg}{"="}[1], "=", $dv_version)) {
+                        undefine($newdep{$adepfield}{$dv_pkg}{"="});                        
+                      }
+                      if (($dv_cmpfirst eq ">" || $dv_cmpfirst eq "<") && 
+                           defined($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst})) {
+                        my $neededcmp = defined($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst});
+                        if ($dv_cercmp eq $newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}) {
+                          $neededcmp = $dv_cmpfirst."=";
+                        }
+                        if (doesmatch($dv_version, $neededcmp, 
+                                      $newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}[1])) {
+                          undefine($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst});                        
+                        }
+                      }
+                    }
+                  }
+                }}
+                else { # cannot handle |s, so I'll just take them...
+                  $newdep{$lf}{$dv_pkg}{'|'}{$dv} = $dv;
                 }
             } else {
                 $dk= "$lf: $dv";
@@ -280,14 +338,31 @@
 } else {
     $fh= 'STDOUT';
 }
+
+for $lf (keys %newdep) {
+    print $lf."\n";
+    for $apkg (sort keys %{$newdep{$lf}}) {
+	for $aop (sort keys %{$newdep{$lf}{$apkg}}) {
+            $newdefdepf{$lf}.= ', ' if length($newdefdepf{$lf});
+            if ($aop ne '|') {
+		$newdefdepf{$lf}.= $apkg;
+		$newdefdepf{$lf}.= " (".join(' ', @{$newdep{$lf}{$apkg}{$aop}}).")" if length($aop);
+	    }
+            else {
+		$newdefdepf{$lf} .= join(', ',sort keys %{$newdep{$lf}{$apkg}{$aop}});
+	    }
+        }
+    }
+}
+
 for $dv (sort keys %predefdepfdep) {
     $lf= $predefdepfdep{$dv};
     $defdepf{$lf}.= ', ' if length($defdepf{$lf});
     $defdepf{$lf}.= $dv;
 }
 for $lf (reverse @depfields) {
-    next unless defined($defdepf{$lf});
-    print($fh "$varnameprefix:$lf=$defdepf{$lf}\n")
+    next unless defined($newdefdepf{$lf});
+    print($fh "$varnameprefix:$lf=$newdefdepf{$lf}\n")
         || syserr("write output entry");
 }
 for $lf (sort keys %unkdepf) {

Attachment: pgphnvaSVaSZh.pgp
Description: PGP signature


Reply to: