This will attempt to automatically fix common mistakes like using MD5 instead of SHA256, using the MD5SUM variable instead of HASH, or even a missing mirror file hash. Signed-off-by: Felix Fietkau <nbd@nbd.name>master
parent
7a315b0b5d
commit
d49059693b
@ -0,0 +1,135 @@ |
||||
#!/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"; |
||||
} |
||||
} |
||||
|
||||
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"; |
Loading…
Reference in new issue