Drop noisy debug call.
[catagits/Gitalist.git] / lib / Gitalist / Model / CollectionOfRepos.pm
index 6588937..5dead00 100644 (file)
@@ -1,11 +1,13 @@
 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';
@@ -13,61 +15,32 @@ 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 => (
@@ -82,6 +55,7 @@ has search_recursively => (
     default => 0,
 );
 
+## XX What is this for?
 has export_ok => (
     is  => 'ro',
     isa => 'Str',
@@ -90,43 +64,48 @@ has export_ok => (
 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 }
     );
 
-    my $class = $self->class;
-
-    $app->log->debug("Using class '$class'");
-
-    return $class->new(%args);
+    return $self->class->new(%args);
 }
 
 __PACKAGE__->meta->make_immutable;