From: Dan Brook Date: Sun, 20 Feb 2011 17:31:10 +0000 (+0000) Subject: Add the ability to provide a whitelist of repos. X-Git-Tag: 0.002008~9 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FGitalist.git;a=commitdiff_plain;h=b70462a4f5137a1444304a35616911094383b381 Add the ability to provide a whitelist of repos. Similar to gitweb.cgi and its $project_list this functionality allows one to specify a whitelist of repos for a given directory. --- diff --git a/gitalist_local.conf b/gitalist_local.conf index 89f0ae5..0540379 100644 --- a/gitalist_local.conf +++ b/gitalist_local.conf @@ -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)__ diff --git a/lib/Gitalist/Git/CollectionOfRepositories/FromDirectory/WhiteList.pm b/lib/Gitalist/Git/CollectionOfRepositories/FromDirectory/WhiteList.pm new file mode 100644 index 0000000..8b1d79b --- /dev/null +++ b/lib/Gitalist/Git/CollectionOfRepositories/FromDirectory/WhiteList.pm @@ -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) + +The file containing the available repositories. Each line specifies a +different repository within L. + +=head1 SEE ALSO + +L, +L, +L + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +See L for the license. + +=cut diff --git a/lib/Gitalist/Model/CollectionOfRepos.pm b/lib/Gitalist/Model/CollectionOfRepos.pm index 84e107d..6c2d9a1 100644 --- a/lib/Gitalist/Model/CollectionOfRepos.pm +++ b/lib/Gitalist/Model/CollectionOfRepos.pm @@ -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 index 0000000..23f33f1 --- /dev/null +++ b/t/02git_CollectionOfRepositories_FromDirectory_WhiteList.t @@ -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 index 0000000..97addba --- /dev/null +++ b/t/lib/repositories/projects.list @@ -0,0 +1,2 @@ +bare.git +repo1