Commit 1eab9f0e32178a9aac941583c69e1b9cf9849f77

Vicent Marti 2013-11-05T14:56:10

error: Simplify giterr_detach

diff --git a/include/git2/errors.h b/include/git2/errors.h
index 5f5d0ab..be7a31d 100644
--- a/include/git2/errors.h
+++ b/include/git2/errors.h
@@ -89,17 +89,14 @@ GIT_EXTERN(void) giterr_clear(void);
 /**
  * Get the last error data and clear it.
  *
- * This copies the last error message into the given `git_buf` and returns
- * the associated `git_error_t`, leaving the error cleared as if
- * `giterr_clear` had been called.  You must call `git_buf_free` on the
- * message to release the memory.
+ * This copies the last error into the given `git_error` struct
+ * and returns 0 if the copy was successful, leaving the error 
+ * cleared as if `giterr_clear` had been called.
  *
- * Note: it is possible that this will return `GITERR_NONE` and set the
- * buffer to NULL, so be prepared for that condition.  Also, if the last
- * error was an out-of-memory error, this will return `GITERR_NOMEMORY`
- * but also leave the buffer set to NULL (to avoid allocation).
+ * If there was no existing error in the library, -1 will be returned
+ * and the contents of `cpy` will be left unmodified.
  */
-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.
diff --git a/src/errors.c b/src/errors.c
index 70b5f26..d04da4c 100644
--- a/src/errors.c
+++ b/src/errors.c
@@ -112,27 +112,22 @@ void giterr_clear(void)
 #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;
 
-	assert(message);
-
-	git_buf_free(message);
+	assert(cpy);
 
 	if (!error)
-		return GITERR_NONE;
-
-	rval = error->klass;
+		return -1;
 
-	if (error != &g_git_oom_error)
-		git_buf_attach(message, error->message, 0);
+	cpy->message = error->message;
+	cpy->klass = error->klass;
 
 	error->message = NULL;
 	giterr_clear();
 
-	return rval;
+	return 0;
 }
 
 const git_error *giterr_last(void)
diff --git a/src/iterator.c b/src/iterator.c
index 369a079..8646399 100644
--- a/src/iterator.c
+++ b/src/iterator.c
@@ -991,8 +991,9 @@ static int fs_iterator__expand_dir(fs_iterator *fi)
 		fi->base.start, fi->base.end, &ff->entries);
 
 	if (error < 0) {
-		git_buf     msg = GIT_BUF_INIT;
-		git_error_t errt = giterr_detach(&msg);
+		git_error last_error = {0};
+
+		giterr_detach(&last_error);
 
 		/* these callbacks may clear the error message */
 		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 */
 		fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS;
 
-		if (msg.ptr) {
-			giterr_set_str(errt, msg.ptr);
-			git_buf_free(&msg);
+		if (last_error.message) {
+			giterr_set_str(last_error.klass, last_error.message);
+			free(last_error.message);
 		}
 
 		return error;