diff options
Diffstat (limited to 'lib/CIL.pm')
-rw-r--r-- | lib/CIL.pm | 122 |
1 files changed, 106 insertions, 16 deletions
@@ -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 ); } ## ---------------------------------------------------------------------------- |