Commit Diff


commit - 98fdf1e045e1e5aca2bddf8ca07778ef7dd86a78
commit + fe8df4c20ba7f071fe1ce416388a69c241201c69
blob - 4ec98d9b24d734b3a32faf3dae874a0ca67ac6dc
blob + 958b66ec82b4dd7e18be4a27f9d081e78e7b6484
--- lib/commit_graph.c
+++ lib/commit_graph.c
@@ -155,6 +155,23 @@ add_node_to_iter_list(struct got_commit_graph *graph,
 		return;
 	}
 
+	/* Ensure that an iteration in progress will see this new commit. */
+	if (graph->iter_node) {
+		n = graph->iter_node;
+		while (n) {
+			next = TAILQ_NEXT(n, entry);
+			if (next &&
+			    node->commit_timestamp >= next->commit_timestamp) {
+				TAILQ_INSERT_BEFORE(next, node, entry);
+				return;
+			}
+			n = next;
+		}
+		TAILQ_INSERT_AFTER(&graph->iter_list, graph->iter_node,
+		    node, entry);
+		return;
+	}
+
 	/*
 	 * If a child node is known, begin looping over the list there
 	 * instead of beginning from the list head.
@@ -164,10 +181,6 @@ add_node_to_iter_list(struct got_commit_graph *graph,
 	/* Insert into list based on committer timestamp. */
 	do {
 		if (node->commit_timestamp == n->commit_timestamp) {
-			/*
-			 * Insert after, rather than before, so that an
-			 * iteration in progress will see this new commit.
-			 */
 			TAILQ_INSERT_AFTER(&graph->iter_list, n, node, entry);
 			break;
 		} else if (node->commit_timestamp < n->commit_timestamp) {