]> git.pld-linux.org Git - projects/distfiles.git/blobdiff - specparser.pl
- allow repeated SourceN + md5
[projects/distfiles.git] / specparser.pl
index 66ebdd7dfd511d268b19f9f8ac2b86ee4f3875ff..db0f1b173d52b48e452c90a419a7f5cc02db7980 100644 (file)
@@ -1,4 +1,5 @@
 #!/usr/bin/perl
+# $Id$
 #
 # USAGE: specparser.pl file.spec
 #
 sub next_spec($)
 {
   $spec = shift;
-  %macro = ();
+  $base_spec = $spec;
+  $base_spec =~ s|.*/||;
+  %macro = ( "nil" => "" );
   $err_cnt = 0;
 }
 
 sub error($)
 {
   $err_cnt++;
-  print "ERROR: $spec: $_[0]\n";
+  print "ERROR: $base_spec: $_[0]\n";
 }
 
 sub warning($)
 {
-  print "ERROR: $spec: $_[0]\n";
+  print "ERROR: $base_spec: $_[0]\n";
 }
 
 sub trim_spaces($)
@@ -47,7 +50,7 @@ sub expand($)
   my $v = trim_spaces(shift);
   my $cnt = 20;
 
-  while ($v =~ /\%\{([^\{]+)\}/) {
+  while ($v =~ /\%\{([^\}]+)\}/) {
     my $value;
     if (defined $macro{$1}) {
       $value = $macro{$1};
@@ -55,7 +58,7 @@ sub expand($)
       error("undefined macro $1");
       $value = "UNDEFINED";
     }
-    $v =~ s/\%\{([^\{]+)\}/$value/;
+    $v =~ s/\%\{([^\}]+)\}/$value/;
 
     return $v if (length $v > 1000 or $cnt-- <= 0)
   }
@@ -102,15 +105,17 @@ sub parse_defines($)
   while (<F>) {
     chomp;
     if (/^\s*\%(define|global)\s+([^\s]+)\s+([^\s].*)$/) {
-     define($2, $3);
+      define($2, $3);
     } elsif (/^Version\s*:\s*(.*)/i) {
       define("version", $1);
     } elsif (/^Name\s*:\s*(.*)/i) {
       define("name", $1);
-    } elsif (/^Source(\d+)\s*:\s*(.*)/i) {
-      define("source_$1", expand($2));
+    #} elsif (/^Source(\d+)\s*:\s*(.*)/i) {
+    #  define("source_$1", expand($2));
     } elsif (/^Patch(\d+)\s*:\s*(.*)/i) {
       define("patch_$1", expand($2));
+    } elsif (/^NoSource\s*:\s*(\d+)\s*$/i) {
+      define("no_source_$1", "1");
     }
   }
   close(F);
@@ -119,15 +124,22 @@ sub parse_defines($)
 sub print_md5($)
 {
   open(F, "< $_[0]") or die;
+  my $sourceno = undef;
+  my $source = undef;
   while (<F>) {
     chomp;
-    if (/^\s*#\s*source(\d+)-md5\s*:\s*([a-f0-9]{32})/i) {
+    if (/^Source(\d+)\s*:\s*(.*)/i) {
+      $sourceno = $1;
+      $source = expand($2);
+    } elsif (/^\s*#\s*source(\d+)-md5\s*:\s*([a-f0-9]{32})/i) {
       my $no = $1;
       my $md5 = $2;
-      if (defined $macro{"source_$1"}) {
-        my $s = $macro{"source_$1"};
+      if (defined $macro{"no_source_$no"}) {
+        error("both NoSource: $no and md5 given");
+      } elsif (defined $sourceno and ($sourceno == $no)) {
+        my $s = $source;
        if ($s =~ /^([a-z0-9A-Z:\=\?\@\+\~\.\-\/_]|\%[0-9])+$/) {
-         if ($s =~ /^(ftp|http):\/\//) {
+         if ($s =~ /^(ftp|http|https):\/\//) {
            if ($s =~ /\/$/) {
              error("source $no ($s) is directory");
            } else {
@@ -145,9 +157,13 @@ sub print_md5($)
        } else {
          error("source $no url $s is ill-formatted");
        }
+      } elsif (defined $sourceno) {
+        error("found md5 for source $no, but last defined source is $sourceno");
       } else {
         error("source $no not defined");
       }
+      $sourceno = undef;
+      $source = undef;
     }
   }
   close(F);
This page took 0.025302 seconds and 4 git commands to generate.