admin (DEVEL): distfiles/specparser.pl - don't try sources with un...

sparky sparky at pld-linux.org
Tue Mar 13 04:48:38 CET 2007


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(\@speccopy, \%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



More information about the pld-cvs-commit mailing list