package Gitalist::Model::CollectionOfRepos;
use Moose;
-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 repo_dir => (
- isa => $repo_dir_t,
- is => 'ro',
- lazy_build => 1
-);
-
-has repos => (
- isa => $arrayof_repos_dir_t,
- is => 'ro',
- default => sub { [] },
- traits => ['Array'],
- handles => {
- _repos_count => 'count',
- },
- coerce => 1,
-);
-
has class => (
isa => LoadableClass,
is => 'ro',
- is => 'lazy',
+ lazy => 1,
+ coerce => 1,
builder => '_build_class',
);
sub _build_class {
- my($self) = @_;
+ my ($self) = @_;
if($self->whitelist && -f $self->whitelist) {
return 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList';
- } elsif ($self->_repos_count && !$self->search_recursively) {
- return 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories';
- } elsif($self->search_recursively) {
+ }
+ elsif($self->search_recursively) {
return 'Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive';
}
-
- return 'Gitalist::Git::CollectionOfRepositories::FromDirectory';
+ 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 => (
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 {
- my $self = shift;
- my $repo_dir = $self->_application->run_options->{repo_dir};
+# Simple directory of repositories (for list)
+has repos_dir => (
+ is => 'ro',
+ isa => DirOrUndef,
+ coerce => 1,
+ builder => '_build_repos_dir',
+ lazy => 1,
+);
- $repo_dir ?
- $repo_dir
- : $self->has_config_repo_dir
- ? $self->config_repo_dir
- : '';
-}
+# Directory containing list of one or more repositories
+has repos => (
+ is => 'ro',
+ isa => ArrayRefOfDirs,
+ coerce => 1,
+);
-after BUILD => sub {
+sub _build_repos_dir {
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;
-};
+ my $dir = $self->_application->run_options->{repo_dir} || $ENV{GITALIST_REPO_DIR } || undef;
+}
+sub BUILD {
+ my $self = shift;
+ $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 || '',
- $self->_has_whitelist ? (whitelist => $self->whistlist) : (),
- $self->_has_repos ? (repos => $self->repos) : ()
- $self->_has_repo_dir ? (repo_dir => $self->repo_dir) : ()
+ $self->_has_whitelist ? (whitelist => $self->whitelist) : (),
+ repos => $self->repos,
+ repo_dir => $self->repos_dir,
%{ $self->args }
);