Commit 98e3b298 by nulltoken

Merge branch 'master' into repo-init

parents 2c08c3f0 51035184
......@@ -49,7 +49,6 @@ typedef SSIZE_T ssize_t;
#include "git2/common.h"
#include "util.h"
#include "thread-utils.h"
#include "errors.h"
#include "bswap.h"
#define GIT_PATH_MAX 4096
......
#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
static struct {
int num;
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 @@
int gitfo_open(const char *path, int flags)
{
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 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)
......@@ -22,11 +22,11 @@ int gitfo_read(git_file fd, void *buf, size_t cnt)
if (r < 0) {
if (errno == EINTR || errno == EAGAIN)
continue;
return git_os_error();
return GIT_EOSERR;
}
if (!r) {
errno = EPIPE;
return git_os_error();
return GIT_EOSERR;
}
cnt -= r;
b += r;
......@@ -42,11 +42,11 @@ int gitfo_write(git_file fd, void *buf, size_t cnt)
if (r < 0) {
if (errno == EINTR || errno == EAGAIN)
continue;
return git_os_error();
return GIT_EOSERR;
}
if (!r) {
errno = EPIPE;
return git_os_error();
return GIT_EOSERR;
}
cnt -= r;
b += r;
......@@ -93,7 +93,7 @@ off_t gitfo_size(git_file fd)
{
struct stat sb;
if (gitfo_fstat(fd, &sb))
return git_os_error();
return GIT_EOSERR;
return sb.st_size;
}
......@@ -152,13 +152,13 @@ int gitfo_move_file(char *from, char *to)
if (!rename(from, to))
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)
{
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;
}
......@@ -276,7 +276,7 @@ int gitfo_dirent(
dir = opendir(path);
if (!dir)
return git_os_error();
return GIT_EOSERR;
while ((de = readdir(dir)) != NULL) {
size_t de_len;
......
......@@ -55,6 +55,8 @@
__attribute__((visibility("default"))) \
GIT_TLS \
type
#elif defined(_MSC_VER)
# define GIT_EXTERN_TLS(type) __declspec(dllexport) GIT_TLS type
#else
# define GIT_EXTERN_TLS(type) extern GIT_TLS type
#endif
......
......@@ -33,16 +33,6 @@
*/
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
* @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
out->data = mmap(NULL, len, mprot, mflag, fd, offset);
if (!out->data || out->data == MAP_FAILED)
return git_os_error();
return GIT_EOSERR;
out->len = len;
return GIT_SUCCESS;
......
......@@ -3,30 +3,6 @@
#include <stdarg.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, ...)
{
va_list va;
......
......@@ -3,28 +3,16 @@
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
extern void *git__malloc(size_t);
extern void *git__calloc(size_t, size_t);
extern char *git__strdup(const char *);
#ifndef GIT__NO_HIDE_MALLOC
# define GIT__FORBID_MALLOC do_not_use_malloc_directly
# ifdef malloc
# undef malloc
# endif
# 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
/*
* Don't wrap malloc/calloc.
* Use the default versions in glibc, and make
* sure that any methods that allocate memory
* return a GIT_ENOMEM error when allocation
* fails.
*/
#define git__malloc malloc
#define git__calloc calloc
#define git__strdup strdup
extern int git__fmt(char *, size_t, const char *, ...)
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):
# command '[build|clean|install|uninstall]-static'
if bld.variant == 'static':
build_library(bld, 'cstlib')
build_library(bld, 'static')
# command '[build|clean|install|uninstall]-shared'
elif bld.variant == 'shared':
build_library(bld, 'cshlib')
build_library(bld, 'shared')
# command '[build|clean]-tests'
elif bld.variant == 'tests':
build_library(bld, 'cshlib')
build_library(bld, 'objects')
build_tests(bld)
# command 'build|clean|install|uninstall': by default, run
......@@ -91,9 +91,15 @@ def build(bld):
from waflib import Options
Options.commands = [bld.cmd + '-shared', bld.cmd + '-static'] + Options.commands
def build_library(bld, lib_str):
directory = bld.path
def build_library(bld, build_type):
BUILD = {
'shared' : bld.shlib,
'static' : bld.stlib,
'objects' : bld.objects
}
directory = bld.path
sources = directory.ant_glob('src/*.c')
# Compile platform-dependant code
......@@ -106,15 +112,12 @@ def build_library(bld, lib_str):
sources.append('src/ppc/sha1.c')
else:
sources.append('src/block-sha1/sha1.c')
features = ['c', lib_str]
#------------------------------
# Build the main library
#------------------------------
# either as static or shared;
bld(features=features,
BUILD[build_type](
source=sources,
target='git2',
includes='src',
......@@ -123,8 +126,8 @@ def build_library(bld, lib_str):
)
# On Unix systems, build the Pkg-config entry file
if bld.env.PLATFORM == 'unix':
bld(rule="""sed -e 's#@prefix@#$(prefix)#' -e 's#@libdir@#$(libdir)#' < ${SRC} > ${TGT}""",
if bld.env.PLATFORM == 'unix' and bld.is_install:
bld(rule="""sed -e 's#@prefix@#${PREFIX}#' -e 's#@libdir@#${LIBDIR}#' < ${SRC} > ${TGT}""",
source='libgit2.pc.in',
target='libgit2.pc',
install_path='${LIBDIR}/pkgconfig',
......@@ -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/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):
return '\n'.join(l for l in test_file.read().splitlines() if text in l)
......@@ -144,7 +154,7 @@ def build_tests(bld):
return
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
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):
includes=['src', 'tests'],
defines=['TEST_TOC="%s.toc"' % test_name, 'TEST_RESOURCES="%s"' % resources_path],
install_path=None,
shlibpath=[directory.find_node('build/tests/').abspath()],
use=['test_helper', 'git2'] + ALL_LIBS # link with all the libs we know
# libraries which are not enabled won't link
)
......@@ -200,28 +209,17 @@ class _run_tests(Context):
fun = 'run_tests'
def run_tests(ctx):
import shutil, tempfile, sys, os
import shutil, tempfile, sys
failed = False
test_folder = tempfile.mkdtemp()
build_folder = ctx.path.find_node('build/tests/')
test_glob = 'build/tests/t????-*'
environ = os.environ.copy()
environ_tail = ""
if sys.platform == 'win32':
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):
if ctx.exec_command(test.abspath(), cwd=test_folder, env=environ) != 0:
if ctx.exec_command(test.abspath(), cwd=test_folder) != 0:
failed = True
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