X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/aafc42d8089437db5105feb12d540c33fe9f9e16..b759189574971eabf98aee73b4e4e4c604e21a94:/ui-blame.c diff --git a/ui-blame.c b/ui-blame.c index d565fff..b118a81 100644 --- a/ui-blame.c +++ b/ui-blame.c @@ -67,15 +67,29 @@ static void emit_blame_entry_linenumber(struct blame_entry *ent) htmlf(numberfmt, ++lineno); } -static void emit_blame_entry_line(struct blame_scoreboard *sb, - struct blame_entry *ent) +static void emit_blame_entry_line_background(struct blame_scoreboard *sb, + struct blame_entry *ent) { - const char *cp, *cpend; + unsigned long line; + size_t len, maxlen = 2; + const char* pos, *endpos; - cp = blame_nth_line(sb, ent->lno); - cpend = blame_nth_line(sb, ent->lno + ent->num_lines); + for (line = ent->lno; line < ent->lno + ent->num_lines; line++) { + html("\n"); + pos = blame_nth_line(sb, line); + endpos = blame_nth_line(sb, line + 1); + len = 0; + while (pos < endpos) { + len++; + if (*pos++ == '\t') + len = (len + 7) & ~7; + } + if (len > maxlen) + maxlen = len; + } - html_ntxt(cp, cpend - cp); + for (len = 0; len < maxlen - 1; len++) + html(" "); } struct walk_tree_context { @@ -88,6 +102,7 @@ static void print_object(const unsigned char *sha1, const char *path, const char *basename, const char *rev) { enum object_type type; + char *buf; unsigned long size; struct argv_array rev_argv = ARGV_ARRAY_INIT; struct rev_info revs; @@ -102,6 +117,13 @@ static void print_object(const unsigned char *sha1, const char *path, return; } + buf = read_sha1_file(sha1, &type, &size); + if (!buf) { + cgit_print_error_page(500, "Internal server error", + "Error reading object %s", sha1_to_hex(sha1)); + return; + } + argv_array_push(&rev_argv, "blame"); argv_array_push(&rev_argv, rev); init_revisions(&revs, NULL); @@ -132,7 +154,7 @@ static void print_object(const unsigned char *sha1, const char *path, htmlf("
| "); + html(" | ");
+
+ /* Colored bars behind lines */
+ html(" ");
for (ent = sb.ent; ent; ) {
struct blame_entry *e = ent->next;
- html(" ");
+ emit_blame_entry_line_background(&sb, ent);
+ html(" | \n");
+ html("");
free((void *)sb.final_buf);
+ /* Lines */
+ html("