Commit 684b35c4 by Edward Thomson

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.
parent ac05086c
...@@ -2508,7 +2508,7 @@ int git_checkout_iterator( ...@@ -2508,7 +2508,7 @@ int git_checkout_iterator(
workdir_opts.start = data.pfx; workdir_opts.start = data.pfx;
workdir_opts.end = 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( (error = git_iterator_for_workdir_ext(
&workdir, data.repo, data.opts.target_directory, index, NULL, &workdir, data.repo, data.opts.target_directory, index, NULL,
&workdir_opts)) < 0) &workdir_opts)) < 0)
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
(P)->cb.advance = NAME_LC ## _iterator__advance; \ (P)->cb.advance = NAME_LC ## _iterator__advance; \
(P)->cb.advance_into = NAME_LC ## _iterator__advance_into; \ (P)->cb.advance_into = NAME_LC ## _iterator__advance_into; \
(P)->cb.reset = NAME_LC ## _iterator__reset; \ (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.at_end = NAME_LC ## _iterator__at_end; \
(P)->cb.free = NAME_LC ## _iterator__free; \ (P)->cb.free = NAME_LC ## _iterator__free; \
} while (0) } while (0)
...@@ -199,16 +200,18 @@ static void iterator_pathlist__update_ignore_case(git_iterator *iter) ...@@ -199,16 +200,18 @@ static void iterator_pathlist__update_ignore_case(git_iterator *iter)
static int iterator__reset_range( static int iterator__reset_range(
git_iterator *iter, const char *start, const char *end) git_iterator *iter, const char *start, const char *end)
{ {
if (iter->start)
git__free(iter->start);
if (start) { if (start) {
if (iter->start)
git__free(iter->start);
iter->start = git__strdup(start); iter->start = git__strdup(start);
GITERR_CHECK_ALLOC(iter->start); GITERR_CHECK_ALLOC(iter->start);
} }
if (iter->end)
git__free(iter->end);
if (end) { if (end) {
if (iter->end)
git__free(iter->end);
iter->end = git__strdup(end); iter->end = git__strdup(end);
GITERR_CHECK_ALLOC(iter->end); GITERR_CHECK_ALLOC(iter->end);
} }
...@@ -270,7 +273,14 @@ static int empty_iterator__noop(const git_index_entry **e, git_iterator *i) ...@@ -270,7 +273,14 @@ static int empty_iterator__noop(const git_index_entry **e, git_iterator *i)
return GIT_ITEROVER; 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); GIT_UNUSED(i); GIT_UNUSED(s); GIT_UNUSED(e);
return 0; return 0;
...@@ -741,17 +751,23 @@ static int tree_iterator__advance_into( ...@@ -741,17 +751,23 @@ static int tree_iterator__advance_into(
return tree_iterator__current(entry, self); return tree_iterator__current(entry, self);
} }
static int tree_iterator__reset( static int tree_iterator__reset(git_iterator *self)
git_iterator *self, const char *start, const char *end)
{ {
tree_iterator *ti = (tree_iterator *)self; tree_iterator *ti = (tree_iterator *)self;
ti->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
tree_iterator__pop_all(ti, false, false); 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) if (iterator__reset_range(self, start, end) < 0)
return -1; 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) static int tree_iterator__at_end(git_iterator *self)
...@@ -1017,16 +1033,13 @@ static int index_iterator__advance_into( ...@@ -1017,16 +1033,13 @@ static int index_iterator__advance_into(
return index_iterator__current(entry, self); return index_iterator__current(entry, self);
} }
static int index_iterator__reset( static int index_iterator__reset(git_iterator *self)
git_iterator *self, const char *start, const char *end)
{ {
index_iterator *ii = (index_iterator *)self; index_iterator *ii = (index_iterator *)self;
const git_index_entry *ie; const git_index_entry *ie;
if (iterator__reset_range(self, start, end) < 0)
return -1;
ii->current = 0; ii->current = 0;
ii->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
iterator_pathlist_walk__reset(self); iterator_pathlist_walk__reset(self);
...@@ -1057,6 +1070,15 @@ static int index_iterator__reset( ...@@ -1057,6 +1070,15 @@ static int index_iterator__reset(
return 0; 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) static void index_iterator__free(git_iterator *self)
{ {
index_iterator *ii = (index_iterator *)self; index_iterator *ii = (index_iterator *)self;
...@@ -1098,7 +1120,7 @@ int git_iterator_for_index( ...@@ -1098,7 +1120,7 @@ int git_iterator_for_index(
git_buf_init(&ii->partial, 0); git_buf_init(&ii->partial, 0);
ii->tree_entry.mode = GIT_FILEMODE_TREE; 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; *iter = (git_iterator *)ii;
return 0; return 0;
...@@ -1479,19 +1501,17 @@ static int fs_iterator__advance( ...@@ -1479,19 +1501,17 @@ static int fs_iterator__advance(
return fs_iterator__advance_over(entry, self); return fs_iterator__advance_over(entry, self);
} }
static int fs_iterator__reset( static int fs_iterator__reset(git_iterator *self)
git_iterator *self, const char *start, const char *end)
{ {
int error; int error;
fs_iterator *fi = (fs_iterator *)self; fs_iterator *fi = (fs_iterator *)self;
fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
while (fi->stack != NULL && fi->stack->next != NULL) while (fi->stack != NULL && fi->stack->next != NULL)
fs_iterator__pop_frame(fi, fi->stack, false); fs_iterator__pop_frame(fi, fi->stack, false);
fi->depth = 0; fi->depth = 0;
if ((error = iterator__reset_range(self, start, end)) < 0)
return error;
fs_iterator__seek_frame_start(fi, fi->stack); fs_iterator__seek_frame_start(fi, fi->stack);
error = fs_iterator__update_entry(fi); error = fs_iterator__update_entry(fi);
...@@ -1501,6 +1521,17 @@ static int fs_iterator__reset( ...@@ -1501,6 +1521,17 @@ static int fs_iterator__reset(
return error; 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) static void fs_iterator__free(git_iterator *self)
{ {
fs_iterator *fi = (fs_iterator *)self; fs_iterator *fi = (fs_iterator *)self;
......
...@@ -57,7 +57,8 @@ typedef struct { ...@@ -57,7 +57,8 @@ typedef struct {
int (*current)(const git_index_entry **, git_iterator *); int (*current)(const git_index_entry **, git_iterator *);
int (*advance)(const git_index_entry **, git_iterator *); int (*advance)(const git_index_entry **, git_iterator *);
int (*advance_into)(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 *); int (*at_end)(git_iterator *);
void (*free)(git_iterator *); void (*free)(git_iterator *);
} git_iterator_callbacks; } git_iterator_callbacks;
...@@ -201,15 +202,20 @@ GIT_INLINE(int) git_iterator_advance_into_or_over( ...@@ -201,15 +202,20 @@ GIT_INLINE(int) git_iterator_advance_into_or_over(
/** /**
* Go back to the start of the iteration. * 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) 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( ...@@ -418,7 +418,7 @@ static int pathspec_match_from_iterator(
GITERR_CHECK_ALLOC(m); 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; goto done;
if (git_iterator_type(iter) == GIT_ITERATOR_TYPE_WORKDIR && if (git_iterator_type(iter) == GIT_ITERATOR_TYPE_WORKDIR &&
......
...@@ -54,7 +54,7 @@ static void tree_iterator_test( ...@@ -54,7 +54,7 @@ static void tree_iterator_test(
cl_assert_equal_i(expected_count, count); cl_assert_equal_i(expected_count, count);
/* test reset */ /* 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))) { while (!(error = git_iterator_advance(&entry, i))) {
cl_assert(entry); cl_assert(entry);
...@@ -634,7 +634,7 @@ static void workdir_iterator_test( ...@@ -634,7 +634,7 @@ static void workdir_iterator_test(
cl_assert_equal_i(expected_count, count); cl_assert_equal_i(expected_count, count);
cl_assert_equal_i(expected_count + expected_ignores, count_all); 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); error = git_iterator_current(&entry, i);
cl_assert((error == 0 && entry != NULL) || cl_assert((error == 0 && entry != NULL) ||
......
...@@ -59,7 +59,7 @@ static void expect_iterator_items( ...@@ -59,7 +59,7 @@ static void expect_iterator_items(
cl_assert_equal_i(expected_flat, count); 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; count = 0;
cl_git_pass(git_iterator_current(&entry, i)); cl_git_pass(git_iterator_current(&entry, i));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment