commit - 5175b31a9e97f249cc1e6621f50d05b3c3dca974
commit + 94489f7d96343ddd926acbfe5d6b98bc759d60ca
blob - a205e68a8f5538b8bd7db5bcec9ce4423a58ed62
blob + 67cc1c5d1595cad48cd0998e6137e955e9207261
--- lib/commit_graph.c
+++ lib/commit_graph.c
/* Path of tree entry of interest to the API user. */
char *path;
- /* The next commit to return when the API user asks for one. */
- struct got_commit_graph_node *iter_node;
-
- /* The graph iteration list contains all nodes in sorted order. */
+ /*
+ * Nodes which will be passed to the API user next, sorted by
+ * commit timestmap.
+ */
struct got_commit_graph_iter_list iter_list;
};
if (TAILQ_EMPTY(&graph->iter_list)) {
TAILQ_INSERT_HEAD(&graph->iter_list, node, entry);
- graph->iter_node = node;
return;
}
- n = graph->iter_node;
+ n = TAILQ_FIRST(&graph->iter_list);
/* Ensure that an iteration in progress will see this new commit. */
while (n) {
next = TAILQ_NEXT(n, entry);
return err;
/* Locate first commit which changed graph->path. */
- while (graph->iter_node == NULL &&
+ while (TAILQ_EMPTY(&graph->iter_list) &&
got_object_idset_num_elements(graph->open_branches) > 0) {
err = fetch_commits_from_open_branches(graph, repo,
cancel_cb, cancel_arg);
return err;
}
- if (graph->iter_node == NULL) {
+ if (TAILQ_EMPTY(&graph->iter_list)) {
const char *path;
if (got_path_is_root_dir(graph->path))
return got_error_no_obj(id);
got_cancel_cb cancel_cb, void *cancel_arg)
{
const struct got_error *err = NULL;
+ struct got_commit_graph_node *node;
*id = NULL;
- if (graph->iter_node == NULL) {
+ if (TAILQ_EMPTY(&graph->iter_list)) {
/* We are done iterating, or iteration was not started. */
return got_error(GOT_ERR_ITER_COMPLETED);
}
- if (graph->iter_node ==
- TAILQ_LAST(&graph->iter_list, got_commit_graph_iter_list) &&
- got_object_idset_num_elements(graph->open_branches) == 0) {
- /* We are done iterating. */
- *id = &graph->iter_node->id;
- graph->iter_node = NULL;
- return NULL;
- }
-
- while (TAILQ_NEXT(graph->iter_node, entry) == NULL &&
+ node = TAILQ_FIRST(&graph->iter_list);
+ while (TAILQ_NEXT(node, entry) == NULL &&
got_object_idset_num_elements(graph->open_branches) > 0) {
err = fetch_commits_from_open_branches(graph, repo,
cancel_cb, cancel_arg);
return err;
}
- *id = &graph->iter_node->id;
- graph->iter_node = TAILQ_NEXT(graph->iter_node, entry);
+ *id = &node->id;
+ TAILQ_REMOVE(&graph->iter_list, node, entry);
return NULL;
}