]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/commit-graph.c: dereference tags in builtin
authorTaylor Blau <me@ttaylorr.com>
Wed, 13 May 2020 21:59:44 +0000 (15:59 -0600)
committerJunio C Hamano <gitster@pobox.com>
Mon, 18 May 2020 19:51:11 +0000 (12:51 -0700)
When given a list of commits, the commit-graph machinery calls
'lookup_commit_reference_gently()' on each element in the set and treats
the resulting set of OIDs as the base over which to close for
reachability.

In an earlier collection of commits, the 'git commit-graph write
--reachable' case made the inner-most call to
'lookup_commit_reference_gently()' by peeling references before they
were passed over to the commit-graph internals.

Do the analog for 'git commit-graph write --stdin-commits' by calling
'lookup_commit_reference_gently()' outside of the commit-graph
machinery, making the inner-most call a noop.

Since this may incur additional processing time, surround
'read_one_commit' with a progress meter to provide output to the caller.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/commit-graph.c

index a5c2332a86ee7b335b661174309f8dbaabf25033..97eb3b72d67da4d1aadde6d320ddee16cfe93a92 100644 (file)
@@ -6,6 +6,7 @@
 #include "repository.h"
 #include "commit-graph.h"
 #include "object-store.h"
+#include "progress.h"
 
 static char const * const builtin_commit_graph_usage[] = {
        N_("git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"),
@@ -138,15 +139,24 @@ static int write_option_parse_split(const struct option *opt, const char *arg,
        return 0;
 }
 
-static int read_one_commit(struct oidset *commits, const char *hash)
+static int read_one_commit(struct oidset *commits, struct progress *progress,
+                          const char *hash)
 {
+       struct commit *result;
        struct object_id oid;
        const char *end;
 
        if (parse_oid_hex(hash, &oid, &end))
                return error(_("unexpected non-hex object ID: %s"), hash);
 
-       oidset_insert(commits, &oid);
+       result = lookup_commit_reference_gently(the_repository, &oid, 1);
+       if (result)
+               oidset_insert(commits, &result->object.oid);
+       else
+               return error(_("invalid commit object id: %s"), hash);
+
+       display_progress(progress, oidset_size(commits));
+
        return 0;
 }
 
@@ -158,6 +168,7 @@ static int graph_write(int argc, const char **argv)
        struct object_directory *odb = NULL;
        int result = 0;
        enum commit_graph_write_flags flags = 0;
+       struct progress *progress = NULL;
 
        static struct option builtin_commit_graph_write_options[] = {
                OPT_STRING(0, "object-dir", &opts.obj_dir,
@@ -228,13 +239,18 @@ static int graph_write(int argc, const char **argv)
        } else if (opts.stdin_commits) {
                oidset_init(&commits, 0);
                flags |= COMMIT_GRAPH_WRITE_CHECK_OIDS;
+               if (opts.progress)
+                       progress = start_delayed_progress(
+                               _("Collecting commits from input"), 0);
 
                while (strbuf_getline(&buf, stdin) != EOF) {
-                       if (read_one_commit(&commits, buf.buf)) {
+                       if (read_one_commit(&commits, progress, buf.buf)) {
                                result = 1;
                                goto cleanup;
                        }
                }
+
+
        }
 
        if (write_commit_graph(odb,
@@ -247,6 +263,8 @@ static int graph_write(int argc, const char **argv)
 cleanup:
        string_list_clear(&pack_indexes, 0);
        strbuf_release(&buf);
+       if (progress)
+               stop_progress(&progress);
        return result;
 }