Moved snapshot method onto Project as both tree and commit sha1's are acceptable...
Zachary Stevens [Fri, 20 Nov 2009 00:17:15 +0000 (00:17 +0000)]
lib/Gitalist/Controller/Root.pm
lib/Gitalist/Git/Object/Commit.pm
lib/Gitalist/Git/Project.pm
t/03legacy_uri.t

index 8f16fe4..3cdf2fc 100644 (file)
@@ -460,12 +460,16 @@ sub snapshot : Local {
     my ($self, $c) = @_;
     my $format = $c->req->param('sf') || 'tgz';
     die unless $format;
-    my $commit = $self->_get_object($c);
+    my $sha1 = $c->req->param('h') || $self->_get_object($c)->sha1;
     $c->response->status(200);
     $c->response->headers->header( 'Content-Disposition' =>
                                        'attachment; filename=export.tgz');
-
-    $c->response->body($commit->snapshot($format));
+    $c->response->body(
+        $c->stash->{Project}->snapshot(
+            sha1 => $sha1,
+            format => $format
+        )
+    );
 }
 
 =head2 auto
index 4664e02..5a125f6 100644 (file)
@@ -8,7 +8,6 @@ class Gitalist::Git::Object::Commit
         use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
         use Moose::Autobox;
         use List::MoreUtils qw/any zip/;
-        use Gitalist::Util qw(to_utf8);
         our $SHA1RE = qr/[0-9a-fA-F]{40}/;
 
         has '+type' => ( default => 'commit' );
@@ -80,25 +79,6 @@ class Gitalist::Git::Object::Commit
             return \@difftree, [$self->_parse_diff(@out)];
         }
 
-method snapshot ( NonEmptySimpleStr $format ) {
-    # TODO - only valid formats are 'tar' and 'zip'
-    my $formats = { tgz => 'tar', zip => 'zip' };
-    unless ($formats->exists($format)) {
-        die("No such format: $format");
-    }
-    $format = $formats->{$format};
-    my $name = $self->project->name;
-    $name =~ s,([^/])/*\.git$,$1,;
-    my $filename = to_utf8($name);
-    $filename .= "-$self->sha1.$format";
-    $name =~ s/\047/\047\\\047\047/g;
-
-
-    my @cmd = ('archive', "--format=$format", "--prefix=$name/", $self->sha1);
-    return $self->_run_cmd_fh(@cmd);
-    # TODO - support compressed archives
-}
-
         ## Private methods
         # gitweb uses the following sort of command for diffing merges:
         # /home/dbrook/apps/bin/git --git-dir=/home/dbrook/dev/app/.git diff-tree -r -M --no-commit-id --patch-with-raw --full-index --cc 316cf158df3f6207afbae7270bcc5ba0 --
index 5ef414d..d4a04aa 100644 (file)
@@ -24,8 +24,10 @@ class Gitalist::Git::Project with Gitalist::Git::HasUtils {
     use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
     use MooseX::Types::Path::Class qw/Dir/;
     use MooseX::Types::Moose qw/Str Maybe Bool HashRef ArrayRef/;
+    use Moose::Autobox;
     use List::MoreUtils qw/any zip/;
     use DateTime;
+    use Gitalist::Util qw(to_utf8);
     use Gitalist::Git::Object::Blob;
     use Gitalist::Git::Object::Tree;
     use Gitalist::Git::Object::Commit;
@@ -238,18 +240,34 @@ Returns a list of revs for the given head ($sha1).
         return @revs;
     }
 
-=head2 snapshot($head?, $format)
+=head2 snapshot($sha1, $format)
 
 Generate an archived snapshot of the repository.
+$sha1 should be a commit or tree.
 Returns a filehandle to read from.
 
 =cut
 
-method snapshot (Gitalist::Git::Object :$commit,
+method snapshot (NonEmptySimpleStr :$sha1,
                  NonEmptySimpleStr :$format
                ) {
-               return $commit->snapshot;
-           }
+    # TODO - only valid formats are 'tar' and 'zip'
+    my $formats = { tgz => 'tar', zip => 'zip' };
+    unless ($formats->exists($format)) {
+        die("No such format: $format");
+    }
+    $format = $formats->{$format};
+    my $name = $self->name;
+    $name =~ s,([^/])/*\.git$,$1,;
+    my $filename = to_utf8($name);
+    $filename .= "-$sha1.$format";
+    $name =~ s/\047/\047\\\047\047/g;
+
+
+    my @cmd = ('archive', "--format=$format", "--prefix=$name/", $sha1);
+    return $self->run_cmd_fh(@cmd);
+    # TODO - support compressed archives
+}
 
 =head2 diff($commit, $patch?, $parent?, $file?)
 
index de6ad10..7188367 100644 (file)
@@ -158,19 +158,16 @@ test('/', 'a=shortlog;h=HEAD');
 test('/', 'a=shortlog;h=master');
 test('/', 'a=shortlog;h=refs/heads/master');
 
-TODO: {
-    local $TODO = "Action: snapshot is not yet implemented.";
-    test('/', 'a=snapshot;h=145dc3ef5d307be84cb9b325d70bd08aeed0eceb;sf=tgz');
-    test('/', 'a=snapshot;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;sf=tgz');
-    test('/', 'a=snapshot;h=3bc0634310b9c62222bb0e724c11ffdfb297b4ac;sf=tgz');
-    test('/', 'a=snapshot;h=3f7567c7bdf7e7ebf410926493b92d398333116e;sf=tgz');
-    test('/', 'a=snapshot;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;sf=tgz');
-    test('/', 'a=snapshot;h=82b5fee28277349b6d46beff5fdf6a7152347ba0;sf=tgz');
-    test('/', 'a=snapshot;h=9062594aebb5df0de7fb92413f17a9eced196c22;sf=tgz');
-    test('/', 'a=snapshot;h=HEAD;sf=tgz');
-    test('/', 'a=snapshot;h=master;sf=tgz');
-    test('/', 'a=snapshot;h=refs/heads/master;sf=tgz');
-}
+test('/', 'a=snapshot;h=145dc3ef5d307be84cb9b325d70bd08aeed0eceb;sf=tgz');
+test('/', 'a=snapshot;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;sf=tgz');
+test('/', 'a=snapshot;h=3bc0634310b9c62222bb0e724c11ffdfb297b4ac;sf=tgz');
+test('/', 'a=snapshot;h=3f7567c7bdf7e7ebf410926493b92d398333116e;sf=tgz');
+test('/', 'a=snapshot;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;sf=tgz');
+test('/', 'a=snapshot;h=82b5fee28277349b6d46beff5fdf6a7152347ba0;sf=tgz');
+test('/', 'a=snapshot;h=9062594aebb5df0de7fb92413f17a9eced196c22;sf=tgz');
+test('/', 'a=snapshot;h=HEAD;sf=tgz');
+test('/', 'a=snapshot;h=master;sf=tgz');
+test('/', 'a=snapshot;h=refs/heads/master;sf=tgz');
 
 test('/', 'a=tree');
 test('/', 'a=tree;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');