diff --git a/Makefile b/Makefile index bbbf64b..29c52c3 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ apidocs: test: $(TEST_RUN) sparse: - @for i in $(SRC_C); do sparse $$i $(SPARSE_FLAGS) $(BASIC_CFLAGS) $(CFLAGS); done + @for i in $(SRC_C); do sparse $$i -DSPARSE_IS_RUNNING $(SPARSE_FLAGS) $(BASIC_CFLAGS) $(CFLAGS); done install-headers: $(PUBLIC_HEADERS) @mkdir -p /tmp/gitinc/git diff --git a/src/common.h b/src/common.h index 5a6fa6e..1a2e9c0 100644 --- a/src/common.h +++ b/src/common.h @@ -3,6 +3,7 @@ #include "cc-compat.h" #include "util.h" +#include "errors.h" #include #include #include diff --git a/src/errors.c b/src/errors.c new file mode 100644 index 0000000..b3e014d --- /dev/null +++ b/src/errors.c @@ -0,0 +1,23 @@ +#include "common.h" +#include "thread-utils.h" /* for GIT_TLS */ + +/* compile-time constant initialization required */ +GIT_TLS int git_errno = 0; + +static struct { + int num; + const char *str; +} error_codes[] = { + { GIT_ENOTOID, "Not a git oid" }, + { GIT_ENOTFOUND, "Object does not exist in the scope searched" }, +}; + +const char *git_strerror(int num) +{ + int i; + for (i = 0; i < ARRAY_SIZE(error_codes); i++) + if (num == error_codes[i].num) + return error_codes[i].str; + + return "Unknown error"; +} diff --git a/src/errors.h b/src/errors.h new file mode 100644 index 0000000..e323fc5 --- /dev/null +++ b/src/errors.h @@ -0,0 +1,17 @@ +#ifndef INCLUDE_errors_h__ +#define INCLUDE_errors_h__ +#include "git/errors.h" + +/* convenience functions */ +static inline int git_int_error(int code) +{ + git_errno = code; + return code; +} + +static inline void *git_ptr_error(int code) +{ + git_errno = code; + return NULL; +} +#endif diff --git a/src/git/errors.h b/src/git/errors.h new file mode 100644 index 0000000..d0a0d63 --- /dev/null +++ b/src/git/errors.h @@ -0,0 +1,25 @@ +#ifndef INCLUDE_git_errors_h__ +#define INCLUDE_git_errors_h__ +/** + * @file git/errors.h + * @brief Git error handling routines and variables + * @ingroup Git + * @{ + */ + +#include "common.h" +#include "thread-utils.h" +GIT_BEGIN_DECL + +/** The git errno. */ +GIT_EXTERN(int) GIT_TLS git_errno; + +/** + * strerror() for the Git library + * @param num The error code to explain + * @return a string explaining the error code + */ +GIT_EXTERN(const char *) git_strerror(int num); +/** @} */ +GIT_END_DECL +#endif diff --git a/src/git/thread-utils.h b/src/git/thread-utils.h index f2ddf1e..7ce66fd 100644 --- a/src/git/thread-utils.h +++ b/src/git/thread-utils.h @@ -22,4 +22,11 @@ # define GIT_TLS /* nothing: tls vars are thread-global */ #endif +/* sparse doesn't grok thread-local variables */ +#ifdef SPARSE_IS_RUNNING +# undef GIT_HAS_TLS +# undef GIT_TLS +# define GIT_TLS +#endif + #endif /* INCLUDE_git_thread_utils_h__ */