From: Dan Brook Date: Sun, 20 Feb 2011 17:09:02 +0000 (+0000) Subject: Add support for export-ok config option. X-Git-Tag: 0.002008~10 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FGitalist.git;a=commitdiff_plain;h=1d72763415136a65d6b965ab168403e99c1cf9c3 Add support for export-ok config option. This mimics the gitweb.cgi behaviour of specifying a file in $export_ok to check for when listing available repos. So if export_ok is specified in the Model::CollectionOfRepos section of the config then only repos containing that filename will be visible. --- diff --git a/gitalist_local.conf b/gitalist_local.conf index 2729895..89f0ae5 100644 --- a/gitalist_local.conf +++ b/gitalist_local.conf @@ -4,5 +4,6 @@ # This file is suppressed from the built dist by MANIFEST.SKIP, so you # don't have this config if you install from CPAN. repo_dir __path_to(../)__ + # export_ok .export-ok diff --git a/lib/Gitalist/Git/CollectionOfRepositories.pm b/lib/Gitalist/Git/CollectionOfRepositories.pm index cea9050..62ed906 100644 --- a/lib/Gitalist/Git/CollectionOfRepositories.pm +++ b/lib/Gitalist/Git/CollectionOfRepositories.pm @@ -7,11 +7,17 @@ role Gitalist::Git::CollectionOfRepositories { use aliased 'Gitalist::Git::Repository'; has repositories => ( - is => 'ro', - isa => ArrayRef['Gitalist::Git::Repository'], - required => 1, + is => 'ro', + isa => ArrayRef['Gitalist::Git::Repository'], + required => 1, lazy_build => 1, ); + + has export_ok => ( + is => 'ro', + isa => 'Str', + ); + method get_repository (NonEmptySimpleStr $name) { my $path = $self->_get_path_for_repository_name($name); die "Couldn't get_repository '$name' - not a valid git repository." @@ -21,7 +27,13 @@ role Gitalist::Git::CollectionOfRepositories { # Determine whether a given directory is a git repo. # http://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html method _is_git_repo ($dir) { - return -f $dir->file('HEAD') || -f $dir->file('.git', 'HEAD'); + my $has_head = -f $dir->file('HEAD') || -f $dir->file('.git', 'HEAD'); + my $eok_file = $self->export_ok + or return $has_head; + my $is_visible = $eok_file + && (-f $dir->file($eok_file) || -f $dir->file('.git', $eok_file)); + + return $has_head && $is_visible; } requires qw/ _build_repositories diff --git a/lib/Gitalist/Model/CollectionOfRepos.pm b/lib/Gitalist/Model/CollectionOfRepos.pm index 45c9e35..84e107d 100644 --- a/lib/Gitalist/Model/CollectionOfRepos.pm +++ b/lib/Gitalist/Model/CollectionOfRepos.pm @@ -49,6 +49,11 @@ has repos => ( coerce => 1, ); +has export_ok => ( + is => 'ro', + isa => 'Str', +); + sub _build_repo_dir { my $self = shift; $ENV{GITALIST_REPO_DIR} ? @@ -67,12 +72,19 @@ after BUILD => sub { sub build_per_context_instance { my ($self, $app) = @_; + + my %args = (export_ok => $self->export_ok || ''); + my $class; if ($self->_repos_count) { - Gitalist::Git::CollectionOfRepositories::FromListOfDirectories->new(repos => $self->repos); + $class = 'Gitalist::Git::CollectionOfRepositories::FromListOfDirectories'; + $args{repos} = $self->repos; } else { - Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive->new(repo_dir => $self->repo_dir); + $class = 'Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive'; + $args{repo_dir} = $self->repo_dir; } + + return $class->new(%args); } __PACKAGE__->meta->make_immutable; diff --git a/t/02git_CollectionOfRepositories_FromDirectory.t b/t/02git_CollectionOfRepositories_FromDirectory.t index 7aded33..e045a44 100644 --- a/t/02git_CollectionOfRepositories_FromDirectory.t +++ b/t/02git_CollectionOfRepositories_FromDirectory.t @@ -61,3 +61,13 @@ lives_ok { my $repo2 = Gitalist::Git::CollectionOfRepositories::FromDirectory->new( repo_dir => $repo2_dir ); my $repo2_proj = $repo2->get_repository('repo1'); } 'relative repo_dir properly handled'; + +my $repo_eok = Gitalist::Git::CollectionOfRepositories::FromDirectory->new( + repo_dir => $repo_dir, + export_ok => 'export-ok', +); + +my @eok_repos = @{$repo_eok->repositories}; + +is(1, @eok_repos, "Found the 1 export-ok repo"); +is('repo1', $eok_repos[0]->name, "Found repo1 export-ok repo"); diff --git a/t/lib/repositories/repo1/export-ok b/t/lib/repositories/repo1/export-ok new file mode 100644 index 0000000..e69de29