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>maint
							parent
							
								
									630cd5194e
								
							
						
					
					
						commit
						fa8953cb40
					
				|  | @ -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)); | ||||
| 			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) | ||||
| 			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); | ||||
| 		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; | ||||
| } | ||||
|  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Taylor Blau
						Taylor Blau