Tidy up and use callback to resolve the repo path for a recursive directory.
}
method _get_path_for_repository_name (NonEmptySimpleStr $name) {
- my $path = Path::Class::Dir->new( $name )->resolve;
- die "Directory traversal prohibited: $path"
+ my $path;
+ $self->repo_dir->recurse(
+ callback => sub {
+ my ( $thing ) = @_;
+ return unless ( $thing->is_dir );
+ $path = $thing if ( $thing->dir_list(-1) eq $name
+ && $self->_is_git_repo( $thing ) );
+ }
+ );
+ $path->resolve if $path;
+ die "Directory traversal prohibited: ".( $path || 'path undefined' )
unless $self->repo_dir->contains($path);
return $path;
}
for my $repo ( @ret ) {
# no need to go further if parent is git dir
# never have a git repo in a git repo?
- return if ( $repo->path->contains( $dir ) );
+ my $check_dir = $repo->path;
+ # go up one and ignore all in that path
+ # if in hidden .git directory
+ $check_dir = $check_dir->parent
+ if ( -f $check_dir->parent->file('.git', 'HEAD') );
+ return if ( $check_dir->contains( $dir ) );
}
eval {
- # pass directory as string
- my $p = $self->get_repository("$dir");
+ # pass directory name as string
+ my @list = $dir->dir_list();
+ my $p = $self->get_repository($list[$#list]);
push @ret, $p;
};
}
package Gitalist::Model::CollectionOfRepos;
use Moose;
-use Gitalist::Git::CollectionOfRepositories::FromDirectory;
+use Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive;
use Gitalist::Git::CollectionOfRepositories::FromListOfDirectories;
use MooseX::Types::Moose qw/Maybe ArrayRef/;
use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
Gitalist::Git::CollectionOfRepositories::FromListOfDirectories->new(repos => $self->repos);
}
else {
- Gitalist::Git::CollectionOfRepositories::FromDirectory->new(repo_dir => $self->repo_dir);
+ Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive->new(repo_dir => $self->repo_dir);
}
}
is_deeply( \@sorted_names, [ qw( bare.git barerecursive.git nodescription repo1 scratch.git) ], 'Repositories are correctly loaded' );
dies_ok {
- my $repository = $repo->get_repository("$repo_dir/NoSuchRepository");
+ my $repository = $repo->get_repository("NoSuchRepository");
} 'throws exception for invalid repository';
dies_ok {
my $repository = $repo->get_repository('../../../');
} 'Relative directory not contained within repo_dir';
-my $repository = $repo->get_repository( "$repo_dir/repo1" );
+my $repository = $repo->get_repository( "repo1" );
isa_ok($repository, 'Gitalist::Git::Repository');
# check for bug where get_repository blew up if repo_dir
lives_ok {
my $repo2_dir = "$Bin/lib/../lib/repositories";
my $repo2 = Gitalist::Git::CollectionOfRepositories::FromDirectoryRecursive->new( repo_dir => $repo2_dir );
- my $repo2_proj = $repo2->get_repository("$repo2_dir/repo1");
+ my $repo2_proj = $repo2->get_repository("repo1");
} 'relative repo_dir properly handled';
+
+# TODO Write a recursive test ignoring directories