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.
wilder
Michael Pyne 10 years ago
parent 85e9c8ffbd
commit 0320263e18
  1. 45
      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 || "<module-set at line $.>"));
@ -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));

Loading…
Cancel
Save