mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 19:58:09 +00:00
Merge branch 'master' into repo-init
This commit is contained in:
commit
98e3b29895
@ -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
|
||||
|
28
src/errors.c
28
src/errors.c
@ -1,34 +1,6 @@
|
||||
#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;
|
||||
|
24
src/errors.h
24
src/errors.h
@ -1,24 +0,0 @@
|
||||
#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;
|
||||
|
24
src/util.c
24
src/util.c
@ -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;
|
||||
|
32
src/util.h
32
src/util.h
@ -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);
|
||||
|
@ -1,12 +0,0 @@
|
||||
#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
|
50
wscript
50
wscript
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user