X-Git-Url: https://git.ladys.computer/Gitweb/blobdiff_plain/715264a8d08973c4bb33edab85c92412384cef6d4d005d11e3fed5ce48a76dbf..742ad6b69984e511de803baeff3856430ad3c46a8f35a165d4c1d627eac5ed5f:/gitweb.cgi
diff --git a/gitweb.cgi b/gitweb.cgi
index ca65695..ffe4620 100755
--- a/gitweb.cgi
+++ b/gitweb.cgi
@@ -15,13 +15,14 @@ use CGI::Carp qw(fatalsToBrowser);
use Fcntl ':mode';
my $cgi = new CGI;
-my $version = "225";
+my $version = "236";
my $my_url = $cgi->url();
my $my_uri = $cgi->url(-absolute => 1);
my $rss_link = "";
# absolute fs-path which will be prepended to the project path
my $projectroot = "/pub/scm";
+$projectroot = "/home/kay/public_html/pub/scm";
# location of the git-core binaries
my $gitbin = "/usr/bin";
@@ -53,8 +54,6 @@ if (defined $action) {
git_opml();
exit;
}
-} else {
- $action = "summary";
}
my $project = $cgi->param('p');
@@ -76,7 +75,7 @@ if (defined $project) {
die_error(undef, "No such project.");
}
$rss_link = "";
- $ENV{'GIT_OBJECT_DIRECTORY'} = "$projectroot/$project/objects";
+ $ENV{'GIT_DIR'} = "$projectroot/$project";
} else {
git_project_list();
exit;
@@ -95,9 +94,26 @@ if (defined $file_name) {
}
my $hash = $cgi->param('h');
-if (defined $hash && !($hash =~ m/^[0-9a-fA-F]{40}$/)) {
- undef $hash;
- die_error(undef, "Invalid hash parameter.");
+if (defined $hash) {
+ if (!($hash =~ m/^[0-9a-fA-F]{40}$/)) {
+ if ($hash =~ m/(^|\/)(|\.|\.\.)($|\/)/) {
+ undef $hash;
+ die_error(undef, "Non-canonical hash parameter.");
+ }
+ if ($hash =~ m/[^a-zA-Z0-9_\.\/\-\+\#\~\:\!]/) {
+ undef $hash;
+ die_error(undef, "Invalid character in hash parameter.");
+ }
+ # replace branch-name with hash
+ my $branchlist = git_read_refs("refs/heads");
+ foreach my $entry (@$branchlist) {
+ my %branch = %$entry;
+ if ($branch{'name'} eq $hash) {
+ $hash = $branch{'id'};
+ last;
+ }
+ }
+ }
}
my $hash_parent = $cgi->param('hp');
@@ -120,7 +136,6 @@ if (defined $page) {
}
}
-
my $searchtext = $cgi->param('s');
if (defined $searchtext) {
if ($searchtext =~ m/[^a-zA-Z0-9_\.\/\-\+\:\@ ]/) {
@@ -130,7 +145,7 @@ if (defined $searchtext) {
$searchtext = quotemeta $searchtext;
}
-if ($action eq "summary") {
+if (!defined $action || $action eq "summary") {
git_summary();
exit;
} elsif ($action eq "branches") {
@@ -178,6 +193,9 @@ if ($action eq "summary") {
} elsif ($action eq "shortlog") {
git_shortlog();
exit;
+} elsif ($action eq "tag") {
+ git_tag();
+ exit;
} else {
undef $action;
die_error(undef, "Unknown action.");
@@ -234,6 +252,9 @@ div.log_link {
div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
a.list { text-decoration:none; color:#000000; }
a.list:hover { text-decoration:underline; color:#880000; }
+a.text { text-decoration:none; color:#0000cc; }
+a.text:visited { text-decoration:none; color:#880000; }
+a.text:hover { text-decoration:underline; color:#880000; }
table { padding:8px 4px; }
th { padding:2px 5px; font-size:12px; text-align:left; }
tr.light:hover { background-color:#edece6; }
@@ -319,7 +340,7 @@ sub git_get_type {
open my $fd, "-|", "$gitbin/git-cat-file -t $hash" or return;
my $type = <$fd>;
- close $fd;
+ close $fd or return;
chomp $type;
return $type;
}
@@ -349,8 +370,10 @@ sub git_read_description {
sub git_read_tag {
my $tag_id = shift;
my %tag;
+ my @comment;
open my $fd, "-|", "$gitbin/git-cat-file tag $tag_id" or return;
+ $tag{'id'} = $tag_id;
while (my $line = <$fd>) {
chomp $line;
if ($line =~ m/^object ([0-9a-fA-F]{40})$/) {
@@ -359,8 +382,19 @@ sub git_read_tag {
$tag{'type'} = $1;
} elsif ($line =~ m/^tag (.+)$/) {
$tag{'name'} = $1;
+ } elsif ($line =~ m/^tagger (.*) ([0-9]+) (.*)$/) {
+ $tag{'author'} = $1;
+ $tag{'epoch'} = $2;
+ $tag{'tz'} = $3;
+ } elsif ($line =~ m/--BEGIN/) {
+ push @comment, $line;
+ last;
+ } elsif ($line eq "") {
+ last;
}
}
+ push @comment, <$fd>;
+ $tag{'comment'} = \@comment;
close $fd or return;
if (!defined $tag{'name'}) {
return
@@ -368,6 +402,37 @@ sub git_read_tag {
return %tag
}
+sub age_string {
+ my $age = shift;
+ my $age_str;
+
+ if ($age > 60*60*24*365*2) {
+ $age_str = (int $age/60/60/24/365);
+ $age_str .= " years ago";
+ } elsif ($age > 60*60*24*(365/12)*2) {
+ $age_str = int $age/60/60/24/(365/12);
+ $age_str .= " months ago";
+ } elsif ($age > 60*60*24*7*2) {
+ $age_str = int $age/60/60/24/7;
+ $age_str .= " weeks ago";
+ } elsif ($age > 60*60*24*2) {
+ $age_str = int $age/60/60/24;
+ $age_str .= " days ago";
+ } elsif ($age > 60*60*2) {
+ $age_str = int $age/60/60;
+ $age_str .= " hours ago";
+ } elsif ($age > 60*2) {
+ $age_str = int $age/60;
+ $age_str .= " min ago";
+ } elsif ($age > 2) {
+ $age_str = int $age;
+ $age_str .= " sec ago";
+ } else {
+ $age_str .= " right now";
+ }
+ return $age_str;
+}
+
sub git_read_commit {
my $commit_id = shift;
my $commit_text = shift;
@@ -440,37 +505,14 @@ sub git_read_commit {
my $age = time - $co{'committer_epoch'};
$co{'age'} = $age;
- if ($age > 60*60*24*365*2) {
- $co{'age_string'} = (int $age/60/60/24/365);
- $co{'age_string'} .= " years ago";
- } elsif ($age > 60*60*24*(365/12)*2) {
- $co{'age_string'} = int $age/60/60/24/(365/12);
- $co{'age_string'} .= " months ago";
- } elsif ($age > 60*60*24*7*2) {
- $co{'age_string'} = int $age/60/60/24/7;
- $co{'age_string'} .= " weeks ago";
- } elsif ($age > 60*60*24*2) {
- $co{'age_string'} = int $age/60/60/24;
- $co{'age_string'} .= " days ago";
- } elsif ($age > 60*60*2) {
- $co{'age_string'} = int $age/60/60;
- $co{'age_string'} .= " hours ago";
- } elsif ($age > 60*2) {
- $co{'age_string'} = int $age/60;
- $co{'age_string'} .= " min ago";
- } elsif ($age > 2) {
- $co{'age_string'} = int $age;
- $co{'age_string'} .= " sec ago";
- } else {
- $co{'age_string'} .= " right now";
- }
+ $co{'age_string'} = age_string($age);
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($co{'committer_epoch'});
if ($age > 60*60*24*7*2) {
- $co{'age_string_date'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon, $mday;
+ $co{'age_string_date'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon+1, $mday;
$co{'age_string_age'} = $co{'age_string'};
} else {
$co{'age_string_date'} = $co{'age_string'};
- $co{'age_string_age'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon, $mday;
+ $co{'age_string_age'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon+1, $mday;
}
return %co;
}
@@ -593,6 +635,21 @@ sub file_type {
}
}
+sub format_log_line_html {
+ my $line = shift;
+
+ $line = escapeHTML($line);
+ $line =~ s/ / /g;
+ if ($line =~ m/([0-9a-fA-F]{40})/) {
+ my $hash_text = $1;
+ if (git_get_type($hash_text) eq "commit") {
+ my $link = $cgi->a({-class => "text", -href => "$my_uri?p=$project;a=commit;h=$hash_text"}, $hash_text);
+ $line =~ s/$hash_text/$link/;
+ }
+ }
+ return $line;
+}
+
sub date_str {
my $epoch = shift;
my $tz = shift || "-0000";
@@ -722,7 +779,7 @@ sub git_project_list {
if (!defined $head) {
next;
}
- $ENV{'GIT_OBJECT_DIRECTORY'} = "$projectroot/$proj{'path'}/objects";
+ $ENV{'GIT_DIR'} = "$projectroot/$proj{'path'}";
my %co = git_read_commit($head);
if (!%co) {
next;
@@ -766,31 +823,57 @@ sub git_read_refs {
my $ref_dir = shift;
my @reflist;
+ my @refs;
opendir my $dh, "$projectroot/$project/$ref_dir";
- my @refs = grep !m/^\./, readdir $dh;
+ while (my $dir = readdir($dh)) {
+ if ($dir =~ m/^\./) {
+ next;
+ }
+ if (-d "$projectroot/$project/$ref_dir/$dir") {
+ opendir my $dh2, "$projectroot/$project/$ref_dir/$dir";
+ my @subdirs = grep !m/^\./, readdir $dh2;
+ closedir($dh2);
+ foreach my $subdir (@subdirs) {
+ push @refs, "$dir/$subdir"
+ }
+ next;
+ }
+ push @refs, $dir;
+ }
closedir($dh);
foreach my $ref_file (@refs) {
my $ref_id = git_read_hash("$project/$ref_dir/$ref_file");
my $type = git_get_type($ref_id) || next;
my %ref_item;
my %co;
+ $ref_item{'type'} = $type;
+ $ref_item{'id'} = $ref_id;
+ $ref_item{'epoch'} = 0;
+ $ref_item{'age'} = "unknown";
if ($type eq "tag") {
my %tag = git_read_tag($ref_id);
+ $ref_item{'comment'} = $tag{'comment'};
if ($tag{'type'} eq "commit") {
%co = git_read_commit($tag{'object'});
+ $ref_item{'epoch'} = $co{'committer_epoch'};
+ $ref_item{'age'} = $co{'age_string'};
+ } elsif (defined($tag{'epoch'})) {
+ my $age = time - $tag{'epoch'};
+ $ref_item{'epoch'} = $tag{'epoch'};
+ $ref_item{'age'} = age_string($age);
}
- $ref_item{'type'} = $tag{'type'};
+ $ref_item{'reftype'} = $tag{'type'};
$ref_item{'name'} = $tag{'name'};
- $ref_item{'id'} = $tag{'object'};
+ $ref_item{'refid'} = $tag{'object'};
} elsif ($type eq "commit"){
%co = git_read_commit($ref_id);
- $ref_item{'type'} = "commit";
+ $ref_item{'reftype'} = "commit";
$ref_item{'name'} = $ref_file;
$ref_item{'title'} = $co{'title'};
- $ref_item{'id'} = $ref_id;
+ $ref_item{'refid'} = $ref_id;
+ $ref_item{'epoch'} = $co{'committer_epoch'};
+ $ref_item{'age'} = $co{'age_string'};
}
- $ref_item{'epoch'} = $co{'committer_epoch'} || 0;
- $ref_item{'age'} = $co{'age_string'} || "unknown";
push @reflist, \%ref_item;
}
@@ -888,6 +971,11 @@ sub git_summary {
my $alternate = 0;
foreach my $entry (@$taglist) {
my %tag = %$entry;
+ my $comment_lines = $tag{'comment'};
+ my $comment = shift @$comment_lines;
+ if (defined($comment)) {
+ $comment = chop_str($comment, 30, 5);
+ }
if ($alternate) {
print "
\n";
} else {
@@ -897,14 +985,22 @@ sub git_summary {
if ($i-- > 0) {
print "| $tag{'age'} | \n" .
"" .
- $cgi->a({-href => "$my_uri?p=$project;a=$tag{'type'};h=$tag{'id'}", -class => "list"}, "" .
- escapeHTML($tag{'name'}) . "") .
+ $cgi->a({-href => "$my_uri?p=$project;a=$tag{'reftype'};h=$tag{'refid'}", -class => "list"},
+ "" . escapeHTML($tag{'name'}) . "") .
" | \n" .
- "" .
- $cgi->a({-href => "$my_uri?p=$project;a=$tag{'type'};h=$tag{'id'}"}, $tag{'type'});
- if ($tag{'type'} eq "commit") {
- print " | " . $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'id'}"}, "shortlog") .
- " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'id'}"}, "log");
+ " | ";
+ if (defined($comment)) {
+ print $cgi->a({-class => "list", -href => "$my_uri?p=$project;a=tag;h=$tag{'id'}"}, $comment);
+ }
+ print " | \n" .
+ "";
+ if ($tag{'type'} eq "tag") {
+ print $cgi->a({-href => "$my_uri?p=$project;a=tag;h=$tag{'id'}"}, "tag") . " | ";
+ }
+ print $cgi->a({-href => "$my_uri?p=$project;a=$tag{'reftype'};h=$tag{'refid'}"}, $tag{'reftype'});
+ if ($tag{'reftype'} eq "commit") {
+ print " | " . $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'name'}"}, "shortlog") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'refid'}"}, "log");
}
print " | \n" .
"
";
@@ -936,12 +1032,12 @@ sub git_summary {
if ($i-- > 0) {
print "$tag{'age'} | \n" .
"" .
- $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'id'}", -class => "list"},
+ $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'name'}", -class => "list"},
"" . escapeHTML($tag{'name'}) . "") .
" | \n" .
"" .
- $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'id'}"}, "shortlog") .
- " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'id'}"}, "log") .
+ $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'name'}"}, "shortlog") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'name'}"}, "log") .
" | \n" .
"";
} else {
@@ -955,6 +1051,41 @@ sub git_summary {
git_footer_html();
}
+sub git_tag {
+ my $head = git_read_hash("$project/HEAD");
+ git_header_html();
+ print "\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=summary"}, "summary") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=shortlog"}, "shortlog") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=log"}, "log") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=commit;h=$head"}, "commit") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=commitdiff;h=$head"}, "commitdiff") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=tree;hb=$head"}, "tree") . "
\n" .
+ "
\n" .
+ "
\n";
+ my %tag = git_read_tag($hash);
+ print "\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=commit;h=$hash", -class => "title"}, escapeHTML($tag{'name'})) . "\n" .
+ "
\n";
+ print "\n" .
+ "
\n" .
+ "| $tag{'type'} | " . $cgi->a({-class => "text", -href => "$my_uri?p=$project;a=$tag{'type'};h=$tag{'object'}"}, $tag{'object'}) . " |
\n";
+ if (defined($tag{'author'})) {
+ my %ad = date_str($tag{'epoch'}, $tag{'tz'});
+ print "| author | " . escapeHTML($tag{'author'}) . " |
\n";
+ print " | " . $ad{'rfc2822'} . sprintf(" (%02d:%02d %s)", $ad{'hour_local'}, $ad{'minute_local'}, $ad{'tz_local'}) . " |
\n";
+ }
+ print "
\n\n" .
+ "
\n";
+ print "";
+ my $comment = $tag{'comment'};
+ foreach my $line (@$comment) {
+ print escapeHTML($line) . "
\n";
+ }
+ print "
\n";
+ git_footer_html();
+}
+
sub git_tags {
my $head = git_read_hash("$project/HEAD");
git_header_html();
@@ -976,6 +1107,11 @@ sub git_tags {
if (defined @$taglist) {
foreach my $entry (@$taglist) {
my %tag = %$entry;
+ my $comment_lines = $tag{'comment'};
+ my $comment = shift @$comment_lines;
+ if (defined($comment)) {
+ $comment = chop_str($comment, 30, 5);
+ }
if ($alternate) {
print "\n";
} else {
@@ -984,14 +1120,22 @@ sub git_tags {
$alternate ^= 1;
print "| $tag{'age'} | \n" .
"" .
- $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'id'}", -class => "list"},
+ $cgi->a({-href => "$my_uri?p=$project;a=$tag{'reftype'};h=$tag{'refid'}", -class => "list"},
"" . escapeHTML($tag{'name'}) . "") .
" | \n" .
- "" .
- $cgi->a({-href => "$my_uri?p=$project;a=$tag{'type'};h=$tag{'id'}"}, $tag{'type'});
- if ($tag{'type'} eq "commit") {
- print " | " . $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'id'}"}, "shortlog") .
- " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'id'}"}, "log");
+ " | ";
+ if (defined($comment)) {
+ print $cgi->a({-class => "list", -href => "$my_uri?p=$project;a=tag;h=$tag{'id'}"}, $comment);
+ }
+ print " | \n" .
+ "";
+ if ($tag{'type'} eq "tag") {
+ print $cgi->a({-href => "$my_uri?p=$project;a=tag;h=$tag{'id'}"}, "tag") . " | ";
+ }
+ print $cgi->a({-href => "$my_uri?p=$project;a=$tag{'reftype'};h=$tag{'refid'}"}, $tag{'reftype'});
+ if ($tag{'reftype'} eq "commit") {
+ print " | " . $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'name'}"}, "shortlog") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'refid'}"}, "log");
}
print " | \n" .
"
";
@@ -1030,11 +1174,11 @@ sub git_branches {
$alternate ^= 1;
print "$tag{'age'} | \n" .
"" .
- $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'id'}", -class => "list"}, "" . escapeHTML($tag{'name'}) . "") .
+ $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'name'}", -class => "list"}, "" . escapeHTML($tag{'name'}) . "") .
" | \n" .
"" .
- $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'id'}"}, "shortog") .
- " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'id'}"}, "log") .
+ $cgi->a({-href => "$my_uri?p=$project;a=shortlog;h=$tag{'name'}"}, "shortlog") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=log;h=$tag{'name'}"}, "log") .
" | \n" .
"";
}
@@ -1270,7 +1414,7 @@ sub git_opml {
if (!defined $head) {
next;
}
- $ENV{'GIT_OBJECT_DIRECTORY'} = "$projectroot/$proj{'path'}/objects";
+ $ENV{'GIT_DIR'} = "$projectroot/$proj{'path'}";
my %co = git_read_commit($head);
if (!%co) {
next;
@@ -1366,7 +1510,7 @@ sub git_log {
} else {
$empty = 0;
}
- print escapeHTML($line) . "
\n";
+ print format_log_line_html($line) . "
\n";
}
if (!$empty) {
print "
\n";
@@ -1386,10 +1530,12 @@ sub git_commit {
my @difftree;
my $root = "";
- if (!defined $co{'parent'}) {
+ my $parent = $co{'parent'};
+ if (!defined $parent) {
$root = " --root";
+ $parent = "";
}
- open my $fd, "-|", "$gitbin/git-diff-tree -r -M $root $co{'parent'} $hash" or die_error(undef, "Open failed.");
+ open my $fd, "-|", "$gitbin/git-diff-tree -r -M $root $parent $hash" or die_error(undef, "Open failed.");
@difftree = map { chomp; $_ } <$fd>;
close $fd or die_error(undef, "Reading diff-tree failed.");
git_header_html();
@@ -1467,7 +1613,7 @@ sub git_commit {
print "" . escapeHTML($line) . "
\n";
} else {
$signed = 0;
- print escapeHTML($line) . "
\n";
+ print format_log_line_html($line) . "
\n";
}
}
print "\n";
@@ -1481,7 +1627,9 @@ sub git_commit {
foreach my $line (@difftree) {
# ':100644 100644 03b218260e99b78c6df0ed378e59ed9205ccc96d 3b93d5e7cc7f7dd4ebed13a5cc1a4ad976fc94d8 M ls-files.c'
# ':100644 100644 7f9281985086971d3877aca27704f2aaf9c448ce bc190ebc71bbd923f2b728e505408f5e54bd073a M rev-tree.c'
- $line =~ m/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\t(.*)$/;
+ if (!($line =~ m/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\t(.*)$/)) {
+ next;
+ }
my $from_mode = $1;
my $to_mode = $2;
my $from_id = $3;
@@ -1489,14 +1637,13 @@ sub git_commit {
my $status = $5;
my $similarity = $6;
my $file = $7;
- #print "$line ($status)
\n";
if ($alternate) {
print "\n";
} else {
print "
\n";
}
$alternate ^= 1;
- if ($status eq "N") {
+ if ($status eq "A") {
my $mode_chng = "";
if (S_ISREG(oct $to_mode)) {
$mode_chng = sprintf(" with mode: %04o", (oct $to_mode) & 0777);
@@ -1658,7 +1805,7 @@ sub git_commitdiff {
} else {
$empty = 0;
}
- print escapeHTML($line) . "
\n";
+ print format_log_line_html($line) . "
\n";
}
print "
\n";
foreach my $line (@difftree) {
@@ -1671,7 +1818,7 @@ sub git_commitdiff {
my $to_id = $4;
my $status = $5;
my $file = $6;
- if ($status eq "N") {
+ if ($status eq "A") {
print "" . file_type($to_mode) . ":" .
$cgi->a({-href => "$my_uri?p=$project;a=blob;h=$to_id;hb=$hash;f=$file"}, $to_id) . "(new)" .
"
\n";
@@ -1703,25 +1850,51 @@ sub git_commitdiff_plain {
my (@difftree) = map { chomp; $_ } <$fd>;
close $fd or die_error(undef, "Reading diff-tree failed.");
+ # try to figure out the next tag after this commit
+ my $tagname;
+ my %taghash;
+ my $tags = git_read_refs("refs/tags");
+ foreach my $entry (@$tags) {
+ my %tag = %$entry;
+ $taghash{$tag{'refid'}} = $tag{'name'};
+ }
+ open $fd, "-|", "$gitbin/git-rev-list HEAD";
+ while (my $commit = <$fd>) {
+ chomp $commit;
+ if ($taghash{$commit}) {
+ $tagname = $taghash{$commit};
+ }
+ if ($commit eq $hash) {
+ last;
+ }
+ }
+ close $fd;
+
+ print $cgi->header(-type => "text/plain", -charset => 'utf-8');
my %co = git_read_commit($hash);
my %ad = date_str($co{'author_epoch'}, $co{'author_tz'});
- print $cgi->header(-type => "text/plain", -charset => 'utf-8');
my $comment = $co{'comment'};
- print "Author: $co{'author'}\n" .
+ print "From: $co{'author'}\n" .
"Date: $ad{'rfc2822'} ($ad{'tz_local'})\n".
- "Source: $my_url?p=$project;a=commitdiff;h=$hash\n" .
+ "Subject: $co{'title'}\n";
+ if (defined $tagname) {
+ print "X-Git-Tag: $tagname\n";
+ }
+ print "X-Git-Url: $my_url?p=$project;a=commitdiff;h=$hash\n" .
"\n";
+
foreach my $line (@$comment) {;
print " $line\n";
}
- print "\n";
+ print "---\n\n";
+
foreach my $line (@difftree) {
$line =~ m/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)\t(.*)$/;
my $from_id = $3;
my $to_id = $4;
my $status = $5;
my $file = $6;
- if ($status eq "N") {
+ if ($status eq "A") {
git_diff_print(undef, "/dev/null", $to_id, "b/$file", "plain");
} elsif ($status eq "D") {
git_diff_print($from_id, "a/$file", undef, "/dev/null", "plain");
@@ -1759,7 +1932,7 @@ sub git_history {
print "\n";
my $alternate = 0;
while (my $line = <$fd>) {
- if ($line =~ m/^([0-9a-fA-F]{40}) /){
+ if ($line =~ m/^([0-9a-fA-F]{40})/){
$commit = $1;
next;
}