commit 99db9666b6f317882a0c92a2abd2dbde1cec575c from: Stefan Sperling date: Mon May 07 15:23:52 2018 UTC add push/pop routines to manage commit queue in tog's log view commit - 31120ada8e3c6ed9981b9ae3fd6551ce495171f9 commit + 99db9666b6f317882a0c92a2abd2dbde1cec575c blob - aee7598b9342a43b833c48420d6b91ef0262c110 blob + 3824d7d7e64d082987124cd35ffe6354502edff2 --- tog/tog.c +++ tog/tog.c @@ -196,30 +196,67 @@ struct commit_queue_entry { TAILQ_HEAD(commit_queue, commit_queue_entry); static const struct got_error * -fetch_commits(struct commit_queue *commits, struct got_object *root_obj, - struct got_object_id *root_id, struct got_repository *repo, int limit) +push_commit(struct commit_queue_entry **entryp, struct commit_queue *commits, + struct got_commit_object *commit, struct got_object_id *id) { - const struct got_error *err; - struct got_commit_object *root_commit; + const struct got_error *err = NULL; struct commit_queue_entry *entry; - int ncommits = 0; - err = got_object_commit_open(&root_commit, repo, root_obj); - if (err) - return err; + *entryp = NULL; entry = calloc(1, sizeof(*entry)); if (entry == NULL) return got_error_from_errno(); - entry->id = got_object_id_dup(root_id); + + entry->id = got_object_id_dup(id); if (entry->id == NULL) { err = got_error_from_errno(); free(entry); return err; } - entry->commit = root_commit; + + entry->commit = commit; TAILQ_INSERT_HEAD(commits, entry, entry); + *entryp = entry; + return NULL; +} +static void +pop_commit(struct commit_queue *commits) +{ + struct commit_queue_entry *entry; + + entry = TAILQ_FIRST(commits); + TAILQ_REMOVE(commits, entry, entry); + got_object_commit_close(entry->commit); + free(entry->id); + free(entry); +} + +static void +free_commits(struct commit_queue *commits) +{ + while (!TAILQ_EMPTY(commits)) + pop_commit(commits); +} + +static const struct got_error * +fetch_commits(struct commit_queue *commits, struct got_object *root_obj, + struct got_object_id *root_id, struct got_repository *repo, int limit) +{ + const struct got_error *err; + struct got_commit_object *root_commit; + struct commit_queue_entry *entry; + int ncommits = 0; + + err = got_object_commit_open(&root_commit, repo, root_obj); + if (err) + return err; + + err = push_commit(&entry, commits, root_commit, root_id); + if (err) + return err; + while (entry->commit->nparents > 0 && ncommits < limit) { struct got_parent_id *pid; struct got_object *obj; @@ -263,20 +300,6 @@ fetch_commits(struct commit_queue *commits, struct got return err; } -static void -free_commits(struct commit_queue *commits) -{ - struct commit_queue_entry *entry; - - while (!TAILQ_EMPTY(commits)) { - entry = TAILQ_FIRST(commits); - TAILQ_REMOVE(commits, entry, entry); - got_object_commit_close(entry->commit); - free(entry->id); - free(entry); - } -} - static const struct got_error * draw_commits(struct commit_queue *commits, int selected) {