mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 11:19:47 +00:00
Merge pull request #3381 from leoyanggit/index_directory_iterator
New feature: add the ablility to iterate through a directory in index
This commit is contained in:
commit
2964cbeae1
@ -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);
|
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
|
/** @name Conflict Index Entry Functions
|
||||||
|
24
src/index.c
24
src/index.c
@ -1466,6 +1466,30 @@ int git_index_remove_directory(git_index *index, const char *dir, int stage)
|
|||||||
return error;
|
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(
|
int git_index__find_pos(
|
||||||
size_t *out, git_index *index, const char *path, size_t path_len, int stage)
|
size_t *out, git_index *index, const char *path, size_t path_len, int stage)
|
||||||
{
|
{
|
||||||
|
@ -155,6 +155,27 @@ void test_index_tests__find_in_empty(void)
|
|||||||
git_index_free(index);
|
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)
|
void test_index_tests__write(void)
|
||||||
{
|
{
|
||||||
git_index *index;
|
git_index *index;
|
||||||
|
Loading…
Reference in New Issue
Block a user