diff options
| author | Edward Thomson <ethomson@edwardthomson.com> | 2015-04-16 19:12:28 -0500 |
|---|---|---|
| committer | Edward Thomson <ethomson@edwardthomson.com> | 2015-04-16 19:12:28 -0500 |
| commit | 6f80bf4afb81f9e907601398735c576da1dbadc1 (patch) | |
| tree | fa74cb5581c5e9ffa338e49d8e12047b0b37a4fc | |
| parent | fa7281db4ea3a00540d39a4dfa786c8f353981cb (diff) | |
| parent | 05d9202678cf910d600c900cf99b09ad7e259157 (diff) | |
| download | libgit2-6f80bf4afb81f9e907601398735c576da1dbadc1.tar.gz | |
Merge pull request #3037 from libgit2/cmn/hide-then-push
Handle hide-then-push in the revwalk
| -rw-r--r-- | include/git2/revwalk.h | 18 | ||||
| -rw-r--r-- | src/revwalk.c | 4 | ||||
| -rw-r--r-- | tests/revwalk/basic.c | 17 |
3 files changed, 31 insertions, 8 deletions
diff --git a/include/git2/revwalk.h b/include/git2/revwalk.h index 0a5fdce21..2cc00536e 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 a6d823ec8..9d0fafddf 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 4ae952775..7e50452c9 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); |
