summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/git2/revwalk.h22
-rw-r--r--src/revwalk.c71
-rw-r--r--tests-clar/revwalk/basic.c5
3 files changed, 57 insertions, 41 deletions
diff --git a/include/git2/revwalk.h b/include/git2/revwalk.h
index e7ec2abf3..632c67588 100644
--- a/include/git2/revwalk.h
+++ b/include/git2/revwalk.h
@@ -164,6 +164,28 @@ GIT_EXTERN(int) git_revwalk_hide_glob(git_revwalk *walk, const char *glob);
GIT_EXTERN(int) git_revwalk_hide_head(git_revwalk *walk);
/**
+ * Push the OID pointed to by a reference
+ *
+ * The reference must point to a commit.
+ *
+ * @param walk the walker being used for the traversal
+ * @param refname the referece to push
+ * @return GIT_SUCCESS or an error code
+ */
+GIT_EXTERN(int) git_revwalk_push_ref(git_revwalk *walk, const char *refname);
+
+/**
+ * Hide the OID pointed to by a reference
+ *
+ * The reference must point to a commit.
+ *
+ * @param walk the walker being used for the traversal
+ * @param refname the referece to hide
+ * @return GIT_SUCCESS or an error code
+ */
+GIT_EXTERN(int) git_revwalk_hide_ref(git_revwalk *walk, const char *refname);
+
+/**
* Get the next commit from the revision walk.
*
* The initial call to this method is *not* blocking when
diff --git a/src/revwalk.c b/src/revwalk.c
index ffa0be6f8..1a398ce2d 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -310,6 +310,23 @@ int git_revwalk_hide(git_revwalk *walk, const git_oid *oid)
return push_commit(walk, oid, 1);
}
+static int push_ref(git_revwalk *walk, const char *refname, int hide)
+{
+ git_reference *ref, *resolved;
+ int error;
+
+ error = git_reference_lookup(&ref, walk->repo, refname);
+ if (error < GIT_SUCCESS)
+ return error;
+ error = git_reference_resolve(&resolved, ref);
+ git_reference_free(ref);
+ if (error < GIT_SUCCESS)
+ return error;
+ error = push_commit(walk, git_reference_oid(resolved), hide);
+ git_reference_free(resolved);
+ return error;
+}
+
struct push_cb_data {
git_revwalk *walk;
const char *glob;
@@ -320,21 +337,8 @@ static int push_glob_cb(const char *refname, void *data_)
{
struct push_cb_data *data = (struct push_cb_data *)data_;
- if (!git__fnmatch(data->glob, refname, 0)) {
- git_reference *ref, *resolved;
- int error;
-
- error = git_reference_lookup(&ref, data->walk->repo, refname);
- if (error < GIT_SUCCESS)
- return error;
- error = git_reference_resolve(&resolved, ref);
- git_reference_free(ref);
- if (error < GIT_SUCCESS)
- return error;
- error = push_commit(data->walk, git_reference_oid(resolved), data->hide);
- git_reference_free(resolved);
- return error;
- }
+ if (!git__fnmatch(data->glob, refname, 0))
+ return push_ref(data->walk, refname, data->hide);
return GIT_SUCCESS;
}
@@ -394,37 +398,28 @@ 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);
+ return push_ref(walk, GIT_HEAD_FILE, 0);
}
int git_revwalk_hide_head(git_revwalk *walk)
{
assert(walk);
- return push_head(walk, 1);
+ return push_ref(walk, GIT_HEAD_FILE, 1);
+}
+
+int git_revwalk_push_ref(git_revwalk *walk, const char *refname)
+{
+ assert(walk && refname);
+ return push_ref(walk, refname, 0);
+}
+
+int git_revwalk_hide_ref(git_revwalk *walk, const char *refname)
+{
+ assert(walk && refname);
+ return push_ref(walk, refname, 1);
}
static int revwalk_enqueue_timesort(git_revwalk *walk, commit_object *commit)
diff --git a/tests-clar/revwalk/basic.c b/tests-clar/revwalk/basic.c
index cc88ec65b..a364d82b0 100644
--- a/tests-clar/revwalk/basic.c
+++ b/tests-clar/revwalk/basic.c
@@ -148,14 +148,13 @@ void test_revwalk_basic__push_head(void)
cl_assert(i == 7);
}
-void test_revwalk_basic__push_head_hide_glob(void)
+void test_revwalk_basic__push_head_hide_ref(void)
{
int i = 0;
git_oid oid;
cl_git_pass(git_revwalk_push_head(_walk));
- /* This is a hack, as we know this will only match the packed-test branch */
- cl_git_pass(git_revwalk_hide_glob(_walk, "heads/packed-test*"));
+ cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/packed-test"));
while (git_revwalk_next(&oid, _walk) == GIT_SUCCESS) {
i++;