diff --git a/gitweb.cgi b/gitweb.cgi index c702c9a2ef3850f47da92adcbfe80365896f4a70..89c3df736f9349170b9f78da37136470436243d6 100755 --- a/gitweb.cgi +++ b/gitweb.cgi @@ -14,7 +14,7 @@ use CGI::Carp qw(fatalsToBrowser); my $cgi = new CGI; -my $version = "056"; +my $version = "057"; my $projectroot = "/home/kay/public_html/pub/scm"; my $defaultprojects = "linux/kernel/git"; my $gitbin = "/home/kay/bin/git"; @@ -26,6 +26,7 @@ my $project = $cgi->param('p'); my $action = $cgi->param('a'); my $hash = $cgi->param('h'); my $hash_parent = $cgi->param('hp'); +my $file_name = $cgi->param('f'); my $time_back = $cgi->param('t'); $ENV{'SHA1_FILE_DIRECTORY'} = "$projectroot/$project/objects"; @@ -33,6 +34,9 @@ $ENV{'SHA1_FILE_DIRECTORY'} = "$projectroot/$project/objects"; if (defined($project) && $project =~ /(^|\/)(|\.|\.\.)($|\/)/) { die_error("", "Invalid project parameter."); } +if (defined($file_name) && $file_name =~ /(^|\/)(|\.|\.\.)($|\/)/) { + die_error("", "Invalid file parameter."); +} if (defined($action) && !$action =~ m/^[0-9a-zA-Z\.\-]+$/) { die_error("", "Invalid action parameter."); } @@ -44,8 +48,6 @@ if (defined($hash_parent) && !($hash_parent =~ m/^[0-9a-fA-F]{40}$/)) { } if (defined($time_back) && !($time_back =~ m/^[0-9]+$/)) { die_error("", "Invalid time parameter."); -} else { - $time_back = 1; } sub git_header_html { @@ -339,10 +341,14 @@ if ($project eq "") { exit; } -if ($action eq "") { +if (!defined($action)) { $action = "log"; } +if (!defined($time_back)) { + $time_back = 1; +} + if ($action eq "blob") { git_header_html(); print "


\n"; @@ -384,7 +390,7 @@ if ($action eq "blob") { git_footer_html(); } elsif ($action eq "log" || $action eq "rss") { open my $fd, "-|", "$gitbin/rev-list " . git_head($project); - my (@revtree) = map { chomp; $_ } <$fd>; + my (@revlist) = map { chomp; $_ } <$fd>; close $fd; if ($action eq "log") { @@ -409,8 +415,8 @@ if ($action eq "blob") { "en\n"; } - for (my $i = 0; $i <= $#revtree; $i++) { - my $commit = $revtree[$i]; + for (my $i = 0; $i <= $#revlist; $i++) { + my $commit = $revlist[$i]; my %co = git_commit($commit); my %ad = date_str($co{'author_epoch'}); my $age = time - $co{'committer_epoch'}; @@ -466,7 +472,7 @@ if ($action eq "blob") { last if ($i >= 20); print "\n" . "\t" . sprintf("%d %s %02d:%02d", $ad{'mday'}, $ad{'month'}, $ad{'hour'}, $ad{'min'}) . " - " . escapeHTML($co{'title'}) . "\n" . - "\t " . $my_url . "?p=$project;a==commit;h=$commit\n" . + "\t " . $my_url . "?p=$project;a=commit;h=$commit\n" . "\t"; my $comment = $co{'comment'}; foreach my $line (@$comment) { @@ -544,7 +550,8 @@ if ($action eq "blob") { $id =~ m/([0-9a-fA-F]+)->([0-9a-fA-F]+)/; my $from = $1; my $to = $2; - print "$modestr " . $cgi->a({-href => "$my_uri?p=$project;a=blobdiff;h=$to;hp=$from"}, $file) . "\n"; + print "$modestr " . $cgi->a({-href => "$my_uri?p=$project;a=blobdiff;h=$to;hp=$from"}, $file) . " (" . + $cgi->a({-href => "$my_uri?p=$project;a=filerevision;h=$hash;f=$file"}, "history") . ")\n"; } } } @@ -595,6 +602,35 @@ if ($action eq "blob") { print "
\n"; print "
"; git_footer_html(); +} elsif ($action eq "filerevision") { + open my $fd, "-|", "$gitbin/rev-list $hash"; + my (@revlist) = map { chomp; $_ } <$fd>; + close $fd; + + git_header_html(); + print "
\n" . + "
\n";
+	foreach my $rev (@revlist) {
+		my %co = git_commit($rev);
+		my $parents  = $co{'parents'};
+		foreach my $parent (@$parents) {
+			open $fd, "-|", "$gitbin/diff-tree -r $parent $rev $file_name";
+			my (@difftree) = map { chomp; $_ } <$fd>;
+			close $fd;
+
+			foreach my $line (@difftree) {
+				$line =~ m/^(.)(.*)\t(.*)\t(.*)\t(.*)$/;
+				my $file = $5;
+				if ($file eq $file_name) {
+					print $cgi->a({-href => "$my_uri?p=$project;a=commit;h=$rev"}, $rev) . " (" . $co{'title'} .")\n";
+					last;
+				}
+			}
+		}
+	}
+	print "
\n"; + print "
"; + git_footer_html(); } else { die_error("", "unknown action"); }