]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/commit-graph.c: extract 'read_one_commit()'
authorTaylor Blau <me@ttaylorr.com>
Mon, 18 May 2020 19:27:09 +0000 (13:27 -0600)
committerJunio C Hamano <gitster@pobox.com>
Mon, 18 May 2020 19:50:07 +0000 (12:50 -0700)
With either '--stdin-commits' or '--stdin-packs', the commit-graph
builtin will read line-delimited input, and interpret it either as a
series of commit OIDs, or pack names.

In a subsequent commit, we will begin handling '--stdin-commits'
differently by processing each line as it comes in, instead of in one
shot at the end. To make adequate room for this additional logic, split
the '--stdin-commits' case from '--stdin-packs' by only storing the
input when '--stdin-packs' is given.

In the case of '--stdin-commits', feed each line to a new
'read_one_commit' helper, which (for now) will merely call
'parse_oid_hex'.

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

index 15fe60317c7846df93d9975dc991ba3a67bd0758..a5c2332a86ee7b335b661174309f8dbaabf25033 100644 (file)
@@ -138,12 +138,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)
+{
+       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);
+       return 0;
+}
+
 static int graph_write(int argc, const char **argv)
 {
-       struct string_list *pack_indexes = NULL;
+       struct string_list pack_indexes = STRING_LIST_INIT_NODUP;
+       struct strbuf buf = STRBUF_INIT;
        struct oidset commits = OIDSET_INIT;
        struct object_directory *odb = NULL;
-       struct string_list lines;
        int result = 0;
        enum commit_graph_write_flags flags = 0;
 
@@ -209,44 +221,32 @@ static int graph_write(int argc, const char **argv)
                return 0;
        }
 
-       string_list_init(&lines, 0);
-       if (opts.stdin_packs || opts.stdin_commits) {
-               struct strbuf buf = STRBUF_INIT;
-
+       if (opts.stdin_packs) {
                while (strbuf_getline(&buf, stdin) != EOF)
-                       string_list_append(&lines, strbuf_detach(&buf, NULL));
-
-               if (opts.stdin_packs)
-                       pack_indexes = &lines;
-               if (opts.stdin_commits) {
-                       struct string_list_item *item;
-                       oidset_init(&commits, lines.nr);
-                       for_each_string_list_item(item, &lines) {
-                               struct object_id oid;
-                               const char *end;
-
-                               if (parse_oid_hex(item->string, &oid, &end)) {
-                                       error(_("unexpected non-hex object ID: "
-                                               "%s"), item->string);
-                                       return 1;
-                               }
-
-                               oidset_insert(&commits, &oid);
+                       string_list_append(&pack_indexes,
+                                          strbuf_detach(&buf, NULL));
+       } else if (opts.stdin_commits) {
+               oidset_init(&commits, 0);
+               flags |= COMMIT_GRAPH_WRITE_CHECK_OIDS;
+
+               while (strbuf_getline(&buf, stdin) != EOF) {
+                       if (read_one_commit(&commits, buf.buf)) {
+                               result = 1;
+                               goto cleanup;
                        }
-                       flags |= COMMIT_GRAPH_WRITE_CHECK_OIDS;
                }
-
-               UNLEAK(buf);
        }
 
        if (write_commit_graph(odb,
-                              pack_indexes,
+                              opts.stdin_packs ? &pack_indexes : NULL,
                               opts.stdin_commits ? &commits : NULL,
                               flags,
                               &split_opts))
                result = 1;
 
-       UNLEAK(lines);
+cleanup:
+       string_list_clear(&pack_indexes, 0);
+       strbuf_release(&buf);
        return result;
 }