X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FGitalist%2FGit%2FCollectionOfRepositories.pm;h=dc3efe5773dfb9087c1eb3c082109e2a21dee8bd;hb=460b079a490cc638ecdd666c63d8edc09b7a8bcc;hp=69243af9a5414a22710bf1f266a751651d7e32e1;hpb=a3f91c1a382894cd683248acfaec2b6d75348fae;p=catagits%2FGitalist.git diff --git a/lib/Gitalist/Git/CollectionOfRepositories.pm b/lib/Gitalist/Git/CollectionOfRepositories.pm index 69243af..dc3efe5 100644 --- a/lib/Gitalist/Git/CollectionOfRepositories.pm +++ b/lib/Gitalist/Git/CollectionOfRepositories.pm @@ -1,30 +1,48 @@ use MooseX::Declare; -role Gitalist::Git::CollectionOfRepositories { +role Gitalist::Git::CollectionOfRepositories + with Gitalist::Git::Serializable + with Gitalist::Git::CollectionOfRepositories::Role::Context { use MooseX::Types::Common::String qw/NonEmptySimpleStr/; use MooseX::Types::Moose qw/ArrayRef/; use Moose::Autobox; use aliased 'Gitalist::Git::Repository'; + requires 'debug_string'; + 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 "Not a valid git repository." - unless $self->_is_git_repo($path); - return Repository->new( $path ); + my $repo = $self->_get_repo_from_name($name); + confess("Couldn't get_repository '$name' - not a valid git repository.") + unless $self->_is_git_repo($repo->path); + return $repo; } + # 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 - _get_path_for_repository_name + _get_repo_from_name /; around _build_repositories {