Commit 98e3b298 by nulltoken

Merge branch 'master' into repo-init

parents 2c08c3f0 51035184
...@@ -49,7 +49,6 @@ typedef SSIZE_T ssize_t; ...@@ -49,7 +49,6 @@ typedef SSIZE_T ssize_t;
#include "git2/common.h" #include "git2/common.h"
#include "util.h" #include "util.h"
#include "thread-utils.h" #include "thread-utils.h"
#include "errors.h"
#include "bswap.h" #include "bswap.h"
#define GIT_PATH_MAX 4096 #define GIT_PATH_MAX 4096
......
#include "common.h" #include "common.h"
#include "thread-utils.h" /* for GIT_TLS */ #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
static struct { static struct {
int num; int num;
const char *str; const char *str;
......
#ifndef INCLUDE_errors_h__
#define INCLUDE_errors_h__
#include "git2/errors.h"
/* convenience functions */
GIT_INLINE(int) git_int_error(int code)
{
git_errno = code;
return code;
}
GIT_INLINE(int) git_os_error(void)
{
return git_int_error(GIT_EOSERR);
}
GIT_INLINE(void) *git_ptr_error(int code)
{
git_errno = code;
return NULL;
}
#endif
...@@ -5,13 +5,13 @@ ...@@ -5,13 +5,13 @@
int gitfo_open(const char *path, int flags) int gitfo_open(const char *path, int flags)
{ {
int fd = open(path, flags | O_BINARY); int fd = open(path, flags | O_BINARY);
return fd >= 0 ? fd : git_os_error(); return fd >= 0 ? fd : GIT_EOSERR;
} }
int gitfo_creat(const char *path, int mode) int gitfo_creat(const char *path, int mode)
{ {
int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode); int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode);
return fd >= 0 ? fd : git_os_error(); return fd >= 0 ? fd : GIT_EOSERR;
} }
int gitfo_read(git_file fd, void *buf, size_t cnt) int gitfo_read(git_file fd, void *buf, size_t cnt)
...@@ -22,11 +22,11 @@ int gitfo_read(git_file fd, void *buf, size_t cnt) ...@@ -22,11 +22,11 @@ int gitfo_read(git_file fd, void *buf, size_t cnt)
if (r < 0) { if (r < 0) {
if (errno == EINTR || errno == EAGAIN) if (errno == EINTR || errno == EAGAIN)
continue; continue;
return git_os_error(); return GIT_EOSERR;
} }
if (!r) { if (!r) {
errno = EPIPE; errno = EPIPE;
return git_os_error(); return GIT_EOSERR;
} }
cnt -= r; cnt -= r;
b += r; b += r;
...@@ -42,11 +42,11 @@ int gitfo_write(git_file fd, void *buf, size_t cnt) ...@@ -42,11 +42,11 @@ int gitfo_write(git_file fd, void *buf, size_t cnt)
if (r < 0) { if (r < 0) {
if (errno == EINTR || errno == EAGAIN) if (errno == EINTR || errno == EAGAIN)
continue; continue;
return git_os_error(); return GIT_EOSERR;
} }
if (!r) { if (!r) {
errno = EPIPE; errno = EPIPE;
return git_os_error(); return GIT_EOSERR;
} }
cnt -= r; cnt -= r;
b += r; b += r;
...@@ -93,7 +93,7 @@ off_t gitfo_size(git_file fd) ...@@ -93,7 +93,7 @@ off_t gitfo_size(git_file fd)
{ {
struct stat sb; struct stat sb;
if (gitfo_fstat(fd, &sb)) if (gitfo_fstat(fd, &sb))
return git_os_error(); return GIT_EOSERR;
return sb.st_size; return sb.st_size;
} }
...@@ -152,13 +152,13 @@ int gitfo_move_file(char *from, char *to) ...@@ -152,13 +152,13 @@ int gitfo_move_file(char *from, char *to)
if (!rename(from, to)) if (!rename(from, to))
return GIT_SUCCESS; return GIT_SUCCESS;
return git_os_error(); return GIT_EOSERR;
} }
int gitfo_map_ro(git_map *out, git_file fd, off_t begin, size_t len) int gitfo_map_ro(git_map *out, git_file fd, off_t begin, size_t len)
{ {
if (git__mmap(out, len, GIT_PROT_READ, GIT_MAP_SHARED, fd, begin) < GIT_SUCCESS) if (git__mmap(out, len, GIT_PROT_READ, GIT_MAP_SHARED, fd, begin) < GIT_SUCCESS)
return git_os_error(); return GIT_EOSERR;
return GIT_SUCCESS; return GIT_SUCCESS;
} }
...@@ -276,7 +276,7 @@ int gitfo_dirent( ...@@ -276,7 +276,7 @@ int gitfo_dirent(
dir = opendir(path); dir = opendir(path);
if (!dir) if (!dir)
return git_os_error(); return GIT_EOSERR;
while ((de = readdir(dir)) != NULL) { while ((de = readdir(dir)) != NULL) {
size_t de_len; size_t de_len;
......
...@@ -55,6 +55,8 @@ ...@@ -55,6 +55,8 @@
__attribute__((visibility("default"))) \ __attribute__((visibility("default"))) \
GIT_TLS \ GIT_TLS \
type type
#elif defined(_MSC_VER)
# define GIT_EXTERN_TLS(type) __declspec(dllexport) GIT_TLS type
#else #else
# define GIT_EXTERN_TLS(type) extern GIT_TLS type # define GIT_EXTERN_TLS(type) extern GIT_TLS type
#endif #endif
......
...@@ -33,16 +33,6 @@ ...@@ -33,16 +33,6 @@
*/ */
GIT_BEGIN_DECL GIT_BEGIN_DECL
/** The git errno. */
#if defined(GIT_TLS)
GIT_EXTERN_TLS(int) git_errno;
#elif defined(GIT_HAS_PTHREAD)
# define git_errno (*git__errno_storage())
GIT_EXTERN(int *) git__errno_storage(void);
#endif
/** /**
* strerror() for the Git library * strerror() for the Git library
* @param num The error code to explain * @param num The error code to explain
......
...@@ -40,7 +40,7 @@ int git__mmap(git_map *out, size_t len, int prot, int flags, int fd, off_t offse ...@@ -40,7 +40,7 @@ int git__mmap(git_map *out, size_t len, int prot, int flags, int fd, off_t offse
out->data = mmap(NULL, len, mprot, mflag, fd, offset); out->data = mmap(NULL, len, mprot, mflag, fd, offset);
if (!out->data || out->data == MAP_FAILED) if (!out->data || out->data == MAP_FAILED)
return git_os_error(); return GIT_EOSERR;
out->len = len; out->len = len;
return GIT_SUCCESS; return GIT_SUCCESS;
......
...@@ -3,30 +3,6 @@ ...@@ -3,30 +3,6 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
void *git__malloc(size_t n)
{
void *r = malloc(n);
if (!r)
return git_ptr_error(GIT_ENOMEM);
return r;
}
void *git__calloc(size_t a, size_t b)
{
void *r = calloc(a, b);
if (!r)
return git_ptr_error(GIT_ENOMEM);
return r;
}
char *git__strdup(const char *s)
{
char *r = strdup(s);
if (!r)
return git_ptr_error(GIT_ENOMEM);
return r;
}
int git__fmt(char *buf, size_t buf_sz, const char *fmt, ...) int git__fmt(char *buf, size_t buf_sz, const char *fmt, ...)
{ {
va_list va; va_list va;
......
...@@ -3,28 +3,16 @@ ...@@ -3,28 +3,16 @@
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
extern void *git__malloc(size_t); /*
extern void *git__calloc(size_t, size_t); * Don't wrap malloc/calloc.
extern char *git__strdup(const char *); * Use the default versions in glibc, and make
* sure that any methods that allocate memory
#ifndef GIT__NO_HIDE_MALLOC * return a GIT_ENOMEM error when allocation
# define GIT__FORBID_MALLOC do_not_use_malloc_directly * fails.
*/
# ifdef malloc #define git__malloc malloc
# undef malloc #define git__calloc calloc
# endif #define git__strdup strdup
# define malloc(a) GIT__FORBID_MALLOC
# ifdef calloc
# undef calloc
# endif
# define calloc(a,b) GIT__FORBID_MALLOC
# ifdef strdup
# undef strdup
# endif
# define strdup(a) GIT__FORBID_MALLOC
#endif
extern int git__fmt(char *, size_t, const char *, ...) extern int git__fmt(char *, size_t, const char *, ...)
GIT_FORMAT_PRINTF(3, 4); GIT_FORMAT_PRINTF(3, 4);
......
#include "test_lib.h"
#include "errors.h"
BEGIN_TEST(errno_zero_on_init)
must_be_true(git_errno == 0);
END_TEST
BEGIN_TEST(set_ENOTOID)
must_be_true(GIT_ENOTOID != 0);
git_errno = GIT_ENOTOID;
must_be_true(git_errno == GIT_ENOTOID);
END_TEST
...@@ -74,15 +74,15 @@ def build(bld): ...@@ -74,15 +74,15 @@ def build(bld):
# command '[build|clean|install|uninstall]-static' # command '[build|clean|install|uninstall]-static'
if bld.variant == 'static': if bld.variant == 'static':
build_library(bld, 'cstlib') build_library(bld, 'static')
# command '[build|clean|install|uninstall]-shared' # command '[build|clean|install|uninstall]-shared'
elif bld.variant == 'shared': elif bld.variant == 'shared':
build_library(bld, 'cshlib') build_library(bld, 'shared')
# command '[build|clean]-tests' # command '[build|clean]-tests'
elif bld.variant == 'tests': elif bld.variant == 'tests':
build_library(bld, 'cshlib') build_library(bld, 'objects')
build_tests(bld) build_tests(bld)
# command 'build|clean|install|uninstall': by default, run # command 'build|clean|install|uninstall': by default, run
...@@ -91,9 +91,15 @@ def build(bld): ...@@ -91,9 +91,15 @@ def build(bld):
from waflib import Options from waflib import Options
Options.commands = [bld.cmd + '-shared', bld.cmd + '-static'] + Options.commands Options.commands = [bld.cmd + '-shared', bld.cmd + '-static'] + Options.commands
def build_library(bld, lib_str): def build_library(bld, build_type):
directory = bld.path
BUILD = {
'shared' : bld.shlib,
'static' : bld.stlib,
'objects' : bld.objects
}
directory = bld.path
sources = directory.ant_glob('src/*.c') sources = directory.ant_glob('src/*.c')
# Compile platform-dependant code # Compile platform-dependant code
...@@ -106,15 +112,12 @@ def build_library(bld, lib_str): ...@@ -106,15 +112,12 @@ def build_library(bld, lib_str):
sources.append('src/ppc/sha1.c') sources.append('src/ppc/sha1.c')
else: else:
sources.append('src/block-sha1/sha1.c') sources.append('src/block-sha1/sha1.c')
features = ['c', lib_str]
#------------------------------ #------------------------------
# Build the main library # Build the main library
#------------------------------ #------------------------------
# either as static or shared; # either as static or shared;
bld(features=features, BUILD[build_type](
source=sources, source=sources,
target='git2', target='git2',
includes='src', includes='src',
...@@ -123,8 +126,8 @@ def build_library(bld, lib_str): ...@@ -123,8 +126,8 @@ def build_library(bld, lib_str):
) )
# On Unix systems, build the Pkg-config entry file # On Unix systems, build the Pkg-config entry file
if bld.env.PLATFORM == 'unix': if bld.env.PLATFORM == 'unix' and bld.is_install:
bld(rule="""sed -e 's#@prefix@#$(prefix)#' -e 's#@libdir@#$(libdir)#' < ${SRC} > ${TGT}""", bld(rule="""sed -e 's#@prefix@#${PREFIX}#' -e 's#@libdir@#${LIBDIR}#' < ${SRC} > ${TGT}""",
source='libgit2.pc.in', source='libgit2.pc.in',
target='libgit2.pc', target='libgit2.pc',
install_path='${LIBDIR}/pkgconfig', install_path='${LIBDIR}/pkgconfig',
...@@ -134,6 +137,13 @@ def build_library(bld, lib_str): ...@@ -134,6 +137,13 @@ def build_library(bld, lib_str):
bld.install_files('${PREFIX}/include', directory.find_node('src/git2.h')) bld.install_files('${PREFIX}/include', directory.find_node('src/git2.h'))
bld.install_files('${PREFIX}/include/git2', directory.ant_glob('src/git2/*.h')) bld.install_files('${PREFIX}/include/git2', directory.ant_glob('src/git2/*.h'))
# On Unix systems, let them know about installation
if bld.env.PLATFORM == 'unix' and bld.cmd in ['install-static', 'install-shared']:
bld.add_post_fun(call_ldconfig)
def call_ldconfig(bld):
bld.exec_command('/sbin/ldconfig')
def grep_test_header(text, test_file): def grep_test_header(text, test_file):
return '\n'.join(l for l in test_file.read().splitlines() if text in l) return '\n'.join(l for l in test_file.read().splitlines() if text in l)
...@@ -144,7 +154,7 @@ def build_tests(bld): ...@@ -144,7 +154,7 @@ def build_tests(bld):
return return
directory = bld.path directory = bld.path
resources_path = directory.find_node('tests/resources/').abspath() resources_path = directory.find_node('tests/resources/').abspath().replace('\\', '/')
# Common object with the Test library methods # Common object with the Test library methods
bld.objects(source=['tests/test_helpers.c', 'tests/test_lib.c'], includes=['src', 'tests'], target='test_helper') bld.objects(source=['tests/test_helpers.c', 'tests/test_lib.c'], includes=['src', 'tests'], target='test_helper')
...@@ -167,7 +177,6 @@ def build_tests(bld): ...@@ -167,7 +177,6 @@ def build_tests(bld):
includes=['src', 'tests'], includes=['src', 'tests'],
defines=['TEST_TOC="%s.toc"' % test_name, 'TEST_RESOURCES="%s"' % resources_path], defines=['TEST_TOC="%s.toc"' % test_name, 'TEST_RESOURCES="%s"' % resources_path],
install_path=None, install_path=None,
shlibpath=[directory.find_node('build/tests/').abspath()],
use=['test_helper', 'git2'] + ALL_LIBS # link with all the libs we know use=['test_helper', 'git2'] + ALL_LIBS # link with all the libs we know
# libraries which are not enabled won't link # libraries which are not enabled won't link
) )
...@@ -200,28 +209,17 @@ class _run_tests(Context): ...@@ -200,28 +209,17 @@ class _run_tests(Context):
fun = 'run_tests' fun = 'run_tests'
def run_tests(ctx): def run_tests(ctx):
import shutil, tempfile, sys, os import shutil, tempfile, sys
failed = False failed = False
test_folder = tempfile.mkdtemp() test_folder = tempfile.mkdtemp()
build_folder = ctx.path.find_node('build/tests/')
test_glob = 'build/tests/t????-*' test_glob = 'build/tests/t????-*'
environ = os.environ.copy()
environ_tail = ""
if sys.platform == 'win32': if sys.platform == 'win32':
test_glob += '.exe' test_glob += '.exe'
environ_var, environ_separator = 'PATH', ';'
else:
environ_var, environ_separator = 'LD_LIBRARY_PATH', ':'
if environ_var in environ:
environ_tail = environ_separator + environ[environ_var]
environ[environ_var] = build_folder.abspath() + environ_tail
for test in ctx.path.ant_glob(test_glob): for test in ctx.path.ant_glob(test_glob):
if ctx.exec_command(test.abspath(), cwd=test_folder, env=environ) != 0: if ctx.exec_command(test.abspath(), cwd=test_folder) != 0:
failed = True failed = True
break break
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment