Author: sparky                       Date: Tue Mar 13 03:48:38 2007 GMT
Module: admin                         Tag: DEVEL
---- Log message:
- don't try sources with undefined macros
- optimisations: 11s for opera

---- Files affected:
admin/distfiles:
   specparser.pl (1.13.2.3 -> 1.13.2.4) 

---- Diffs:

================================================================
Index: admin/distfiles/specparser.pl
diff -u admin/distfiles/specparser.pl:1.13.2.3 
admin/distfiles/specparser.pl:1.13.2.4
--- admin/distfiles/specparser.pl:1.13.2.3      Tue Mar 13 04:22:42 2007
+++ admin/distfiles/specparser.pl       Tue Mar 13 04:48:33 2007
@@ -64,6 +64,7 @@
                } else {
                        error("undefined macro $1");
                        $value = "UNDEFINED";
+                       return undef;
                }
                $v =~ s/\%\{([^\}]+)\}/$value/;
 
@@ -106,7 +107,8 @@
                chomp;
                if 
(/^\s*(\%(description|package|prep|install|pre|post|files)|BuildRoot|URL)/) {
                        last;
-               } elsif (/^\s*(\%if|\%else|\%endif|\%define|Version|Name)/) {
+               } elsif 
(/^\s*(\%if.*|\%else|\%endif|\%define\s+.*|Version.*|Name.*)\s*$/) {
+                       $_ = $1;
                        if ($spec[$#spec] =~ /\%if/) {
                                if (/\%else/) {
                                        next; # don't include empty %if-%else
@@ -127,23 +129,6 @@
 } # }}}
 
 
-
-sub find_closing($$)
-{
-       my ($spec, $end) = @_;
-       my $level = 0;
-       local $_;
-       while ($_ = shift @{$spec}) {
-               if (/^\s*\%($end)\s*$/ and $level <= 0) {
-                       return;
-               } elsif (/^\s*\%if/) {
-                       $level++;
-               } elsif (/^\s*\%endif\s*$/) {
-                       $level--;
-               }
-       }
-}
-
 my $total = 0;
 
 sub cont($$);
@@ -152,37 +137,64 @@
        my ($spec, $macros) = @_;
        local $_;
        while ($_ = shift @{$spec}) {
-               if (/^\s*\%if/) { # if, ifarch, ifos
+               if (0 <= index $_, '%if') { # if, ifarch, ifos
 
                        # split spec parsing
                        my @speccopy = @{$spec};
                        my %macroscopy = %{$macros};
                        cont([EMAIL PROTECTED], \%macroscopy);
 
-                       find_closing($spec, "else|endif");
+                       my $level = 0;
+                       while ($_ = shift @{$spec}) {
+                               if ($level <= 0 and ($_ eq '%else' or $_ eq 
'%endif')) {
+                                       last;
+                               } elsif (0 <= index $_, '%if') {
+                                       $level++;
+                               } elsif ($_ eq '%endif') {
+                                       $level--;
+                               }
+                       }
+
                        # continue parsing
                        
-               } elsif (/^\s*\%else\s*$/) {
+               } elsif ($_ eq '%else') {
 
                        # %else happens only when %if was interpreted
                        # so skip until %endif
                        
-                       find_closing($spec, "endif");
+                       my $level = 0;
+                       while ($_ = shift @{$spec}) {
+                               if ($level <= 0 and $_ eq '%endif') {
+                                       last;
+                               } elsif (0 <= index $_, '%if') {
+                                       $level++;
+                               } elsif ($_ eq '%endif') {
+                                       $level--;
+                               }
+                       }
 
                } elsif (/^\s*\%(define|global)\s+([^\s]+)\s+([^\s].*)$/) {
                        $macros->{$2} = $3;
+
                } elsif (/^Version\s*:\s*(.*)/i) {
                        $macros->{"version"} = $1;
                } elsif (/^Name\s*:\s*(.*)/i) {
                        $macros->{"name"} = $1;
-               } elsif (!/\%(endif|undef|bcond)/) {
+               } elsif (!/\%endif/) {
                        warn "unrecognised line: $_\n";
                }
        }
 
        # the end, yuppie !
        foreach my $s (@sources) {
-               print_source( $s->[0], $s->[1], expand( $s->[2], $macros ) );
+               my $src = expand( $s->[2], $macros );
+               if (defined $src) {
+                       our %tried;
+                       unless (exists $tried{$src}) {
+                               print_source( $s->[0], $s->[1], $src );
+                               $tried{$src} = 1;
+                       }
+               }
        }
        
        if (++$total > 10000) {
@@ -191,9 +203,9 @@
        }
 } # }}}
 
-my %printed;
 sub print_once($)
 {
+       our %printed;
        my $l = shift;
        unless (exists $printed{$l}) {
                print $l . "\n";
================================================================

---- CVS-web:
    
http://cvs.pld-linux.org/admin/distfiles/specparser.pl?r1=1.13.2.3&r2=1.13.2.4&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to