Add support for export-ok config option.
Dan Brook [Sun, 20 Feb 2011 17:09:02 +0000 (17:09 +0000)]
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.

gitalist_local.conf
lib/Gitalist/Git/CollectionOfRepositories.pm
lib/Gitalist/Model/CollectionOfRepos.pm
t/02git_CollectionOfRepositories_FromDirectory.t
t/lib/repositories/repo1/export-ok [new file with mode: 0644]

index 2729895..89f0ae5 100644 (file)
@@ -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
 </Model::CollectionOfRepos>
 
index cea9050..62ed906 100644 (file)
@@ -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
index 45c9e35..84e107d 100644 (file)
@@ -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;
index 7aded33..e045a44 100644 (file)
@@ -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 (file)
index 0000000..e69de29