Feature — specify Interchange "feature" for activation in the catalog
Specify Interchange "feature" for inclusion in the current catalog.
For an introduction to Interchange "features", please see the feature glossary entry.
Interchange 5.9.0:
Source: lib/Vend/Config.pm
Line 2274 (context shows lines 2274-2392)
sub parse_feature { my ($var, $value) = @_; my $c = $C->{$var} || {}; return $c unless $value; $value =~ s/^\s+//; $value =~ s/\s+$//; my $fdir = Vend::File::catfile($Global::FeatureDir, $value); unless(-d $fdir) { config_warn("Feature '%s' not found, skipping.", $value); return $c; } # Get the global install files and remove them from the config list my @gfiles = glob("$fdir/*.global"); my %seen; @seen{@gfiles} = @gfiles; # Get the init files and remove them from the config list my @ifiles = glob("$fdir/*.init"); @seen{@ifiles} = @ifiles; # Get the uninstall files and remove them from the config list my @ufiles = glob("$fdir/*.uninstall"); @seen{@ufiles} = @ifiles; # Any other files are config files my @cfiles = grep ! $seen{$_}++, glob("$fdir/*"); # directories are for copying my @cdirs = grep -d $_, @cfiles; # strip the directories from the config list, leaving catalog.cfg stuff @cfiles = grep -f $_, @cfiles; # Don't install global more than once @gfiles = grep ! $Global::FeatureSeen{$_}++, @gfiles; # Place the catalog configuration in the config list unshift @include, @cfiles; my @copy; my $wanted = sub { return unless -f $_; my $n = $File::Find::name; $n =~ s{^$fdir/}{}; my $d = $File::Find::dir; $d =~ s{^$fdir/}{}; push @copy, [$n, $d]; }; if(@cdirs) { File::Find::find({ wanted => $wanted, follow => 1 }, @cdirs); } #::logDebug("gfiles=" . ::uneval(\@gfiles)); #::logDebug("cfiles=" . ::uneval(\@cfiles)); #::logDebug("ifiles=" . ::uneval(\@ifiles)); #::logDebug("ufiles=" . ::uneval(\@ufiles)); #::logDebug("cdirs=" . ::uneval(\@cdirs)); #::logDebug("copy=" . ::uneval(\@copy)); for(@copy) { my ($n, $d) = @$_; my $tf = Vend::File::catfile($C->{VendRoot}, $n); next if -f $tf; my $td = Vend::File::catfile($C->{VendRoot}, $d); unless(-d $td) { File::Path::mkpath($td) or do { config_warn("Feature %s not able to make directory %s", $value, $td); next; }; } File::Copy::copy("$fdir/$n", $tf) or do { config_warn("Feature %s not able to copy %s to %s", $value, "$fdir/$n", $tf); next; }; } for(@gfiles) { global_chunk($_); } if(@ifiles) { my $initdir = Vend::File::catfile($C->{ConfDir}, 'init', $value); File::Path::mkpath($initdir) unless -d $initdir; my $unfile = Vend::File::catfile($initdir, 'uninstall'); ## Feature was previously uninstalled, we *do* need to run init my $ignore = -f $unfile; if($ignore) { unlink $unfile or die errmsg("Couldn't unlink $unfile: $!"); } for(@ifiles) { my $fn = $_; $fn =~ s{^$fdir/}{}; if($ignore) { unlink "$initdir/$fn" or die errmsg("Couldn't unlink $fn: $!"); } next if -f "$initdir/$fn"; $C->{Init} ||= []; push @{$C->{Init}}, [$_, "$initdir/$fn"]; } } #::logDebug("Init=" . ::uneval($C->{Init})); $c->{$value} = 1; return $c; }