diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/errors.c | 18 | ||||
-rw-r--r-- | src/iterator.c | 13 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/errors.c b/src/errors.c index c9d9e4e37..d04da4ca9 100644 --- a/src/errors.c +++ b/src/errors.c @@ -112,6 +112,24 @@ void giterr_clear(void) #endif } +int giterr_detach(git_error *cpy) +{ + git_error *error = GIT_GLOBAL->last_error; + + assert(cpy); + + if (!error) + return -1; + + cpy->message = error->message; + cpy->klass = error->klass; + + error->message = NULL; + giterr_clear(); + + return 0; +} + const git_error *giterr_last(void) { return GIT_GLOBAL->last_error; diff --git a/src/iterator.c b/src/iterator.c index c0d7862ff..8646399ab 100644 --- a/src/iterator.c +++ b/src/iterator.c @@ -991,8 +991,21 @@ static int fs_iterator__expand_dir(fs_iterator *fi) fi->base.start, fi->base.end, &ff->entries); if (error < 0) { + git_error last_error = {0}; + + giterr_detach(&last_error); + + /* these callbacks may clear the error message */ fs_iterator__free_frame(ff); fs_iterator__advance_over(NULL, (git_iterator *)fi); + /* next time return value we skipped to */ + fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS; + + if (last_error.message) { + giterr_set_str(last_error.klass, last_error.message); + free(last_error.message); + } + return error; } |