new version: Re: Fix for ports INDEX generation - should make portupgrade work normally

Raphael Marmier raphael at marmier.net
Mon Dec 20 17:41:47 PST 2004


I have optimized the patch to make_index, halving the additional time it 
 takes to run.

portupgrade now works fine with ports overrides, at least on my machine.

the enclosed patch can be applied directly to the original make_index. 
Go in /usr/ports/Tools and run patch < make_index.diff

Raphael

Raphael Marmier wrote:
hi all,

I've modified the /usr/ports/Tools/make_index script to accomodate ports 
overrides.
AFAIK, this should solve portupgrade's problems on DragonFly.

Simply copy this script in place of the original. (can someone tell me 
how I generate a diff that can be used with patch, like a pro?)

I would feel better if it receives some real world testing from 
DragonFly users before I submit it to the FreeBSD folk ;)

Regards,

Raphael


--- make_index	Tue Dec 21 00:50:16 2004
+++ make_index2	Mon Dec 20 23:22:44 2004
@@ -6,25 +6,55 @@
 # *-depends as a list of directories, using 'make describe'.  This
 # script goes back in and maps the directories back to pkgnames,
 # fixes up the *-depends list, and writes out the new INDEX file.
+#
+# This script is compatible DragonFlyBSD's ports overrides
 
 require 5.002;
 
 # Helper function to map a directory to a pkgname.
 sub by_path {
     my ($name, $port) = @_;
+    my ($result,$revpath,$portname) = undef;
 
-  # If a direct mapping exists, then use it.
-    return $by_path{$name} if (defined $by_path{$name});
+  # If the mapping is in our cache, use it
+    return $cache{$name} if (defined $cache{$name});
 
-  # Make sure we have /usr/ports at the beginning.
-    $name =~ s!^$pwd!/usr/ports!o;
-    return $by_path{$name} if (defined $by_path{$name});
+  # Remove the $PORTSDIR part of the path
+    $path = $result[0] if @result = $name =~ m!^$pwd/(.*)$!o;
+
+  # Reverse the path so we can match from the end of a string.
+    $revpath = reverse($path);
+
+    my $portname;
+
+    # Find the key and use it to get the port's name.
+    foreach (@pathes) {
+        if ( index($_,$revpath) == 0 ) {
+            $portname = $by_path{$_};
+            $cache{$name} = $portname;
+        }
+    }
+    return $portname if (defined $portname);
 
   # Collapse all the '..' sequences.
     my @f = split('/', $name), @p = ();
     foreach (@f) { (/\.\./) ? pop(@p) : push(@p, $_); }
     $name = join('/', @p);
-    return $by_path{$name} if (defined $by_path{$name});
+
+  # Remove the $PORTSDIR part of the path
+    $path = $result[0] if @result = $name =~ m!^$pwd/(.*)$!o;
+
+  # Reverse the path so we can match from the end of a string.
+    $revpath = reverse($path);
+
+  # Find the key and use it to get the port's name.
+    foreach (@pathes) {
+        if ( index($_,$revpath) == 0 ) {
+            $portname = $by_path{$_};
+            $cache{$name} = $portname;
+        }
+    }
+    return $portname if (defined $portname);
 
     print STDERR "make_index: $port: no entry for $name\n";
     return undef;
@@ -99,14 +129,15 @@
     chomp;
     my @f = split(/\|/);
 
-  # Force to canonical form.
-    $f[1] =~ s!^$pwd!/usr/ports!o;
-    $f[4] =~ s!^$pwd!/usr/ports!o;
-
   # Save directory -> pkgname relationship.
   # Note: $f[0] gets clobbered by the splice below so we'll save
   # it to a new $name first.
-    $by_path{$f[1]} = $name = $f[0];
+  # We store the key reversed as we need to match keys starting from the end.
+    $revpath = reverse($f[1]);
+    $by_path{$revpath} = $name = $f[0];
+
+  # Build a list of keys so we can use a regex to locate one
+    push(@pathes,$revpath);
 
   # Create a hash table of the infomation we need about this port.
     my $pkg = {
@@ -123,6 +154,9 @@
   # This is a cheap way of preserving the order of the entries.
     push(@names, $name);
 }
+
+# We need a path resolution cache
+%cache = ();
 
 # For each port perform the mapping between directory and pkgnames.
 foreach $name (keys %index) {




More information about the Users mailing list