summaryrefslogtreecommitdiff
path: root/lib/CIL.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CIL.pm')
-rw-r--r--lib/CIL.pm122
1 files changed, 106 insertions, 16 deletions
diff --git a/lib/CIL.pm b/lib/CIL.pm
index 9a87bf9..548ada3 100644
--- a/lib/CIL.pm
+++ b/lib/CIL.pm
@@ -23,28 +23,51 @@ package CIL;
use strict;
use warnings;
+use Carp qw(croak confess);
use File::Glob qw(:glob);
+use File::HomeDir;
+use CIL::Git;
+
+use vars qw( $VERSION );
+$VERSION = '0.07.00';
+
+use Module::Pluggable
+ sub_name => 'commands',
+ search_path => [ 'CIL::Command' ],
+ require => 1;
use base qw(Class::Accessor);
__PACKAGE__->mk_accessors(qw(
IssueDir
StatusStrict StatusAllowed StatusOpen StatusClosed
LabelStrict LabelAllowed
- VCS
+ DefaultNewStatus
+ UseGit
UserName UserEmail
+ AutoAssignSelf
+ git hook
));
my $defaults = {
- IssueDir => 'issues', # the dir to save the issues in
- StatusStrict => 0, # whether to complain if a status is invalid
- LabelStrict => 0, # whether to complain if a label is invalid
+ IssueDir => 'issues', # the dir to save the issues in
+ StatusStrict => 0, # whether to complain if a status is invalid
+ LabelStrict => 0, # whether to complain if a label is invalid
+ DefaultNewStatus => 'New', # What Status to use for new issues by default
+ UseGit => 0, # don't do anything with Git
};
-my @config_hashes = qw(StatusAllowed StatusOpen StatusClosed LabelAllowed);
+my @config_hashes = qw(StatusOpen StatusClosed LabelAllowed);
my $defaults_user = {
- UserName => 'Name',
- UserEmail => 'me@example.com',
+ UserName => eval { Git->repository->config( 'user.name' ) } || 'UserName',
+ UserEmail => eval { Git->repository->config( 'user.email' ) } || 'username@example.org',
+ AutoAssignSelf => 0,
+};
+
+my $allowed = {
+ hook => {
+ 'issue_post_save' => 1,
+ },
};
## ----------------------------------------------------------------------------
@@ -60,11 +83,15 @@ sub new {
# save the settings for various bits of info
foreach my $key ( keys %$defaults ) {
# if we have been passed it in, use it, else use the default
- $self->$key( $cfg->{$key} || $defaults->{$key} );
+ $self->$key( $cfg->{$key} || $defaults->{$key} );
}
return $self;
}
+sub command_names {
+ return map { $_->name } $_[0]->commands;
+}
+
sub list_entities {
my ($self, $prefix, $base) = @_;
@@ -189,15 +216,23 @@ sub get_attachments_for {
sub read_config_user {
my ($self) = @_;
- my $filename = "$ENV{HOME}/.cilrc";
+ my $filename = File::HomeDir->my_home() . '/.cilrc';
+ # firstly, set the default config
my $cfg;
+ %$cfg = %$defaults_user;
+
+ # then read the ~/.cilrc file
if ( -f $filename ) {
$cfg = CIL::Utils->parse_cil_file( $filename );
}
- # set each config to be either the user defined one or the default
- foreach ( qw(UserName UserEmail) ) {
+ # for some settings, see if we can get it from Git
+ $cfg->{UserName} = eval { Git->repository->config( 'user.name' ) } || $cfg->{UserName};
+ $cfg->{UserEmail} = eval { Git->repository->config( 'user.email' ) } || $cfg->{UserEmail};
+
+ # save them all internally
+ foreach ( qw(UserName UserEmail AutoAssignSelf) ) {
$self->$_( $cfg->{$_} || $defaults_user->{$_} );
}
}
@@ -212,14 +247,13 @@ sub read_config_file {
my $cfg;
if ( -f $filename ) {
$cfg = CIL::Utils->parse_cil_file( $filename );
+ %$cfg = (%$defaults, %$cfg);
}
else {
+ # set some defaults if we don't have a .cil file
$cfg = $defaults;
}
- # set some defaults if we don't have any of these
- %$cfg = (%$defaults, %$cfg);
-
# for some things, make a hash out of them
foreach my $hash_name ( @config_hashes ) {
# if we have nothing in the cfg hash already, set it to empty and move on
@@ -242,16 +276,72 @@ sub read_config_file {
# set each config item
$self->IssueDir( $cfg->{IssueDir} );
+ $self->UseGit( $cfg->{UseGit} );
+ # Status info
$self->StatusStrict( $cfg->{StatusStrict} );
- $self->StatusAllowed( $cfg->{StatusAllowed} );
$self->StatusOpen( $cfg->{StatusOpen} );
$self->StatusClosed( $cfg->{StatusClosed} );
+ # make the StatusAllowed list the sum of StatusOpen and StatusClosed
+ $self->StatusAllowed( { %{$cfg->{StatusOpen}}, %{$cfg->{StatusClosed}} } );
+
+ # Label Info
$self->LabelStrict( $cfg->{LabelStrict} );
$self->LabelAllowed( $cfg->{LabelAllowed} );
- $self->VCS( $cfg->{VCS} );
+ $self->DefaultNewStatus( $cfg->{DefaultNewStatus} );
+
+ # create the git instance if we want it
+ $self->UseGit( $cfg->{UseGit} || 0 );
+ if ( $self->UseGit ) {
+ $self->git( CIL::Git->new() );
+ }
+}
+
+sub register_hook {
+ my ($self, $hook_name, $code) = @_;
+
+ unless ( defined $allowed->{hook}{$hook_name} ) {
+ croak "hook '$hook_name' not allowed";
+ }
+
+ push @{$self->{hook}{$hook_name}}, $code;
+}
+
+sub run_hook {
+ my ($self, $hook_name, @rest) = @_;
+
+ unless ( defined $allowed->{hook}{$hook_name} ) {
+ croak "hook '$hook_name' not allowed";
+ }
+
+ # call all the hooks with all the args
+ if ( ref $self->hook eq 'HASH' ) {
+ foreach my $code ( @{$self->hook->{$hook_name}} ) {
+ &$code( $self, @rest );
+ }
+ }
+}
+
+sub file_exists {
+ my ($self, $filename) = @_;
+ return -f $filename;
+}
+
+sub dir_exists {
+ my ($self, $dir) = @_;
+ return -d $dir;
+}
+
+sub parse_cil_file {
+ my ($self, $filename, $last_field) = @_;
+ return CIL::Utils->parse_cil_file($filename, $last_field);
+}
+
+sub save {
+ my ($self, $filename, $data, @fields) = @_;
+ return CIL::Utils->write_cil_file( $filename, $data, @fields );
}
## ----------------------------------------------------------------------------