Add the ability to provide a whitelist of repos.
Dan Brook [Sun, 20 Feb 2011 17:31:10 +0000 (17:31 +0000)]
Similar to gitweb.cgi and its $project_list this functionality allows
one to specify a whitelist of repos for a given directory.

gitalist_local.conf
lib/Gitalist/Git/CollectionOfRepositories/FromDirectory/WhiteList.pm [new file with mode: 0644]
lib/Gitalist/Model/CollectionOfRepos.pm
t/02git_CollectionOfRepositories_FromDirectory_WhiteList.t [new file with mode: 0644]
t/lib/repositories/projects.list [new file with mode: 0644]

index 89f0ae5..0540379 100644 (file)
@@ -5,5 +5,6 @@
     # don't have this config if you install from CPAN.
     repo_dir __path_to(../)__
     # export_ok .export-ok
+    # whitelist __path_to(../project.list)__
 </Model::CollectionOfRepos>
 
diff --git a/lib/Gitalist/Git/CollectionOfRepositories/FromDirectory/WhiteList.pm b/lib/Gitalist/Git/CollectionOfRepositories/FromDirectory/WhiteList.pm
new file mode 100644 (file)
index 0000000..8b1d79b
--- /dev/null
@@ -0,0 +1,65 @@
+use MooseX::Declare;
+
+class Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList
+    extends Gitalist::Git::CollectionOfRepositories::FromDirectory {
+    use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
+    use MooseX::Types::Path::Class qw/File Dir/;
+
+    has whitelist => (
+        isa      => File,
+        is       => 'ro',
+        required => 1,
+        coerce   => 1,
+    );
+
+    method _build_repositories {
+        return [
+            map  Gitalist::Git::Repository->new($_),
+            grep -d $_,
+            map  $self->repo_dir->subdir($_), $self->whitelist->slurp(chomp => 1)
+        ];
+    }
+}
+
+__END__
+=head1 NAME
+
+Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList - Model of a repositories listed in a file in a given directory.
+
+=head1 SYNOPSIS
+
+    my $repo = Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList->new(
+      repo_dir  => $Dir,
+      whitelist => 'projects.list',
+    );
+    my $repository_list = $repo->repositories;
+    my $first_repository = $repository_list->[0];
+    my $named_repository = $repo->get_repository('Gitalist');
+
+=head1 DESCRIPTION
+
+This class provides a list of Repositories found in the given
+directory and specified in a given whitelist file.
+
+=head1 ATTRIBUTES
+
+=head2 whitelist (C<Path::Class::File>)
+
+The file containing the available repositories. Each line specifies a
+different repository within L</repo_dir>.
+
+=head1 SEE ALSO
+
+L<Gitalist::Git::CollectionOfRepositories>,
+L<Gitalist::Git::Repository>, 
+L<Gitalist::Git::CollectionOfRepositories::FromDirectory>
+
+=head1 AUTHORS
+
+See L<Gitalist> for authors.
+
+=head1 LICENSE
+
+See L<Gitalist> for the license.
+
+=cut
index 84e107d..6c2d9a1 100644 (file)
@@ -3,6 +3,7 @@ package Gitalist::Model::CollectionOfRepos;
 use Moose;
 use Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive;
 use Gitalist::Git::CollectionOfRepositories::FromListOfDirectories;
+use Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList;
 use MooseX::Types::Moose qw/Maybe ArrayRef/;
 use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
 use Moose::Util::TypeConstraints;
@@ -54,6 +55,12 @@ has export_ok => (
     isa => 'Str',
 );
 
+has whitelist => (
+    is  => 'ro',
+    isa => 'Str',
+);
+
+
 sub _build_repo_dir {
     my $self = shift;
     $ENV{GITALIST_REPO_DIR} ?
@@ -75,7 +82,11 @@ sub build_per_context_instance {
 
     my %args = (export_ok => $self->export_ok || '');
     my $class;
-    if ($self->_repos_count) {
+    if($self->whitelist && -f $self->whitelist) {
+        $class = 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList';
+        $args{repo_dir}  = $self->repo_dir;
+        $args{whitelist} = $self->whitelist;
+    } elsif ($self->_repos_count) {
         $class = 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories';
         $args{repos} = $self->repos;
     }
diff --git a/t/02git_CollectionOfRepositories_FromDirectory_WhiteList.t b/t/02git_CollectionOfRepositories_FromDirectory_WhiteList.t
new file mode 100644 (file)
index 0000000..23f33f1
--- /dev/null
@@ -0,0 +1,28 @@
+use FindBin qw/$Bin/;
+BEGIN {
+    my $env = "$FindBin::Bin/../script/env";
+    if (-r $env) {
+        do $env or die $@;
+    }
+}
+
+use strict;
+use warnings;
+use Test::More qw/no_plan/;
+use Test::Exception;
+
+use Data::Dumper;
+
+BEGIN { use_ok 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList' }
+
+my $repo_dir = "$Bin/lib/repositories";
+my $repo     = Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList->new(
+   repo_dir  => $repo_dir,
+   whitelist => "$repo_dir/projects.list",
+);
+isa_ok($repo, 'Gitalist::Git::CollectionOfRepositories::FromDirectory::WhiteList');
+
+my @repos = @{$repo->repositories};
+is(scalar @repos, 2, 'Only 2 repos found' );
+is($repos[0]->name, 'bare.git', 'Found bare.git');
+is($repos[1]->name, 'repo1', 'Found repo1');
diff --git a/t/lib/repositories/projects.list b/t/lib/repositories/projects.list
new file mode 100644 (file)
index 0000000..97addba
--- /dev/null
@@ -0,0 +1,2 @@
+bare.git
+repo1