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