commit - 9ba79e04983cd5159d9153ecfd6da5ce29b1d6d6
commit + d231233082281366b326748a6438d4df1d465126
blob - 09035ff59b7dcf9f8612b5ed112bf58ad4c5b22b
blob + 90a73058e6a8463b4fca5849b78e27ee04b10678
--- lib/commit_graph.c
+++ lib/commit_graph.c
}
/*
- * If a child node is known, start iterating there.
+ * If a child node is known, being looping over the list there
+ * instead of from the list head.
* All parent commits *should* appear before their children unless
* commit timestamps are broken (in which case the ordering of
- * commits will be broken either way).
+ * commits will be broken in some way in any case).
*/
n = child_node ? child_node : TAILQ_FIRST(&graph->iter_list);
+
+ /* Ensure that an iteration in progress will see this new commit. */
+ if (graph->iter_node) {
+ n = graph->iter_node;
+ do {
+ next = TAILQ_NEXT(n, entry);
+ if (next &&
+ node->commit_timestamp >= next->commit_timestamp) {
+ TAILQ_INSERT_BEFORE(next, node, entry);
+ return;
+ }
+ n = next;
+ } while (next);
+
+ TAILQ_INSERT_AFTER(&graph->iter_list, graph->iter_node,
+ node, entry);
+ return;
+ }
+
+ /* Insert into list based on committer timestamp. */
do {
- if (node->commit_timestamp < n->commit_timestamp) {
+ if (node->commit_timestamp == n->commit_timestamp) {
+ TAILQ_INSERT_AFTER(&graph->iter_list, n, node, entry);
+ } else if (node->commit_timestamp < n->commit_timestamp) {
next = TAILQ_NEXT(n, entry);
if (next == NULL) {
TAILQ_INSERT_AFTER(&graph->iter_list, n,