summary refs log tree commit diff
path: root/pkgs/build-support/vm/rpm/rpm-closure.pl
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/build-support/vm/rpm/rpm-closure.pl')
-rw-r--r--pkgs/build-support/vm/rpm/rpm-closure.pl62
1 files changed, 34 insertions, 28 deletions
diff --git a/pkgs/build-support/vm/rpm/rpm-closure.pl b/pkgs/build-support/vm/rpm/rpm-closure.pl
index 94da0a20adc..8f7669d6fef 100644
--- a/pkgs/build-support/vm/rpm/rpm-closure.pl
+++ b/pkgs/build-support/vm/rpm/rpm-closure.pl
@@ -28,20 +28,20 @@ sub rpmvercmp {
         my $v2 = $vercmps2[$i];
 
         if($v1 =~ /^[0-9]*$/ && $v2 =~ /^[0-9]*$/) {
-	    if ( int($v1) > int($v2) ) {
-		return 1;
-	    }
-	    elsif ( int($v1) < int($v2) ) {
-		return -1;
-	    }
-	} else {
-	    if ( $v1 gt $v2 ) {
-		return 1;
-	    }
-	    elsif ( $v1 lt $v2 ) {
-		return -1;
-	    }
-	}
+            if ( int($v1) > int($v2) ) {
+                return 1;
+            }
+            elsif ( int($v1) < int($v2) ) {
+                return -1;
+            }
+        } else {
+            if ( $v1 gt $v2 ) {
+                return 1;
+            }
+            elsif ( $v1 lt $v2 ) {
+                return -1;
+            }
+        }
     }
     if($l1 == $l2) {
         return 0;
@@ -90,19 +90,25 @@ for (my $i = 0; $i < scalar(@packagesFiles); $i++) {
 }
 
 my %provides;
-foreach my $pkgName (keys %pkgs) {
-    print STDERR "looking at $pkgName\n";
+PKG: foreach my $pkgName (keys %pkgs) {
+    #print STDERR "looking at $pkgName\n";
     my $pkg = $pkgs{$pkgName};
-    
-    #print STDERR keys %{$pkg->{format}}, "\n";
 
-    #print STDERR $pkg->{format}->{'rpm:provides'}, "\n";
-    
+    # Skip packages that conflict with a required package.
+    my $conflicts = $pkg->{format}->{'rpm:conflicts'}->{'rpm:entry'} // [];
+    foreach my $conflict (@{$conflicts}) {
+        next if $conflict->{flags} // "" eq "LT" || $conflict->{flags} // "" eq "LE";
+        #print STDERR "  $pkgName conflicts with $conflict->{name}\n";
+        if (grep { $_ eq $conflict->{name} } @toplevelPkgs) {
+            print STDERR "skipping package $pkgName because it conflicts with a required package\n";
+            next PKG;
+        }
+    }
+
     my $provides = $pkg->{format}->{'rpm:provides'}->{'rpm:entry'} or die;
     foreach my $req (@{$provides}) {
-        #print "$req->{name}\n";
-        #print STDERR "  provides $req\n";
-        #die "multiple provides for $req" if defined $provides{$req};
+        #print STDERR "  $pkgName provides $req->{name}\n";
+        #die "multiple provides for $req->{name}" if defined $provides{$req->{name}};
         $provides{$req->{name}} = $pkgName;
     }
 
@@ -123,9 +129,9 @@ sub closePackage {
 
     return if defined $donePkgs{$pkgName};
     $donePkgs{$pkgName} = 1;
-    
+
     print STDERR ">>> $pkgName\n";
-    
+
     my $pkg = $pkgs{$pkgName} or die "package $pkgName doesn't exist";
 
     my $requires = $pkg->{format}->{'rpm:requires'}->{'rpm:entry'} || [];
@@ -133,14 +139,14 @@ sub closePackage {
     my @deps = ();
     foreach my $req (@{$requires}) {
         next if $req->{name} =~ /^rpmlib\(/;
-        print STDERR "  needs $req->{name}\n";
+        #print STDERR "  needs $req->{name}\n";
         my $provider = $provides{$req->{name}};
         if (!defined $provider) {
             print STDERR "    WARNING: no provider for $req->{name}\n";
             next;
         }
-        print STDERR "    satisfied by $provider\n";
-        push @deps, $provider; 
+        #print STDERR "    satisfied by $provider\n";
+        push @deps, $provider;
     }
 
     closePackage($_) foreach @deps;