X-Git-Url: https://git.ladys.computer/Gitweb/blobdiff_plain/642fbafd9a631157f11947752c41c3b98d46a4fece7a7c2a7e8a66d3c03ee601..d0fa8ea86735cda28c6687739811e48dfc171aef15f25065fef85d838dab9269:/gitweb.cgi diff --git a/gitweb.cgi b/gitweb.cgi index 42f15d1..7c4ba77 100755 --- a/gitweb.cgi +++ b/gitweb.cgi @@ -2,8 +2,8 @@ # gitweb - simple web interface to track changes in git repositories # -# (C) 2005, Kay Sievers -# (C) 2005, Christian Gierke +# (C) 2005-2006, Kay Sievers +# (C) 2005, Christian Gierke # # This program is licensed under the GPLv2 @@ -17,7 +17,7 @@ use Fcntl ':mode'; binmode STDOUT, ':utf8'; my $cgi = new CGI; -my $version = "261"; +my $version = "266"; my $my_url = $cgi->url(); my $my_uri = $cgi->url(-absolute => 1); my $rss_link = ""; @@ -253,7 +253,7 @@ sub git_header_html { - + @@ -396,6 +396,24 @@ sub git_get_type { return $type; } +sub git_read_head { + my $project = shift; + my $oENV = $ENV{'GIT_DIR'}; + my $retval = undef; + $ENV{'GIT_DIR'} = "$projectroot/$project"; + if (open my $fd, "-|", "$gitbin/git-rev-parse", "--verify", "HEAD") { + my $head = <$fd>; + close $fd; + if (defined $head && $head =~ /^([0-9a-fA-F]{40})$/) { + $retval = $1; + } + } + if (defined $oENV) { + $ENV{'GIT_DIR'} = $oENV; + } + return $retval; +} + sub git_read_hash { my $path = shift; @@ -769,7 +787,7 @@ sub get_file_owner { } my $owner = $gcos; $owner =~ s/[,;].*$//; - return $owner; + return decode("utf8", $owner, Encode::FB_DEFAULT); } sub git_read_projects { @@ -805,7 +823,7 @@ sub git_read_projects { if (-e "$projectroot/$path/HEAD") { my $pr = { path => $path, - owner => $owner, + owner => decode("utf8", $owner, Encode::FB_DEFAULT), }; push @list, $pr } @@ -823,7 +841,7 @@ sub git_project_list { die_error(undef, "No project found."); } foreach my $pr (@list) { - my $head = git_read_hash("$pr->{'path'}/HEAD"); + my $head = git_read_head($pr->{'path'}); if (!defined $head) { next; } @@ -994,7 +1012,7 @@ sub git_read_refs { sub git_summary { my $descr = git_read_description($project) || "none"; - my $head = git_read_hash("$project/HEAD"); + my $head = git_read_head($project); my %co = git_read_commit($head); my %cd = date_str($co{'committer_epoch'}, $co{'committer_tz'}); @@ -1007,7 +1025,7 @@ sub git_summary { $pr = unescape($pr); $ow = unescape($ow); if ($pr eq $project) { - $owner = $ow; + $owner = decode("utf8", $ow, Encode::FB_DEFAULT); last; } } @@ -1034,7 +1052,7 @@ sub git_summary { "owner$owner\n" . "last change$cd{'rfc2822'}\n" . "\n"; - open my $fd, "-|", "$gitbin/git-rev-list --max-count=17 " . git_read_hash("$project/HEAD") or die_error(undef, "Open failed."); + open my $fd, "-|", "$gitbin/git-rev-list --max-count=17 " . git_read_head($project) or die_error(undef, "Open failed."); my (@revlist) = map { chomp; $_ } <$fd>; close $fd; print "
\n" . @@ -1172,7 +1190,7 @@ sub git_summary { } sub git_tag { - my $head = git_read_hash("$project/HEAD"); + my $head = git_read_head($project); git_header_html(); print "
\n" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=summary")}, "summary") . @@ -1211,7 +1229,7 @@ sub git_tag { } sub git_tags { - my $head = git_read_hash("$project/HEAD"); + my $head = git_read_head($project); git_header_html(); print "
\n" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=summary")}, "summary") . @@ -1270,7 +1288,7 @@ sub git_tags { } sub git_heads { - my $head = git_read_hash("$project/HEAD"); + my $head = git_read_head($project); git_header_html(); print "
\n" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=summary")}, "summary") . @@ -1343,7 +1361,7 @@ sub git_get_hash_by_path { sub git_blob { if (!defined $hash && defined $file_name) { - my $base = $hash_base || git_read_hash("$project/HEAD"); + my $base = $hash_base || git_read_head($project); $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file."); } open my $fd, "-|", "$gitbin/git-cat-file blob $hash" or die_error(undef, "Open failed."); @@ -1407,13 +1425,13 @@ sub git_blob_plain { sub git_tree { if (!defined $hash) { - $hash = git_read_hash("$project/HEAD"); + $hash = git_read_head($project); if (defined $file_name) { - my $base = $hash_base || git_read_hash("$project/HEAD"); + my $base = $hash_base || $hash; $hash = git_get_hash_by_path($base, $file_name, "tree"); } if (!defined $hash_base) { - $hash_base = git_read_hash("$project/HEAD"); + $hash_base = $hash; } } $/ = "\0"; @@ -1497,7 +1515,7 @@ sub git_tree { sub git_rss { # http://www.notestips.com/80256B3A007F2692/1/NAMO5P9UPQ - open my $fd, "-|", "$gitbin/git-rev-list --max-count=150 " . git_read_hash("$project/HEAD") or die_error(undef, "Open failed."); + open my $fd, "-|", "$gitbin/git-rev-list --max-count=150 " . git_read_head($project) or die_error(undef, "Open failed."); my (@revlist) = map { chomp; $_ } <$fd>; close $fd or die_error(undef, "Reading rev-list failed."); print $cgi->header(-type => 'text/xml', -charset => 'utf-8'); @@ -1566,7 +1584,7 @@ sub git_opml { foreach my $pr (@list) { my %proj = %$pr; - my $head = git_read_hash("$proj{'path'}/HEAD"); + my $head = git_read_head($proj{'path'}); if (!defined $head) { next; } @@ -1587,7 +1605,7 @@ sub git_opml { } sub git_log { - my $head = git_read_hash("$project/HEAD"); + my $head = git_read_head($project); if (!defined $hash) { $hash = $head; } @@ -1707,8 +1725,8 @@ sub git_commit { } my $refs = read_info_ref(); my $ref = ""; - if (defined $refs->{$hash}) { - $ref = " " . esc_html($refs->{$hash}) . ""; + if (defined $refs->{$co{'id'}}) { + $ref = " " . esc_html($refs->{$co{'id'}}) . ""; } git_header_html(undef, $expires); print "
\n" . @@ -1949,8 +1967,8 @@ sub git_commitdiff { } my $refs = read_info_ref(); my $ref = ""; - if (defined $refs->{$hash}) { - $ref = " " . esc_html($refs->{$hash}) . ""; + if (defined $refs->{$co{'id'}}) { + $ref = " " . esc_html($refs->{$co{'id'}}) . ""; } git_header_html(undef, $expires); print "
\n" . @@ -2083,7 +2101,7 @@ sub git_commitdiff_plain { sub git_history { if (!defined $hash) { - $hash = git_read_hash("$project/HEAD"); + $hash = git_read_head($project); } my %co = git_read_commit($hash); if (!%co) { @@ -2105,7 +2123,7 @@ sub git_history { "
\n"; print "
/" . esc_html($file_name) . "
\n"; - open my $fd, "-|", "$gitbin/git-rev-list $hash | $gitbin/git-diff-tree -r --stdin \'$file_name\'"; + open my $fd, "-|", "$gitbin/git-rev-list $hash | $gitbin/git-diff-tree -r --stdin -- \'$file_name\'"; my $commit; print "\n"; my $alternate = 0; @@ -2159,7 +2177,7 @@ sub git_search { die_error("", "Text field empty."); } if (!defined $hash) { - $hash = git_read_hash("$project/HEAD"); + $hash = git_read_head($project); } my %co = git_read_commit($hash); if (!%co) { @@ -2300,7 +2318,7 @@ sub git_search { } sub git_shortlog { - my $head = git_read_hash("$project/HEAD"); + my $head = git_read_head($project); if (!defined $hash) { $hash = $head; }