Merge branch 'busybox-w32'

This topic branch brings slightly experimental changes supporting Git
for Windows to use BusyBox-w32 to execute its shell scripts as well as
its test suite.

The test suite can be run by installing the test artifacts into a MinGit
that has busybox.exe (and using Git for Windows' SDK's Perl for now, as
the test suite requires Perl even when NO_PERL is set, go figure) by
using the `install-mingit-test-artifacts` Makefile target with the
DESTDIR variable pointing to the top-level directory of the MinGit
installation.

To facilitate running the test suite (without having `make` available,
as `make.exe` is not part of MinGit), this branch brings an experimental
patch to the `test-run-command` helper to run Git's test suite. It is
still very experimental, though: in this developer's tests it seemed
that the `poll()` emulation required for `run_parallel_processes()` to
work sometimes hiccups on Windows, causing infinite "hangs". It is also
possible that BusyBox itself has problems writing to the pipes opened by
`test-run-command` (and merging this branch will help investigate
further). Caveat emptor.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin
2018-10-12 21:51:32 +02:00
54 changed files with 641 additions and 216 deletions

1
.gitattributes vendored
View File

@@ -4,6 +4,7 @@
*.perl eol=lf diff=perl
*.pl eof=lf diff=perl
*.pm eol=lf diff=perl
*.png binary
*.py eol=lf diff=python
*.bat eol=crlf
/Documentation/git-*.txt eol=lf

View File

@@ -703,6 +703,7 @@ X =
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
TEST_BUILTINS_OBJS += test-chmtime.o
TEST_BUILTINS_OBJS += test-cmp.o
TEST_BUILTINS_OBJS += test-config.o
TEST_BUILTINS_OBJS += test-ctype.o
TEST_BUILTINS_OBJS += test-date.o
@@ -713,6 +714,7 @@ TEST_BUILTINS_OBJS += test-dump-split-index.o
TEST_BUILTINS_OBJS += test-example-decorate.o
TEST_BUILTINS_OBJS += test-genrandom.o
TEST_BUILTINS_OBJS += test-hashmap.o
TEST_BUILTINS_OBJS += test-iconv.o
TEST_BUILTINS_OBJS += test-index-version.o
TEST_BUILTINS_OBJS += test-json-writer.o
TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o

View File

@@ -10,6 +10,7 @@
#include "win32/lazyload.h"
#include "../config.h"
#include "../attr.h"
#include "../string-list.h"
#define HCAST(type, handle) ((type)(intptr_t)handle)
@@ -1344,6 +1345,65 @@ static char *lookup_prog(const char *dir, int dirlen, const char *cmd,
return NULL;
}
static char *path_lookup(const char *cmd, int exe_only);
static char *is_busybox_applet(const char *cmd)
{
static struct string_list applets = STRING_LIST_INIT_DUP;
static char *busybox_path;
static int busybox_path_initialized;
/* Avoid infinite loop */
if (!strncasecmp(cmd, "busybox", 7) &&
(!cmd[7] || !strcasecmp(cmd + 7, ".exe")))
return NULL;
if (!busybox_path_initialized) {
busybox_path = path_lookup("busybox.exe", 1);
busybox_path_initialized = 1;
}
/* Assume that sh is compiled in... */
if (!busybox_path || !strcasecmp(cmd, "sh"))
return xstrdup_or_null(busybox_path);
if (!applets.nr) {
struct child_process cp = CHILD_PROCESS_INIT;
struct strbuf buf = STRBUF_INIT;
char *p;
argv_array_pushl(&cp.args, busybox_path, "--help", NULL);
if (capture_command(&cp, &buf, 2048)) {
string_list_append(&applets, "");
return NULL;
}
/* parse output */
p = strstr(buf.buf, "Currently defined functions:\n");
if (!p) {
warning("Could not parse output of busybox --help");
string_list_append(&applets, "");
return NULL;
}
p = strchrnul(p, '\n');
for (;;) {
size_t len;
p += strspn(p, "\n\t ,");
len = strcspn(p, "\n\t ,");
if (!len)
break;
p[len] = '\0';
string_list_insert(&applets, p);
p = p + len + 1;
}
}
return string_list_has_string(&applets, cmd) ?
xstrdup(busybox_path) : NULL;
}
/*
* Determines the absolute path of cmd using the split path in path.
* If cmd contains a slash or backslash, no lookup is performed.
@@ -1372,6 +1432,9 @@ static char *path_lookup(const char *cmd, int exe_only)
path = sep + 1;
}
if (!prog && !isexe)
prog = is_busybox_applet(cmd);
return prog;
}
@@ -1550,8 +1613,8 @@ static int is_msys2_sh(const char *cmd)
}
static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaenv,
const char *dir,
int prepend_cmd, int fhin, int fhout, int fherr)
const char *dir, const char *prepend_cmd,
int fhin, int fhout, int fherr)
{
static int restrict_handle_inheritance = 1;
STARTUPINFOEXW si;
@@ -1625,9 +1688,9 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
/* concatenate argv, quoting args as we go */
strbuf_init(&args, 0);
if (prepend_cmd) {
char *quoted = (char *)quote_arg(cmd);
char *quoted = (char *)quote_arg(prepend_cmd);
strbuf_addstr(&args, quoted);
if (quoted != cmd)
if (quoted != prepend_cmd)
free(quoted);
}
for (; *argv; argv++) {
@@ -1785,7 +1848,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
return (pid_t)pi.dwProcessId;
}
static pid_t mingw_spawnv(const char *cmd, const char **argv, int prepend_cmd)
static pid_t mingw_spawnv(const char *cmd, const char **argv,
const char *prepend_cmd)
{
return mingw_spawnve_fd(cmd, argv, NULL, NULL, prepend_cmd, 0, 1, 2);
}
@@ -1813,14 +1877,14 @@ pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **deltaenv,
pid = -1;
}
else {
pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, 1,
pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, interpr,
fhin, fhout, fherr);
free(iprog);
}
argv[0] = argv0;
}
else
pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, 0,
pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, NULL,
fhin, fhout, fherr);
free(prog);
}
@@ -1846,7 +1910,7 @@ static int try_shell_exec(const char *cmd, char *const *argv)
ALLOC_ARRAY(argv2, argc + 1);
argv2[0] = (char *)cmd; /* full path to the script file */
memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc);
pid = mingw_spawnv(prog, argv2, 1);
pid = mingw_spawnv(prog, argv2, interpr);
if (pid >= 0) {
int status;
if (waitpid(pid, &status, 0) < 0)
@@ -1866,7 +1930,7 @@ int mingw_execv(const char *cmd, char *const *argv)
if (!try_shell_exec(cmd, argv)) {
int pid, status;
pid = mingw_spawnv(cmd, (const char **)argv, 0);
pid = mingw_spawnv(cmd, (const char **)argv, NULL);
if (pid < 0)
return -1;
if (waitpid(pid, &status, 0) < 0)

View File

@@ -649,6 +649,65 @@ else
NO_CURL = YesPlease
endif
endif
ifeq (i686,$(uname_M))
MINGW_PREFIX := mingw32
endif
ifeq (x86_64,$(uname_M))
MINGW_PREFIX := mingw64
endif
DESTDIR_WINDOWS = $(shell cygpath -aw '$(DESTDIR_SQ)')
DESTDIR_MIXED = $(shell cygpath -am '$(DESTDIR_SQ)')
install-mingit-test-artifacts:
install -m755 -d '$(DESTDIR_SQ)/usr/bin'
printf '%s\n%s\n' >'$(DESTDIR_SQ)/usr/bin/perl' \
"#!/mingw64/bin/busybox sh" \
"exec \"$(shell cygpath -am /usr/bin/perl.exe)\" \"\$$@\""
install -m755 -d '$(DESTDIR_SQ)'
printf '%s%s\n%s\n%s\n%s\n%s\n' >'$(DESTDIR_SQ)/init.bat' \
"PATH=$(DESTDIR_WINDOWS)\\$(MINGW_PREFIX)\\bin;" \
"C:\\WINDOWS;C:\\WINDOWS\\system32" \
"@set GIT_TEST_INSTALLED=$(DESTDIR_MIXED)/$(MINGW_PREFIX)/bin" \
"@`echo "$(DESTDIR_WINDOWS)" | sed 's/:.*/:/'`" \
"@cd `echo "$(DESTDIR_WINDOWS)" | sed 's/^.://'`\\test-git\\t" \
"@echo Now, run 'helper\\test-run-command testsuite'"
install -m755 -d '$(DESTDIR_SQ)/test-git'
sed 's/^\(NO_PERL\|NO_PYTHON\)=.*/\1=YesPlease/' \
<GIT-BUILD-OPTIONS >'$(DESTDIR_SQ)/test-git/GIT-BUILD-OPTIONS'
install -m755 -d '$(DESTDIR_SQ)/test-git/t/helper'
install -m755 $(TEST_PROGRAMS) '$(DESTDIR_SQ)/test-git/t/helper'
(cd t && $(TAR) cf - t[0-9][0-9][0-9][0-9] diff-lib) | \
(cd '$(DESTDIR_SQ)/test-git/t' && $(TAR) xf -)
install -m755 t/t556x_common t/*.sh '$(DESTDIR_SQ)/test-git/t'
install -m755 -d '$(DESTDIR_SQ)/test-git/templates'
(cd templates && $(TAR) cf - blt) | \
(cd '$(DESTDIR_SQ)/test-git/templates' && $(TAR) xf -)
# po/build/locale for t0200
install -m755 -d '$(DESTDIR_SQ)/test-git/po/build/locale'
(cd po/build/locale && $(TAR) cf - .) | \
(cd '$(DESTDIR_SQ)/test-git/po/build/locale' && $(TAR) xf -)
# git-daemon.exe for t5802, git-http-backend.exe for t5560
install -m755 -d '$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
install -m755 git-daemon.exe git-http-backend.exe \
'$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
# git-remote-testgit for t5801
install -m755 -d '$(DESTDIR_SQ)/$(MINGW_PREFIX)/libexec/git-core'
install -m755 git-remote-testgit \
'$(DESTDIR_SQ)/$(MINGW_PREFIX)/libexec/git-core'
# git-upload-archive (dashed) for t5000
install -m755 git-upload-archive.exe '$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
# git-difftool--helper for t7800
install -m755 git-difftool--helper \
'$(DESTDIR_SQ)/$(MINGW_PREFIX)/libexec/git-core'
endif
ifeq ($(uname_S),QNX)
COMPAT_CFLAGS += -DSA_RESTART=0

View File

@@ -332,17 +332,30 @@ create_virtual_base() {
# Platform specific tweaks to work around some commands
case $(uname -s) in
*MINGW*)
# Windows has its own (incompatible) sort and find
sort () {
/usr/bin/sort "$@"
}
find () {
/usr/bin/find "$@"
}
# git sees Windows-style pwd
pwd () {
builtin pwd -W
}
if test -x /usr/bin/sort
then
# Windows has its own (incompatible) sort; override
sort () {
/usr/bin/sort "$@"
}
fi
if test -x /usr/bin/find
then
# Windows has its own (incompatible) find; override
find () {
/usr/bin/find "$@"
}
fi
# On Windows, Git wants Windows paths. But /usr/bin/pwd spits out
# Unix-style paths. At least in Bash, we have a builtin pwd that
# understands the -W option to force "mixed" paths, i.e. with drive
# prefix but still with forward slashes. Let's use that, if available.
if type builtin >/dev/null 2>&1
then
pwd () {
builtin pwd -W
}
fi
is_absolute_path () {
case "$1" in
[/\\]* | [A-Za-z]:*)

View File

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Before

Width:  |  Height:  |  Size: 275 B

After

Width:  |  Height:  |  Size: 275 B

73
t/helper/test-cmp.c Normal file
View File

@@ -0,0 +1,73 @@
#include "test-tool.h"
#include "git-compat-util.h"
#include "strbuf.h"
#include "gettext.h"
#include "parse-options.h"
#include "run-command.h"
#ifdef WIN32
#define NO_SUCH_DIR "\\\\.\\GLOBALROOT\\invalid"
#else
#define NO_SUCH_DIR "/dev/null"
#endif
static int run_diff(const char *path1, const char *path2)
{
const char *argv[] = {
"diff", "--no-index", NULL, NULL, NULL
};
const char *env[] = {
"GIT_PAGER=cat",
"GIT_DIR=" NO_SUCH_DIR,
"HOME=" NO_SUCH_DIR,
NULL
};
argv[2] = path1;
argv[3] = path2;
return run_command_v_opt_cd_env(argv,
RUN_COMMAND_NO_STDIN | RUN_GIT_CMD,
NULL, env);
}
int cmd__cmp(int argc, const char **argv)
{
FILE *f0, *f1;
struct strbuf b0 = STRBUF_INIT, b1 = STRBUF_INIT;
if (argc != 3)
die("Require exactly 2 arguments, got %d", argc);
if (!(f0 = !strcmp(argv[1], "-") ? stdin : fopen(argv[1], "r")))
return error_errno("could not open '%s'", argv[1]);
if (!(f1 = !strcmp(argv[2], "-") ? stdin : fopen(argv[2], "r"))) {
fclose(f0);
return error_errno("could not open '%s'", argv[2]);
}
for (;;) {
int r0 = strbuf_getline(&b0, f0);
int r1 = strbuf_getline(&b1, f1);
if (r0 == EOF) {
fclose(f0);
fclose(f1);
strbuf_release(&b0);
strbuf_release(&b1);
if (r1 == EOF)
return 0;
cmp_failed:
if (!run_diff(argv[1], argv[2]))
die("Huh? 'diff --no-index %s %s' succeeded",
argv[1], argv[2]);
return 1;
}
if (r1 == EOF || strbuf_cmp(&b0, &b1)) {
fclose(f0);
fclose(f1);
strbuf_release(&b0);
strbuf_release(&b1);
goto cmp_failed;
}
}
}

47
t/helper/test-iconv.c Normal file
View File

@@ -0,0 +1,47 @@
#include "test-tool.h"
#include "git-compat-util.h"
#include "strbuf.h"
#include "gettext.h"
#include "parse-options.h"
#include "utf8.h"
int cmd__iconv(int argc, const char **argv)
{
struct strbuf buf = STRBUF_INIT;
char *from = NULL, *to = NULL, *p;
size_t len;
int ret = 0;
const char * const iconv_usage[] = {
N_("test-helper --iconv [<options>]"),
NULL
};
struct option options[] = {
OPT_STRING('f', "from-code", &from, "encoding", "from"),
OPT_STRING('t', "to-code", &to, "encoding", "to"),
OPT_END()
};
argc = parse_options(argc, argv, NULL, options,
iconv_usage, 0);
if (argc > 1 || !from || !to)
usage_with_options(iconv_usage, options);
if (!argc) {
if (strbuf_read(&buf, 0, 2048) < 0)
die_errno("Could not read from stdin");
} else if (strbuf_read_file(&buf, argv[0], 2048) < 0)
die_errno("Could not read from '%s'", argv[0]);
p = reencode_string_len(buf.buf, buf.len, to, from, &len);
if (!p)
die_errno("Could not reencode");
if (write(1, p, len) < 0)
ret = !!error_errno("Could not write %"PRIuMAX" bytes",
(uintmax_t)len);
strbuf_release(&buf);
free(p);
return ret;
}

View File

@@ -10,9 +10,14 @@
#include "test-tool.h"
#include "git-compat-util.h"
#include "cache.h"
#include "run-command.h"
#include "argv-array.h"
#include "strbuf.h"
#include "parse-options.h"
#include "string-list.h"
#include "thread-utils.h"
#include "wildmatch.h"
#include <string.h>
#include <errno.h>
@@ -50,6 +55,141 @@ static int task_finished(int result,
return 1;
}
struct testsuite {
struct string_list tests, failed;
int next;
int quiet, immediate, verbose, trace;
};
static int next_test(struct child_process *cp, struct strbuf *err, void *cb,
void **task_cb)
{
struct testsuite *suite = cb;
const char *test;
if (suite->next >= suite->tests.nr)
return 0;
test = suite->tests.items[suite->next++].string;
argv_array_pushl(&cp->args, "sh", test, NULL);
if (suite->quiet)
argv_array_push(&cp->args, "--quiet");
if (suite->immediate)
argv_array_push(&cp->args, "-i");
if (suite->verbose)
argv_array_push(&cp->args, "-v");
if (suite->trace)
argv_array_push(&cp->args, "-x");
strbuf_addf(err, "Output of '%s':\n", test);
*task_cb = (void *)test;
return 1;
}
static int test_finished(int result, struct strbuf *err, void *cb,
void *task_cb)
{
struct testsuite *suite = cb;
const char *name = (const char *)task_cb;
if (result)
string_list_append(&suite->failed, name);
strbuf_addf(err, "%s: '%s'\n", result ? "FAIL" : "SUCCESS", name);
return 0;
}
static int test_failed(struct strbuf *out, void *cb, void *task_cb)
{
struct testsuite *suite = cb;
const char *name = (const char *)task_cb;
string_list_append(&suite->failed, name);
strbuf_addf(out, "FAILED TO START: '%s'\n", name);
return 0;
}
static const char * const testsuite_usage[] = {
"test-run-command testsuite [<options>] [<pattern>...]",
NULL
};
static int testsuite(int argc, const char **argv)
{
struct testsuite suite;
int max_jobs = 1, i, ret;
DIR *dir;
struct dirent *d;
struct option options[] = {
OPT_BOOL('i', "immediate", &suite.immediate,
"stop at first failed test case(s)"),
OPT_INTEGER('j', "jobs", &max_jobs, "run <N> jobs in parallel"),
OPT_BOOL('q', "quiet", &suite.quiet, "be terse"),
OPT_BOOL('v', "verbose", &suite.verbose, "be verbose"),
OPT_BOOL('x', "trace", &suite.trace, "trace shell commands"),
OPT_END()
};
memset(&suite, 0, sizeof(suite));
suite.tests.strdup_strings = suite.failed.strdup_strings = 1;
argc = parse_options(argc, argv, NULL, options,
testsuite_usage, PARSE_OPT_STOP_AT_NON_OPTION);
if (max_jobs <= 0)
max_jobs = online_cpus();
dir = opendir(".");
if (!dir)
die("Could not open the current directory");
while ((d = readdir(dir))) {
const char *p = d->d_name;
if (*p != 't' || !isdigit(p[1]) || !isdigit(p[2]) ||
!isdigit(p[3]) || !isdigit(p[4]) || p[5] != '-' ||
!ends_with(p, ".sh"))
continue;
/* No pattern: match all */
if (!argc) {
string_list_append(&suite.tests, p);
continue;
}
for (i = 0; i < argc; i++)
if (!wildmatch(argv[i], p, 0)) {
string_list_append(&suite.tests, p);
break;
}
}
closedir(dir);
if (!suite.tests.nr)
die("No tests match!");
if (max_jobs > suite.tests.nr)
max_jobs = suite.tests.nr;
fprintf(stderr, "Running %d tests (%d at a time)\n",
suite.tests.nr, max_jobs);
ret = run_processes_parallel(max_jobs, next_test, test_failed,
test_finished, &suite);
if (suite.failed.nr > 0) {
ret = 1;
fprintf(stderr, "%d tests failed:\n\n", suite.failed.nr);
for (i = 0; i < suite.failed.nr; i++)
fprintf(stderr, "\t%s\n", suite.failed.items[i].string);
}
string_list_clear(&suite.tests, 0);
string_list_clear(&suite.failed, 0);
return !!ret;
}
static int inherit_handle(const char *argv0)
{
struct child_process cp = CHILD_PROCESS_INIT;
@@ -95,6 +235,9 @@ int cmd__run_command(int argc, const char **argv)
struct child_process proc = CHILD_PROCESS_INIT;
int jobs;
if (argc > 1 && !strcmp(argv[1], "testsuite"))
exit(testsuite(argc - 1, argv + 1));
if (argc < 2)
return 1;
if (!strcmp(argv[1], "inherited-handle"))

View File

@@ -8,6 +8,7 @@ struct test_cmd {
static struct test_cmd cmds[] = {
{ "chmtime", cmd__chmtime },
{ "cmp", cmd__cmp },
{ "config", cmd__config },
{ "ctype", cmd__ctype },
{ "date", cmd__date },
@@ -18,6 +19,7 @@ static struct test_cmd cmds[] = {
{ "example-decorate", cmd__example_decorate },
{ "genrandom", cmd__genrandom },
{ "hashmap", cmd__hashmap },
{ "iconv", cmd__iconv },
{ "index-version", cmd__index_version },
{ "json-writer", cmd__json_writer },
{ "lazy-init-name-hash", cmd__lazy_init_name_hash },

View File

@@ -4,6 +4,7 @@
#include "git-compat-util.h"
int cmd__chmtime(int argc, const char **argv);
int cmd__cmp(int argc, const char **argv);
int cmd__config(int argc, const char **argv);
int cmd__ctype(int argc, const char **argv);
int cmd__date(int argc, const char **argv);
@@ -14,6 +15,7 @@ int cmd__dump_split_index(int argc, const char **argv);
int cmd__example_decorate(int argc, const char **argv);
int cmd__genrandom(int argc, const char **argv);
int cmd__hashmap(int argc, const char **argv);
int cmd__iconv(int argc, const char **argv);
int cmd__index_version(int argc, const char **argv);
int cmd__json_writer(int argc, const char **argv);
int cmd__lazy_init_name_hash(int argc, const char **argv);

View File

@@ -4,6 +4,10 @@
. ../../GIT-BUILD-OPTIONS
INTEROP_ROOT=$(pwd)
BUILD_ROOT=$INTEROP_ROOT/build
case "$PATH" in
*\;*) PATH_SEP=\; ;;
*) PATH_SEP=: ;;
esac
build_version () {
if test -z "$1"
@@ -57,7 +61,7 @@ wrap_git () {
write_script "$1" <<-EOF
GIT_EXEC_PATH="$2"
export GIT_EXEC_PATH
PATH="$2:\$PATH"
PATH="$2$PATH_SEP\$PATH"
export GIT_EXEC_PATH
exec git "\$@"
EOF
@@ -71,7 +75,7 @@ generate_wrappers () {
echo >&2 fatal: test tried to run generic git
exit 1
EOF
PATH=$(pwd)/.bin:$PATH
PATH=$(pwd)/.bin$PATH_SEP$PATH
}
VERSION_A=${GIT_TEST_VERSION_A:-$VERSION_A}

View File

@@ -214,7 +214,7 @@ setup_ext_wrapper () {
cd "$TRASH_DIRECTORY/remote" &&
eval "$*"
EOF
PATH=$TRASH_DIRECTORY:$PATH &&
PATH=$TRASH_DIRECTORY$PATH_SEP$PATH &&
export TRASH_DIRECTORY
'
}

View File

@@ -4,8 +4,8 @@ test_description='blob conversion via gitattributes'
. ./test-lib.sh
TEST_ROOT="$PWD"
PATH=$TEST_ROOT:$PATH
TEST_ROOT="$(pwd)"
PATH=$PWD$PATH_SEP$PATH
write_script <<\EOF "$TEST_ROOT/rot13.sh"
tr \

View File

@@ -135,25 +135,25 @@ ancestor /foo /fo -1
ancestor /foo /foo -1
ancestor /foo /bar -1
ancestor /foo /foo/bar -1
ancestor /foo /foo:/bar -1
ancestor /foo /:/foo:/bar 0
ancestor /foo /foo:/:/bar 0
ancestor /foo /:/bar:/foo 0
ancestor /foo "/foo$PATH_SEP/bar" -1
ancestor /foo "/$PATH_SEP/foo$PATH_SEP/bar" 0
ancestor /foo "/foo$PATH_SEP/$PATH_SEP/bar" 0
ancestor /foo "/$PATH_SEP/bar$PATH_SEP/foo" 0
ancestor /foo/bar / 0
ancestor /foo/bar /fo -1
ancestor /foo/bar /foo 4
ancestor /foo/bar /foo/ba -1
ancestor /foo/bar /:/fo 0
ancestor /foo/bar /foo:/foo/ba 4
ancestor /foo/bar "/$PATH_SEP/fo" 0
ancestor /foo/bar "/foo$PATH_SEP/foo/ba" 4
ancestor /foo/bar /bar -1
ancestor /foo/bar /fo -1
ancestor /foo/bar /foo:/bar 4
ancestor /foo/bar /:/foo:/bar 4
ancestor /foo/bar /foo:/:/bar 4
ancestor /foo/bar /:/bar:/fo 0
ancestor /foo/bar /:/bar 0
ancestor /foo/bar "/foo$PATH_SEP/bar" 4
ancestor /foo/bar "/$PATH_SEP/foo$PATH_SEP/bar" 4
ancestor /foo/bar "/foo$PATH_SEP/$PATH_SEP/bar" 4
ancestor /foo/bar "/$PATH_SEP/bar$PATH_SEP/fo" 0
ancestor /foo/bar "/$PATH_SEP/bar" 0
ancestor /foo/bar /foo 4
ancestor /foo/bar /foo:/bar 4
ancestor /foo/bar "/foo$PATH_SEP/bar" 4
ancestor /foo/bar /bar -1
test_expect_success 'strip_path_suffix' '

View File

@@ -47,7 +47,7 @@ test_expect_success 'run_command does not try to execute a directory' '
cat bin2/greet
EOF
PATH=$PWD/bin1:$PWD/bin2:$PATH \
PATH=$PWD/bin1$PATH_SEP$PWD/bin2$PATH_SEP$PATH \
test-tool run-command run-command greet >actual 2>err &&
test_cmp bin2/greet actual &&
test_must_be_empty err
@@ -64,7 +64,7 @@ test_expect_success POSIXPERM 'run_command passes over non-executable file' '
cat bin2/greet
EOF
PATH=$PWD/bin1:$PWD/bin2:$PATH \
PATH=$PWD/bin1$PATH_SEP$PWD/bin2$PATH_SEP$PATH \
test-tool run-command run-command greet >actual 2>err &&
test_cmp bin2/greet actual &&
test_must_be_empty err
@@ -84,7 +84,7 @@ test_expect_success POSIXPERM,SANITY 'unreadable directory in PATH' '
git config alias.nitfol "!echo frotz" &&
chmod a-rx local-command &&
(
PATH=./local-command:$PATH &&
PATH=./local-command$PATH_SEP$PATH &&
git nitfol >actual
) &&
echo frotz >expect &&

View File

@@ -30,7 +30,7 @@ test_expect_success 'setup helper scripts' '
test -z "$pass" || echo password=$pass
EOF
PATH="$PWD:$PATH"
PATH="$PWD$PATH_SEP$PATH"
'
test_expect_success 'credential_fill invokes helper' '

View File

@@ -1738,7 +1738,7 @@ test_expect_success '--show-origin getting a single key' '
test_cmp expect output
'
test_expect_success 'set up custom config file' '
test_expect_success !MINGW 'set up custom config file' '
CUSTOM_CONFIG_FILE="file\" (dq) and spaces.conf" &&
cat >"$CUSTOM_CONFIG_FILE" <<-\EOF
[user]
@@ -1754,7 +1754,7 @@ test_expect_success !MINGW '--show-origin escape special file name characters' '
test_cmp expect output
'
test_expect_success '--show-origin stdin' '
test_expect_success !MINGW '--show-origin stdin' '
cat >expect <<-\EOF &&
standard input: user.custom=true
EOF

View File

@@ -79,9 +79,9 @@ then
GIT_CEILING_DIRECTORIES="$TRASH_ROOT/top/"
test_fail subdir_ceil_at_top_slash
GIT_CEILING_DIRECTORIES=":$TRASH_ROOT/top"
GIT_CEILING_DIRECTORIES="$PATH_SEP$TRASH_ROOT/top"
test_prefix subdir_ceil_at_top_no_resolve "sub/dir/"
GIT_CEILING_DIRECTORIES=":$TRASH_ROOT/top/"
GIT_CEILING_DIRECTORIES="$PATH_SEP$TRASH_ROOT/top/"
test_prefix subdir_ceil_at_top_slash_no_resolve "sub/dir/"
fi
@@ -111,13 +111,13 @@ GIT_CEILING_DIRECTORIES="$TRASH_ROOT/subdi"
test_prefix subdir_ceil_at_subdi_slash "sub/dir/"
GIT_CEILING_DIRECTORIES="/foo:$TRASH_ROOT/sub"
GIT_CEILING_DIRECTORIES="/foo$PATH_SEP$TRASH_ROOT/sub"
test_fail second_of_two
GIT_CEILING_DIRECTORIES="$TRASH_ROOT/sub:/bar"
GIT_CEILING_DIRECTORIES="$TRASH_ROOT/sub$PATH_SEP/bar"
test_fail first_of_two
GIT_CEILING_DIRECTORIES="/foo:$TRASH_ROOT/sub:/bar"
GIT_CEILING_DIRECTORIES="/foo$PATH_SEP$TRASH_ROOT/sub$PATH_SEP/bar"
test_fail second_of_three

View File

@@ -16,7 +16,7 @@ test_cd_to_toplevel () {
test_expect_success $3 "$2" '
(
cd '"'$1'"' &&
PATH="$EXEC_PATH:$PATH" &&
PATH="$EXEC_PATH$PATH_SEP$PATH" &&
. git-sh-setup &&
cd_to_toplevel &&
[ "$(pwd -P)" = "$TOPLEVEL" ]

View File

@@ -26,7 +26,7 @@ test_expect_success 'example 1: notes to add an Acked-by line' '
'
test_expect_success 'example 2: binary notes' '
cp "$TEST_DIRECTORY"/test-binary-1.png . &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png . &&
git checkout B &&
blob=$(git hash-object -w test-binary-1.png) &&
git notes --ref=logo add -C "$blob" &&

View File

@@ -143,7 +143,7 @@ test_expect_success 'rebase -s funny -Xopt' '
git checkout -b test-funny master^ &&
test_commit funny &&
(
PATH=./test-bin:$PATH &&
PATH=./test-bin$PATH_SEP$PATH &&
git rebase -s funny -Xopt master
) &&
test -f funny.was.run

View File

@@ -60,7 +60,7 @@ test_expect_success 'rebase --continue remembers merge strategy and options' '
EOF
chmod +x test-bin/git-merge-funny &&
(
PATH=./test-bin:$PATH &&
PATH=./test-bin$PATH_SEP$PATH &&
test_must_fail git rebase -s funny -Xopt master topic
) &&
test -f funny.was.run &&
@@ -68,7 +68,7 @@ test_expect_success 'rebase --continue remembers merge strategy and options' '
echo "Resolved" >F2 &&
git add F2 &&
(
PATH=./test-bin:$PATH &&
PATH=./test-bin$PATH_SEP$PATH &&
git rebase --continue
) &&
test -f funny.was.run
@@ -92,7 +92,7 @@ test_expect_success 'rebase -i --continue handles merge strategy and options' '
EOF
chmod +x test-bin/git-merge-funny &&
(
PATH=./test-bin:$PATH &&
PATH=./test-bin$PATH_SEP$PATH &&
test_must_fail git rebase -i -s funny -Xopt -Xfoo master topic
) &&
test -f funny.was.run &&
@@ -100,7 +100,7 @@ test_expect_success 'rebase -i --continue handles merge strategy and options' '
echo "Resolved" >F2 &&
git add F2 &&
(
PATH=./test-bin:$PATH &&
PATH=./test-bin$PATH_SEP$PATH &&
git rebase --continue
) &&
test -f funny.was.run

View File

@@ -1084,7 +1084,7 @@ test_expect_success 'stash -- <subdir> works with binary files' '
git reset &&
>subdir/untracked &&
>subdir/tracked &&
cp "$TEST_DIRECTORY"/test-binary-1.png subdir/tracked-binary &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png subdir/tracked-binary &&
git add subdir/tracked* &&
git stash -- subdir/ &&
test_path_is_missing subdir/tracked &&

View File

@@ -19,7 +19,7 @@ test_expect_success 'prepare repository' '
echo AIT >a && echo BIT >b && echo CIT >c && echo DIT >d &&
git update-index --add a b c d &&
echo git >a &&
cat "$TEST_DIRECTORY"/test-binary-1.png >b &&
cat "$TEST_DIRECTORY"/diff-lib/test-binary-1.png >b &&
echo git >c &&
cat b b >d
'

View File

@@ -6,12 +6,12 @@ test_description='rewrite diff'
test_expect_success setup '
cat "$TEST_DIRECTORY"/../COPYING >test &&
cat "$TEST_DIRECTORY"/diff-lib/COPYING >test &&
git add test &&
tr \
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" \
<"$TEST_DIRECTORY"/../COPYING >test &&
<"$TEST_DIRECTORY"/diff-lib/COPYING >test &&
echo "to be deleted" >test2 &&
blob=$(git hash-object test2) &&
blob=$(git rev-parse --short $blob) &&

View File

@@ -7,21 +7,21 @@ test_description='typechange rename detection'
test_expect_success setup '
rm -f foo bar &&
cat "$TEST_DIRECTORY"/../COPYING >foo &&
cat "$TEST_DIRECTORY"/diff-lib/COPYING >foo &&
test_ln_s_add linklink bar &&
git add foo &&
git commit -a -m Initial &&
git tag one &&
git rm -f foo bar &&
cat "$TEST_DIRECTORY"/../COPYING >bar &&
cat "$TEST_DIRECTORY"/diff-lib/COPYING >bar &&
test_ln_s_add linklink foo &&
git add bar &&
git commit -a -m Second &&
git tag two &&
git rm -f foo bar &&
cat "$TEST_DIRECTORY"/../COPYING >foo &&
cat "$TEST_DIRECTORY"/diff-lib/COPYING >foo &&
git add foo &&
git commit -a -m Third &&
git tag three &&
@@ -35,15 +35,15 @@ test_expect_success setup '
# This is purely for sanity check
git rm -f foo bar &&
cat "$TEST_DIRECTORY"/../COPYING >foo &&
cat "$TEST_DIRECTORY"/../Makefile >bar &&
cat "$TEST_DIRECTORY"/diff-lib/COPYING >foo &&
cat "$TEST_DIRECTORY"/diff-lib/README >bar &&
git add foo bar &&
git commit -a -m Fifth &&
git tag five &&
git rm -f foo bar &&
cat "$TEST_DIRECTORY"/../Makefile >foo &&
cat "$TEST_DIRECTORY"/../COPYING >bar &&
cat "$TEST_DIRECTORY"/diff-lib/README >foo &&
cat "$TEST_DIRECTORY"/diff-lib/COPYING >bar &&
git add foo bar &&
git commit -a -m Sixth &&
git tag six

View File

@@ -32,7 +32,7 @@ test_expect_success 'binary changes do not count in lines' '
git reset --hard &&
echo a >a &&
echo c >c &&
cat "$TEST_DIRECTORY"/test-binary-1.png >d &&
cat "$TEST_DIRECTORY"/diff-lib/test-binary-1.png >d &&
cat >expect <<-\EOF &&
a | 1 +
c | 1 +

View File

@@ -45,7 +45,7 @@ test_fix () {
apply_patch --whitespace=fix || return 1
# find touched lines
$DIFF file target | sed -n -e "s/^> //p" >fixed
$DIFF -u file target | sed -n -e "3,\$s/^+//p" >fixed
# the changed lines are all expected to change
fixed_cnt=$(wc -l <fixed)

View File

@@ -39,33 +39,39 @@ check_zip() {
extracted=${dir_with_prefix}a
original=a
test_expect_success UNZIP " extract ZIP archive with EOL conversion" '
test_expect_success !BUSYBOX,UNZIP \
" extract ZIP archive with EOL conversion" '
(mkdir $dir && cd $dir && "$GIT_UNZIP" -a ../$zipfile)
'
test_expect_success UNZIP " validate that text files are converted" "
test_expect_success !BUSYBOX,UNZIP \
" validate that text files are converted" "
test_cmp_bin $extracted/text.cr $extracted/text.crlf &&
test_cmp_bin $extracted/text.cr $extracted/text.lf
"
test_expect_success UNZIP " validate that binary files are unchanged" "
test_expect_success !BUSYBOX,UNZIP \
" validate that binary files are unchanged" "
test_cmp_bin $original/binary.cr $extracted/binary.cr &&
test_cmp_bin $original/binary.crlf $extracted/binary.crlf &&
test_cmp_bin $original/binary.lf $extracted/binary.lf
"
test_expect_success UNZIP " validate that diff files are converted" "
test_expect_success !BUSYBOX,UNZIP \
" validate that diff files are converted" "
test_cmp_bin $extracted/diff.cr $extracted/diff.crlf &&
test_cmp_bin $extracted/diff.cr $extracted/diff.lf
"
test_expect_success UNZIP " validate that -diff files are unchanged" "
test_expect_success !BUSYBOX,UNZIP \
" validate that -diff files are unchanged" "
test_cmp_bin $original/nodiff.cr $extracted/nodiff.cr &&
test_cmp_bin $original/nodiff.crlf $extracted/nodiff.crlf &&
test_cmp_bin $original/nodiff.lf $extracted/nodiff.lf
"
test_expect_success UNZIP " validate that custom diff is unchanged " "
test_expect_success !BUSYBOX,UNZIP \
" validate that custom diff is unchanged " "
test_cmp_bin $original/custom.cr $extracted/custom.cr &&
test_cmp_bin $original/custom.crlf $extracted/custom.crlf &&
test_cmp_bin $original/custom.lf $extracted/custom.lf
@@ -77,7 +83,7 @@ test_expect_success \
'mkdir a &&
echo simple textfile >a/a &&
mkdir a/bin &&
cp /bin/sh a/bin &&
cp "$TEST_DIRECTORY/diff-lib/test-binary-1.png" a/bin &&
printf "text\r" >a/text.cr &&
printf "text\r\n" >a/text.crlf &&
printf "text\n" >a/text.lf &&

View File

@@ -25,7 +25,7 @@ test_expect_success 'setup proxy script' '
write_script proxy <<-\EOF
echo >&2 "proxying for $*"
cmd=$(./proxy-get-cmd)
cmd=$("$PERL_PATH" ./proxy-get-cmd)
echo >&2 "Running $cmd"
exec $cmd
EOF

View File

@@ -8,6 +8,21 @@ repo_is_hardlinked() {
test_line_count = 0 output
}
if test_have_prereq MINGW,BUSYBOX
then
# BusyBox' `find` does not support `-links`. Besides, BusyBox-w32's
# lstat() does not report hard links, just like Git's mingw_lstat()
# (from where BusyBox-w32 got its initial implementation).
repo_is_hardlinked() {
for f in $(find "$1/objects" -type f)
do
"$SYSTEMROOT"/system32/fsutil.exe \
hardlink list $f >links &&
test_line_count -gt 1 links || return 1
done
}
fi
test_expect_success 'preparing origin repository' '
: >file && git add . && git commit -m1 &&
git clone --bare . a.git &&

View File

@@ -38,7 +38,7 @@ test_expect_success 'access alternate via absolute path' '
'
test_expect_success 'access multiple alternates' '
check_obj "$PWD/one.git/objects:$PWD/two.git/objects" <<-EOF
check_obj "$PWD/one.git/objects$PATH_SEP$PWD/two.git/objects" <<-EOF
$one blob
$two blob
EOF
@@ -74,7 +74,7 @@ test_expect_success 'access alternate via relative path (subdir)' '
quoted='"one.git\057objects"'
unquoted='two.git/objects'
test_expect_success 'mix of quoted and unquoted alternates' '
check_obj "$quoted:$unquoted" <<-EOF
check_obj "$quoted$PATH_SEP$unquoted" <<-EOF
$one blob
$two blob
EOF

View File

@@ -85,7 +85,7 @@ test_expect_success 'set up fake git-daemon' '
"$TRASH_DIRECTORY/remote"
EOF
export TRASH_DIRECTORY &&
PATH=$TRASH_DIRECTORY:$PATH
PATH=$TRASH_DIRECTORY$PATH_SEP$PATH
'
test_expect_success 'ext command can connect to git daemon (no vhost)' '

View File

@@ -14,8 +14,23 @@ test_expect_success 'setup repository to clone' '
'
test_proto "host:path" ssh "remote:repo.git"
test_proto "ssh://" ssh "ssh://remote$PWD/remote/repo.git"
test_proto "git+ssh://" ssh "git+ssh://remote$PWD/remote/repo.git"
hostdir="$PWD"
if test_have_prereq MINGW && test "/${PWD#/}" != "$PWD"
then
case "$PWD" in
[A-Za-z]:/*)
hostdir="${PWD#?:}"
;;
*)
skip_all="Unhandled PWD '$PWD'; skipping rest"
test_done
;;
esac
fi
test_proto "ssh://" ssh "ssh://remote$hostdir/remote/repo.git"
test_proto "git+ssh://" ssh "git+ssh://remote$hostdir/remote/repo.git"
# Don't even bother setting up a "-remote" directory, as ssh would generally
# complain about the bogus option rather than completing our request. Our

View File

@@ -221,7 +221,7 @@ test_expect_success "expected conflict markers" "test_cmp expect out"
test_expect_success 'binary files cannot be merged' '
test_must_fail git merge-file -p \
orig.txt "$TEST_DIRECTORY"/test-binary-1.png new1.txt 2> merge.err &&
orig.txt "$TEST_DIRECTORY"/diff-lib/test-binary-1.png new1.txt 2> merge.err &&
grep "Cannot merge binary files" merge.err
'

View File

@@ -6,7 +6,7 @@ test_description='ask merge-recursive to merge binary files'
test_expect_success setup '
cat "$TEST_DIRECTORY"/test-binary-1.png >m &&
cat "$TEST_DIRECTORY"/diff-lib/test-binary-1.png >m &&
git add m &&
git ls-files -s | sed -e "s/ 0 / 1 /" >E1 &&
test_tick &&

View File

@@ -6,7 +6,7 @@ test_description='git mv in subdirs'
test_expect_success \
'prepare reference tree' \
'mkdir path0 path1 &&
cp "$TEST_DIRECTORY"/../COPYING path0/COPYING &&
cp "$TEST_DIRECTORY"/diff-lib/COPYING path0/COPYING &&
git add path0/COPYING &&
git commit -m add -a'
@@ -108,7 +108,7 @@ test_expect_success \
test_expect_success \
'adding another file' \
'cp "$TEST_DIRECTORY"/../README.md path0/README &&
'cp "$TEST_DIRECTORY"/diff-lib/README path0/ &&
git add path0/README &&
git commit -m add2 -a'

View File

@@ -54,7 +54,7 @@ test_expect_success !MINGW,TTY 'LESS and LV envvars set by git-sh-setup' '
sane_unset LESS LV &&
PAGER="env >pager-env.out; wc" &&
export PAGER &&
PATH="$(git --exec-path):$PATH" &&
PATH="$(git --exec-path)$PATH_SEP$PATH" &&
export PATH &&
test_terminal sh -c ". git-sh-setup && git_pager"
) &&
@@ -388,7 +388,7 @@ test_default_pager() {
EOF
chmod +x \$less &&
(
PATH=.:\$PATH &&
PATH=.$PATH_SEP\$PATH &&
export PATH &&
$full_command
) &&

View File

@@ -62,7 +62,7 @@ EOF
test_expect_success 'rename & unmerged setup' '
git rm -f -r . &&
cat "$TEST_DIRECTORY/README" >ONE &&
cat "$TEST_DIRECTORY/diff-lib/README" >ONE &&
git add ONE &&
test_tick &&
git commit -m "One commit with ONE" &&

View File

@@ -18,7 +18,12 @@ GIT_FORCE_UNTRACKED_CACHE=true
export GIT_FORCE_UNTRACKED_CACHE
sync_mtime () {
find . -type d -ls >/dev/null
if test_have_prereq BUSYBOX
then
find . -type d -print0 | xargs -0r ls -ld >/dev/null
else
find . -type d -ls >/dev/null
fi
}
avoid_racy() {

View File

@@ -9,7 +9,7 @@ test_description='git reset should cull empty subdirs'
test_expect_success \
'creating initial files' \
'mkdir path0 &&
cp "$TEST_DIRECTORY"/../COPYING path0/COPYING &&
cp "$TEST_DIRECTORY"/diff-lib/COPYING path0/COPYING &&
git add path0/COPYING &&
git commit -m add -a'
@@ -17,10 +17,10 @@ test_expect_success \
'creating second files' \
'mkdir path1 &&
mkdir path1/path2 &&
cp "$TEST_DIRECTORY"/../COPYING path1/path2/COPYING &&
cp "$TEST_DIRECTORY"/../COPYING path1/COPYING &&
cp "$TEST_DIRECTORY"/../COPYING COPYING &&
cp "$TEST_DIRECTORY"/../COPYING path0/COPYING-TOO &&
cp "$TEST_DIRECTORY"/diff-lib/COPYING path1/path2/COPYING &&
cp "$TEST_DIRECTORY"/diff-lib/COPYING path1/COPYING &&
cp "$TEST_DIRECTORY"/diff-lib/COPYING COPYING &&
cp "$TEST_DIRECTORY"/diff-lib/COPYING path0/COPYING-TOO &&
git add path1/path2/COPYING &&
git add path1/COPYING &&
git add COPYING &&

View File

@@ -23,7 +23,7 @@ test_expect_success 'set up custom strategy' '
EOF
chmod +x git-merge-theirs &&
PATH=.:$PATH &&
PATH=.$PATH_SEP$PATH &&
export PATH
'

View File

@@ -52,7 +52,7 @@ test_expect_success SIMPLEPAGER 'git grep -O' '
EOF
echo grep.h >expect.notless &&
PATH=.:$PATH git grep -O GREP_PATTERN >out &&
PATH=.$PATH_SEP$PATH git grep -O GREP_PATTERN >out &&
{
test_cmp expect.less pager-args ||
test_cmp expect.notless pager-args

View File

@@ -12,7 +12,7 @@ test_expect_success 'setup' '
echo distimdistim was called
EOF
PATH="$PATH:." &&
PATH="$PATH$PATH_SEP." &&
export PATH &&
git commit --allow-empty -m "a single log entry" &&

View File

@@ -19,7 +19,7 @@ then
fi
# Override svnrdump with our simulator
PATH="$HOME:$PATH"
PATH="$HOME$PATH_SEP$PATH"
export PATH PYTHON_PATH GIT_BUILD_DIR
write_script "$HOME/svnrdump" <<\EOF

View File

@@ -11,6 +11,13 @@ if ! test_have_prereq PERL; then
test_done
fi
case "$PWD" in
*:*)
skip_all='cvs would get confused by the colon in `pwd`; skipping tests'
test_done
;;
esac
cvs >/dev/null 2>&1
if test $? -ne 1
then
@@ -55,8 +62,8 @@ test_expect_success \
'mkdir A B C D E F &&
echo hello1 >A/newfile1.txt &&
echo hello2 >B/newfile2.txt &&
cp "$TEST_DIRECTORY"/test-binary-1.png C/newfile3.png &&
cp "$TEST_DIRECTORY"/test-binary-1.png D/newfile4.png &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png C/newfile3.png &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png D/newfile4.png &&
git add A/newfile1.txt &&
git add B/newfile2.txt &&
git add C/newfile3.png &&
@@ -81,8 +88,8 @@ test_expect_success \
rm -f B/newfile2.txt &&
rm -f C/newfile3.png &&
echo Hello5 >E/newfile5.txt &&
cp "$TEST_DIRECTORY"/test-binary-2.png D/newfile4.png &&
cp "$TEST_DIRECTORY"/test-binary-1.png F/newfile6.png &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-2.png D/newfile4.png &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png F/newfile6.png &&
git add E/newfile5.txt &&
git add F/newfile6.png &&
git commit -a -m "Test: Remove, add and update" &&
@@ -170,7 +177,7 @@ test_expect_success \
'mkdir "G g" &&
echo ok then >"G g/with spaces.txt" &&
git add "G g/with spaces.txt" && \
cp "$TEST_DIRECTORY"/test-binary-1.png "G g/with spaces.png" && \
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png "G g/with spaces.png" && \
git add "G g/with spaces.png" &&
git commit -a -m "With spaces" &&
id=$(git rev-list --max-count=1 HEAD) &&
@@ -182,7 +189,8 @@ test_expect_success \
test_expect_success \
'Update file with spaces in file name' \
'echo Ok then >>"G g/with spaces.txt" &&
cat "$TEST_DIRECTORY"/test-binary-1.png >>"G g/with spaces.png" && \
cat "$TEST_DIRECTORY"/diff-lib/test-binary-1.png \
>>"G g/with spaces.png" && \
git add "G g/with spaces.png" &&
git commit -a -m "Update with spaces" &&
id=$(git rev-list --max-count=1 HEAD) &&
@@ -207,7 +215,7 @@ test_expect_success !MINGW \
'mkdir -p Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö &&
echo Foo >Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö/gårdetsågårdet.txt &&
git add Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö/gårdetsågårdet.txt &&
cp "$TEST_DIRECTORY"/test-binary-1.png Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö/gårdetsågårdet.png &&
cp "$TEST_DIRECTORY"/diff-lib/test-binary-1.png Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö/gårdetsågårdet.png &&
git add Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö/gårdetsågårdet.png &&
git commit -a -m "Går det så går det" && \
id=$(git rev-list --max-count=1 HEAD) &&

View File

@@ -66,7 +66,12 @@ test_expect_success 'fast-export master~2..master' '
'
test_expect_success 'iso-8859-1' '
test_lazy_prereq UTF8_ONLY_ENV '
. "$TEST_DIRECTORY"/t3901/8859-1.txt &&
! git var GIT_AUTHOR_IDENT | grep "Áéí"
'
test_expect_success !UTF8_ONLY_ENV 'iso-8859-1' '
git config i18n.commitencoding ISO8859-1 &&
# use author and committer name in ISO-8859-1 to match it.
@@ -82,6 +87,11 @@ test_expect_success 'iso-8859-1' '
grep "Áéí óú" actual)
'
# The subsequent tests validate timestamps, and we may just have skipped a tick
test_have_prereq !UTF8_ONLY_ENV ||
test_tick
test_expect_success 'import/export-marks' '
git checkout -b marks master &&
@@ -196,7 +206,7 @@ GIT_COMMITTER_NAME='C O Mitter'; export GIT_COMMITTER_NAME
test_expect_success 'setup copies' '
git config --unset i18n.commitencoding &&
{ git config --unset i18n.commitencoding || :; } &&
git checkout -b copy rein &&
git mv file file3 &&
git commit -m move1 &&

View File

@@ -198,7 +198,7 @@ test_expect_success 'exit when p4 fails to produce marshaled output' '
EOF
chmod 755 badp4dir/p4 &&
(
PATH="$TRASH_DIRECTORY/badp4dir:$PATH" &&
PATH="$TRASH_DIRECTORY/badp4dir$PATH_SEP$PATH" &&
export PATH &&
test_expect_code 1 git p4 clone --dest="$git" //depot >errs 2>&1
) &&

View File

@@ -126,12 +126,7 @@ invalid_variable_name='${foo.bar}'
actual="$TRASH_DIRECTORY/actual"
if test_have_prereq MINGW
then
ROOT="$(pwd -W)"
else
ROOT="$(pwd)"
fi
ROOT="$(pwd)"
test_expect_success 'setup for __git_find_repo_path/__gitdir tests' '
mkdir -p subdir/subsubdir &&

View File

@@ -742,7 +742,7 @@ test_expect_code () {
# - not all diff versions understand "-u"
test_cmp() {
$GIT_TEST_CMP "$@"
GIT_ALLOC_LIMIT=0 $GIT_TEST_CMP "$@"
}
# test_cmp_bin - helper to compare binary files
@@ -1020,72 +1020,6 @@ test_skip_or_die () {
esac
}
# The following mingw_* functions obey POSIX shell syntax, but are actually
# bash scripts, and are meant to be used only with bash on Windows.
# A test_cmp function that treats LF and CRLF equal and avoids to fork
# diff when possible.
mingw_test_cmp () {
# Read text into shell variables and compare them. If the results
# are different, use regular diff to report the difference.
local test_cmp_a= test_cmp_b=
# When text came from stdin (one argument is '-') we must feed it
# to diff.
local stdin_for_diff=
# Since it is difficult to detect the difference between an
# empty input file and a failure to read the files, we go straight
# to diff if one of the inputs is empty.
if test -s "$1" && test -s "$2"
then
# regular case: both files non-empty
mingw_read_file_strip_cr_ test_cmp_a <"$1"
mingw_read_file_strip_cr_ test_cmp_b <"$2"
elif test -s "$1" && test "$2" = -
then
# read 2nd file from stdin
mingw_read_file_strip_cr_ test_cmp_a <"$1"
mingw_read_file_strip_cr_ test_cmp_b
stdin_for_diff='<<<"$test_cmp_b"'
elif test "$1" = - && test -s "$2"
then
# read 1st file from stdin
mingw_read_file_strip_cr_ test_cmp_a
mingw_read_file_strip_cr_ test_cmp_b <"$2"
stdin_for_diff='<<<"$test_cmp_a"'
fi
test -n "$test_cmp_a" &&
test -n "$test_cmp_b" &&
test "$test_cmp_a" = "$test_cmp_b" ||
eval "diff -u \"\$@\" $stdin_for_diff"
}
# $1 is the name of the shell variable to fill in
mingw_read_file_strip_cr_ () {
# Read line-wise using LF as the line separator
# and use IFS to strip CR.
local line
while :
do
if IFS=$'\r' read -r -d $'\n' line
then
# good
line=$line$'\n'
else
# we get here at EOF, but also if the last line
# was not terminated by LF; in the latter case,
# some text was read
if test -z "$line"
then
# EOF, really
break
fi
fi
eval "$1=\$$1\$line"
done
}
# Like "env FOO=BAR some-program", but run inside a subshell, which means
# it also works for shell functions (though those functions cannot impact
# the environment outside of the test_env invocation).

View File

@@ -15,6 +15,15 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see http://www.gnu.org/licenses/ .
# On Unix/Linux, the path separator is the colon, on other systems it
# may be different, though. On Windows, for example, it is a semicolon.
# If the PATH variable contains semicolons, it is pretty safe to assume
# that the path separator is a semicolon.
case "$PATH" in
*\;*) PATH_SEP=\; ;;
*) PATH_SEP=: ;;
esac
# Test the binaries we have just built. The tests are kept in
# t/ subdirectory and are run in 'trash directory' subdirectory.
if test -z "$TEST_DIRECTORY"
@@ -116,23 +125,18 @@ EDITOR=:
# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets
# deriving from the command substitution clustered with the other
# ones.
unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e '
my @env = keys %ENV;
my $ok = join("|", qw(
TRACE
DEBUG
TEST
.*_TEST
PROVE
VALGRIND
UNZIP
PERF_
CURL_VERBOSE
TRACE_CURL
));
my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
print join("\n", @vars);
')
unset VISUAL EMAIL LANGUAGE COLUMNS $(env | sed -n \
-e '/^GIT_TRACE/d' \
-e '/^GIT_DEBUG/d' \
-e '/^GIT_TEST/d' \
-e '/^GIT_.*_TEST/d' \
-e '/^GIT_PROVE/d' \
-e '/^GIT_VALGRIND/d' \
-e '/^GIT_UNZIP/d' \
-e '/^GIT_PERF_/d' \
-e '/^GIT_CURL_VERBOSE/d' \
-e '/^GIT_TRACE_CURL/d' \
-e 's/^\(GIT_[^=]*\)=.*/\1/p')
unset XDG_CACHE_HOME
unset XDG_CONFIG_HOME
unset GITPERLLIB
@@ -1057,7 +1061,7 @@ then
done
done
IFS=$OLDIFS
PATH=$GIT_VALGRIND/bin:$PATH
PATH=$GIT_VALGRIND/bin$PATH_SEP$PATH
GIT_EXEC_PATH=$GIT_VALGRIND/bin
export GIT_VALGRIND
GIT_VALGRIND_MODE="$valgrind"
@@ -1069,7 +1073,7 @@ elif test -n "$GIT_TEST_INSTALLED"
then
GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) ||
error "Cannot run git from $GIT_TEST_INSTALLED."
PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR/t/helper:$PATH
PATH=$GIT_TEST_INSTALLED$PATH_SEP$GIT_BUILD_DIR/t/helper$PATH_SEP$PATH
GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
else # normal case, use ../bin-wrappers only unless $with_dashes:
if test -n "$no_bin_wrappers"
@@ -1085,12 +1089,12 @@ else # normal case, use ../bin-wrappers only unless $with_dashes:
fi
with_dashes=t
fi
PATH="$git_bin_dir:$PATH"
PATH="$git_bin_dir$PATH_SEP$PATH"
fi
GIT_EXEC_PATH=$GIT_BUILD_DIR
if test -n "$with_dashes"
then
PATH="$GIT_BUILD_DIR:$GIT_BUILD_DIR/t/helper:$PATH"
PATH="$GIT_BUILD_DIR$PATH_SEP$GIT_BUILD_DIR/t/helper$PATH_SEP$PATH"
fi
fi
GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
@@ -1192,17 +1196,30 @@ yes () {
uname_s=$(uname -s)
case $uname_s in
*MINGW*)
# Windows has its own (incompatible) sort and find
sort () {
/usr/bin/sort "$@"
}
find () {
/usr/bin/find "$@"
}
# git sees Windows-style pwd
pwd () {
builtin pwd -W
}
if test -x /usr/bin/sort
then
# Windows has its own (incompatible) sort; override
sort () {
/usr/bin/sort "$@"
}
fi
if test -x /usr/bin/find
then
# Windows has its own (incompatible) find; override
find () {
/usr/bin/find "$@"
}
fi
# On Windows, Git wants Windows paths. But /usr/bin/pwd spits out
# Unix-style paths. At least in Bash, we have a builtin pwd that
# understands the -W option to force "mixed" paths, i.e. with drive
# prefix but still with forward slashes. Let's use that, if available.
if type builtin >/dev/null 2>&1
then
pwd () {
builtin pwd -W
}
fi
# no POSIX permissions
# backslashes in pathspec are converted to '/'
# exec does not inherit the PID
@@ -1210,7 +1227,13 @@ case $uname_s in
test_set_prereq NATIVE_CRLF
test_set_prereq SED_STRIPS_CR
test_set_prereq GREP_STRIPS_CR
GIT_TEST_CMP=mingw_test_cmp
GIT_TEST_CMP="test-tool cmp"
if ! type iconv >/dev/null 2>&1
then
iconv () {
test-tool iconv "$@"
}
fi
;;
*CYGWIN*)
test_set_prereq POSIXPERM
@@ -1353,6 +1376,10 @@ test_lazy_prereq UNZIP '
test $? -ne 127
'
test_lazy_prereq BUSYBOX '
case "$($SHELL --help 2>&1)" in *BusyBox*) true;; *) false;; esac
'
run_with_limited_cmdline () {
(ulimit -s 128 && "$@")
}

View File

@@ -119,10 +119,10 @@ static struct child_process *get_helper(struct transport *transport)
helper->in = -1;
helper->out = -1;
helper->err = 0;
argv_array_pushf(&helper->args, "git-remote-%s", data->name);
argv_array_pushf(&helper->args, "remote-%s", data->name);
argv_array_push(&helper->args, transport->remote->name);
argv_array_push(&helper->args, remove_ext_force(transport->url));
helper->git_cmd = 0;
helper->git_cmd = 1;
helper->silent_exec_failure = 1;
if (have_git_dir())