package Gitalist::Model::CollectionOfRepos;
use Moose;
-use Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive;
-use Gitalist::Git::CollectionOfRepositories::FromListOfDirectories;
-use Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList;
-use MooseX::Types::Moose qw/Maybe ArrayRef/;
+use MooseX::Types::Moose qw/Undef Maybe ArrayRef Str/;
use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
+use MooseX::Types::LoadableClass qw/ LoadableClass /;
+use Gitalist::Git::Types qw/ ArrayRefOfDirs Dir DirOrUndef /;
use Moose::Util::TypeConstraints;
use Moose::Autobox;
+use Path::Class qw/ dir /;
use namespace::autoclean;
extends 'Catalyst::Model';
+with 'Catalyst::Component::ApplicationAttribute';
with 'Catalyst::Component::InstancePerContext';
-my $repo_dir_t = subtype NonEmptySimpleStr,
- where { -d $_ },
- message { 'Cannot find repository dir: "' . $_ . '", please set up gitalist.conf, or set GITALIST_REPO_DIR environment or pass the --repo_dir parameter when starting the application' };
-
-my $arrayof_repos_dir_t = subtype ArrayRef[$repo_dir_t],
- where { 1 },
- message { 'Cannot find repository directories listed in config - these are invalid directories: ' . join(', ', $_->flatten) };
-
-coerce $arrayof_repos_dir_t,
- from NonEmptySimpleStr,
- via { [ $_ ] };
-
-has config_repo_dir => (
- isa => NonEmptySimpleStr,
- is => 'ro',
- init_arg => 'repo_dir',
- predicate => 'has_config_repo_dir',
+has class => (
+ isa => LoadableClass,
+ is => 'ro',
+ lazy => 1,
+ coerce => 1,
+ builder => '_build_class',
);
-has repo_dir => (
- isa => $repo_dir_t,
- is => 'ro',
- lazy_build => 1
-);
+sub _build_class {
+ my ($self) = @_;
-has repos => (
- isa => $arrayof_repos_dir_t,
- is => 'ro',
- default => sub { [] },
- traits => ['Array'],
- handles => {
- _repos_count => 'count',
- },
- coerce => 1,
-);
+ if($self->whitelist && -f $self->whitelist) {
+ return 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList';
+ }
+ elsif($self->search_recursively) {
+ return 'Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive';
+ }
+ elsif ($self->repos) {
+ return 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories';
+ }
+ elsif ($self->repos_dir) {
+ return 'Gitalist::Git::CollectionOfRepositories::FromDirectory';
+ }
+ else {
+ return "Don't know where to get repositores from. Try a --repos_dir option, or setting up config";
+ }
+}
+has args => (
+ isa => 'HashRef',
+ is => 'ro',
+ default => sub { {} },
+);
has search_recursively => (
is => 'ro',
default => 0,
);
+## XX What is this for?
has export_ok => (
is => 'ro',
isa => 'Str',
has whitelist => (
is => 'ro',
isa => 'Str',
+ predicate => '_has_whitelist',
);
-sub _build_repo_dir {
+# Simple directory of repositories (for list)
+has repos_dir => (
+ is => 'ro',
+ isa => DirOrUndef,
+ coerce => 1,
+ builder => '_build_repos_dir',
+ lazy => 1,
+);
+
+# Directory containing list of one or more repositories
+has repos => (
+ is => 'ro',
+ isa => ArrayRefOfDirs,
+ coerce => 1,
+);
+
+sub _build_repos_dir {
my $self = shift;
- $ENV{GITALIST_REPO_DIR} ?
- $ENV{GITALIST_REPO_DIR}
- : $self->has_config_repo_dir
- ? $self->config_repo_dir
- : '';
+ my $dir = $self->_application->run_options->{repo_dir} || $ENV{GITALIST_REPO_DIR } || undef;
}
-after BUILD => sub {
+sub BUILD {
my $self = shift;
- # Explode loudly at app startup time if there is no list of
- # repositories or repos dir, rather than on first hit
- $self->_repos_count || $self->repo_dir;
-};
+ $self->class();
+ if ($self->repos_dir) { $self->repos_dir->resolve }
+}
sub build_per_context_instance {
my ($self, $app) = @_;
- my %args = (export_ok => $self->export_ok || '');
- my $class;
- if($self->whitelist && -f $self->whitelist) {
- $class = 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList';
- $args{repo_dir} = $self->repo_dir;
- $args{whitelist} = $self->whitelist;
- } elsif ($self->_repos_count && !$self->search_recursively) {
- $class = 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories';
- $args{repos} = $self->repos;
- } else {
- $class = 'Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive';
- $args{repo_dir} = $self->repo_dir;
- }
+ my %args = (
+ export_ok => $self->export_ok || '',
+ $self->_has_whitelist ? (whitelist => $self->whitelist) : (),
+ repos => $self->repos,
+ repo_dir => $self->repos_dir,
+ %{ $self->args }
+ );
+
+ my $class = $self->class;
+
+ $app->log->debug("Using class '$class'");
return $class->new(%args);
}
__END__
+=encoding UTF-8
+
+=head1 NAME
+
+Gitalist::Model::CollectionOfRepos - Model::CollectionOfRepos module for Gitalist
+
+=head1 DESCRIPTION
+
+This Model is a factory for an object implementing the L<Gitalist::Git::CollectionOfRepositories>
+interface.
+
+The simple options passed on the command line (like C<--repos_dir>), a class will by picked by default
+L<Gitalist::Git::CollectionOfRepositories::FromDirectory>.
+
+This can be overridden from config by explicitly passing in a class name and args for that class
+in config:
+
+ <Model::CollectionOfRepos>
+ class MyClassName
+ <args>
+ ...
+ </args>
+ </Model::CollectionOfRepos>
+
=head1 AUTHORS
See L<Gitalist> for authors.