APPLIED(X,B,C)/cmt: [X, B, C, D, unstable][PATCH] UBUNTU: [Packaging] config-check: Add an include directive

Khaled Elmously khalid.elmously at canonical.com
Mon Mar 4 05:04:57 UTC 2019


Fixed nominations to add cosmic and remove artful


On 2019-02-01 16:03:15 , Marcelo Henrique Cerri wrote:
> BugLink: http://bugs.launchpad.net/bugs/1752072
> 
> Update the config-check script to support a new include directive, that can
> be used to override annotations from another file. For instance, with
> this change a custom kernel can include the annotation file from
> "debian.master/" and override some of it policies.
> 
> The directive is only available when using the file format 3, that
> extends format 2.
> 
> The new directive follows the systax:
> 
> 	include FILEPATH
> 
> Quotes are also accepted:
> 
> 	include "FILEPATH"
> 
> `FILENAME` is always relative to the current annotations file location.
> So, assuming a custom kernel, the following directive will include the
> annotations file from the generic kernel:
> 
> 	include "../../debian.master/config/annotations"
> 
> To avoid mistakes, any reference to a config in the base annotations
> file AFTER the include directive will completely override the references
> from the included file.
> 
> For instance, the following:
> 
>     # FORMAT: 3
>     include "../../debian.master/config/annotations"
>     CONFIG_X note<some note>
> 
> Will cause any line related to CONFIG_X in the included annotations file
> to be ignored.
> 
> The patch also includes smalls changes to avoid warning due to duplicate
> variable declarations.
> 
> Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
> ---
> 
> That's a patch to replace the patch "config-check: allow overlay annotations files".
> 
> ---
>  debian/scripts/config-check | 80 +++++++++++++++++++++++++++----------
>  1 file changed, 59 insertions(+), 21 deletions(-)
> 
> diff --git a/debian/scripts/config-check b/debian/scripts/config-check
> index 224be080514a..843f5999006b 100755
> --- a/debian/scripts/config-check
> +++ b/debian/scripts/config-check
> @@ -3,6 +3,8 @@
>  # check-config -- check the current config for issues
>  #
>  use strict;
> +use File::Basename;
> +use File::Spec;
>  
>  my $P = 'check-config';
>  
> @@ -13,7 +15,7 @@ if ($ARGV[0] eq '--test') {
>  	die "Usage: $P <config> <arch> <flavour> <commonconfig> <warn-only>\n";
>  }
>  
> -my ($config, $arch, $flavour, $commonconfig, $warn_only) = @ARGV;
> +my ($configfile, $arch, $flavour, $commonconfig, $warn_only) = @ARGV;
>  
>  my %values = ();
>  
> @@ -25,8 +27,8 @@ $fail_exit = 0 if ($warn_only eq 'true' || $warn_only eq '1');
>  my $exit_val = 0;
>  
>  # Load up the current configuration values -- FATAL if this fails
> -print "$P: $config: loading config\n";
> -open(CONFIG, "<$config") || die "$P: $config: open failed -- $! -- aborting\n";
> +print "$P: $configfile: loading config\n";
> +open(CONFIG, "<$configfile") || die "$P: $configfile: open failed -- $! -- aborting\n";
>  while (<CONFIG>) {
>  	# Pull out values.
>  	/^#*\s*(CONFIG_\w+)[\s=](.*)$/ or next;
> @@ -38,38 +40,74 @@ while (<CONFIG>) {
>  }
>  close(CONFIG);
>  
> -# ANNOTATIONS: check any annotations marked for enforcement
> -my $pass = 0;
> -my $total = 0;
> -my $annotations = "$commonconfig/annotations";
> -my ($config, $value, $options, $option, $value, $check, $policy);
> -print "$P: $annotations loading annotations\n";
> -my %annot;
> -my $form = 1;
> -open(ANNOTATIONS, "<$annotations") || die "$P: $annotations: open failed -- $! -- aborting\n";
> -while (<ANNOTATIONS>) {
> +sub read_annotations {
> +    my ($filename) = @_;
> +    my %annot;
> +    my $form = 1;
> +    my ($config, $value, $options);
> +
> +    # Keep track of the configs that shouldn't be appended because
> +    # they were include_annot from another annotations file.
> +    # That's a hash of undefs, aka a set.
> +    my %noappend;
> +
> +    print "$P: $filename loading annotations\n";
> +    open(my $fd, "<$filename") ||
> +	die "$P: $filename: open failed -- $! -- aborting\n";
> +    while (<$fd>) {
>  	if (/^# FORMAT: (\S+)/) {
> -		die "$P: $1: unknown annotations format\n" if ($1 != 2);
> -		$form = $1;
> +	    die "$P: $1: unknown annotations format\n" if ($1 != 2 && $1 != 3);
> +	    $form = $1;
> +	}
> +
> +	# Format #3 adds the include directive on top of format #2:
> +	if ($form == 3 && /^\s*include(\s|$)/) {
> +	    # Include quoted or unquoted files:
> +	    if (/^\s*include\s+"(.*)"\s*$/ || /^\s*include\s+(.*)$/) {
> +		# The include is relative to the current file
> +		my $include_filename = File::Spec->join(dirname($filename), $1);
> +		# Append the include files
> +		my %include_annot = read_annotations($include_filename);
> +		%annot = ( %annot, %include_annot );
> +		# And marked them to not be appended:
> +		my %included_noappend;
> +		# Discard the values and keep only the keys
> +		@included_noappend{keys %include_annot} = ();
> +		%noappend = ( %noappend, %included_noappend );
> +		next;
> +	    } else {
> +		die "$P: Invalid include: $_";
> +	    }
>  	}
>  
>  	/^#/ && next;
>  	chomp;
>  	/^$/ && next;
> -
>  	/^CONFIG_/ || next;
>  
>  	if ($form == 1) {
> -		($config, $value, $options) = split(' ', $_, 3);
> -	} elsif ($form == 2) {
> -		($config, $options) = split(' ', $_, 2);
> +	    ($config, $value, $options) = split(' ', $_, 3);
> +	} elsif ($form >= 2) {
> +	    ($config, $options) = split(' ', $_, 2);
>  	}
>  
> +	if (exists $noappend{$config}) {
> +	    delete $annot{$config};
> +	    delete $noappend{$config};
> +	}
>  	$annot{$config} = $annot{$config} . ' ' . $options;
> +    }
> +    close($fd);
> +    return %annot;
>  }
> -close(ANNOTATIONS);
>  
> -my $config;
> +# ANNOTATIONS: check any annotations marked for enforcement
> +my $annotations = "$commonconfig/annotations";
> +my %annot = read_annotations($annotations);
> +
> +my $pass = 0;
> +my $total = 0;
> +my ($config, $value, $options, $option, $check, $policy);
>  for $config (keys %annot) {
>  	$check = 0;
>  	$options = $annot{$config};
> -- 
> 2.17.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list