diff --git a/include/git2/revwalk.h b/include/git2/revwalk.h index 020c898ca..e7ec2abf3 100644 --- a/include/git2/revwalk.h +++ b/include/git2/revwalk.h @@ -116,6 +116,14 @@ GIT_EXTERN(int) git_revwalk_push(git_revwalk *walk, const git_oid *oid); */ GIT_EXTERN(int) git_revwalk_push_glob(git_revwalk *walk, const char *glob); +/** + * Push the repository's HEAD + * + * @param walk the walker being used for the traversal + * @return GIT_SUCCESS or an error code + */ +GIT_EXTERN(int) git_revwalk_push_head(git_revwalk *walk); + /** * Mark a commit (and its ancestors) uninteresting for the output. * @@ -147,6 +155,14 @@ GIT_EXTERN(int) git_revwalk_hide(git_revwalk *walk, const git_oid *oid); */ GIT_EXTERN(int) git_revwalk_hide_glob(git_revwalk *walk, const char *glob); +/** + * Hide the repository's HEAD + * + * @param walk the walker being used for the traversal + * @return GIT_SUCCESS or an error code + */ +GIT_EXTERN(int) git_revwalk_hide_head(git_revwalk *walk); + /** * Get the next commit from the revision walk. * diff --git a/src/revwalk.c b/src/revwalk.c index 8f818b814..cd971b5d9 100644 --- a/src/revwalk.c +++ b/src/revwalk.c @@ -391,6 +391,39 @@ int git_revwalk_hide_glob(git_revwalk *walk, const char *glob) return push_glob(walk, glob, 1); } +static int push_head(git_revwalk *walk, int hide) +{ + git_reference *ref, *resolved; + int error; + + error = git_reference_lookup(&ref, walk->repo, "HEAD"); + if (error < GIT_SUCCESS) { + return error; + } + error = git_reference_resolve(&resolved, ref); + if (error < GIT_SUCCESS) { + return error; + } + git_reference_free(ref); + + error = push_commit(walk, git_reference_oid(resolved), hide); + + git_reference_free(resolved); + return error; +} + +int git_revwalk_push_head(git_revwalk *walk) +{ + assert(walk); + return push_head(walk, 0); +} + +int git_revwalk_hide_head(git_revwalk *walk) +{ + assert(walk); + return push_head(walk, 1); +} + static int revwalk_enqueue_timesort(git_revwalk *walk, commit_object *commit) { return git_pqueue_insert(&walk->iterator_time, commit); diff --git a/tests-clar/revwalk/basic.c b/tests-clar/revwalk/basic.c index f013945ff..fff93ec93 100644 --- a/tests-clar/revwalk/basic.c +++ b/tests-clar/revwalk/basic.c @@ -132,3 +132,18 @@ void test_revwalk_basic__glob_heads(void) /* git log --branches --oneline | wc -l => 13 */ cl_assert(i == 13); } + +void test_revwalk_basic__push_head(void) +{ + int i = 0; + git_oid oid; + + cl_git_pass(git_revwalk_push_head(_walk)); + + while (git_revwalk_next(&oid, _walk) == GIT_SUCCESS) { + i++; + } + + /* git log HEAD --oneline | wc -l => 7 */ + cl_assert(i == 7); +}