2017-01-02 18:40:20 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
2017-05-30 04:25:25 +08:00
|
|
|
test_description='various Windows-only path tests'
|
2020-11-19 07:44:34 +08:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 07:44:19 +08:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2021-10-12 21:56:44 +08:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2017-01-02 18:40:20 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2017-10-31 21:19:03 +08:00
|
|
|
if test_have_prereq CYGWIN
|
|
|
|
then
|
|
|
|
alias winpwd='cygpath -aw .'
|
|
|
|
elif test_have_prereq MINGW
|
|
|
|
then
|
|
|
|
alias winpwd=pwd
|
|
|
|
else
|
2017-05-30 04:25:25 +08:00
|
|
|
skip_all='skipping Windows-only path tests'
|
2017-01-02 18:40:20 +08:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2017-10-31 21:19:03 +08:00
|
|
|
UNCPATH="$(winpwd)"
|
2017-01-02 18:40:20 +08:00
|
|
|
case "$UNCPATH" in
|
|
|
|
[A-Z]:*)
|
|
|
|
# Use administrative share e.g. \\localhost\C$\git-sdk-64\usr\src\git
|
|
|
|
# (we use forward slashes here because MSYS2 and Git accept them, and
|
|
|
|
# they are easier on the eyes)
|
|
|
|
UNCPATH="//localhost/${UNCPATH%%:*}\$/${UNCPATH#?:}"
|
|
|
|
test -d "$UNCPATH" || {
|
|
|
|
skip_all='could not access administrative share; skipping'
|
|
|
|
test_done
|
|
|
|
}
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
skip_all='skipping UNC path tests, cannot determine current path as UNC'
|
|
|
|
test_done
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
test_expect_success setup '
|
|
|
|
test_commit initial
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success clone '
|
|
|
|
git clone "file://$UNCPATH" clone
|
|
|
|
'
|
|
|
|
|
2020-02-14 05:51:44 +08:00
|
|
|
test_expect_success 'clone without file://' '
|
|
|
|
git clone "$UNCPATH" clone-without-file
|
|
|
|
'
|
|
|
|
|
mingw: special-case arguments to `sh`
The MSYS2 runtime does its best to emulate the command-line wildcard
expansion and de-quoting which would be performed by the calling Unix
shell on Unix systems.
Those Unix shell quoting rules differ from the quoting rules applying to
Windows' cmd and Powershell, making it a little awkward to quote
command-line parameters properly when spawning other processes.
In particular, git.exe passes arguments to subprocesses that are *not*
intended to be interpreted as wildcards, and if they contain
backslashes, those are not to be interpreted as escape characters, e.g.
when passing Windows paths.
Note: this is only a problem when calling MSYS2 executables, not when
calling MINGW executables such as git.exe. However, we do call MSYS2
executables frequently, most notably when setting the use_shell flag in
the child_process structure.
There is no elegant way to determine whether the .exe file to be
executed is an MSYS2 program or a MINGW one. But since the use case of
passing a command line through the shell is so prevalent, we need to
work around this issue at least when executing sh.exe.
Let's introduce an ugly, hard-coded test whether argv[0] is "sh", and
whether it refers to the MSYS2 Bash, to determine whether we need to
quote the arguments differently than usual.
That still does not fix the issue completely, but at least it is
something.
Incidentally, this also fixes the problem where `git clone \\server\repo`
failed due to incorrect handling of the backslashes when handing the path
to the git-upload-pack process.
Further, we need to take care to quote not only whitespace and
backslashes, but also curly brackets. As aliases frequently go through
the MSYS2 Bash, and as aliases frequently get parameters such as
HEAD@{yesterday}, this is really important. As an early version of this
patch broke this, let's make sure that this does not regress by adding a
test case for that.
Helped-by: Kim Gybels <kgybels@infogroep.be>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-01-18 04:14:48 +08:00
|
|
|
test_expect_success 'clone with backslashed path' '
|
2019-01-18 04:14:47 +08:00
|
|
|
BACKSLASHED="$(echo "$UNCPATH" | tr / \\\\)" &&
|
|
|
|
git clone "$BACKSLASHED" backslashed
|
|
|
|
'
|
|
|
|
|
2020-02-14 05:51:44 +08:00
|
|
|
test_expect_success fetch '
|
|
|
|
git init to-fetch &&
|
|
|
|
(
|
|
|
|
cd to-fetch &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git fetch "$UNCPATH" main
|
2020-02-14 05:51:44 +08:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2017-01-02 18:40:20 +08:00
|
|
|
test_expect_success push '
|
|
|
|
(
|
|
|
|
cd clone &&
|
|
|
|
git checkout -b to-push &&
|
|
|
|
test_commit to-push &&
|
|
|
|
git push origin HEAD
|
|
|
|
) &&
|
|
|
|
rev="$(git -C clone rev-parse --verify refs/heads/to-push)" &&
|
|
|
|
test "$rev" = "$(git rev-parse --verify refs/heads/to-push)"
|
|
|
|
'
|
|
|
|
|
2017-10-31 21:19:03 +08:00
|
|
|
test_expect_success MINGW 'remote nick cannot contain backslashes' '
|
|
|
|
BACKSLASHED="$(winpwd | tr / \\\\)" &&
|
2019-12-19 02:12:05 +08:00
|
|
|
git ls-remote "$BACKSLASHED" 2>err &&
|
2017-05-30 04:25:25 +08:00
|
|
|
test_i18ngrep ! "unable to access" err
|
|
|
|
'
|
|
|
|
|
2019-02-25 22:17:45 +08:00
|
|
|
test_expect_success 'unc alternates' '
|
|
|
|
tree="$(git rev-parse HEAD:)" &&
|
|
|
|
mkdir test-unc-alternate &&
|
|
|
|
(
|
|
|
|
cd test-unc-alternate &&
|
|
|
|
git init &&
|
|
|
|
test_must_fail git show $tree &&
|
|
|
|
echo "$UNCPATH/.git/objects" >.git/objects/info/alternates &&
|
|
|
|
git show $tree
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2017-01-02 18:40:20 +08:00
|
|
|
test_done
|