Minimally working snapshot action.
[catagits/Gitalist.git] / lib / Gitalist / Git / Object / Commit.pm
index d42e41b..752b930 100644 (file)
@@ -8,6 +8,7 @@ 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' );
@@ -44,7 +45,7 @@ class Gitalist::Git::Object::Commit
                     ? '--cc' : '--root';
                 push @cmd, $self->sha1;
             }
-            return $self->_run_cmd( @cmd );
+            return $self->_run_cmd_fh( @cmd );
         }
 
         method diff ( Maybe[Bool] :$patch?,
@@ -79,6 +80,18 @@ class Gitalist::Git::Object::Commit
             return \@difftree, [$self->_parse_diff(@out)];
         }
 
+method snapshot ( NonEmptySimpleStr $format ) {
+#    return unless (qw/tar zip/->any($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);
+}
+
         ## 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 --