mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-26 11:34:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			136 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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";
 |