diff options
author | Leo Yang <lyang@topologyinc.com> | 2015-08-17 15:02:02 -0400 |
---|---|---|
committer | Leo Yang <lyang@topologyinc.com> | 2015-09-04 12:24:36 -0400 |
commit | c097f7173daced0f86fd816a72ad5fc0f636484a (patch) | |
tree | 2934468800976cc954f7042f5f7cc89b4ce34921 | |
parent | 1cef6b9f190587a78c65bd3168879be3eb37e0fb (diff) | |
download | libgit2-c097f7173daced0f86fd816a72ad5fc0f636484a.tar.gz |
New API: git_index_find_prefix
Find the first index entry matching a prefix.
-rw-r--r-- | include/git2/index.h | 11 | ||||
-rw-r--r-- | src/index.c | 24 | ||||
-rw-r--r-- | tests/index/tests.c | 21 |
3 files changed, 56 insertions, 0 deletions
diff --git a/include/git2/index.h b/include/git2/index.h index 7caf3ed78..176ba301e 100644 --- a/include/git2/index.h +++ b/include/git2/index.h @@ -643,6 +643,17 @@ GIT_EXTERN(int) git_index_update_all( */ GIT_EXTERN(int) git_index_find(size_t *at_pos, git_index *index, const char *path); +/** + * Find the first position of any entries matching a prefix. To find the first position + * of a path inside a given folder, suffix the prefix with a '/'. + * + * @param at_pos the address to which the position of the index entry is written (optional) + * @param index an existing index object + * @param prefix the prefix to search for + * @return 0 with valid value in at_pos; an error code otherwise + */ +GIT_EXTERN(int) git_index_find_prefix(size_t *at_pos, git_index *index, const char *prefix); + /**@}*/ /** @name Conflict Index Entry Functions diff --git a/src/index.c b/src/index.c index 53120e49c..e32320f80 100644 --- a/src/index.c +++ b/src/index.c @@ -1420,6 +1420,30 @@ int git_index_remove_directory(git_index *index, const char *dir, int stage) return error; } +int git_index_find_prefix(size_t *at_pos, git_index *index, const char *prefix) +{ + int error = 0; + size_t pos; + const git_index_entry *entry; + + if (git_mutex_lock(&index->lock) < 0) { + giterr_set(GITERR_OS, "Failed to lock index"); + return -1; + } + + index_find(&pos, index, prefix, strlen(prefix), GIT_INDEX_STAGE_ANY, false); + entry = git_vector_get(&index->entries, pos); + if (!entry || git__prefixcmp(entry->path, prefix) != 0) + error = GIT_ENOTFOUND; + + if (!error && at_pos) + *at_pos = pos; + + git_mutex_unlock(&index->lock); + + return error; +} + int git_index__find_pos( size_t *out, git_index *index, const char *path, size_t path_len, int stage) { diff --git a/tests/index/tests.c b/tests/index/tests.c index e1ff12ad0..60c212681 100644 --- a/tests/index/tests.c +++ b/tests/index/tests.c @@ -155,6 +155,27 @@ void test_index_tests__find_in_empty(void) git_index_free(index); } +void test_index_tests__find_prefix(void) +{ + git_index *index; + const git_index_entry *entry; + size_t pos; + + cl_git_pass(git_index_open(&index, TEST_INDEX_PATH)); + + cl_git_pass(git_index_find_prefix(&pos, index, "src")); + entry = git_index_get_byindex(index, pos); + cl_assert(git__strcmp(entry->path, "src/block-sha1/sha1.c") == 0); + + cl_git_pass(git_index_find_prefix(&pos, index, "src/co")); + entry = git_index_get_byindex(index, pos); + cl_assert(git__strcmp(entry->path, "src/commit.c") == 0); + + cl_assert(GIT_ENOTFOUND == git_index_find_prefix(NULL, index, "blah")); + + git_index_free(index); +} + void test_index_tests__write(void) { git_index *index; |