vendor/libgit2/src/errors.c in rugged-0.19.0 vs vendor/libgit2/src/errors.c in rugged-0.21.0
- old
+ new
@@ -6,11 +6,10 @@
*/
#include "common.h"
#include "global.h"
#include "posix.h"
#include "buffer.h"
-#include <stdarg.h>
/********************************************
* New error handling
********************************************/
@@ -21,11 +20,12 @@
static void set_error(int error_class, char *string)
{
git_error *error = &GIT_GLOBAL->error_t;
- git__free(error->message);
+ if (error->message != string)
+ git__free(error->message);
error->message = string;
error->klass = error_class;
GIT_GLOBAL->last_error = error;
@@ -101,19 +101,74 @@
return GIT_EINVALIDSPEC;
}
void giterr_clear(void)
{
- set_error(0, NULL);
- GIT_GLOBAL->last_error = NULL;
+ if (GIT_GLOBAL->last_error != NULL) {
+ set_error(0, NULL);
+ GIT_GLOBAL->last_error = NULL;
+ }
errno = 0;
#ifdef GIT_WIN32
SetLastError(0);
#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;
}
+int giterr_capture(git_error_state *state, int error_code)
+{
+ state->error_code = error_code;
+ if (error_code)
+ giterr_detach(&state->error_msg);
+ return error_code;
+}
+
+int giterr_restore(git_error_state *state)
+{
+ if (state && state->error_code && state->error_msg.message)
+ set_error(state->error_msg.klass, state->error_msg.message);
+ else
+ giterr_clear();
+
+ return state ? state->error_code : 0;
+}
+
+int giterr_system_last(void)
+{
+#ifdef GIT_WIN32
+ return GetLastError();
+#else
+ return errno;
+#endif
+}
+
+void giterr_system_set(int code)
+{
+#ifdef GIT_WIN32
+ SetLastError(code);
+#else
+ errno = code;
+#endif
+}