commit - a62c5b798e37fb267b9e802387bf75d68e254457
commit + de56b2d77396d1145d46d110daf59e9a9c3a1842
blob - c25942999ae0962cb43c4da8b0fabe0d558677b8
blob + c648591b4673fc1d58c557b41016f9841b142d98
--- lib/commit_graph.c
+++ lib/commit_graph.c
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 {
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;
}
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)
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;
}
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;
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
commit, repo);
if (err)
break;
- if (changed && changed_id && *changed_id == NULL)
- *changed_id = commit_id;
}
done:
for (i = 0; i < arg.ntips; i++)
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;