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
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' );
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 --
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;
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?)
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');