#our $projectroot = "/pub/scm";
our $projectroot = "++GITWEB_PROJECTROOT++";
-# location for temporary files needed for diffs
-our $git_temp = "/tmp/gitweb";
-
# target of the home link on top of all pages
our $home_link = $my_uri || "/";
# You define site-wide feature defaults here; override them with
# $GITWEB_CONFIG as necessary.
our %feature = (
- # feature => {'sub' => feature-sub, 'override' => allow-override, 'default' => [ default options...]
- # if feature is overridable, feature-sub will be called with default options;
- # return value indicates if to enable specified feature
+ # feature => {
+ # 'sub' => feature-sub (subroutine),
+ # 'override' => allow-override (boolean),
+ # 'default' => [ default options...] (array reference)}
+ #
+ # if feature is overridable (it means that allow-override has true value,
+ # then feature-sub will be called with default options as parameters;
+ # return value of feature-sub indicates if to enable specified feature
+ #
+ # use gitweb_check_feature(<feature>) to check if <feature> is enabled
'blame' => {
'sub' => \&feature_blame,
}
# To enable system wide have in $GITWEB_CONFIG
-# $feature{'blame'}{'default'} = [1];
-# To have project specific config enable override in $GITWEB_CONFIG
-# $feature{'blame'}{'override'} = 1;
+# $feature{'blame'}{'default'} = [1];
+# To have project specific config enable override in $GITWEB_CONFIG
+# $feature{'blame'}{'override'} = 1;
# and in project config gitweb.blame = 0|1;
sub feature_blame {
}
# To disable system wide have in $GITWEB_CONFIG
-# $feature{'snapshot'}{'default'} = [undef];
-# To have project specific config enable override in $GITWEB_CONFIG
-# $feature{'blame'}{'override'} = 1;
+# $feature{'snapshot'}{'default'} = [undef];
+# To have project specific config enable override in $GITWEB_CONFIG
+# $feature{'blame'}{'override'} = 1;
# and in project config gitweb.snapshot = none|gzip|bzip2
sub feature_snapshot {
our $git_version = qx($GIT --version) =~ m/git version (.*)$/ ? $1 : "unknown";
$projects_list ||= $projectroot;
-if (! -d $git_temp) {
- mkdir($git_temp, 0700) || die_error(undef, "Couldn't mkdir $git_temp");
-}
# ======================================================================
# input validation and dispatch
"blob") .
" | " .
$cgi->a({-href => href(action=>"history", hash_base=>$parent,
- file_name=>$diff{'file'})},\
+ file_name=>$diff{'file'})},
"history") .
"</td>\n";
print "<div class=\"patchset\">\n";
LINE:
- while (my $patch_line @$fd>) {
+ while (my $patch_line = <$fd>) {
chomp $patch_line;
if ($patch_line =~ m/^diff /) { # "git diff" header
print "</table>\n";
}
-## ----------------------------------------------------------------------
-## functions printing large fragments, format as one of arguments
-
-sub git_diff_print {
- my $from = shift;
- my $from_name = shift;
- my $to = shift;
- my $to_name = shift;
- my $format = shift || "html";
-
- my $from_tmp = "/dev/null";
- my $to_tmp = "/dev/null";
- my $pid = $$;
-
- # create tmp from-file
- if (defined $from) {
- $from_tmp = "$git_temp/gitweb_" . $$ . "_from";
- open my $fd2, "> $from_tmp";
- open my $fd, "-|", $GIT, "cat-file", "blob", $from;
- my @file = <$fd>;
- print $fd2 @file;
- close $fd2;
- close $fd;
- }
-
- # create tmp to-file
- if (defined $to) {
- $to_tmp = "$git_temp/gitweb_" . $$ . "_to";
- open my $fd2, "> $to_tmp";
- open my $fd, "-|", $GIT, "cat-file", "blob", $to;
- my @file = <$fd>;
- print $fd2 @file;
- close $fd2;
- close $fd;
- }
-
- open my $fd, "-|", "/usr/bin/diff -u -p -L \'$from_name\' -L \'$to_name\' $from_tmp $to_tmp";
- if ($format eq "plain") {
- undef $/;
- print <$fd>;
- $/ = "\n";
- } else {
- while (my $line = <$fd>) {
- chomp $line;
- my $char = substr($line, 0, 1);
- my $diff_class = "";
- if ($char eq '+') {
- $diff_class = " add";
- } elsif ($char eq "-") {
- $diff_class = " rem";
- } elsif ($char eq "@") {
- $diff_class = " chunk_header";
- } elsif ($char eq "\\") {
- # skip errors
- next;
- }
- $line = untabify($line);
- print "<div class=\"diff$diff_class\">" . esc_html($line) . "</div>\n";
- }
- }
- close $fd;
-
- if (defined $from) {
- unlink($from_tmp);
- }
- if (defined $to) {
- unlink($to_tmp);
- }
-}
-
-
## ======================================================================
## ======================================================================
## actions
chomp $line;
$line_class_num = ($line_class_num + 1) % $line_class_len;
- if ($line =~ m/^([0-9a-fA-F]{40})\t\(\s*([^\t]+)\t(\d+) \+\d\d\d\d\t(\d+)\)(.*)$/) {
+ if ($line =~ m/^([0-9a-fA-F]{40})\t\(\s*([^\t]+)\t(\d+) [+-]\d\d\d\d\t(\d+)\)(.*)$/) {
$long_rev = $1;
$author = $2;
$time = $3;
}
sub git_blob_plain {
+ # blobs defined by non-textual hash id's can be cached
+ my $expires;
+ if ($hash =~ m/^[0-9a-fA-F]{40}$/) {
+ $expires = "+1d";
+ }
+
if (!defined $hash) {
if (defined $file_name) {
my $base = $hash_base || git_get_head_hash($project);
$save_as .= '.txt';
}
- print $cgi->header(-type => "$type",
- -content_disposition => "inline; filename=\"$save_as\"");
+ print $cgi->header(
+ -type => "$type",
+ -expires=>$expires,
+ -content_disposition => "inline; filename=\"$save_as\"");
undef $/;
binmode STDOUT, ':raw';
print <$fd>;
}
sub git_blob {
+ # blobs defined by non-textual hash id's can be cached
+ my $expires;
+ if ($hash =~ m/^[0-9a-fA-F]{40}$/) {
+ $expires = "+1d";
+ }
+
if (!defined $hash) {
if (defined $file_name) {
my $base = $hash_base || git_get_head_hash($project);
close $fd;
return git_blob_plain($mimetype);
}
- git_header_html();
+ git_header_html(undef, $expires);
my $formats_nav = '';
if (defined $hash_base && (my %co = parse_commit($hash_base))) {
if (defined $file_name) {
}
# open patch output
- #open $fd, "-|", $GIT, "diff", '-p', $hash_parent, $hash
- open $fd, "-|", $GIT, "diff", '-p', $hash, $hash_parent
+ open $fd, "-|", $GIT, "diff", '-p', $hash_parent, $hash
or die_error(undef, "Open git-diff failed");
} else {
die_error('404 Not Found', "Missing one of the blob diff parameters")