+ print "<div class=\"page_nav\">\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=log"}, "log") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=tree;hb=$head"}, "latest tree") .
+ "<br/><br/>\n" .
+ "</div>\n";
+ print "<div class=\"title\">project</div>\n";
+ print "<div class=\"page_body\">\n" .
+ "<table cellspacing=\"0\">\n" .
+ "<tr><td>description</td><td>" . escapeHTML($descr) . "</td></tr>\n" .
+ "<tr><td>owner</td><td>$owner</td></tr>\n" .
+ "<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n" .
+ "</table>\n" .
+ "</div><br/>\n";
+ open my $fd, "-|", "$gitbin/git-rev-list --max-count=11 " . git_read_hash("$project/HEAD") || die_error(undef, "Open failed.");
+ my (@revlist) = map { chomp; $_ } <$fd>;
+ close $fd;
+ print "<div>\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=log", -class => "title"}, "recent commits") .
+ "</div>\n";
+ my $i = 10;
+ foreach my $commit (@revlist) {
+ my %co = git_read_commit($commit);
+ my %ad = date_str($co{'author_epoch'});
+ print "<div class=\"list\">\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=commit;h=$commit"},
+ "<span class=\"log_age\">" . $co{'age_string'} . "</span>" . escapeHTML($co{'title'})) . "\n" .
+ "</div>\n";
+ if (--$i == 0) {
+ print "<div class=\"list\">" . $cgi->a({-href => "$my_uri?p=$project;a=log"}, "...") . "</div>\n";
+ last;
+ }
+ }
+ print "<br/>\n";
+
+ my $taglist = git_read_tags();
+ if (defined @$taglist) {
+ print "<div>\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=tags", -class => "title"}, "recent tags") .
+ "</div>\n";
+ my $i = 10;
+ foreach my $entry (@$taglist) {
+ my %tag = %$entry;
+ print "<div class=\"list\">\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=$tag{'type'};h=$tag{'id'}"},
+ "<span class=\"log_age\">$tag{'age'}</span>" . escapeHTML($tag{'name'})) . "\n" .
+ "</div>\n";
+ if (--$i == 0) {
+ print "<div class=\"list\">" . $cgi->a({-href => "$my_uri?p=$project;a=tags"}, "...") . "</div>\n";
+ last;
+ }
+ }
+ }
+ print "<br/>\n";
+ git_footer_html();
+}
+
+sub git_tags {
+ my $head = git_read_hash("$project/HEAD");
+ git_header_html();
+ print "<div class=\"page_nav\">\n" .
+ $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=tree"}, "tree") .
+ "<br/><br/>\n" .
+ "</div>\n";
+ my $taglist = git_read_tags();
+ print "<div>\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=summary", -class => "title"}, "tags") .
+ "</div>\n";
+ if (defined @$taglist) {
+ foreach my $entry (@$taglist) {
+ my %tag = %$entry;
+ print "<div class=\"list\">\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=$tag{'type'};h=$tag{'id'}"},
+ "<span class=\"log_age\">$tag{'age'}</span>" . escapeHTML($tag{'name'})) . "\n" .
+ "</div>\n";
+ }
+ }
+ print "<br/>\n";
+ git_footer_html();
+}
+
+sub git_get_hash_by_path {
+ my $base = shift;
+ my $path = shift;
+
+ my $tree = $base;
+ my @parts = split '/', $path;
+ while (my $part = shift @parts) {
+ open my $fd, "-|", "$gitbin/git-ls-tree $tree" || die_error(undef, "Open git-ls-tree failed.");
+ my (@entries) = map { chomp; $_ } <$fd>;
+ close $fd || return undef;
+ foreach my $line (@entries) {
+ #'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa panic.c'
+ $line =~ m/^([0-9]+)\t(.*)\t(.*)\t(.*)$/;
+ my $t_mode = $1;
+ my $t_type = $2;
+ my $t_hash = $3;
+ my $t_name = $4;
+ if ($t_name eq $part) {
+ if (!(@parts)) {
+ return $t_hash;
+ }
+ if ($t_type eq "tree") {
+ $tree = $t_hash;
+ }
+ last;
+ }
+ }
+ }
+}
+
+sub git_blob {
+ if (!defined $hash && defined $file_name) {
+ my $base = $hash_base || git_read_hash("$project/HEAD");
+ $hash = git_get_hash_by_path($base, $file_name, "blob");
+ }
+ open my $fd, "-|", "$gitbin/git-cat-file blob $hash" || die_error(undef, "Open failed.");
+ my $base = $file_name || "";
+ git_header_html();
+ if (defined $hash_base && (my %co = git_read_commit($hash_base))) {
+ print "<div class=\"page_nav\">\n" .
+ $cgi->a({-href => "$my_uri?p=$project;a=commit;h=$hash_base"}, "commit") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=commitdiff;h=$hash_base"}, "commitdiff") .
+ " | " . $cgi->a({-href => "$my_uri?p=$project;a=tree;h=" . $co{'tree'} . ";hb=$hash_base"}, "tree");
+ if (defined $file_name) {
+ print " | " . $cgi->a({-href => "$my_uri?p=$project;a=history;h=$hash_base;f=$file_name"}, "history");
+ }
+ print "<br/><br/>\n" .
+ "</div>\n";
+ print "<div>" .
+ $cgi->a({-href => "$my_uri?p=$project;a=commit;h=$hash_base", -class => "title"}, escapeHTML($co{'title'})) .
+ "</div>\n";
+ } else {
+ print "<div class=\"page_nav\">\n" .
+ "<br/><br/></div>\n" .
+ "<div class=\"title\">$hash</div>\n";
+ }
+ if (defined $file_name) {
+ print "<div class=\"page_path\">/$file_name</div>\n";
+ }
+ print "<div class=\"page_body\">\n";