Rename the Catalyst model to be in line with everything else. BREAKS CURRENT INSTALLS...
[catagits/Gitalist.git] / lib / Gitalist / Model / CollectionOfRepos.pm
diff --git a/lib/Gitalist/Model/CollectionOfRepos.pm b/lib/Gitalist/Model/CollectionOfRepos.pm
new file mode 100644 (file)
index 0000000..2820b53
--- /dev/null
@@ -0,0 +1,90 @@
+package Gitalist::Model::CollectionOfRepos;
+
+use Moose;
+use Gitalist::Git::CollectionOfRepositories::FromDirectory;
+use Gitalist::Git::CollectionOfRepositories::FromListOfDirectories;
+use MooseX::Types::Moose qw/Maybe ArrayRef/;
+use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
+use Moose::Util::TypeConstraints;
+use Moose::Autobox;
+use namespace::autoclean;
+
+extends 'Catalyst::Model';
+
+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,
+);
+
+sub _build_repo_dir {
+    my $self = shift;
+    $ENV{GITALIST_REPO_DIR} ?
+        $ENV{GITALIST_REPO_DIR}
+      : $self->has_config_repo_dir
+      ? $self->config_repo_dir
+        : '';
+}
+
+after BUILD => sub {
+    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;
+};
+
+sub build_per_context_instance {
+    my ($self, $app) = @_;
+    if ($self->_repos_count) {
+        Gitalist::Git::CollectionOfRepositories::FromListOfDirectories->new(repos => $self->repos);
+    }
+    else {
+        Gitalist::Git::CollectionOfRepositories::FromDirectory->new(repo_dir => $self->repo_dir);
+    }
+}
+
+__PACKAGE__->meta->make_immutable;
+
+__END__
+
+=head1 AUTHORS
+
+See L<Gitalist> for authors.
+
+=head1 LICENSE
+
+See L<Gitalist> for the license.
+
+=cut