Add the ability to provide a whitelist of repos.
[catagits/Gitalist.git] / lib / Gitalist / Model / CollectionOfRepos.pm
CommitLineData
7bf1a6f5 1package Gitalist::Model::CollectionOfRepos;
21336a02 2
3use Moose;
afbb1a52 4use Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive;
cd169152 5use Gitalist::Git::CollectionOfRepositories::FromListOfDirectories;
b70462a4 6use Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList;
bd7cb7a1 7use MooseX::Types::Moose qw/Maybe ArrayRef/;
bddfb71e 8use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
a18818fd 9use Moose::Util::TypeConstraints;
a7010acf 10use Moose::Autobox;
21336a02 11use namespace::autoclean;
12
bddfb71e 13extends 'Catalyst::Model';
21336a02 14
bddfb71e 15with 'Catalyst::Component::InstancePerContext';
16
a18818fd 17my $repo_dir_t = subtype NonEmptySimpleStr,
18 where { -d $_ },
19 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' };
20
a7010acf 21my $arrayof_repos_dir_t = subtype ArrayRef[$repo_dir_t],
22 where { 1 },
23 message { 'Cannot find repository directories listed in config - these are invalid directories: ' . join(', ', $_->flatten) };
24
25coerce $arrayof_repos_dir_t,
26 from NonEmptySimpleStr,
27 via { [ $_ ] };
28
a18818fd 29has config_repo_dir => (
bddfb71e 30 isa => NonEmptySimpleStr,
31 is => 'ro',
a18818fd 32 init_arg => 'repo_dir',
33 predicate => 'has_config_repo_dir',
bddfb71e 34);
35
a18818fd 36has repo_dir => (
a7010acf 37 isa => $repo_dir_t,
a18818fd 38 is => 'ro',
39 lazy_build => 1
40);
41
bd7cb7a1 42has repos => (
a7010acf 43 isa => $arrayof_repos_dir_t,
bd7cb7a1 44 is => 'ro',
45 default => sub { [] },
46 traits => ['Array'],
47 handles => {
48 _repos_count => 'count',
49 },
a7010acf 50 coerce => 1,
bd7cb7a1 51);
52
1d727634 53has export_ok => (
54 is => 'ro',
55 isa => 'Str',
56);
57
b70462a4 58has whitelist => (
59 is => 'ro',
60 isa => 'Str',
61);
62
63
a18818fd 64sub _build_repo_dir {
65 my $self = shift;
66 $ENV{GITALIST_REPO_DIR} ?
67 $ENV{GITALIST_REPO_DIR}
68 : $self->has_config_repo_dir
69 ? $self->config_repo_dir
70 : '';
71}
72
73after BUILD => sub {
74 my $self = shift;
bd7cb7a1 75 # Explode loudly at app startup time if there is no list of
82bc0f05 76 # repositories or repos dir, rather than on first hit
bd7cb7a1 77 $self->_repos_count || $self->repo_dir;
a18818fd 78};
79
bddfb71e 80sub build_per_context_instance {
81 my ($self, $app) = @_;
1d727634 82
83 my %args = (export_ok => $self->export_ok || '');
84 my $class;
b70462a4 85 if($self->whitelist && -f $self->whitelist) {
86 $class = 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList';
87 $args{repo_dir} = $self->repo_dir;
88 $args{whitelist} = $self->whitelist;
89 } elsif ($self->_repos_count) {
1d727634 90 $class = 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories';
91 $args{repos} = $self->repos;
bd7cb7a1 92 }
93 else {
1d727634 94 $class = 'Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive';
95 $args{repo_dir} = $self->repo_dir;
bd7cb7a1 96 }
1d727634 97
98 return $class->new(%args);
21336a02 99}
100
101__PACKAGE__->meta->make_immutable;
bddfb71e 102
775e96e0 103__END__
104
105=head1 AUTHORS
106
107See L<Gitalist> for authors.
108
109=head1 LICENSE
110
111See L<Gitalist> for the license.
112
113=cut