Commit Diff


commit - 63da309a4f2c5978e3fe9ec99266313333116218
commit + 1bf85b22df5bb9019f291c010d72dcf37ad2e774
blob - f6669fd0b9bea0a21d77886b9e2933fc07952a79
blob + df87bed092f0a22f4787ade94b10bdac94c80123
--- lib/commit_graph.c
+++ lib/commit_graph.c
@@ -375,17 +375,17 @@ free_node(struct got_commit_graph_node *node)
 
 static const struct got_error *
 add_node(struct got_commit_graph_node **new_node, int *changed,
-    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)
+    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)
 {
 	const struct got_error *err = NULL;
 	struct got_commit_graph_node *node;
 	struct got_object_qid *pid;
-	int branch_done = 0;
 
 	*new_node = NULL;
 	*changed = 0;
+	*branch_done = 0;
 
 	node = calloc(1, sizeof(*node));
 	if (node == NULL)
@@ -418,7 +418,7 @@ add_node(struct got_commit_graph_node **new_node, int 
 			 * branch. Keep going on other branches.
 			 */
 			err = NULL;
-			branch_done = 1;
+			*branch_done = 1;
 		} else {
 			free_node(node);
 			return err;
@@ -428,10 +428,6 @@ add_node(struct got_commit_graph_node **new_node, int 
 	if (*changed)
 		add_node_to_iter_list(graph, node, child_node);
 
-	if (branch_done)
-		err = close_branch(graph, commit_id);
-	else
-		err = advance_branch(graph, node, commit_id, commit, repo);
 	if (err)
 		free_node(node);
 	else
@@ -447,7 +443,7 @@ got_commit_graph_open(struct got_commit_graph **graph,
 {
 	const struct got_error *err = NULL;
 	struct got_commit_object *commit;
-	int changed;
+	int changed, branch_done;
 
 	*graph = NULL;
 
@@ -473,8 +469,12 @@ got_commit_graph_open(struct got_commit_graph **graph,
 	if (first_parent_traversal)
 		(*graph)->flags |= GOT_COMMIT_GRAPH_FIRST_PARENT_TRAVERSAL;
 
-	err = add_node(&(*graph)->head_node, &changed, *graph, commit_id,
-	    commit, NULL, repo);
+	err = add_node(&(*graph)->head_node, &changed, &branch_done, *graph,
+	    commit_id, commit, NULL, repo);
+	if (err == NULL) {
+		err = advance_branch(*graph, (*graph)->head_node, commit_id,
+		    commit, repo);
+	}
 	got_object_commit_close(commit);
 	if (err) {
 		got_commit_graph_close(*graph);
@@ -538,7 +538,7 @@ fetch_commits_from_open_branches(int *ncommits,
 		struct got_object_id *commit_id;
 		struct got_commit_graph_node *child_node, *new_node;
 		struct got_commit_object *commit;
-		int changed;
+		int changed, branch_done;
 
 		commit_id = &graph->tips[i].id;
 		child_node = graph->tips[i].node;
@@ -547,8 +547,13 @@ fetch_commits_from_open_branches(int *ncommits,
 		if (err)
 			break;
 
-		err = add_node(&new_node, &changed, graph, commit_id, commit,
-		    child_node, repo);
+		err = add_node(&new_node, &changed, &branch_done, graph,
+		    commit_id, commit, child_node, repo);
+		if (branch_done)
+			err = close_branch(graph, commit_id);
+		else
+			err = advance_branch(graph, new_node, commit_id,
+			    commit, repo);
 		if (changed && *changed_id == NULL)
 			*changed_id = commit_id;
 		got_object_commit_close(commit);