123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #!/usr/bin/env perl
- use strict;
- my $error;
- my %state;
- sub usage() {
- die <<EOF;
- Usage: $0 <file> <command> [<arguments>]
- Commands:
- add-hash <variable> <value>
- fix-hash <variable> <value>
- rename-var <variable> <name>
- EOF
- }
- sub set_var($) {
- my $var = shift;
- $state{var} = $var;
- if ($var =~ /(.*):(.*)/) {
- $state{template} = $1;
- $state{var} = $2;
- $state{related_var} = "URL";
- } else {
- $state{context} = 1;
- $state{related_var} = "PKG_SOURCE_URL";
- }
- }
- my %check_command = (
- "add-hash" => sub {
- set_var($ARGV[0]);
- $state{value} = $ARGV[1];
- length($ARGV[1]) == 64 or die "Invalid hash value\n";
- },
- "fix-hash" => sub {
- set_var($ARGV[0]);
- $state{value} = $ARGV[1];
- $state{prev_value} = $ARGV[2];
- length($ARGV[1]) == 64 or die "Invalid hash value\n";
- },
- "rename-var" => sub {
- set_var($ARGV[0]);
- $state{new_var} = $ARGV[1];
- $state{new_var} =~ s/.*://g;
- },
- );
- sub check_context($) {
- my $line = shift;
- return unless $state{template};
- $state{next} and do {
- $state{context} = 1;
- undef $state{next};
- return;
- };
- if (not $state{context}) {
- $line =~ /^\s*define\s+$state{template}/ and $state{next} = 1;
- } else {
- $line =~ /^\s*endef/ and do {
- $state{done} = 1;
- undef $state{context};
- }
- }
- }
- my %commands = (
- "add-hash" => sub {
- my $line = shift;
- check_context($line);
- return $line unless $state{context};
- # skip existing hash variable
- return "" if $line =~ /^(\s*)$state{var}(\s*):?=(\s*)(.*)\n/;
- # insert md5sum after related variable
- return $line unless $line =~ /^(\s*)$state{related_var}(\s*):?=(\s*)(.*)\n/;
- return "$line$1$state{var}$2:=$3$state{value}\n";
- },
- "fix-hash" => sub {
- my $line = shift;
- check_context($line);
- return $line unless $state{context};
- return $line unless $line =~ /^(\s*)$state{var}(\s*):?=(\s*)(.*)$state{prev_value}(.*)\n/;
- $state{done} = 1;
- $4 =~ /\$/ and do {
- warn "$state{var} contains a reference to another variable, can't fix automatically\n";
- return $line;
- };
- return "$1$state{var}$2:=$3$state{value}\n";
- },
- "rename-var" => sub {
- my $line = shift;
- check_context($line);
- return $line unless $state{context};
- return $line unless $line =~ /^(\s*)$state{var}(\s*:?=.*)\n/;
- return "$1$state{new_var}$2\n";
- },
- );
- my $file = shift @ARGV;
- my $command = shift @ARGV;
- ($file and $command and $check_command{$command}) or usage;
- &{$check_command{$command}}();
- -f $file or die "File $file not found\n";
- open IN, "<${file}" or die "Cannot open input file\n";
- open OUT, ">${file}.new" or die "Cannot open output file\n";
- my $cmd = $commands{$command};
- while (my $line = <IN>) {
- $line = &$cmd($line) unless $state{done};
- print OUT $line;
- last if $error;
- }
- close OUT;
- close IN;
- $error and do {
- unlink "${file}.new";
- exit 1;
- };
- rename "${file}.new", "$file";
|