]> gitweb.ps.run Git - ps-cgit/blobdiff - ui-blame.c
git: update to v2.39.1
[ps-cgit] / ui-blame.c
index cfab7fb98f0401557deca9c7a23716ca66336e4b..aedce8dfd24aa0b4db686360120bdd04b0a0cd5f 100644 (file)
@@ -54,6 +54,15 @@ static void emit_blame_entry_hash(struct blame_entry *ent)
        html("</span>");
        free(detail);
 
        html("</span>");
        free(detail);
 
+       if (!parse_commit(suspect->commit) && suspect->commit->parents) {
+               struct commit *parent = suspect->commit->parents->item;
+
+               html(" ");
+               cgit_blame_link("^", "Blame the previous revision", NULL,
+                               ctx.qry.head, oid_to_hex(&parent->object.oid),
+                               suspect->path);
+       }
+
        while (line++ < ent->num_lines)
                html("\n");
 }
        while (line++ < ent->num_lines)
                html("\n");
 }
@@ -132,7 +141,8 @@ static void print_object(const struct object_id *oid, const char *path,
        init_scoreboard(&sb);
        sb.revs = &revs;
        sb.repo = the_repository;
        init_scoreboard(&sb);
        sb.revs = &revs;
        sb.repo = the_repository;
-       setup_scoreboard(&sb, path, &o);
+       sb.path = path;
+       setup_scoreboard(&sb, &o);
        o->suspects = blame_entry_prepend(NULL, 0, sb.num_lines, o);
        prio_queue_put(&sb.commits, o->commit);
        blame_origin_decref(o);
        o->suspects = blame_entry_prepend(NULL, 0, sb.num_lines, o);
        prio_queue_put(&sb.commits, o->commit);
        blame_origin_decref(o);
@@ -151,6 +161,10 @@ static void print_object(const struct object_id *oid, const char *path,
        cgit_tree_link("tree", NULL, NULL, ctx.qry.head, rev, path);
        html(")\n");
 
        cgit_tree_link("tree", NULL, NULL, ctx.qry.head, rev, path);
        html(")\n");
 
+       if (buffer_is_binary(buf, size)) {
+               html("<div class='error'>blob is binary.</div>");
+               goto cleanup;
+       }
        if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
                htmlf("<div class='error'>blob size (%ldKB)"
                      " exceeds display size limit (%dKB).</div>",
        if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
                htmlf("<div class='error'>blob size (%ldKB)"
                      " exceeds display size limit (%dKB).</div>",
@@ -220,8 +234,7 @@ cleanup:
 }
 
 static int walk_tree(const struct object_id *oid, struct strbuf *base,
 }
 
 static int walk_tree(const struct object_id *oid, struct strbuf *base,
-                    const char *pathname, unsigned mode, int stage,
-                    void *cbdata)
+                    const char *pathname, unsigned mode, void *cbdata)
 {
        struct walk_tree_context *walk_tree_ctx = cbdata;
 
 {
        struct walk_tree_context *walk_tree_ctx = cbdata;
 
@@ -290,10 +303,8 @@ void cgit_print_blame(void)
        walk_tree_ctx.match_baselen = (path_items.match) ?
                                       basedir_len(path_items.match) : -1;
 
        walk_tree_ctx.match_baselen = (path_items.match) ?
                                       basedir_len(path_items.match) : -1;
 
-       read_tree_recursive(the_repository,
-                           repo_get_commit_tree(the_repository, commit),
-                           "", 0, 0,
-                           &paths, walk_tree, &walk_tree_ctx);
+       read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
+                 &paths, walk_tree, &walk_tree_ctx);
        if (!walk_tree_ctx.state)
                cgit_print_error_page(404, "Not found", "Not found");
        else if (walk_tree_ctx.state == 2)
        if (!walk_tree_ctx.state)
                cgit_print_error_page(404, "Not found", "Not found");
        else if (walk_tree_ctx.state == 2)