зеркало из https://github.com/microsoft/git.git
Clean up compatibility definitions.
This attempts to clean up the way various compatibility functions are defined and used. - A new header file, git-compat-util.h, is introduced. This looks at various NO_XXX and does necessary function name replacements, equivalent of -Dstrcasestr=gitstrcasestr in the Makefile. - Those function name replacements are removed from the Makefile. - Common features such as usage(), die(), xmalloc() are moved from cache.h to git-compat-util.h; cache.h includes git-compat-util.h itself. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
cd8c458947
Коммит
4050c0df8e
12
Makefile
12
Makefile
|
@ -162,7 +162,7 @@ LIB_FILE=libgit.a
|
|||
LIB_H = \
|
||||
blob.h cache.h commit.h count-delta.h csum-file.h delta.h \
|
||||
diff.h epoch.h object.h pack.h pkt-line.h quote.h refs.h \
|
||||
run-command.h strbuf.h tag.h tree.h
|
||||
run-command.h strbuf.h tag.h tree.h git-compat-util.h
|
||||
|
||||
DIFF_OBJS = \
|
||||
diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \
|
||||
|
@ -320,15 +320,15 @@ ifdef NEEDS_NSL
|
|||
SIMPLE_LIB += -lnsl
|
||||
endif
|
||||
ifdef NO_STRCASESTR
|
||||
COMPAT_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1
|
||||
COMPAT_CFLAGS += -DNO_STRCASESTR
|
||||
COMPAT_OBJS += compat/strcasestr.o
|
||||
endif
|
||||
ifdef NO_SETENV
|
||||
COMPAT_CFLAGS += -Dsetenv=gitsetenv -DNO_SETENV=1
|
||||
COMPAT_CFLAGS += -DNO_SETENV
|
||||
COMPAT_OBJS += compat/setenv.o
|
||||
endif
|
||||
ifdef NO_MMAP
|
||||
COMPAT_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP
|
||||
COMPAT_CFLAGS += -DNO_MMAP
|
||||
COMPAT_OBJS += compat/mmap.o
|
||||
endif
|
||||
ifdef NO_IPV6
|
||||
|
@ -363,9 +363,9 @@ all: $(ALL_PROGRAMS)
|
|||
all:
|
||||
$(MAKE) -C templates
|
||||
|
||||
git$(X): git.c $(COMPAT_OBJS) Makefile
|
||||
git$X: git.c $(LIB_FILE) Makefile
|
||||
$(CC) -DGIT_EXEC_PATH='"$(bindir)"' -DGIT_VERSION='"$(GIT_VERSION)"' \
|
||||
$(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(filter %.o,$^)
|
||||
$(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE)
|
||||
|
||||
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
|
||||
rm -f $@
|
||||
|
|
96
cache.h
96
cache.h
|
@ -1,23 +1,7 @@
|
|||
#ifndef CACHE_H
|
||||
#define CACHE_H
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#ifndef NO_MMAP
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
#include <sys/param.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include "git-compat-util.h"
|
||||
|
||||
#include SHA1_HEADER
|
||||
#include <zlib.h>
|
||||
|
@ -36,15 +20,6 @@
|
|||
#define DTYPE(de) DT_UNKNOWN
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define NORETURN __attribute__((__noreturn__))
|
||||
#else
|
||||
#define NORETURN
|
||||
#ifndef __attribute__
|
||||
#define __attribute__(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Intensive research over the course of many years has shown that
|
||||
* port 9418 is totally unused by anything else. Or
|
||||
|
@ -250,11 +225,6 @@ extern const char *resolve_ref(const char *path, unsigned char *sha1, int);
|
|||
extern int create_symref(const char *git_HEAD, const char *refs_heads_master);
|
||||
extern int validate_symref(const char *git_HEAD);
|
||||
|
||||
/* General helper functions */
|
||||
extern void usage(const char *err) NORETURN;
|
||||
extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
|
||||
extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
||||
|
||||
extern int base_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);
|
||||
extern int cache_name_compare(const char *name1, int len1, const char *name2, int len2);
|
||||
|
||||
|
@ -272,30 +242,6 @@ extern int setup_ident(void);
|
|||
extern const char *git_author_info(void);
|
||||
extern const char *git_committer_info(void);
|
||||
|
||||
static inline void *xmalloc(size_t size)
|
||||
{
|
||||
void *ret = malloc(size);
|
||||
if (!ret)
|
||||
die("Out of memory, malloc failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void *xrealloc(void *ptr, size_t size)
|
||||
{
|
||||
void *ret = realloc(ptr, size);
|
||||
if (!ret)
|
||||
die("Out of memory, realloc failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void *xcalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
void *ret = calloc(nmemb, size);
|
||||
if (!ret)
|
||||
die("Out of memory, calloc failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct checkout {
|
||||
const char *base_dir;
|
||||
int base_dir_len;
|
||||
|
@ -373,20 +319,6 @@ extern void packed_object_info_detail(struct pack_entry *, char *, unsigned long
|
|||
/* Dumb servers support */
|
||||
extern int update_server_info(int);
|
||||
|
||||
#ifdef NO_MMAP
|
||||
|
||||
#ifndef PROT_READ
|
||||
#define PROT_READ 1
|
||||
#define PROT_WRITE 2
|
||||
#define MAP_PRIVATE 1
|
||||
#define MAP_FAILED ((void*)-1)
|
||||
#endif
|
||||
|
||||
extern void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
|
||||
extern int gitfakemunmap(void *start, size_t length);
|
||||
|
||||
#endif
|
||||
|
||||
typedef int (*config_fn_t)(const char *, const char *);
|
||||
extern int git_default_config(const char *, const char *);
|
||||
extern int git_config_from_file(config_fn_t fn, const char *);
|
||||
|
@ -404,31 +336,5 @@ extern char git_default_name[MAX_GITNAME];
|
|||
#define MAX_ENCODING_LENGTH 64
|
||||
extern char git_commit_encoding[MAX_ENCODING_LENGTH];
|
||||
|
||||
/* Sane ctype - no locale, and works with signed chars */
|
||||
#undef isspace
|
||||
#undef isdigit
|
||||
#undef isalpha
|
||||
#undef isalnum
|
||||
#undef tolower
|
||||
#undef toupper
|
||||
extern unsigned char sane_ctype[256];
|
||||
#define GIT_SPACE 0x01
|
||||
#define GIT_DIGIT 0x02
|
||||
#define GIT_ALPHA 0x04
|
||||
#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
|
||||
#define isspace(x) sane_istest(x,GIT_SPACE)
|
||||
#define isdigit(x) sane_istest(x,GIT_DIGIT)
|
||||
#define isalpha(x) sane_istest(x,GIT_ALPHA)
|
||||
#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
|
||||
#define tolower(x) sane_case((unsigned char)(x), 0x20)
|
||||
#define toupper(x) sane_case((unsigned char)(x), 0)
|
||||
|
||||
static inline int sane_case(int x, int high)
|
||||
{
|
||||
if (sane_istest(x, GIT_ALPHA))
|
||||
x = (x & ~0x20) | high;
|
||||
return x;
|
||||
}
|
||||
|
||||
extern int copy_fd(int ifd, int ofd);
|
||||
#endif /* CACHE_H */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include "../cache.h"
|
||||
#include "../git-compat-util.h"
|
||||
|
||||
void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
|
||||
{
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "../git-compat-util.h"
|
||||
|
||||
char *gitstrcasestr(const char *haystack, const char *needle)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
#ifndef GIT_COMPAT_UTIL_H
|
||||
#define GIT_COMPAT_UTIL_H
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <sys/param.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define NORETURN __attribute__((__noreturn__))
|
||||
#else
|
||||
#define NORETURN
|
||||
#ifndef __attribute__
|
||||
#define __attribute__(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* General helper functions */
|
||||
extern void usage(const char *err) NORETURN;
|
||||
extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
|
||||
extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
||||
|
||||
#ifdef NO_MMAP
|
||||
|
||||
#ifndef PROT_READ
|
||||
#define PROT_READ 1
|
||||
#define PROT_WRITE 2
|
||||
#define MAP_PRIVATE 1
|
||||
#define MAP_FAILED ((void*)-1)
|
||||
#endif
|
||||
|
||||
#define mmap gitfakemmap
|
||||
#define munmap gitfakemunmap
|
||||
extern void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
|
||||
extern int gitfakemunmap(void *start, size_t length);
|
||||
|
||||
#else /* NO_MMAP */
|
||||
|
||||
#include <sys/mman.h>
|
||||
|
||||
#endif /* NO_MMAP */
|
||||
|
||||
#ifdef NO_SETENV
|
||||
#define setenv gitsetenv
|
||||
extern int gitsetenv(const char *, const char *, int);
|
||||
#endif
|
||||
|
||||
#ifdef NO_STRCASESTR
|
||||
#define strcasestr gitstrcasestr
|
||||
extern char *gitstrcasestr(const char *haystack, const char *needle);
|
||||
#endif
|
||||
|
||||
static inline void *xmalloc(size_t size)
|
||||
{
|
||||
void *ret = malloc(size);
|
||||
if (!ret)
|
||||
die("Out of memory, malloc failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void *xrealloc(void *ptr, size_t size)
|
||||
{
|
||||
void *ret = realloc(ptr, size);
|
||||
if (!ret)
|
||||
die("Out of memory, realloc failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void *xcalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
void *ret = calloc(nmemb, size);
|
||||
if (!ret)
|
||||
die("Out of memory, calloc failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Sane ctype - no locale, and works with signed chars */
|
||||
#undef isspace
|
||||
#undef isdigit
|
||||
#undef isalpha
|
||||
#undef isalnum
|
||||
#undef tolower
|
||||
#undef toupper
|
||||
extern unsigned char sane_ctype[256];
|
||||
#define GIT_SPACE 0x01
|
||||
#define GIT_DIGIT 0x02
|
||||
#define GIT_ALPHA 0x04
|
||||
#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
|
||||
#define isspace(x) sane_istest(x,GIT_SPACE)
|
||||
#define isdigit(x) sane_istest(x,GIT_DIGIT)
|
||||
#define isalpha(x) sane_istest(x,GIT_ALPHA)
|
||||
#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
|
||||
#define tolower(x) sane_case((unsigned char)(x), 0x20)
|
||||
#define toupper(x) sane_case((unsigned char)(x), 0)
|
||||
|
||||
static inline int sane_case(int x, int high)
|
||||
{
|
||||
if (sane_istest(x, GIT_ALPHA))
|
||||
x = (x & ~0x20) | high;
|
||||
return x;
|
||||
}
|
||||
|
||||
#endif
|
15
git.c
15
git.c
|
@ -8,15 +8,12 @@
|
|||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include "git-compat-util.h"
|
||||
|
||||
#ifndef PATH_MAX
|
||||
# define PATH_MAX 4096
|
||||
#endif
|
||||
|
||||
#ifdef NO_SETENV
|
||||
extern int gitsetenv(const char *, const char *, int);
|
||||
#endif
|
||||
|
||||
static const char git_usage[] =
|
||||
"Usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ ARGS ]";
|
||||
|
||||
|
@ -156,10 +153,10 @@ static void list_commands(const char *exec_path, const char *pattern)
|
|||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
static void usage(const char *exec_path, const char *fmt, ...)
|
||||
static void cmd_usage(const char *exec_path, const char *fmt, ...)
|
||||
__attribute__((__format__(__printf__, 2, 3), __noreturn__));
|
||||
#endif
|
||||
static void usage(const char *exec_path, const char *fmt, ...)
|
||||
static void cmd_usage(const char *exec_path, const char *fmt, ...)
|
||||
{
|
||||
if (fmt) {
|
||||
va_list ap;
|
||||
|
@ -254,12 +251,12 @@ int main(int argc, char **argv, char **envp)
|
|||
else if (!strcmp(arg, "help"))
|
||||
show_help = 1;
|
||||
else if (!show_help)
|
||||
usage(NULL, NULL);
|
||||
cmd_usage(NULL, NULL);
|
||||
}
|
||||
|
||||
if (i >= argc || show_help) {
|
||||
if (i >= argc)
|
||||
usage(exec_path, NULL);
|
||||
cmd_usage(exec_path, NULL);
|
||||
|
||||
show_man_page(argv[i]);
|
||||
}
|
||||
|
@ -297,7 +294,7 @@ int main(int argc, char **argv, char **envp)
|
|||
execve(git_command, &argv[i], envp);
|
||||
|
||||
if (errno == ENOENT)
|
||||
usage(exec_path, "'%s' is not a git-command", argv[i]);
|
||||
cmd_usage(exec_path, "'%s' is not a git-command", argv[i]);
|
||||
|
||||
fprintf(stderr, "Failed to run command '%s': %s\n",
|
||||
git_command, strerror(errno));
|
||||
|
|
|
@ -10,10 +10,6 @@
|
|||
#include <iconv.h>
|
||||
#include "cache.h"
|
||||
|
||||
#ifdef NO_STRCASESTR
|
||||
extern char *gitstrcasestr(const char *haystack, const char *needle);
|
||||
#endif
|
||||
|
||||
static FILE *cmitmsg, *patchfile;
|
||||
|
||||
static int keep_subject = 0;
|
||||
|
|
2
usage.c
2
usage.c
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (C) Linus Torvalds, 2005
|
||||
*/
|
||||
#include "cache.h"
|
||||
#include "git-compat-util.h"
|
||||
|
||||
static void report(const char *prefix, const char *err, va_list params)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче