2008-02-28 03:28:45 +08:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
|
|
|
|
#
|
|
|
|
|
2009-10-31 08:47:47 +08:00
|
|
|
test_description='test WebDAV http-push
|
2008-02-28 03:28:45 +08:00
|
|
|
|
|
|
|
This test runs various sanity checks on http-push.'
|
|
|
|
|
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
|
|
|
|
|
2008-02-28 03:28:45 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2008-07-08 03:02:50 +08:00
|
|
|
if git http-push > /dev/null 2>&1 || [ $? -eq 128 ]
|
|
|
|
then
|
2010-06-25 01:44:48 +08:00
|
|
|
skip_all="skipping test, USE_CURL_MULTI is not defined"
|
2008-07-08 03:02:50 +08:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2021-12-22 18:59:41 +08:00
|
|
|
if test_have_prereq !REFFILES
|
|
|
|
then
|
|
|
|
skip_all='skipping test; dumb HTTP protocol not supported with reftable.'
|
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2009-10-31 08:47:45 +08:00
|
|
|
LIB_HTTPD_DAV=t
|
2008-08-08 17:26:28 +08:00
|
|
|
. "$TEST_DIRECTORY"/lib-httpd.sh
|
2009-10-31 08:47:45 +08:00
|
|
|
ROOT_PATH="$PWD"
|
2009-02-25 16:32:08 +08:00
|
|
|
start_httpd
|
2008-02-28 03:28:45 +08:00
|
|
|
|
|
|
|
test_expect_success 'setup remote repository' '
|
|
|
|
cd "$ROOT_PATH" &&
|
|
|
|
mkdir test_repo &&
|
|
|
|
cd test_repo &&
|
|
|
|
git init &&
|
|
|
|
: >path1 &&
|
|
|
|
git add path1 &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m initial &&
|
|
|
|
cd - &&
|
|
|
|
git clone --bare test_repo test_repo.git &&
|
|
|
|
cd test_repo.git &&
|
|
|
|
git --bare update-server-info &&
|
2022-03-17 18:13:08 +08:00
|
|
|
test_hook --setup post-update <<-\EOF &&
|
|
|
|
exec git update-server-info
|
|
|
|
EOF
|
2009-10-31 08:47:30 +08:00
|
|
|
ORIG_HEAD=$(git rev-parse --verify HEAD) &&
|
2008-02-28 03:28:45 +08:00
|
|
|
cd - &&
|
2008-07-08 03:02:37 +08:00
|
|
|
mv test_repo.git "$HTTPD_DOCUMENT_ROOT_PATH"
|
2008-02-28 03:28:45 +08:00
|
|
|
'
|
2008-06-14 15:25:56 +08:00
|
|
|
|
2011-12-14 04:17:04 +08:00
|
|
|
test_expect_success 'create password-protected repository' '
|
|
|
|
mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb" &&
|
|
|
|
cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
|
|
|
"$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git"
|
|
|
|
'
|
|
|
|
|
2012-08-27 21:24:31 +08:00
|
|
|
setup_askpass_helper
|
2011-12-14 04:17:04 +08:00
|
|
|
|
2008-02-28 03:28:45 +08:00
|
|
|
test_expect_success 'clone remote repository' '
|
|
|
|
cd "$ROOT_PATH" &&
|
2009-10-31 08:47:46 +08:00
|
|
|
git clone $HTTPD_URL/dumb/test_repo.git test_repo_clone
|
2008-02-28 03:28:45 +08:00
|
|
|
'
|
|
|
|
|
2009-10-31 08:47:30 +08:00
|
|
|
test_expect_success 'push to remote repository with packed refs' '
|
2008-02-28 03:28:45 +08:00
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
: >path2 &&
|
|
|
|
git add path2 &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m path2 &&
|
2009-01-17 23:41:41 +08:00
|
|
|
HEAD=$(git rev-parse --verify HEAD) &&
|
2008-07-08 05:06:46 +08:00
|
|
|
git push &&
|
2009-01-17 23:41:41 +08:00
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
test $HEAD = $(git rev-parse --verify HEAD))
|
2008-02-28 03:28:45 +08:00
|
|
|
'
|
|
|
|
|
2009-10-31 08:47:31 +08:00
|
|
|
test_expect_success 'push already up-to-date' '
|
2009-10-31 08:47:30 +08:00
|
|
|
git push
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push to remote repository with unpacked refs' '
|
2009-01-17 23:41:41 +08:00
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
rm packed-refs &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git update-ref refs/heads/main $ORIG_HEAD &&
|
2009-10-31 08:47:30 +08:00
|
|
|
git --bare update-server-info) &&
|
2009-01-17 23:41:41 +08:00
|
|
|
git push &&
|
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
test $HEAD = $(git rev-parse --verify HEAD))
|
|
|
|
'
|
|
|
|
|
2009-06-06 16:43:27 +08:00
|
|
|
test_expect_success 'http-push fetches unpacked objects' '
|
2009-06-06 16:43:23 +08:00
|
|
|
cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
|
|
|
"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_unpacked.git &&
|
|
|
|
|
2009-10-31 08:47:46 +08:00
|
|
|
git clone $HTTPD_URL/dumb/test_repo_unpacked.git \
|
2009-06-06 16:43:23 +08:00
|
|
|
"$ROOT_PATH"/fetch_unpacked &&
|
|
|
|
|
|
|
|
# By reset, we force git to retrieve the object
|
|
|
|
(cd "$ROOT_PATH"/fetch_unpacked &&
|
|
|
|
git reset --hard HEAD^ &&
|
|
|
|
git remote rm origin &&
|
|
|
|
git reflog expire --expire=0 --all &&
|
|
|
|
git prune &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git push -f -v $HTTPD_URL/dumb/test_repo_unpacked.git main)
|
2009-06-06 16:43:23 +08:00
|
|
|
'
|
|
|
|
|
2009-06-06 16:43:27 +08:00
|
|
|
test_expect_success 'http-push fetches packed objects' '
|
2009-06-06 16:43:24 +08:00
|
|
|
cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
|
|
|
"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_packed.git &&
|
|
|
|
|
2009-10-31 08:47:46 +08:00
|
|
|
git clone $HTTPD_URL/dumb/test_repo_packed.git \
|
2009-06-06 16:43:24 +08:00
|
|
|
"$ROOT_PATH"/test_repo_clone_packed &&
|
|
|
|
|
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_packed.git &&
|
|
|
|
git --bare repack &&
|
|
|
|
git --bare prune-packed) &&
|
|
|
|
|
|
|
|
# By reset, we force git to retrieve the packed object
|
|
|
|
(cd "$ROOT_PATH"/test_repo_clone_packed &&
|
|
|
|
git reset --hard HEAD^ &&
|
2012-09-06 20:25:23 +08:00
|
|
|
git remote remove origin &&
|
2009-06-06 16:43:24 +08:00
|
|
|
git reflog expire --expire=0 --all &&
|
|
|
|
git prune &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git push -f -v $HTTPD_URL/dumb/test_repo_packed.git main)
|
2009-06-06 16:43:24 +08:00
|
|
|
'
|
|
|
|
|
2009-01-17 23:41:41 +08:00
|
|
|
test_expect_success 'create and delete remote branch' '
|
2008-02-28 03:28:45 +08:00
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
git checkout -b dev &&
|
|
|
|
: >path3 &&
|
|
|
|
git add path3 &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m dev &&
|
|
|
|
git push origin dev &&
|
|
|
|
git push origin :dev &&
|
2008-07-12 23:47:52 +08:00
|
|
|
test_must_fail git show-ref --verify refs/remotes/origin/dev
|
2008-02-28 03:28:45 +08:00
|
|
|
'
|
|
|
|
|
http-push: ensure unforced pushes fail when data would be lost
When we push using the DAV-based protocol, the client is the one that
performs the ref updates and therefore makes the checks to see whether
an unforced push should be allowed. We make this check by determining
if either (a) we lack the object file for the old value of the ref or
(b) the new value of the ref is not newer than the old value, and in
either case, reject the push.
However, the ref_newer function, which performs this latter check, has
an odd behavior due to the reuse of certain object flags. Specifically,
it will incorrectly return false in its first invocation and then
correctly return true on a subsequent invocation. This occurs because
the object flags used by http-push.c are the same as those used by
commit-reach.c, which implements ref_newer, and one piece of code
misinterprets the flags set by the other.
Note that this does not occur in all cases. For example, if the example
used in the tests is changed to use one repository instead of two and
rewind the head to add a commit, the test passes and we correctly reject
the push. However, the example provided does trigger this behavior, and
the code has been broken in this way since at least Git 2.0.0.
To solve this problem, let's move the two sets of object flags so that
they don't overlap, since we're clearly using them at the same time.
The new set should not conflict with other usage because other users are
either builtin code (which is not compiled into git http-push) or
upload-pack (which we similarly do not use here).
Reported-by: Michael Ward <mward@smartsoftwareinc.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-06-24 05:52:20 +08:00
|
|
|
test_expect_success 'non-force push fails if not up to date' '
|
|
|
|
git init --bare "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_conflict.git &&
|
|
|
|
git -C "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_conflict.git update-server-info &&
|
|
|
|
git clone $HTTPD_URL/dumb/test_repo_conflict.git "$ROOT_PATH"/c1 &&
|
|
|
|
git clone $HTTPD_URL/dumb/test_repo_conflict.git "$ROOT_PATH"/c2 &&
|
|
|
|
test_commit -C "$ROOT_PATH/c1" path1 &&
|
|
|
|
git -C "$ROOT_PATH/c1" push origin HEAD &&
|
|
|
|
git -C "$ROOT_PATH/c2" pull &&
|
|
|
|
test_commit -C "$ROOT_PATH/c1" path2 &&
|
|
|
|
git -C "$ROOT_PATH/c1" push origin HEAD &&
|
|
|
|
test_commit -C "$ROOT_PATH/c2" path3 &&
|
|
|
|
git -C "$ROOT_PATH/c1" log --graph --all &&
|
|
|
|
git -C "$ROOT_PATH/c2" log --graph --all &&
|
|
|
|
test_must_fail git -C "$ROOT_PATH/c2" push origin HEAD
|
|
|
|
'
|
|
|
|
|
2009-01-17 23:11:51 +08:00
|
|
|
test_expect_success 'MKCOL sends directory names with trailing slashes' '
|
|
|
|
|
|
|
|
! grep "\"MKCOL.*[^/] HTTP/[^ ]*\"" < "$HTTPD_ROOT_PATH"/access.log
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2009-02-27 07:44:40 +08:00
|
|
|
x1="[0-9a-f]"
|
|
|
|
x2="$x1$x1"
|
2019-12-22 03:49:33 +08:00
|
|
|
xtrunc=$(echo $OID_REGEX | sed -e "s/\[0-9a-f\]\[0-9a-f\]//")
|
use a hash of the lock token as the suffix for PUT/MOVE
After 753bc91 ("Remove the requirement opaquelocktoken uri scheme"),
lock tokens are in the URI forms in which they are received from the
server, eg. 'opaquelocktoken:', 'urn:uuid:'.
However, "start_put" (and consequently "start_move"), which attempts to
create a unique temporary file using the UUID of the lock token,
inadvertently uses the lock token in its URI form. These file
operations on the server may not be successful (specifically, in
Windows), due to the colon ':' character from the URI form of the lock
token in the file path.
This patch uses a hash of the lock token instead, guaranteeing only
"safe" characters (a-f, 0-9) are used in the file path.
The token's hash is generated when the lock token is received from the
server in handle_new_lock_ctx, minimizing the number of times of
hashing.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-02-14 17:52:14 +08:00
|
|
|
|
2009-02-27 07:44:40 +08:00
|
|
|
test_expect_success 'PUT and MOVE sends object to URLs with SHA-1 hash suffix' '
|
2011-08-29 14:42:21 +08:00
|
|
|
sed \
|
|
|
|
-e "s/PUT /OP /" \
|
|
|
|
-e "s/MOVE /OP /" \
|
2019-12-22 03:49:33 +08:00
|
|
|
-e "s|/objects/$x2/${xtrunc}_$OID_REGEX|WANTED_PATH_REQUEST|" \
|
2011-08-29 14:42:21 +08:00
|
|
|
"$HTTPD_ROOT_PATH"/access.log |
|
|
|
|
grep -e "\"OP .*WANTED_PATH_REQUEST HTTP/[.0-9]*\" 20[0-9] "
|
use a hash of the lock token as the suffix for PUT/MOVE
After 753bc91 ("Remove the requirement opaquelocktoken uri scheme"),
lock tokens are in the URI forms in which they are received from the
server, eg. 'opaquelocktoken:', 'urn:uuid:'.
However, "start_put" (and consequently "start_move"), which attempts to
create a unique temporary file using the UUID of the lock token,
inadvertently uses the lock token in its URI form. These file
operations on the server may not be successful (specifically, in
Windows), due to the colon ':' character from the URI form of the lock
token in the file path.
This patch uses a hash of the lock token instead, guaranteeing only
"safe" characters (a-f, 0-9) are used in the file path.
The token's hash is generated when the lock token is received from the
server in handle_new_lock_ctx, minimizing the number of times of
hashing.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-02-14 17:52:14 +08:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2010-03-02 18:49:26 +08:00
|
|
|
test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
2020-11-19 07:44:34 +08:00
|
|
|
"$ROOT_PATH"/test_repo_clone main
|
2010-03-02 18:49:26 +08:00
|
|
|
|
2011-12-14 08:11:56 +08:00
|
|
|
test_expect_success 'push to password-protected repository (user in URL)' '
|
2011-12-14 04:17:04 +08:00
|
|
|
test_commit pw-user &&
|
2014-01-02 15:38:35 +08:00
|
|
|
set_askpass user@host pass@host &&
|
2011-12-14 04:17:04 +08:00
|
|
|
git push "$HTTPD_URL_USER/auth/dumb/test_repo.git" HEAD &&
|
|
|
|
git rev-parse --verify HEAD >expect &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" \
|
|
|
|
rev-parse --verify HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2012-08-27 21:24:31 +08:00
|
|
|
test_expect_failure 'user was prompted only once for password' '
|
|
|
|
expect_askpass pass user@host
|
|
|
|
'
|
|
|
|
|
2011-12-14 04:17:04 +08:00
|
|
|
test_expect_failure 'push to password-protected repository (no user in URL)' '
|
|
|
|
test_commit pw-nouser &&
|
2014-01-02 15:38:35 +08:00
|
|
|
set_askpass user@host pass@host &&
|
2011-12-14 04:17:04 +08:00
|
|
|
git push "$HTTPD_URL/auth/dumb/test_repo.git" HEAD &&
|
2015-03-20 18:06:15 +08:00
|
|
|
expect_askpass both user@host &&
|
2011-12-14 04:17:04 +08:00
|
|
|
git rev-parse --verify HEAD >expect &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" \
|
|
|
|
rev-parse --verify HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2008-02-28 03:28:45 +08:00
|
|
|
test_done
|