Rename ->project to ->get_project.
Zachary Stevens [Sun, 13 Dec 2009 01:38:51 +0000 (01:38 +0000)]
Add test for repo_dir being handed a relative path.

lib/Gitalist/Controller/Root.pm
lib/Gitalist/Git/Repo.pm
t/02git_repo.t

index b1fd379..b0a2bb9 100644 (file)
@@ -624,7 +624,7 @@ sub base : Chained('/root') PathPart('') CaptureArgs(0) {
   my $project = $c->req->param('p');
   if (defined $project) {
     eval {
-      $c->stash(Project => $c->model('GitRepos')->project($project));
+      $c->stash(Project => $c->model('GitRepos')->get_project($project));
     };
     if ($@) {
       $c->detach('/error_404');
index 3984dd5..62879d7 100644 (file)
@@ -20,14 +20,20 @@ class Gitalist::Git::Repo {
         lazy_build => 1,
     );
 
+    method BUILD {
+        # Make sure repo_dir is an absolute path so that
+        # ->contains() works correctly.
+        $self->repo_dir->resolve;
+    }
+
     ## Public methods
-    method project (NonEmptySimpleStr $project) {
-        my $path = $self->repo_dir->subdir($project)->resolve;
-        $self->repo_dir->resolve; # FIXME - This needs to be called, or if repo_dir contains .., it'll explode below!
-                                  #         This is a Path::Class::Dir bug, right?
-        die "Directory traversal prohibited" unless $self->repo_dir->contains($path);
-        die "Not a valid Project" unless $self->_is_git_repo($path);
-        return Project->new( $self->repo_dir->subdir($project) );
+    method get_project (NonEmptySimpleStr $name) {
+        my $path = $self->repo_dir->subdir($name)->resolve;
+        die "Directory traversal prohibited"
+            unless $self->repo_dir->contains($path);
+        die "Not a valid Project"
+            unless $self->_is_git_repo($path);
+        return Project->new( $path );
     }
 
     ## Builders
@@ -42,7 +48,7 @@ class Gitalist::Git::Repo {
             next unless -d $obj;
             next unless $self->_is_git_repo($obj);
 
-            push @ret, $self->project($file);
+            push @ret, $self->get_project($file);
         }
 
         return [sort { $a->name cmp $b->name } @ret];
@@ -66,7 +72,7 @@ Gitalist::Git::Repo - Model of a repository directory
     my $repo = Gitalist::Git::Repo->new( repo_dir => $Dir );
     my $project_list = $repo->projects;
     my $first_project = @$project_list[0];
-    my $named_project = $repo->project('Gitalist');
+    my $named_project = $repo->get_project('Gitalist');
 
 =head1 DESCRIPTION
 
@@ -89,7 +95,7 @@ An array of all Repos found in C<repo_dir>.
 
 =head1 METHODS
 
-=head2 project (Str $project)
+=head2 get_project (Str $name)
 
 Returns a L<Gitalist::Git::Project> for the specified project
 name.
index 821d5db..65a31e2 100644 (file)
@@ -32,16 +32,25 @@ ok(scalar @{$project_list} == 3, 'list_projects returns an array with the correc
 is($project_list->[0]->{name}, 'bare.git', 'list_projects has correct name for "bare.git" repo' );
 
 dies_ok {
-    my $project = $repo->project('NoSuchProject');
+    my $project = $repo->get_project('NoSuchProject');
 } 'throws exception for invalid project';
 
 dies_ok {
-    my $project = $repo->project();
+    my $project = $repo->get_project();
 } 'throws exception for no project';
 
 dies_ok {
-    my $project = $repo->project('../../../');
+    my $project = $repo->get_project('../../../');
 } 'throws exception for directory traversal';
 
-my $project = $repo->project('repo1');
+my $project = $repo->get_project('repo1');
 isa_ok($project, 'Gitalist::Git::Project');
+
+
+# check for bug where get_project blew up if repo_dir
+# was a relative path
+lives_ok {
+    my $repo2_dir = "$Bin/lib/../lib/repositories";
+    my $repo2 = Gitalist::Git::Repo->new( repo_dir => $repo2_dir );
+    my $repo2_proj = $repo2->get_project('repo1');
+} 'relative repo_dir properly handled';