mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-11 13:12:22 +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 "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
|
||||||
|
28
src/errors.c
28
src/errors.c
@ -1,34 +1,6 @@
|
|||||||
#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;
|
||||||
|
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 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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(
|
|||||||
|
|
||||||
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 @@
|
|||||||
__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 @@
|
|||||||
*/
|
*/
|
||||||
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
|
|||||||
|
|
||||||
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;
|
||||||
|
24
src/util.c
24
src/util.c
@ -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;
|
||||||
|
32
src/util.h
32
src/util.h
@ -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);
|
||||||
|
@ -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'
|
# 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):
|
|||||||
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):
|
|||||||
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):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# 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):
|
|||||||
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):
|
|||||||
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):
|
|||||||
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):
|
|||||||
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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user