uninstall_feature —
| Attribute | Pos. | Req. | Default | Description |
|---|---|---|---|---|
| name | Yes | |||
| interpolate | 0 | interpolate output? | ||
| hide | 0 | Hide the tag return value? |
Interchange 5.9.0:
Source: code/UI_Tag/uninstall_feature.tag
Lines: 15
# Copyright 2005-2007 Interchange Development Group and others # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. See the LICENSE file for details. # # $Id: uninstall_feature.tag,v 1.3 2007-03-30 23:40:54 pajamian Exp $ UserTag uninstall_feature Order name UserTag uninstall_feature MapRoutine Vend::Config::uninstall_feature UserTag uninstall_feature Version $Revision: 1.3 $ UserTag uninstall_feature Description <<EOD This tag uninstalls features which were installed with Feature. EOD
Source: lib/Vend/Config.pm
Lines: 2542
sub uninstall_feature {
my ($value) = @_;
my $c = $Vend::Cfg
or die "Not in catalog context.\n";
#::logDebug("Running uninstall for cat=$Vend::Cat, from cfg ref=$c->{CatalogName}");
$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;
}
my $etag = errmsg("feature %s uninstall -- ", $value);
# 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;
my $Tag = new Vend::Tags;
my @copy;
my @errors;
my @warnings;
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("ufiles=" . ::uneval(\@ufiles));
#::logDebug("ifiles=" . ::uneval(\@ifiles));
#::logDebug("cdirs=" . ::uneval(\@cdirs));
#::logDebug("copy=" . ::uneval(\@copy));
for(@ufiles) {
#::logDebug("Running uninstall file $_");
my $save = $Global::AllowGlobal->{$Vend::Cat};
$Global::AllowGlobal->{$Vend::Cat} = 1;
open UNFILE, "< $_"
or do {
push @errors, $etag . errmsg("error reading %s: %s", $_, $!);
};
my $chunk = join "", <UNFILE>;
close UNFILE;
#::logDebug("uninstall chunk length=" . length($chunk));
my $out;
eval {
$out = Vend::Interpolate::interpolate_html($chunk);
};
if($@) {
push @errors, $etag . errmsg("error running uninstall %s: %s", $_, $@);
}
push @warnings, $etag . errmsg("message from %s: %s", $_, $out)
if $out =~ /\S/;
$Global::AllowGlobal->{$Vend::Cat} = $save;
}
for(@copy) {
my ($n, $d) = @$_;
my $tf = Vend::File::catfile($c->{VendRoot}, $n);
next unless -f $tf;
my $contents1 = Vend::File::readfile($tf);
my $sf = "$fdir/$n";
open UNSRC, "< $sf"
or die $etag . errmsg("Couldn't read uninstall source file %s: %s", $sf, $!);
local $/;
my $contents2 = <UNSRC>;
if($contents1 ne $contents2) {
push @warnings, $etag . errmsg("will not uninstall %s, changed.", $tf);
next;
}
unlink $tf
or do {
push @errors,
$etag . errmsg("$etag couldn't unlink file %s: %s", $tf, $!);
next;
};
my $td = Vend::File::catfile($c->{VendRoot}, $d);
my @left = glob("$td/*");
push @left, glob("$td/.?*");
next if @left;
File::Path::rmtree($td);
}
if(@ifiles) {
#::logDebug("running uninstall touch and init");
my $initdir = Vend::File::catfile($c->{ConfDir}, 'init', $value);
File::Path::mkpath($initdir) unless -d $initdir;
my $fn = Vend::File::catfile($initdir, 'uninstall');
#::logDebug("touching uninstall file $fn");
open UNFILE, ">> $fn"
or die errmsg("Couldn't create uninstall flag file %s: %s", $fn, $!);
print UNFILE $etag . errmsg("uninstalled at %s.\n", scalar(localtime));
close UNFILE;
}
my $errors;
for(@errors) {
$Tag->error({ set => $_});
::logError($_);
$errors++;
}
for(@warnings) {
$Tag->warnings($_);
::logError($_);
}
return ! $errors;
}