control: tags -1 patch > > > This is a hack, not a proper handling of the configuration. > > > > fwiw, the maintainers have been in violent agreement with this for years, > > but it needs someone with tuits to replace the current situation with a > > solution that's usable from all the languages included in devscripts and > > maintains the existing semantics (it's not just simple key=value pairs, > > users are actively relying on being able to use shell within the file in > > some cases, and that at least needs considering).
OK, here is my try to do the following. Ugly, yes. But it seems to catch most errors in friendly way. * "egrep" test to catch space after "=" * "set -e" to detect command not found; * space before "=" * "false" in line * "bash -n" test * Report the file name if a bug is found as much. If no objection, I will apply this patch to git. Osamu
diff --git a/scripts/uscan.pl b/scripts/uscan.pl index dd1f4231..a1151bc9 100755 --- a/scripts/uscan.pl +++ b/scripts/uscan.pl @@ -1948,15 +1948,28 @@ if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) { my %config_default = %config_vars; my $shell_cmd; - # Set defaults + # Set defaults with caution while respecting bash syntax + # See https://bugs.debian.org/863118 (avoid "ENV_VAR= yes" line etc.) + $shell_cmd .= 'set -e' . "\n"; foreach my $var (keys %config_vars) { $shell_cmd .= qq[$var="$config_vars{$var}";\n]; } - $shell_cmd .= 'for file in ' . join(" ",@config_files) . "; do\n"; - $shell_cmd .= '[ -f $file ] && . $file; done;' . "\n"; + $shell_cmd .= 'for file in ' . join(" ",@config_files) . '; do' . "\n"; + $shell_cmd .= '[ -f $file ] && \\' . "\n"; + $shell_cmd .= '{ if egrep -e "^\s*[^\s#]\w+=\s+[^#]" $file >&2 ; then' . "\n"; + $shell_cmd .= 'echo "Error: space after \"=\" in $file" >&2 ; exit 1' . "\n"; + $shell_cmd .= 'elif ! /bin/bash -n $file >&2 ; then' . "\n"; + $shell_cmd .= 'echo "Error: Bash syntax error in $file" >&2 ; exit 1' . "\n"; + $shell_cmd .= 'else' . "\n"; + $shell_cmd .= '. $file' . "\n"; + $shell_cmd .= 'fi ; }' . "\n"; + $shell_cmd .= 'done' . "\n"; # Read back values foreach my $var (keys %config_vars) { $shell_cmd .= "echo \$$var;\n" } my $shell_out = `/bin/bash -c '$shell_cmd'`; + if ( $? != 0 ) { + uscan_die "Error detected while parsing configuration files (bash -e).\n"; + } @config_vars{keys %config_vars} = split /\n/, $shell_out, -1; # Check validity