Align Vhost code with reality.
[catagits/Gitalist.git] / lib / Gitalist / Model / CollectionOfRepos.pm
1 package Gitalist::Model::CollectionOfRepos;
2
3 use Moose;
4 use MooseX::Types::Moose qw/Undef Maybe ArrayRef Str/;
5 use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
6 use MooseX::Types::LoadableClass qw/ LoadableClass /;
7 use Gitalist::Git::Types qw/ ArrayRefOfDirs Dir DirOrUndef /;
8 use Moose::Util::TypeConstraints;
9 use Moose::Autobox;
10 use Path::Class qw/ dir /;
11 use namespace::autoclean;
12 use Carp qw/croak/;
13
14 extends 'Catalyst::Model';
15
16 has class => (
17     isa => LoadableClass,
18     is  => 'ro',
19     lazy => 1,
20     coerce => 1,
21     builder => '_build_class',
22 );
23
24 sub _build_class {
25     my ($self) = @_;
26
27     if($self->whitelist && -f $self->whitelist) {
28         return 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList';
29     }
30     elsif($self->search_recursively) {
31         return 'Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive';
32     }
33     elsif ($self->repos) {
34         return 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories';
35     }
36     elsif ($self->repo_dir) {
37         return 'Gitalist::Git::CollectionOfRepositories::FromDirectory';
38     }
39     else {
40         croak "Don't know where to get repositores from. Try a --repo_dir option, or setting up config";
41     }
42 }
43
44 has args => (
45     isa     => 'HashRef',
46     is      => 'ro',
47     default => sub { {} },
48 );
49
50 has search_recursively => (
51     is      => 'ro',
52     isa     => 'Bool',
53     default => 0,
54 );
55
56 ## XX What is this for?
57 has export_ok => (
58     is  => 'ro',
59     isa => 'Str',
60 );
61
62 has whitelist => (
63     is  => 'ro',
64     isa => 'Str',
65     predicate => '_has_whitelist',
66 );
67
68 # Simple directory of repositories (for list)
69 has repo_dir => (
70     is => 'ro',
71     isa => DirOrUndef,
72     coerce => 1,
73     builder => '_build_repo_dir',
74     lazy => 1,
75 );
76
77 # Directory containing list of one or more repositories
78 has repos => (
79     is => 'ro',
80     isa => ArrayRefOfDirs,
81     coerce => 1,
82 );
83
84 sub _build_repo_dir {
85     my $self = shift;
86     return $ENV{GITALIST_REPO_DIR};
87 }
88
89 sub BUILD {
90     my($self) = @_;
91
92     $self->class();
93
94     if ($self->repo_dir) { $self->repo_dir->resolve }
95 }
96
97 sub COMPONENT {
98     my($class, $ctx, @args) = @_;
99
100     my $self = $class->new($ctx, @args);
101
102     my %args = (
103         export_ok => $self->export_ok || '',
104         repos      => $self->repos,
105         repo_dir  => $self->repo_dir,
106         $self->_has_whitelist ? (whitelist => $self->whitelist) : (),
107         %{ $self->args }
108     );
109
110     my $model_class = $self->class;
111
112     $ctx->log->debug("Building $model_class with " . join(", ", map { $_ . " => " . (defined($args{$_}) ? "'" . $args{$_}  . "'" : 'undef') } keys %args))
113         if $ctx->debug;
114
115     my $model = $model_class->new(\%args);
116
117     $ctx->log->debug("Using class '$model_class' " . $model->debug_string) if $ctx->debug;
118
119     return $model;
120 }
121
122 __PACKAGE__->meta->make_immutable;
123
124 __END__
125
126 =encoding UTF-8
127
128 =head1 NAME
129
130 Gitalist::Model::CollectionOfRepos - Model::CollectionOfRepos module for Gitalist
131
132 =head1 DESCRIPTION
133
134 This Model is a factory for an object implementing the L<Gitalist::Git::CollectionOfRepositories>
135 interface.
136
137 The simple options passed on the command line (like C<--repo_dir>), a class will by picked by default 
138 L<Gitalist::Git::CollectionOfRepositories::FromDirectory>.
139
140 This can be overridden from config by explicitly passing in a class name and args for that class
141 in config:
142
143     <Model::CollectionOfRepos>
144         class MyClassName
145         <args>
146             ...
147         </args>
148     </Model::CollectionOfRepos>
149
150 =head1 AUTHORS
151
152 See L<Gitalist> for authors.
153
154 =head1 LICENSE
155
156 See L<Gitalist> for the license.
157
158 =cut