error: Simplify giterr_detach

This commit is contained in:
Vicent Marti 2013-11-05 14:56:10 +01:00
parent 3b259cbd1a
commit 1eab9f0e32
3 changed files with 18 additions and 25 deletions

View File

@ -89,17 +89,14 @@ GIT_EXTERN(void) giterr_clear(void);
/** /**
* Get the last error data and clear it. * Get the last error data and clear it.
* *
* This copies the last error message into the given `git_buf` and returns * This copies the last error into the given `git_error` struct
* the associated `git_error_t`, leaving the error cleared as if * and returns 0 if the copy was successful, leaving the error
* `giterr_clear` had been called. You must call `git_buf_free` on the * cleared as if `giterr_clear` had been called.
* message to release the memory.
* *
* Note: it is possible that this will return `GITERR_NONE` and set the * If there was no existing error in the library, -1 will be returned
* buffer to NULL, so be prepared for that condition. Also, if the last * and the contents of `cpy` will be left unmodified.
* error was an out-of-memory error, this will return `GITERR_NOMEMORY`
* but also leave the buffer set to NULL (to avoid allocation).
*/ */
GIT_EXTERN(git_error_t) giterr_detach(git_buf *message); GIT_EXTERN(int) giterr_detach(git_error *cpy);
/** /**
* Set the error message string for this thread. * Set the error message string for this thread.

View File

@ -112,27 +112,22 @@ void giterr_clear(void)
#endif #endif
} }
git_error_t giterr_detach(git_buf *message) int giterr_detach(git_error *cpy)
{ {
git_error_t rval;
git_error *error = GIT_GLOBAL->last_error; git_error *error = GIT_GLOBAL->last_error;
assert(message); assert(cpy);
git_buf_free(message);
if (!error) if (!error)
return GITERR_NONE; return -1;
rval = error->klass; cpy->message = error->message;
cpy->klass = error->klass;
if (error != &g_git_oom_error)
git_buf_attach(message, error->message, 0);
error->message = NULL; error->message = NULL;
giterr_clear(); giterr_clear();
return rval; return 0;
} }
const git_error *giterr_last(void) const git_error *giterr_last(void)

View File

@ -991,8 +991,9 @@ static int fs_iterator__expand_dir(fs_iterator *fi)
fi->base.start, fi->base.end, &ff->entries); fi->base.start, fi->base.end, &ff->entries);
if (error < 0) { if (error < 0) {
git_buf msg = GIT_BUF_INIT; git_error last_error = {0};
git_error_t errt = giterr_detach(&msg);
giterr_detach(&last_error);
/* these callbacks may clear the error message */ /* these callbacks may clear the error message */
fs_iterator__free_frame(ff); fs_iterator__free_frame(ff);
@ -1000,9 +1001,9 @@ static int fs_iterator__expand_dir(fs_iterator *fi)
/* next time return value we skipped to */ /* next time return value we skipped to */
fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS; fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
if (msg.ptr) { if (last_error.message) {
giterr_set_str(errt, msg.ptr); giterr_set_str(last_error.klass, last_error.message);
git_buf_free(&msg); free(last_error.message);
} }
return error; return error;