Skip to content

Commit 7dbb8a1

Browse files
committed
Merge branch 'busybox-w32'
Signed-off-by: Johannes Schindelin <[email protected]>
2 parents 74f406f + f52b2d6 commit 7dbb8a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+369
-121
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*.pm text eol=lf diff=perl
77
*.py text eol=lf diff=python
88
*.bat text eol=crlf
9+
*.png binary
910
CODE_OF_CONDUCT.md -whitespace
1011
/Documentation/**/*.txt text eol=lf
1112
/command-list.txt text eol=lf

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,7 @@ TEST_BUILTINS_OBJS += test-hash-speed.o
819819
TEST_BUILTINS_OBJS += test-hash.o
820820
TEST_BUILTINS_OBJS += test-hashmap.o
821821
TEST_BUILTINS_OBJS += test-hexdump.o
822+
TEST_BUILTINS_OBJS += test-iconv.o
822823
TEST_BUILTINS_OBJS += test-json-writer.o
823824
TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
824825
TEST_BUILTINS_OBJS += test-match-trees.o

compat/mingw.c

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "../repository.h"
2626
#include "win32/fscache.h"
2727
#include "../attr.h"
28+
#include "../string-list.h"
2829

2930
#define HCAST(type, handle) ((type)(intptr_t)handle)
3031

@@ -1734,6 +1735,65 @@ static char *lookup_prog(const char *dir, int dirlen, const char *cmd,
17341735
return NULL;
17351736
}
17361737

1738+
static char *path_lookup(const char *cmd, int exe_only);
1739+
1740+
static char *is_busybox_applet(const char *cmd)
1741+
{
1742+
static struct string_list applets = STRING_LIST_INIT_DUP;
1743+
static char *busybox_path;
1744+
static int busybox_path_initialized;
1745+
1746+
/* Avoid infinite loop */
1747+
if (!strncasecmp(cmd, "busybox", 7) &&
1748+
(!cmd[7] || !strcasecmp(cmd + 7, ".exe")))
1749+
return NULL;
1750+
1751+
if (!busybox_path_initialized) {
1752+
busybox_path = path_lookup("busybox.exe", 1);
1753+
busybox_path_initialized = 1;
1754+
}
1755+
1756+
/* Assume that sh is compiled in... */
1757+
if (!busybox_path || !strcasecmp(cmd, "sh"))
1758+
return xstrdup_or_null(busybox_path);
1759+
1760+
if (!applets.nr) {
1761+
struct child_process cp = CHILD_PROCESS_INIT;
1762+
struct strbuf buf = STRBUF_INIT;
1763+
char *p;
1764+
1765+
strvec_pushl(&cp.args, busybox_path, "--help", NULL);
1766+
1767+
if (capture_command(&cp, &buf, 2048)) {
1768+
string_list_append(&applets, "");
1769+
return NULL;
1770+
}
1771+
1772+
/* parse output */
1773+
p = strstr(buf.buf, "Currently defined functions:\n");
1774+
if (!p) {
1775+
warning("Could not parse output of busybox --help");
1776+
string_list_append(&applets, "");
1777+
return NULL;
1778+
}
1779+
p = strchrnul(p, '\n');
1780+
for (;;) {
1781+
size_t len;
1782+
1783+
p += strspn(p, "\n\t ,");
1784+
len = strcspn(p, "\n\t ,");
1785+
if (!len)
1786+
break;
1787+
p[len] = '\0';
1788+
string_list_insert(&applets, p);
1789+
p = p + len + 1;
1790+
}
1791+
}
1792+
1793+
return string_list_has_string(&applets, cmd) ?
1794+
xstrdup(busybox_path) : NULL;
1795+
}
1796+
17371797
/*
17381798
* Determines the absolute path of cmd using the split path in path.
17391799
* If cmd contains a slash or backslash, no lookup is performed.
@@ -1762,6 +1822,9 @@ static char *path_lookup(const char *cmd, int exe_only)
17621822
path = sep + 1;
17631823
}
17641824

1825+
if (!prog && !isexe)
1826+
prog = is_busybox_applet(cmd);
1827+
17651828
return prog;
17661829
}
17671830

@@ -1965,8 +2028,8 @@ static int is_msys2_sh(const char *cmd)
19652028
}
19662029

19672030
static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaenv,
1968-
const char *dir,
1969-
int prepend_cmd, int fhin, int fhout, int fherr)
2031+
const char *dir, const char *prepend_cmd,
2032+
int fhin, int fhout, int fherr)
19702033
{
19712034
static int restrict_handle_inheritance = -1;
19722035
STARTUPINFOEXW si;
@@ -2057,9 +2120,9 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
20572120
/* concatenate argv, quoting args as we go */
20582121
strbuf_init(&args, 0);
20592122
if (prepend_cmd) {
2060-
char *quoted = (char *)quote_arg(cmd);
2123+
char *quoted = (char *)quote_arg(prepend_cmd);
20612124
strbuf_addstr(&args, quoted);
2062-
if (quoted != cmd)
2125+
if (quoted != prepend_cmd)
20632126
free(quoted);
20642127
}
20652128
for (; *argv; argv++) {
@@ -2218,7 +2281,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
22182281
return (pid_t)pi.dwProcessId;
22192282
}
22202283

2221-
static pid_t mingw_spawnv(const char *cmd, const char **argv, int prepend_cmd)
2284+
static pid_t mingw_spawnv(const char *cmd, const char **argv,
2285+
const char *prepend_cmd)
22222286
{
22232287
return mingw_spawnve_fd(cmd, argv, NULL, NULL, prepend_cmd, 0, 1, 2);
22242288
}
@@ -2246,14 +2310,14 @@ pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **deltaenv,
22462310
pid = -1;
22472311
}
22482312
else {
2249-
pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, 1,
2313+
pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, interpr,
22502314
fhin, fhout, fherr);
22512315
free(iprog);
22522316
}
22532317
argv[0] = argv0;
22542318
}
22552319
else
2256-
pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, 0,
2320+
pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, NULL,
22572321
fhin, fhout, fherr);
22582322
free(prog);
22592323
}
@@ -2278,7 +2342,7 @@ static int try_shell_exec(const char *cmd, char *const *argv)
22782342
argv2[0] = (char *)cmd; /* full path to the script file */
22792343
COPY_ARRAY(&argv2[1], &argv[1], argc);
22802344
exec_id = trace2_exec(prog, (const char **)argv2);
2281-
pid = mingw_spawnv(prog, (const char **)argv2, 1);
2345+
pid = mingw_spawnv(prog, (const char **)argv2, interpr);
22822346
if (pid >= 0) {
22832347
int status;
22842348
if (waitpid(pid, &status, 0) < 0)
@@ -2302,7 +2366,7 @@ int mingw_execv(const char *cmd, char *const *argv)
23022366
int exec_id;
23032367

23042368
exec_id = trace2_exec(cmd, (const char **)argv);
2305-
pid = mingw_spawnv(cmd, (const char **)argv, 0);
2369+
pid = mingw_spawnv(cmd, (const char **)argv, NULL);
23062370
if (pid < 0) {
23072371
trace2_exec_result(exec_id, -1);
23082372
return -1;

config.mak.uname

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,62 @@ ifeq ($(uname_S),MINGW)
754754
ETC_GITCONFIG = ../etc/gitconfig
755755
ETC_GITATTRIBUTES = ../etc/gitattributes
756756
endif
757+
ifeq (i686,$(uname_M))
758+
MINGW_PREFIX := mingw32
759+
endif
760+
ifeq (x86_64,$(uname_M))
761+
MINGW_PREFIX := mingw64
762+
endif
763+
764+
DESTDIR_WINDOWS = $(shell cygpath -aw '$(DESTDIR_SQ)')
765+
DESTDIR_MIXED = $(shell cygpath -am '$(DESTDIR_SQ)')
766+
install-mingit-test-artifacts:
767+
install -m755 -d '$(DESTDIR_SQ)/usr/bin'
768+
printf '%s\n%s\n' >'$(DESTDIR_SQ)/usr/bin/perl' \
769+
"#!/mingw64/bin/busybox sh" \
770+
"exec \"$(shell cygpath -am /usr/bin/perl.exe)\" \"\$$@\""
771+
772+
install -m755 -d '$(DESTDIR_SQ)'
773+
printf '%s%s\n%s\n%s\n%s\n%s\n' >'$(DESTDIR_SQ)/init.bat' \
774+
"PATH=$(DESTDIR_WINDOWS)\\$(MINGW_PREFIX)\\bin;" \
775+
"C:\\WINDOWS;C:\\WINDOWS\\system32" \
776+
"@set GIT_TEST_INSTALLED=$(DESTDIR_MIXED)/$(MINGW_PREFIX)/bin" \
777+
"@`echo "$(DESTDIR_WINDOWS)" | sed 's/:.*/:/'`" \
778+
"@cd `echo "$(DESTDIR_WINDOWS)" | sed 's/^.://'`\\test-git\\t" \
779+
"@echo Now, run 'helper\\test-run-command testsuite'"
780+
781+
install -m755 -d '$(DESTDIR_SQ)/test-git'
782+
sed 's/^\(NO_PERL\|NO_PYTHON\)=.*/\1=YesPlease/' \
783+
<GIT-BUILD-OPTIONS >'$(DESTDIR_SQ)/test-git/GIT-BUILD-OPTIONS'
784+
785+
install -m755 -d '$(DESTDIR_SQ)/test-git/t/helper'
786+
install -m755 $(TEST_PROGRAMS) '$(DESTDIR_SQ)/test-git/t/helper'
787+
(cd t && $(TAR) cf - t[0-9][0-9][0-9][0-9] lib-diff) | \
788+
(cd '$(DESTDIR_SQ)/test-git/t' && $(TAR) xf -)
789+
install -m755 t/t556x_common t/*.sh '$(DESTDIR_SQ)/test-git/t'
790+
791+
install -m755 -d '$(DESTDIR_SQ)/test-git/templates'
792+
(cd templates && $(TAR) cf - blt) | \
793+
(cd '$(DESTDIR_SQ)/test-git/templates' && $(TAR) xf -)
794+
795+
# po/build/locale for t0200
796+
install -m755 -d '$(DESTDIR_SQ)/test-git/po/build/locale'
797+
(cd po/build/locale && $(TAR) cf - .) | \
798+
(cd '$(DESTDIR_SQ)/test-git/po/build/locale' && $(TAR) xf -)
799+
800+
# git-daemon.exe for t5802, git-http-backend.exe for t5560
801+
install -m755 -d '$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
802+
install -m755 git-daemon.exe git-http-backend.exe \
803+
'$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
804+
805+
# git-upload-archive (dashed) for t5000
806+
install -m755 -d '$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
807+
install -m755 git-upload-archive.exe '$(DESTDIR_SQ)/$(MINGW_PREFIX)/bin'
808+
809+
# git-difftool--helper for t7800
810+
install -m755 -d '$(DESTDIR_SQ)/$(MINGW_PREFIX)/libexec/git-core'
811+
install -m755 git-difftool--helper \
812+
'$(DESTDIR_SQ)/$(MINGW_PREFIX)/libexec/git-core'
757813
endif
758814
ifeq ($(uname_S),QNX)
759815
COMPAT_CFLAGS += -DSA_RESTART=0

git-sh-setup.sh

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -292,17 +292,30 @@ create_virtual_base() {
292292
# Platform specific tweaks to work around some commands
293293
case $(uname -s) in
294294
*MINGW*)
295-
# Windows has its own (incompatible) sort and find
296-
sort () {
297-
/usr/bin/sort "$@"
298-
}
299-
find () {
300-
/usr/bin/find "$@"
301-
}
302-
# git sees Windows-style pwd
303-
pwd () {
304-
builtin pwd -W
305-
}
295+
if test -x /usr/bin/sort
296+
then
297+
# Windows has its own (incompatible) sort; override
298+
sort () {
299+
/usr/bin/sort "$@"
300+
}
301+
fi
302+
if test -x /usr/bin/find
303+
then
304+
# Windows has its own (incompatible) find; override
305+
find () {
306+
/usr/bin/find "$@"
307+
}
308+
fi
309+
# On Windows, Git wants Windows paths. But /usr/bin/pwd spits out
310+
# Unix-style paths. At least in Bash, we have a builtin pwd that
311+
# understands the -W option to force "mixed" paths, i.e. with drive
312+
# prefix but still with forward slashes. Let's use that, if available.
313+
if type builtin >/dev/null 2>&1
314+
then
315+
pwd () {
316+
builtin pwd -W
317+
}
318+
fi
306319
is_absolute_path () {
307320
case "$1" in
308321
[/\\]* | [A-Za-z]:*)

t/helper/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ test_tool_sources = [
2929
'test-hash.c',
3030
'test-hashmap.c',
3131
'test-hexdump.c',
32+
'test-iconv.c',
3233
'test-json-writer.c',
3334
'test-lazy-init-name-hash.c',
3435
'test-match-trees.c',

t/helper/test-iconv.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include "test-tool.h"
2+
#include "git-compat-util.h"
3+
#include "strbuf.h"
4+
#include "gettext.h"
5+
#include "parse-options.h"
6+
#include "utf8.h"
7+
8+
int cmd__iconv(int argc, const char **argv)
9+
{
10+
struct strbuf buf = STRBUF_INIT;
11+
char *from = NULL, *to = NULL, *p;
12+
size_t len;
13+
int ret = 0;
14+
const char * const iconv_usage[] = {
15+
N_("test-helper --iconv [<options>]"),
16+
NULL
17+
};
18+
struct option options[] = {
19+
OPT_STRING('f', "from-code", &from, "encoding", "from"),
20+
OPT_STRING('t', "to-code", &to, "encoding", "to"),
21+
OPT_END()
22+
};
23+
24+
argc = parse_options(argc, argv, NULL, options,
25+
iconv_usage, 0);
26+
27+
if (argc > 1 || !from || !to)
28+
usage_with_options(iconv_usage, options);
29+
30+
if (!argc) {
31+
if (strbuf_read(&buf, 0, 2048) < 0)
32+
die_errno("Could not read from stdin");
33+
} else if (strbuf_read_file(&buf, argv[0], 2048) < 0)
34+
die_errno("Could not read from '%s'", argv[0]);
35+
36+
p = reencode_string_len(buf.buf, buf.len, to, from, &len);
37+
if (!p)
38+
die_errno("Could not reencode");
39+
if (write(1, p, len) < 0)
40+
ret = !!error_errno("Could not write %"PRIuMAX" bytes",
41+
(uintmax_t)len);
42+
43+
strbuf_release(&buf);
44+
free(p);
45+
46+
return ret;
47+
}

t/helper/test-tool.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ static struct test_cmd cmds[] = {
3939
{ "hashmap", cmd__hashmap },
4040
{ "hash-speed", cmd__hash_speed },
4141
{ "hexdump", cmd__hexdump },
42+
{ "iconv", cmd__iconv },
4243
{ "json-writer", cmd__json_writer },
4344
{ "lazy-init-name-hash", cmd__lazy_init_name_hash },
4445
{ "match-trees", cmd__match_trees },

t/helper/test-tool.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ int cmd__getcwd(int argc, const char **argv);
3232
int cmd__hashmap(int argc, const char **argv);
3333
int cmd__hash_speed(int argc, const char **argv);
3434
int cmd__hexdump(int argc, const char **argv);
35+
int cmd__iconv(int argc, const char **argv);
3536
int cmd__json_writer(int argc, const char **argv);
3637
int cmd__lazy_init_name_hash(int argc, const char **argv);
3738
int cmd__match_trees(int argc, const char **argv);

t/interop/interop-lib.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
. ../../GIT-BUILD-OPTIONS
55
INTEROP_ROOT=$(pwd)
66
BUILD_ROOT=$INTEROP_ROOT/build
7+
case "$PATH" in
8+
*\;*) PATH_SEP=\; ;;
9+
*) PATH_SEP=: ;;
10+
esac
711

812
build_version () {
913
if test -z "$1"
@@ -57,7 +61,7 @@ wrap_git () {
5761
write_script "$1" <<-EOF
5862
GIT_EXEC_PATH="$2"
5963
export GIT_EXEC_PATH
60-
PATH="$2:\$PATH"
64+
PATH="$2$PATH_SEP\$PATH"
6165
export GIT_EXEC_PATH
6266
exec git "\$@"
6367
EOF
@@ -71,7 +75,7 @@ generate_wrappers () {
7175
echo >&2 fatal: test tried to run generic git: $*
7276
exit 1
7377
EOF
74-
PATH=$(pwd)/.bin:$PATH
78+
PATH=$(pwd)/.bin$PATH_SEP$PATH
7579
}
7680

7781
VERSION_A=${GIT_TEST_VERSION_A:-$VERSION_A}
File renamed without changes.
File renamed without changes.

t/lib-proto-disable.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ setup_ext_wrapper () {
214214
cd "$TRASH_DIRECTORY/remote" &&
215215
eval "$*"
216216
EOF
217-
PATH=$TRASH_DIRECTORY:$PATH &&
217+
PATH=$TRASH_DIRECTORY$PATH_SEP$PATH &&
218218
export TRASH_DIRECTORY
219219
'
220220
}

t/t0014-alias.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ test_expect_success 'looping aliases - internal execution' '
3939

4040
test_expect_success 'run-command formats empty args properly' '
4141
test_must_fail env GIT_TRACE=1 git frotz a "" b " " c 2>actual.raw &&
42-
sed -ne "/run_command:/s/.*trace: run_command: //p" actual.raw >actual &&
42+
sed -ne "/run_command: git-frotz/s/.*trace: run_command: //p" actual.raw >actual &&
4343
echo "git-frotz a '\'''\'' b '\'' '\'' c" >expect &&
4444
test_cmp expect actual
4545
'

0 commit comments

Comments
 (0)