From 0320263e1846720cee32f63f99631c57c0e16c87 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Sun, 14 Aug 2016 16:06:33 -0400 Subject: [PATCH] Allow 'options' blocks to apply to module-sets. This change tries to ensure that modules and module-sets do not have the same names. However this doesn't quite work yet -- an option block for a module-set must meet all requirements for module-sets, including repository declaration, use-modules, etc. A subsequent patch will refactor that to fix. --- modules/ksb/Application.pm | 45 ++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/modules/ksb/Application.pm b/modules/ksb/Application.pm index bd14372..249fe46 100644 --- a/modules/ksb/Application.pm +++ b/modules/ksb/Application.pm @@ -1069,6 +1069,7 @@ sub _readConfigurationOptions my $using_default = 1; my @pendingOptsKeys = keys %{$pendingOptionsRef->{global}}; my %seenModules; # NOTE! *not* module-sets, *just* modules. + my %seenModuleSets; # and vice versa -- named sets only though! my %seenModuleSetItems; # To track option override modules. # Now read in module settings @@ -1094,6 +1095,16 @@ sub _readConfigurationOptions die make_exception('Config', 'Ungrouped/Unknown option'); } + if ($modulename && exists $seenModuleSets{$modulename}) { + error ("Duplicate module-set $modulename at $rcfile:$."); + die make_exception('Config', "Duplicate module-set $modulename defined at $rcfile:$."); + } + + if ($modulename && exists $seenModules{$modulename}) { + error ("Name $modulename for module-set at $rcfile:$. is already in use on a module"); + die make_exception('Config', "Can't re-use name $modulename for module-set defined at $rcfile:$."); + } + # A moduleset can give us more than one module to add. $newModule = _parseModuleSetOptions($ctx, $fileReader, ksb::ModuleSet->new($ctx, $modulename || "")); @@ -1102,6 +1113,8 @@ sub _readConfigurationOptions # are overriding/overlaying their options. my @moduleSetItems = $newModule->moduleNamesToFind(); @seenModuleSetItems{@moduleSetItems} = ($newModule) x scalar @moduleSetItems; + + $seenModuleSets{$modulename} = $newModule if $modulename; } # Duplicate module entry? (Note, this must be checked before the check # below for 'options' sets) @@ -1126,22 +1139,32 @@ sub _readConfigurationOptions # Module override (for use-modules from a module-set), or option overrride? elsif ($type eq 'options') { # Parse the modules... - $newModule = _parseModuleOptions($ctx, $fileReader, - ksb::Module->new($ctx, "#overlay_$modulename")); - - # but only keep the options. Any existing pending options came from - # cmdline so do not overwrite existing keys. - $pendingOptionsRef->{$modulename} //= { }; - my $moduleOptsRef = $pendingOptionsRef->{$modulename}; - while (my ($k, $v) = each %{$newModule->{options}}) { - $moduleOptsRef->{$k} = $v unless exists $moduleOptsRef->{$k}; + if (exists $seenModuleSets{$modulename}) { + _parseModuleSetOptions($ctx, $fileReader, $seenModuleSets{$modulename}); } + else { + $newModule = _parseModuleOptions($ctx, $fileReader, + ksb::Module->new($ctx, "#overlay_$modulename")); + + # but only keep the options. Any existing pending options came from + # cmdline so do not overwrite existing keys. + $pendingOptionsRef->{$modulename} //= { }; + my $moduleOptsRef = $pendingOptionsRef->{$modulename}; + while (my ($k, $v) = each %{$newModule->{options}}) { + $moduleOptsRef->{$k} = $v unless exists $moduleOptsRef->{$k}; + } - # Don't mask global cmdline options. - delete @{$moduleOptsRef}{@pendingOptsKeys}; + # Don't mask global cmdline options. + delete @{$moduleOptsRef}{@pendingOptsKeys}; + } next; # Don't add to module list } + # Must follow 'options' handling + elsif (exists $seenModuleSets{$modulename}) { + error ("Name $modulename for module at $rcfile:$. is already in use on a module-set"); + die make_exception('Config', "Can't re-use name $modulename for module defined at $rcfile:$."); + } else { $newModule = _parseModuleOptions($ctx, $fileReader, ksb::Module->new($ctx, $modulename));