mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 14:02:48 +00:00
iterator: disambiguate reset and reset_range
Disambiguate the reset and reset_range functions. Now reset_range with a NULL path will clear the start or end; reset will leave the existing start and end unchanged.
This commit is contained in:
parent
ac05086c40
commit
684b35c41b
@ -2508,7 +2508,7 @@ int git_checkout_iterator(
|
||||
workdir_opts.start = data.pfx;
|
||||
workdir_opts.end = data.pfx;
|
||||
|
||||
if ((error = git_iterator_reset(target, data.pfx, data.pfx)) < 0 ||
|
||||
if ((error = git_iterator_reset_range(target, data.pfx, data.pfx)) < 0 ||
|
||||
(error = git_iterator_for_workdir_ext(
|
||||
&workdir, data.repo, data.opts.target_directory, index, NULL,
|
||||
&workdir_opts)) < 0)
|
||||
|
@ -18,6 +18,7 @@
|
||||
(P)->cb.advance = NAME_LC ## _iterator__advance; \
|
||||
(P)->cb.advance_into = NAME_LC ## _iterator__advance_into; \
|
||||
(P)->cb.reset = NAME_LC ## _iterator__reset; \
|
||||
(P)->cb.reset_range = NAME_LC ## _iterator__reset_range; \
|
||||
(P)->cb.at_end = NAME_LC ## _iterator__at_end; \
|
||||
(P)->cb.free = NAME_LC ## _iterator__free; \
|
||||
} while (0)
|
||||
@ -199,16 +200,18 @@ static void iterator_pathlist__update_ignore_case(git_iterator *iter)
|
||||
static int iterator__reset_range(
|
||||
git_iterator *iter, const char *start, const char *end)
|
||||
{
|
||||
if (iter->start)
|
||||
git__free(iter->start);
|
||||
|
||||
if (start) {
|
||||
if (iter->start)
|
||||
git__free(iter->start);
|
||||
iter->start = git__strdup(start);
|
||||
GITERR_CHECK_ALLOC(iter->start);
|
||||
}
|
||||
|
||||
if (iter->end)
|
||||
git__free(iter->end);
|
||||
|
||||
if (end) {
|
||||
if (iter->end)
|
||||
git__free(iter->end);
|
||||
iter->end = git__strdup(end);
|
||||
GITERR_CHECK_ALLOC(iter->end);
|
||||
}
|
||||
@ -270,7 +273,14 @@ static int empty_iterator__noop(const git_index_entry **e, git_iterator *i)
|
||||
return GIT_ITEROVER;
|
||||
}
|
||||
|
||||
static int empty_iterator__reset(git_iterator *i, const char *s, const char *e)
|
||||
static int empty_iterator__reset(git_iterator *i)
|
||||
{
|
||||
GIT_UNUSED(i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int empty_iterator__reset_range(
|
||||
git_iterator *i, const char *s, const char *e)
|
||||
{
|
||||
GIT_UNUSED(i); GIT_UNUSED(s); GIT_UNUSED(e);
|
||||
return 0;
|
||||
@ -741,17 +751,23 @@ static int tree_iterator__advance_into(
|
||||
return tree_iterator__current(entry, self);
|
||||
}
|
||||
|
||||
static int tree_iterator__reset(
|
||||
git_iterator *self, const char *start, const char *end)
|
||||
static int tree_iterator__reset(git_iterator *self)
|
||||
{
|
||||
tree_iterator *ti = (tree_iterator *)self;
|
||||
|
||||
tree_iterator__pop_all(ti, false, false);
|
||||
ti->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
|
||||
|
||||
tree_iterator__pop_all(ti, false, false);
|
||||
return tree_iterator__push_frame(ti); /* re-expand root tree */
|
||||
}
|
||||
|
||||
static int tree_iterator__reset_range(
|
||||
git_iterator *self, const char *start, const char *end)
|
||||
{
|
||||
if (iterator__reset_range(self, start, end) < 0)
|
||||
return -1;
|
||||
|
||||
return tree_iterator__push_frame(ti); /* re-expand root tree */
|
||||
return tree_iterator__reset(self);
|
||||
}
|
||||
|
||||
static int tree_iterator__at_end(git_iterator *self)
|
||||
@ -1017,16 +1033,13 @@ static int index_iterator__advance_into(
|
||||
return index_iterator__current(entry, self);
|
||||
}
|
||||
|
||||
static int index_iterator__reset(
|
||||
git_iterator *self, const char *start, const char *end)
|
||||
static int index_iterator__reset(git_iterator *self)
|
||||
{
|
||||
index_iterator *ii = (index_iterator *)self;
|
||||
const git_index_entry *ie;
|
||||
|
||||
if (iterator__reset_range(self, start, end) < 0)
|
||||
return -1;
|
||||
|
||||
ii->current = 0;
|
||||
ii->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
|
||||
|
||||
iterator_pathlist_walk__reset(self);
|
||||
|
||||
@ -1057,6 +1070,15 @@ static int index_iterator__reset(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int index_iterator__reset_range(
|
||||
git_iterator *self, const char *start, const char *end)
|
||||
{
|
||||
if (iterator__reset_range(self, start, end) < 0)
|
||||
return -1;
|
||||
|
||||
return index_iterator__reset(self);
|
||||
}
|
||||
|
||||
static void index_iterator__free(git_iterator *self)
|
||||
{
|
||||
index_iterator *ii = (index_iterator *)self;
|
||||
@ -1098,7 +1120,7 @@ int git_iterator_for_index(
|
||||
git_buf_init(&ii->partial, 0);
|
||||
ii->tree_entry.mode = GIT_FILEMODE_TREE;
|
||||
|
||||
index_iterator__reset((git_iterator *)ii, NULL, NULL);
|
||||
index_iterator__reset((git_iterator *)ii);
|
||||
|
||||
*iter = (git_iterator *)ii;
|
||||
return 0;
|
||||
@ -1479,19 +1501,17 @@ static int fs_iterator__advance(
|
||||
return fs_iterator__advance_over(entry, self);
|
||||
}
|
||||
|
||||
static int fs_iterator__reset(
|
||||
git_iterator *self, const char *start, const char *end)
|
||||
static int fs_iterator__reset(git_iterator *self)
|
||||
{
|
||||
int error;
|
||||
fs_iterator *fi = (fs_iterator *)self;
|
||||
|
||||
fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
|
||||
|
||||
while (fi->stack != NULL && fi->stack->next != NULL)
|
||||
fs_iterator__pop_frame(fi, fi->stack, false);
|
||||
fi->depth = 0;
|
||||
|
||||
if ((error = iterator__reset_range(self, start, end)) < 0)
|
||||
return error;
|
||||
|
||||
fs_iterator__seek_frame_start(fi, fi->stack);
|
||||
|
||||
error = fs_iterator__update_entry(fi);
|
||||
@ -1501,6 +1521,17 @@ static int fs_iterator__reset(
|
||||
return error;
|
||||
}
|
||||
|
||||
static int fs_iterator__reset_range(
|
||||
git_iterator *self, const char *start, const char *end)
|
||||
{
|
||||
int error;
|
||||
|
||||
if ((error = iterator__reset_range(self, start, end)) < 0)
|
||||
return error;
|
||||
|
||||
return fs_iterator__reset(self);
|
||||
}
|
||||
|
||||
static void fs_iterator__free(git_iterator *self)
|
||||
{
|
||||
fs_iterator *fi = (fs_iterator *)self;
|
||||
|
@ -57,7 +57,8 @@ typedef struct {
|
||||
int (*current)(const git_index_entry **, git_iterator *);
|
||||
int (*advance)(const git_index_entry **, git_iterator *);
|
||||
int (*advance_into)(const git_index_entry **, git_iterator *);
|
||||
int (*reset)(git_iterator *, const char *start, const char *end);
|
||||
int (*reset)(git_iterator *);
|
||||
int (*reset_range)(git_iterator *, const char *start, const char *end);
|
||||
int (*at_end)(git_iterator *);
|
||||
void (*free)(git_iterator *);
|
||||
} git_iterator_callbacks;
|
||||
@ -201,15 +202,20 @@ GIT_INLINE(int) git_iterator_advance_into_or_over(
|
||||
|
||||
/**
|
||||
* Go back to the start of the iteration.
|
||||
*
|
||||
* This resets the iterator to the start of the iteration. It also allows
|
||||
* you to reset the `start` and `end` pathname boundaries of the iteration
|
||||
* when doing so.
|
||||
*/
|
||||
GIT_INLINE(int) git_iterator_reset(
|
||||
GIT_INLINE(int) git_iterator_reset(git_iterator *iter)
|
||||
{
|
||||
return iter->cb->reset(iter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Go back to the start of the iteration after updating the `start` and
|
||||
* `end` pathname boundaries of the iteration.
|
||||
*/
|
||||
GIT_INLINE(int) git_iterator_reset_range(
|
||||
git_iterator *iter, const char *start, const char *end)
|
||||
{
|
||||
return iter->cb->reset(iter, start, end);
|
||||
return iter->cb->reset_range(iter, start, end);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -418,7 +418,7 @@ static int pathspec_match_from_iterator(
|
||||
GITERR_CHECK_ALLOC(m);
|
||||
}
|
||||
|
||||
if ((error = git_iterator_reset(iter, ps->prefix, ps->prefix)) < 0)
|
||||
if ((error = git_iterator_reset_range(iter, ps->prefix, ps->prefix)) < 0)
|
||||
goto done;
|
||||
|
||||
if (git_iterator_type(iter) == GIT_ITERATOR_TYPE_WORKDIR &&
|
||||
|
@ -54,7 +54,7 @@ static void tree_iterator_test(
|
||||
cl_assert_equal_i(expected_count, count);
|
||||
|
||||
/* test reset */
|
||||
cl_git_pass(git_iterator_reset(i, NULL, NULL));
|
||||
cl_git_pass(git_iterator_reset(i));
|
||||
|
||||
while (!(error = git_iterator_advance(&entry, i))) {
|
||||
cl_assert(entry);
|
||||
@ -634,7 +634,7 @@ static void workdir_iterator_test(
|
||||
cl_assert_equal_i(expected_count, count);
|
||||
cl_assert_equal_i(expected_count + expected_ignores, count_all);
|
||||
|
||||
cl_git_pass(git_iterator_reset(i, NULL, NULL));
|
||||
cl_git_pass(git_iterator_reset(i));
|
||||
|
||||
error = git_iterator_current(&entry, i);
|
||||
cl_assert((error == 0 && entry != NULL) ||
|
||||
|
@ -59,7 +59,7 @@ static void expect_iterator_items(
|
||||
|
||||
cl_assert_equal_i(expected_flat, count);
|
||||
|
||||
cl_git_pass(git_iterator_reset(i, NULL, NULL));
|
||||
cl_git_pass(git_iterator_reset(i));
|
||||
|
||||
count = 0;
|
||||
cl_git_pass(git_iterator_current(&entry, i));
|
||||
|
Loading…
Reference in New Issue
Block a user