commit de56b2d77396d1145d46d110daf59e9a9c3a1842 from: Stefan Sperling date: Sat Jan 04 19:39:29 2020 UTC move changed-path detection out of add_node() in commit graph commit - a62c5b798e37fb267b9e802387bf75d68e254457 commit + de56b2d77396d1145d46d110daf59e9a9c3a1842 blob - c25942999ae0962cb43c4da8b0fabe0d558677b8 blob + c648591b4673fc1d58c557b41016f9841b142d98 --- lib/commit_graph.c +++ lib/commit_graph.c @@ -52,8 +52,6 @@ struct got_commit_graph_branch_tip { struct got_object_id *commit_id; struct got_commit_object *commit; struct got_commit_graph_node *new_node; - int changed; - int branch_done; }; struct got_commit_graph { @@ -149,8 +147,7 @@ done: static void add_node_to_iter_list(struct got_commit_graph *graph, - struct got_commit_graph_node *node, - struct got_commit_graph_node *child_node) + struct got_commit_graph_node *node) { struct got_commit_graph_node *n, *next; @@ -294,17 +291,16 @@ advance_branch(struct got_commit_graph *graph, } static const struct got_error * -add_node(struct got_commit_graph_node **new_node, int *changed, - int *branch_done, struct got_commit_graph *graph, - struct got_object_id *commit_id, struct got_commit_object *commit, - struct got_commit_graph_node *child_node, struct got_repository *repo) +add_node(struct got_commit_graph_node **new_node, + struct got_commit_graph *graph, + struct got_object_id *commit_id, + struct got_commit_object *commit, + struct got_repository *repo) { const struct got_error *err = NULL; struct got_commit_graph_node *node; *new_node = NULL; - *changed = 0; - *branch_done = 0; node = calloc(1, sizeof(*node)); if (node == NULL) @@ -314,32 +310,35 @@ add_node(struct got_commit_graph_node **new_node, int node->timestamp = commit->committer_time; err = got_object_idset_add(graph->node_ids, &node->id, node); - if (err) { + if (err) free(node); - return err; - } + else + *new_node = node; + return err; +} - err = detect_changed_path(changed, commit, commit_id, graph->path, - repo); - if (err) { - if (err->code == GOT_ERR_NO_OBJ) { - /* - * History of the path stops here on the current - * branch. Keep going on other branches. - */ - err = NULL; - *branch_done = 1; - } else { - got_object_idset_remove(NULL, graph->node_ids, - &node->id); - free(node); +const struct got_error * +detect_change(int *changed, int *branch_done, const char *path, + struct got_commit_object *commit, struct got_object_id *commit_id, + struct got_repository *repo) +{ + const struct got_error *err; + + *changed = 0; + *branch_done = 0; + + err = detect_changed_path(changed, commit, commit_id, path, repo); + if (err) { + if (err->code != GOT_ERR_NO_OBJ) return err; - } + /* + * History of the path stops here on the current + * branch. Keep going on other branches. + */ + err = NULL; + *branch_done = 1; } - if (*changed) - add_node_to_iter_list(graph, node, child_node); - *new_node = node; return NULL; } @@ -394,26 +393,21 @@ static const struct got_error * add_branch_tip(struct got_object_id *commit_id, void *data, void *arg) { const struct got_error *err; - struct got_commit_graph_node *child_node = data; struct add_branch_tip_arg *a = arg; struct got_commit_graph_node *new_node; struct got_commit_object *commit; - int changed, branch_done; err = got_object_open_as_commit(&commit, a->repo, commit_id); if (err) return err; - err = add_node(&new_node, &changed, &branch_done, a->graph, - commit_id, commit, child_node, a->repo); + err = add_node(&new_node, a->graph, commit_id, commit, a->repo); if (err) return err; a->tips[a->ntips].commit_id = new_node ? &new_node->id : NULL; a->tips[a->ntips].commit = commit; a->tips[a->ntips].new_node = new_node; - a->tips[a->ntips].changed = changed; - a->tips[a->ntips].branch_done = branch_done; a->ntips++; return NULL; @@ -470,9 +464,16 @@ fetch_commits_from_open_branches(int *nfetched, commit_id = arg.tips[i].commit_id; commit = arg.tips[i].commit; new_node = arg.tips[i].new_node; - branch_done = arg.tips[i].branch_done; - changed = arg.tips[i].changed; - + + err = detect_change(&changed, &branch_done, graph->path, + commit, commit_id, repo); + if (err) + break; + if (changed) { + add_node_to_iter_list(graph, new_node); + if (changed_id && *changed_id == NULL) + *changed_id = commit_id; + } if (branch_done) err = close_branch(graph, commit_id); else @@ -480,8 +481,6 @@ fetch_commits_from_open_branches(int *nfetched, commit, repo); if (err) break; - if (changed && changed_id && *changed_id == NULL) - *changed_id = commit_id; } done: for (i = 0; i < arg.ntips; i++) @@ -528,11 +527,17 @@ got_commit_graph_iter_start(struct got_commit_graph *g if (err) return err; - err = add_node(&start_node, &changed, &branch_done, graph, id, - commit, NULL, repo); + err = add_node(&start_node, graph, id, commit, repo); if (err) goto done; + err = detect_change(&changed, &branch_done, graph->path, + commit, id, repo); + if (err) + goto done; + if (changed) + add_node_to_iter_list(graph, start_node); + err = advance_branch(graph, start_node, id, commit, repo); if (err) goto done;