Jakub Narebski wrote:
Toby White wrote:
I was wondering if a feature like the following would be of
use to anyone except me: I'd like to be able to download
the full source of a given tree from gitweb.
[...]
So you want to have snapshot of a tree. Why not snapshot of a commit,
or of a tag?
I've quickly hacked gitweb to do this for me - patch below.
It adds an extra link to the 'commit' page. Next to the link
that would lead you to 'tree', there is 'tar.gz' which simply
returns the tar.gz of the same tree.
The patch is against the version of gitweb currently in
Debian, which is, erm, '264-1', apparently, because that's
what I had to hand.
It is really better to hack git with git. And you can use current gitweb
with old git (well, not always, as current gitweb requires --full-history
option to git-rev-list to be available).
How about the below on top of latest git
-aneesh
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 37a6284..b9b522a 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -175,6 +175,7 @@ my %actions = (
"tag" => \&git_tag,
"tags" => \&git_tags,
"tree" => \&git_tree,
+ "snapshot" => \&git_snapshot,
);
$action = 'summary' if (!defined($action));
@@ -1334,6 +1335,7 @@ sub git_shortlog_body {
"<td class=\"link\">" .
$cgi->a({-href => href(action=>"commit", hash=>$commit)}, "commit") . " | " .
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff") .
+ " | " .$cgi->a({-href => "$my_uri/$project.tar.gz?" . esc_param("p=$project;a=snapshot;h=$commit")}, "snapshot") .
"</td>\n" .
"</tr>\n";
}
@@ -2097,6 +2099,21 @@ sub git_tree {
git_footer_html();
}
+sub git_snapshot {
+ if (!defined $hash) {
+ $hash = git_get_head_hash($project);
+ }
+ print $cgi->header(-type=>'application/x-tar',
+ -Content-Encoding=>'x-gzip', -status=> '200 OK');
+ open my $fd, "-|", "$GIT tar-tree $hash $project | gzip -c9" or die_error(undef, "Execute git-tar-tree failed.");
+ binmode STDOUT, ':raw';
+ print <$fd>;
+ binmode STDOUT, ':utf8'; # as set at the beginning of gitweb.cgi
+ close $fd;
+
+
+}
+
sub git_log {
my $head = git_get_head_hash($project);
if (!defined $hash) {