int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo) { git_revwalk *walk = git__calloc(1, sizeof(git_revwalk)); GITERR_CHECK_ALLOC(walk); walk->commits = git_oidmap_alloc(); GITERR_CHECK_ALLOC(walk->commits); if (git_pqueue_init( &walk->iterator_time, 0, 8, git_commit_list_time_cmp) < 0 || git_pool_init(&walk->commit_pool, 1, git_pool__suggest_items_per_page(COMMIT_ALLOC) * COMMIT_ALLOC) < 0) return -1; walk->get_next = &revwalk_next_unsorted; walk->enqueue = &revwalk_enqueue_unsorted; walk->repo = repo; if (git_repository_odb(&walk->odb, repo) < 0) { git_revwalk_free(walk); return -1; } *revwalk_out = walk; return 0; }
int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo) { git_revwalk *walk; walk = git__malloc(sizeof(git_revwalk)); if (walk == NULL) return GIT_ENOMEM; memset(walk, 0x0, sizeof(git_revwalk)); walk->commits = git_hashtable_alloc(64, object_table_hash, (git_hash_keyeq_ptr)git_oid_cmp); if (walk->commits == NULL) { free(walk); return GIT_ENOMEM; } git_pqueue_init(&walk->iterator_time, 8, commit_time_cmp); git_vector_init(&walk->memory_alloc, 8, NULL); alloc_chunk(walk); walk->get_next = &revwalk_next_unsorted; walk->enqueue = &revwalk_enqueue_unsorted; walk->repo = repo; *revwalk_out = walk; return GIT_SUCCESS; }
static int premark_uninteresting(git_revwalk *walk) { int error = 0; unsigned short i; git_pqueue q; git_commit_list *list; git_commit_list_node *commit, *parent; if ((error = git_pqueue_init(&q, 0, 8, git_commit_list_time_cmp)) < 0) return error; for (list = walk->user_input; list; list = list->next) { if ((error = git_commit_list_parse(walk, list->item)) < 0) goto cleanup; if ((error = git_pqueue_insert(&q, list->item)) < 0) goto cleanup; } while (interesting(&q)) { commit = git_pqueue_pop(&q); for (i = 0; i < commit->out_degree; i++) { parent = commit->parents[i]; if ((error = git_commit_list_parse(walk, parent)) < 0) goto cleanup; if (commit->uninteresting) parent->uninteresting = 1; if (contains(&q, parent)) continue; if ((error = git_pqueue_insert(&q, parent)) < 0) goto cleanup; } } cleanup: git_pqueue_free(&q); return error; }
static int ahead_behind(git_commit_list_node *one, git_commit_list_node *two, size_t *ahead, size_t *behind) { git_commit_list_node *commit; git_pqueue pq; int i; *ahead = 0; *behind = 0; if (git_pqueue_init(&pq, 2, git_commit_list_time_cmp) < 0) return -1; if (git_pqueue_insert(&pq, one) < 0) goto on_error; if (git_pqueue_insert(&pq, two) < 0) goto on_error; while ((commit = git_pqueue_pop(&pq)) != NULL) { if (commit->flags & RESULT || (commit->flags & (PARENT1 | PARENT2)) == (PARENT1 | PARENT2)) continue; else if (commit->flags & PARENT1) (*behind)++; else if (commit->flags & PARENT2) (*ahead)++; for (i = 0; i < commit->out_degree; i++) { git_commit_list_node *p = commit->parents[i]; if (git_pqueue_insert(&pq, p) < 0) return -1; } commit->flags |= RESULT; } git_pqueue_free(&pq); return 0; on_error: git_pqueue_free(&pq); return -1; }