From: Zachary Stevens Date: Fri, 20 Nov 2009 00:17:15 +0000 (+0000) Subject: Moved snapshot method onto Project as both tree and commit sha1's are acceptable... X-Git-Tag: 0.000000_01~16^2~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2e79039ac58a36a4a5101486d16b744caab8db3d;p=catagits%2FGitalist.git Moved snapshot method onto Project as both tree and commit sha1's are acceptable inputs. --- diff --git a/lib/Gitalist/Controller/Root.pm b/lib/Gitalist/Controller/Root.pm index 8f16fe4..3cdf2fc 100644 --- a/lib/Gitalist/Controller/Root.pm +++ b/lib/Gitalist/Controller/Root.pm @@ -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 diff --git a/lib/Gitalist/Git/Object/Commit.pm b/lib/Gitalist/Git/Object/Commit.pm index 4664e02..5a125f6 100644 --- a/lib/Gitalist/Git/Object/Commit.pm +++ b/lib/Gitalist/Git/Object/Commit.pm @@ -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 -- diff --git a/lib/Gitalist/Git/Project.pm b/lib/Gitalist/Git/Project.pm index 5ef414d..d4a04aa 100644 --- a/lib/Gitalist/Git/Project.pm +++ b/lib/Gitalist/Git/Project.pm @@ -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?) diff --git a/t/03legacy_uri.t b/t/03legacy_uri.t index de6ad10..7188367 100644 --- a/t/03legacy_uri.t +++ b/t/03legacy_uri.t @@ -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');