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