Kwiki
view release on metacpan or search on metacpan
lib/Kwiki/Command.pm view on Meta::CPAN
return unless $object->can('extract_files');
my $class_title = $self->hub->$class_id->class_title;
$self->msg("Extracting files for $class_title:\n");
$self->hub->$class_id->quiet($self->quiet);
$self->hub->$class_id->extract_files;
$self->msg("\n");
}
sub is_kwiki_dir {
my $dir = shift || '.';
-d "$dir/plugin" and -f "$dir/registry.dd";
}
sub handle_update {
chdir io->dir(shift || '.')->assert->open . '';
die "Can't update non Kwiki directory!\n"
unless -d 'plugin';
$self->create_registry;
$self->install($_) for $self->all_class_ids;
$self->set_permissions;
}
sub handle_update_all {
my @dirs = (io->curdir, io->curdir->All_Dirs);
while (my $dir = shift @dirs) {
next unless $self->is_kwiki_dir($dir);
$self->msg('Updating ', $dir->absolute->pathname, "\n");
$dir->chdir;
system("kwiki -quiet -update");
}
}
sub all_class_ids {
my @all_modules;
for my $key (keys %{$self->hub->config}) {
push @all_modules, $self->hub->config->{$key}
if $key =~ /_class/;
}
push @all_modules, @{$self->hub->config->{plugin_classes} || []};
map {
eval "require $_; 1"
? $_->can('extract_files')
? do {
my $class_id = $_->class_id;
$self->hub->config->add_config({"${class_id}_class" => $_});
($_->class_id)
}
: ()
: ();
} @all_modules;
}
sub handle_add {
$self->update_plugins('+', @_);
}
sub handle_remove {
$self->update_plugins('-', @_);
}
sub update_plugins {
die "This operation must be performed inside a Kwiki installation directory"
unless -f $self->hub->config->plugins_file;
my $mode = shift;
return $self->usage unless @_;
my $plugins_file = $self->hub->config->plugins_file;
my $plugins = io($plugins_file);
my @lines = $plugins->chomp->slurp;
for my $module (@_) {
eval "require $module;1" or die $@ or
($module = "Kwiki::$module" and eval "require $module;1") or
die "Invalid module '$module'";
if ($mode eq '+') {
next if grep /^$module$/, @lines;
push @lines, $module;
next;
}
@lines = grep {$_ ne $module} @lines;
}
$plugins->println($_) for @lines;
$plugins->close;
$self->hub->config->add_plugins_file($plugins_file);
$self->handle_update;
}
sub handle_install {
die "This operation must be performed inside a Kwiki installation directory"
unless -f $self->hub->config->plugins_file;
return $self->usage unless @_;
require Cwd;
$self->cpan_setup;
my @modules = @_;
for my $module (@_) {
$self->fake_install($module);
my $home = Cwd::cwd();
my $rc = CPAN::Shell->expand('Module', $module);
if (not defined $rc) {
die "WARNING - Can't install $module\nStopping...\n";
}
$rc->install;
chdir $home;
}
$self->update_plugins('+', @modules);
}
sub cpan_setup {
no warnings;
require CPAN;
# require CPAN::Config;
my $lib = io->dir('lib')->absolute;
$ENV{PERL_MM_OPT} = "INSTALLSITELIB=$lib PREFIX=$lib"
if $lib->exists;
CPAN::Config->load;
$CPAN::Config_loaded = 1;
my $cpan_dir = io->dir('.cpan')->rel2abs;
$CPAN::Config->{cpan_home} =
$CPAN::Config->{build_dir} = $cpan_dir;
$CPAN::Config->{keep_source_where} =
io->catdir($cpan_dir, 'sources')->name;
}
( run in 1.606 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )