X-Git-Url: https://git.ladys.computer/Gitweb/blobdiff_plain/926ebc44e6f05af75718204ba61a54d9f39c70bb228859fd606aed2fa6f71761..3b1deed24c602b10094e4478e415c93c94e410f7fa9da1c9cc4aef203488a735:/gitweb.cgi
diff --git a/gitweb.cgi b/gitweb.cgi
index 8630119..12dbc9c 100755
--- a/gitweb.cgi
+++ b/gitweb.cgi
@@ -227,7 +227,7 @@ if (!defined $action || $action eq "summary") {
git_tag();
exit;
} elsif ($action eq "blame") {
- git_blame();
+ git_blame2();
exit;
} else {
undef $action;
@@ -1238,6 +1238,75 @@ sub git_tag {
git_footer_html();
}
+sub git_read_blame_line {
+ my %bl;
+ $_ = shift;
+
+ ($bl{'hash'}, $bl{'lineno'}, $bl{'data'}) = /^([0-9a-fA-F]{40}).*?(\d+)\)\s{1}(\s*.*)/;
+
+ return %bl;
+}
+
+sub git_blame2 {
+ my $fd;
+ my $ftype;
+ die_error(undef, "Permission denied.") if (!git_get_project_config_bool ('blame'));
+ die_error('404 Not Found', "File name not defined") if (!$file_name);
+ $hash_base ||= git_read_head($project);
+ die_error(undef, "Reading commit failed") unless ($hash_base);
+ my %co = git_read_commit($hash_base)
+ or die_error(undef, "Reading commit failed");
+ if (!defined $hash) {
+ $hash = git_get_hash_by_path($hash_base, $file_name, "blob")
+ or die_error(undef, "Error looking up file");
+ }
+ $ftype = git_get_type($hash);
+ if ($ftype !~ "blob") {
+ die_error("400 Bad Request", "object is not a blob");
+ }
+ open ($fd, "-|", $GIT, "blame", '-l', $file_name, $hash_base)
+ or die_error(undef, "Open failed");
+ git_header_html();
+ print "
\n" .
+ $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=summary")}, "summary") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=shortlog")}, "shortlog") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=log")}, "log") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base")}, "commit") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$hash_base")}, "commitdiff") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tree;h=$co{'tree'};hb=$hash_base")}, "tree") . "
\n";
+ print $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$hash;hb=$hash_base;f=$file_name")}, "blob") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;f=$file_name")}, "head") . "
\n";
+ print "
\n".
+ "" .
+ $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base"), -class => "title"}, esc_html($co{'title'})) .
+ "
\n";
+ git_print_page_path($file_name, $ftype);
+
+ print "\n";
+
+ print "
\n";
+ print "| Commit | Line | Data |
\n";
+ while (my $line = <$fd>) {
+ my %blame_line = git_read_blame_line($line);
+ my $full_rev = $blame_line{'hash'};
+ my $rev = substr($full_rev, 0, 8);
+ my $lineno = $blame_line{'lineno'};
+ my $data = $blame_line{'data'};
+
+ print "\n";
+ print "| " .
+ $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$full_rev;f=$file_name")}, esc_html($rev)) . " | \n";
+ print "" . esc_html($lineno) . " | \n";
+ print "" . esc_html($data) . " | \n";
+ print "
\n";
+ }
+ print "
\n";
+ print "
";
+
+ close $fd or print "Reading blob failed\n";
+ git_footer_html();
+}
+
sub git_blame {
my $fd;
die_error('403 Permission denied', "Permission denied.") if (!git_get_project_config_bool ('blame'));
@@ -1531,6 +1600,14 @@ sub git_blob_plain_mimetype {
}
sub git_blob_plain {
+ if (!defined $hash) {
+ if (defined $file_name) {
+ my $base = $hash_base || git_read_head($project);
+ $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
+ } else {
+ die_error(undef, "No file name defined.");
+ }
+ }
my $type = shift;
open my $fd, "-|", "$GIT cat-file blob $hash" or die_error("Couldn't cat $file_name, $hash");
@@ -1554,10 +1631,14 @@ sub git_blob_plain {
}
sub git_blob {
- if (!defined $hash && defined $file_name) {
- my $base = $hash_base || git_read_head($project);
- $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
- }
+ if (!defined $hash) {
+ if (defined $file_name) {
+ my $base = $hash_base || git_read_head($project);
+ $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
+ } else {
+ die_error(undef, "No file name defined.");
+ }
+ }
my $have_blame = git_get_project_config_bool ('blame');
open my $fd, "-|", "$GIT cat-file blob $hash" or die_error(undef, "Open failed.");
my $mimetype = git_blob_plain_mimetype($fd, $file_name);
@@ -1687,7 +1768,7 @@ sub git_tree {
"" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$t_hash$base_key;f=$base$t_name")}, "blob") .
# " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;h=$t_hash$base_key;f=$base$t_name")}, "blame") .
- " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;hb=$hash_base;f=$base$t_name")}, "history") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$t_hash;hb=$hash_base;f=$base$t_name")}, "history") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;h=$t_hash;f=$base$t_name")}, "raw") .
" | \n";
} elsif ($t_type eq "tree") {
@@ -2314,7 +2395,18 @@ sub git_history {
print "\n" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base"), -class => "title"}, esc_html($co{'title'})) . "\n" .
"
\n";
- print "/" . esc_html($file_name) . "
\n";
+ if (defined $hash) {
+ my $ftype = git_get_type($hash);
+
+ if ($ftype =~ "blob") {
+ print "/" .
+ $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;f=$file_name")}, esc_html($file_name)) . "
\n";
+ } else {
+ print "/" . esc_html($file_name) . "
\n";
+ }
+ } else {
+ print "/" . esc_html($file_name) . "
\n";
+ }
open my $fd, "-|",
"$GIT rev-list --full-history $hash_base -- \'$file_name\'";