From: Jim Klimov Date: Fri, 11 Mar 2016 13:24:44 GMT Subject: [PATCH 1/6] gitweb.perl : added ability to "git archive" just certain paths (files or subdirs, not whole repo) via gitweb interface Message-ID: <1457702689-9084-1-git-send-email-jim@jimklimov.com> --- gitweb/gitweb.perl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 05d7910..030d429 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -7328,6 +7328,15 @@ sub git_snapshot { die_error(403, "Unsupported snapshot format"); } + if (!defined($hash)) { + $hash=""; + if ( $file_name && $file_name =~ /^([^:]*):(.*)$/ ) { + $hash = "$1"; + $file_name = "$2"; + } + if ( $hash eq "") { $hash = "HEAD"; } + printf STDERR "Defaulted hash to '$hash' ('h=' URL argument was missing)\n"; + } my $type = git_get_type("$hash^{}"); if (!$type) { die_error(404, 'Object does not exist'); @@ -7345,6 +7354,14 @@ sub git_snapshot { git_cmd(), 'archive', "--format=$known_snapshot_formats{$format}{'format'}", "--prefix=$prefix/", $hash); + if ($file_name) { + # To fetch several pathnames use space-separation, e.g. + # "...git-web?p=proj.git;a=snapshot;f=file1%20file2 + # To fetch pathnames with spaces, escape them, e.g. + # "...git-web?p=proj.git;a=snapshot;f=file\%20name + $cmd .= " " . $file_name; + } + if (exists $known_snapshot_formats{$format}{'compressor'}) { $cmd .= ' | ' . quote_command(@{$known_snapshot_formats{$format}{'compressor'}}); } -- 2.1.4