- implement var substitution for arch, fix quoting code, also set 'sources' when...
authorMichael Schroeder <mls@suse.de>
Fri, 24 Aug 2012 11:49:39 +0000 (13:49 +0200)
committerMichael Schroeder <mls@suse.de>
Fri, 24 Aug 2012 11:50:54 +0000 (13:50 +0200)
Build.pm
Build/Arch.pm

index be20b06..e4ed7e4 100644 (file)
--- a/Build.pm
+++ b/Build.pm
@@ -864,7 +864,7 @@ sub show {
   die unless $cf;
   my $d = Build::parse($cf, $fn);
   die("$d->{'error'}\n") if $d->{'error'};
-  $d->{'sources'} = [ map {$d->{$_}} grep {/^source/} sort keys %$d ];
+  $d->{'sources'} = [ map {ref($d->{$_}) ? @{$d->{$_}} : $d->{$_}} grep {/^source/} sort keys %$d ];
   my $x = $d->{$field};
   $x = [ $x ] unless ref $x;
   print "$_\n" for @$x;
index 1824b27..a01a70c 100644 (file)
@@ -12,18 +12,24 @@ eval { require Archive::Tar; };
 # parse a PKGBUILD file
 
 sub quote {
-  my ($str) = @_;
-  $str =~ s/([ \t\"\'])/sprintf("%%%02X", ord($1))/ge;
+  my ($str, $q, $vars) = @_;
+  if ($q ne "'" && $str =~ /\$/) {
+    $str =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/$vars->{$2 || $1} ? join(' ', @{$vars->{$2 || $1}}) : "\$$1"/ge;
+  }
+  $str =~ s/([ \t\"\'\$])/sprintf("%%%02X", ord($1))/ge;
   return $str;
 }
 
 sub unquotesplit {
-  my ($str) = @_;
+  my ($str, $vars) = @_;
   $str =~ s/%/%25/g;
   $str =~ s/^[ \t]+//;
   while ($str =~ /([\"\'])/) {
     my $q = $1;
-    $str =~ s/$q(.*?)$q/quote($1)/e;
+    $str =~ s/$q(.*?)$q/quote($1, $q, $vars)/e;
+  }
+  if ($str =~ /\$/) {
+    $str =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/$vars->{$2 || $1} ? join(' ', @{$vars->{$2 || $1}}) : "\$$1"/ge;
   }
   my @args = split(/[ \t]+/, $str);
   for (@args) {
@@ -56,13 +62,14 @@ sub parse {
        $val .= ' ' . $nextline;
       }
     }
-    $vars{$var} = [ unquotesplit($val) ];
+    $vars{$var} = [ unquotesplit($val, \%vars) ];
   }
   close PKG;
   $ret->{'name'} = $vars{'pkgname'}->[0] if $vars{'pkgname'};
   $ret->{'version'} = $vars{'pkgver'}->[0] if $vars{'pkgver'};
   $ret->{'deps'} = $vars{'makedepends'} || [];
   push @{$ret->{'deps'}}, @{$vars{'depends'} || []};
+  $ret->{'source'} = $vars{'source'} if $vars{'source'};
   return $ret;
 }