builtin/commit-graph.c: extract 'read_one_commit()'

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>
This commit is contained in:
Taylor Blau 2020-05-18 13:27:09 -06:00 committed by Junio C Hamano
parent 630cd5194e
commit fa8953cb40

View File

@ -138,12 +138,24 @@ static int write_option_parse_split(const struct option *opt, const char *arg,
return 0; 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) 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 oidset commits = OIDSET_INIT;
struct object_directory *odb = NULL; struct object_directory *odb = NULL;
struct string_list lines;
int result = 0; int result = 0;
enum commit_graph_write_flags flags = 0; enum commit_graph_write_flags flags = 0;
@ -209,44 +221,32 @@ static int graph_write(int argc, const char **argv)
return 0; return 0;
} }
string_list_init(&lines, 0); if (opts.stdin_packs) {
if (opts.stdin_packs || opts.stdin_commits) {
struct strbuf buf = STRBUF_INIT;
while (strbuf_getline(&buf, stdin) != EOF) while (strbuf_getline(&buf, stdin) != EOF)
string_list_append(&lines, strbuf_detach(&buf, NULL)); string_list_append(&pack_indexes,
strbuf_detach(&buf, NULL));
} else if (opts.stdin_commits) {
oidset_init(&commits, 0);
flags |= COMMIT_GRAPH_WRITE_CHECK_OIDS;
if (opts.stdin_packs) while (strbuf_getline(&buf, stdin) != EOF) {
pack_indexes = &lines; if (read_one_commit(&commits, buf.buf)) {
if (opts.stdin_commits) { result = 1;
struct string_list_item *item; goto cleanup;
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);
} }
flags |= COMMIT_GRAPH_WRITE_CHECK_OIDS;
} }
UNLEAK(buf);
} }
if (write_commit_graph(odb, if (write_commit_graph(odb,
pack_indexes, opts.stdin_packs ? &pack_indexes : NULL,
opts.stdin_commits ? &commits : NULL, opts.stdin_commits ? &commits : NULL,
flags, flags,
&split_opts)) &split_opts))
result = 1; result = 1;
UNLEAK(lines); cleanup:
string_list_clear(&pack_indexes, 0);
strbuf_release(&buf);
return result; return result;
} }