]> git.proxmox.com Git - libgit2.git/blobdiff - src/errors.c
Update Copyright header
[libgit2.git] / src / errors.c
index ac73402ee28f01f91c615520f3a7d74f757a941d..58e0976f2f16a4cc93beb141629ce63785583e07 100644 (file)
@@ -1,33 +1,12 @@
+/*
+ * Copyright (C) 2009-2012 the libgit2 contributors
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
 #include "common.h"
-#include "thread-utils.h" /* for GIT_TLS */
-
-#if defined(GIT_TLS)
-/* compile-time constant initialization required */
-GIT_TLS int git_errno = 0;
-
-#elif defined(GIT_HAS_PTHREAD)
-
-static pthread_key_t errno_key;
-
-static void init_errno(void) __attribute__((constructor));
-static void init_errno(void)
-{
-       pthread_key_create(&errno_key, free);
-}
-
-int *git__errno_storage(void)
-{
-       int *e = pthread_getspecific(errno_key);
-       if (!e) {
-#undef calloc
-               e = calloc(1, sizeof(*e));
-#define calloc(a,b) GIT__FORBID_MALLOC
-               pthread_setspecific(errno_key, e);
-       }
-       return e;
-}
-
-#endif
+#include "global.h"
+#include <stdarg.h>
 
 static struct {
        int num;
@@ -41,12 +20,26 @@ static struct {
        {GIT_EOBJTYPE, "The specified object is of invalid type"},
        {GIT_EOBJCORRUPTED, "The specified object has its data corrupted"},
        {GIT_ENOTAREPO, "The specified repository is invalid"},
-       {GIT_EINVALIDTYPE, "The object type is invalid or doesn't match"},
+       {GIT_EINVALIDTYPE, "The object or config variable type is invalid or doesn't match"},
        {GIT_EMISSINGOBJDATA, "The object cannot be written that because it's missing internal data"},
        {GIT_EPACKCORRUPTED, "The packfile for the ODB is corrupted"},
        {GIT_EFLOCKFAIL, "Failed to adquire or release a file lock"},
        {GIT_EZLIB, "The Z library failed to inflate/deflate an object's data"},
        {GIT_EBUSY, "The queried object is currently busy"},
+       {GIT_EINVALIDPATH, "The path is invalid"},
+       {GIT_EBAREINDEX, "The index file is not backed up by an existing repository"},
+       {GIT_EINVALIDREFNAME, "The name of the reference is not valid"},
+       {GIT_EREFCORRUPTED, "The specified reference has its data corrupted"},
+       {GIT_ETOONESTEDSYMREF, "The specified symbolic reference is too deeply nested"},
+       {GIT_EPACKEDREFSCORRUPTED, "The pack-refs file is either corrupted of its format is not currently supported"},
+       {GIT_EINVALIDPATH, "The path is invalid" },
+       {GIT_EREVWALKOVER, "The revision walker is empty; there are no more commits left to iterate"},
+       {GIT_EINVALIDREFSTATE, "The state of the reference is not valid"},
+       {GIT_ENOTIMPLEMENTED, "This feature has not been implemented yet"},
+       {GIT_EEXISTS, "A reference with this name already exists"},
+       {GIT_EOVERFLOW, "The given integer literal is too large to be parsed"},
+       {GIT_ENOTNUM, "The given literal is not a valid number"},
+       {GIT_EAMBIGUOUSOIDPREFIX, "The given oid prefix is ambiguous"},
 };
 
 const char *git_strerror(int num)
@@ -61,3 +54,51 @@ const char *git_strerror(int num)
 
        return "Unknown error";
 }
+
+#define ERROR_MAX_LEN 1024
+
+void git___rethrow(const char *msg, ...)
+{
+       char new_error[ERROR_MAX_LEN];
+       char *last_error;
+       char *old_error = NULL;
+
+       va_list va;
+
+       last_error = GIT_GLOBAL->error.last;
+
+       va_start(va, msg);
+       vsnprintf(new_error, ERROR_MAX_LEN, msg, va);
+       va_end(va);
+
+       old_error = git__strdup(last_error);
+
+       snprintf(last_error, ERROR_MAX_LEN, "%s \n      - %s", new_error, old_error);
+
+       git__free(old_error);
+}
+
+void git___throw(const char *msg, ...)
+{
+       va_list va;
+
+       va_start(va, msg);
+       vsnprintf(GIT_GLOBAL->error.last, ERROR_MAX_LEN, msg, va);
+       va_end(va);
+}
+
+const char *git_lasterror(void)
+{
+       char *last_error = GIT_GLOBAL->error.last;
+
+       if (!last_error[0])
+               return NULL;
+
+       return last_error;
+}
+
+void git_clearerror(void)
+{
+       char *last_error = GIT_GLOBAL->error.last;
+       last_error[0] = '\0';
+}