Merge pull request #3037 from libgit2/cmn/hide-then-push Handle hide-then-push in the revwalk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
diff --git a/include/git2/revwalk.h b/include/git2/revwalk.h
index 0a5fdce..2cc0053 100644
--- a/include/git2/revwalk.h
+++ b/include/git2/revwalk.h
@@ -90,15 +90,17 @@ GIT_EXTERN(int) git_revwalk_new(git_revwalk **out, git_repository *repo);
GIT_EXTERN(void) git_revwalk_reset(git_revwalk *walker);
/**
- * Mark a commit to start traversal from.
+ * Add a new root for the traversal
*
- * The given OID must belong to a committish on the walked
- * repository.
+ * The pushed commit will be marked as one of the roots from which to
+ * start the walk. This commit may not be walked if it or a child is
+ * hidden.
+ *
+ * At least one commit must be pushed onto the walker before a walk
+ * can be started.
*
- * The given commit will be used as one of the roots
- * when starting the revision walk. At least one commit
- * must be pushed onto the walker before a walk can
- * be started.
+ * The given id must belong to a committish on the walked
+ * repository.
*
* @param walk the walker being used for the traversal.
* @param id the oid of the commit to start from.
@@ -135,7 +137,7 @@ GIT_EXTERN(int) git_revwalk_push_head(git_revwalk *walk);
/**
* Mark a commit (and its ancestors) uninteresting for the output.
*
- * The given OID must belong to a committish on the walked
+ * The given id must belong to a committish on the walked
* repository.
*
* The resolved commit and all its parents will be hidden from the
diff --git a/src/revwalk.c b/src/revwalk.c
index a6d823e..9d0fafd 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -144,6 +144,10 @@ static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting,
if (commit == NULL)
return -1; /* error already reported by failed lookup */
+ /* A previous hide already told us we don't want this commit */
+ if (commit->uninteresting)
+ return 0;
+
if (uninteresting)
walk->did_hide = 1;
else
diff --git a/tests/revwalk/basic.c b/tests/revwalk/basic.c
index 4ae9527..7e50452 100644
--- a/tests/revwalk/basic.c
+++ b/tests/revwalk/basic.c
@@ -314,6 +314,23 @@ void test_revwalk_basic__disallow_non_commit(void)
cl_git_fail(git_revwalk_push(_walk, &oid));
}
+void test_revwalk_basic__hide_then_push(void)
+{
+ git_oid oid;
+ int i = 0;
+
+ revwalk_basic_setup_walk(NULL);
+ cl_git_pass(git_oid_fromstr(&oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644"));
+
+ cl_git_pass(git_revwalk_hide(_walk, &oid));
+ cl_git_pass(git_revwalk_push(_walk, &oid));
+
+ while (git_revwalk_next(&oid, _walk) == 0)
+ i++;
+
+ cl_assert_equal_i(i, 0);
+}
+
void test_revwalk_basic__push_range(void)
{
revwalk_basic_setup_walk(NULL);