2008-02-27 22:28:45 +03:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
|
|
|
|
#
|
|
|
|
|
2009-10-31 03:47:47 +03:00
|
|
|
test_description='test WebDAV http-push
|
2008-02-27 22:28:45 +03:00
|
|
|
|
|
|
|
This test runs various sanity checks on http-push.'
|
|
|
|
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
2008-07-07 23:02:50 +04:00
|
|
|
if git http-push > /dev/null 2>&1 || [ $? -eq 128 ]
|
|
|
|
then
|
2010-06-24 21:44:48 +04:00
|
|
|
skip_all="skipping test, USE_CURL_MULTI is not defined"
|
2008-07-07 23:02:50 +04:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2009-10-31 03:47:45 +03:00
|
|
|
LIB_HTTPD_DAV=t
|
|
|
|
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5540'}
|
2008-08-08 13:26:28 +04:00
|
|
|
. "$TEST_DIRECTORY"/lib-httpd.sh
|
2009-10-31 03:47:45 +03:00
|
|
|
ROOT_PATH="$PWD"
|
2009-02-25 11:32:08 +03:00
|
|
|
start_httpd
|
2008-02-27 22:28:45 +03: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 &&
|
2008-08-12 02:34:46 +04:00
|
|
|
mv hooks/post-update.sample hooks/post-update &&
|
2009-10-31 03:47:30 +03:00
|
|
|
ORIG_HEAD=$(git rev-parse --verify HEAD) &&
|
2008-02-27 22:28:45 +03:00
|
|
|
cd - &&
|
2008-07-07 23:02:37 +04:00
|
|
|
mv test_repo.git "$HTTPD_DOCUMENT_ROOT_PATH"
|
2008-02-27 22:28:45 +03:00
|
|
|
'
|
2008-06-14 11:25:56 +04:00
|
|
|
|
2011-12-14 00:17:04 +04: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 17:24:31 +04:00
|
|
|
setup_askpass_helper
|
2011-12-14 00:17:04 +04:00
|
|
|
|
2008-02-27 22:28:45 +03:00
|
|
|
test_expect_success 'clone remote repository' '
|
|
|
|
cd "$ROOT_PATH" &&
|
2009-10-31 03:47:46 +03:00
|
|
|
git clone $HTTPD_URL/dumb/test_repo.git test_repo_clone
|
2008-02-27 22:28:45 +03:00
|
|
|
'
|
|
|
|
|
2009-10-31 03:47:30 +03:00
|
|
|
test_expect_success 'push to remote repository with packed refs' '
|
2008-02-27 22:28:45 +03:00
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
: >path2 &&
|
|
|
|
git add path2 &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m path2 &&
|
2009-01-17 18:41:41 +03:00
|
|
|
HEAD=$(git rev-parse --verify HEAD) &&
|
2008-07-08 01:06:46 +04:00
|
|
|
git push &&
|
2009-01-17 18:41:41 +03:00
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
test $HEAD = $(git rev-parse --verify HEAD))
|
2008-02-27 22:28:45 +03:00
|
|
|
'
|
|
|
|
|
2009-10-31 03:47:31 +03:00
|
|
|
test_expect_success 'push already up-to-date' '
|
2009-10-31 03:47:30 +03:00
|
|
|
git push
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push to remote repository with unpacked refs' '
|
2009-01-17 18:41:41 +03:00
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
rm packed-refs &&
|
2009-10-31 03:47:30 +03:00
|
|
|
git update-ref refs/heads/master $ORIG_HEAD &&
|
|
|
|
git --bare update-server-info) &&
|
2009-01-17 18:41:41 +03:00
|
|
|
git push &&
|
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
test $HEAD = $(git rev-parse --verify HEAD))
|
|
|
|
'
|
|
|
|
|
2009-06-06 12:43:27 +04:00
|
|
|
test_expect_success 'http-push fetches unpacked objects' '
|
2009-06-06 12:43:23 +04:00
|
|
|
cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
|
|
|
"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_unpacked.git &&
|
|
|
|
|
2009-10-31 03:47:46 +03:00
|
|
|
git clone $HTTPD_URL/dumb/test_repo_unpacked.git \
|
2009-06-06 12:43:23 +04: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 &&
|
2009-10-31 03:47:46 +03:00
|
|
|
git push -f -v $HTTPD_URL/dumb/test_repo_unpacked.git master)
|
2009-06-06 12:43:23 +04:00
|
|
|
'
|
|
|
|
|
2009-06-06 12:43:27 +04:00
|
|
|
test_expect_success 'http-push fetches packed objects' '
|
2009-06-06 12:43:24 +04:00
|
|
|
cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
|
|
|
"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_packed.git &&
|
|
|
|
|
2009-10-31 03:47:46 +03:00
|
|
|
git clone $HTTPD_URL/dumb/test_repo_packed.git \
|
2009-06-06 12:43:24 +04: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 16:25:23 +04:00
|
|
|
git remote remove origin &&
|
2009-06-06 12:43:24 +04:00
|
|
|
git reflog expire --expire=0 --all &&
|
|
|
|
git prune &&
|
2009-10-31 03:47:46 +03:00
|
|
|
git push -f -v $HTTPD_URL/dumb/test_repo_packed.git master)
|
2009-06-06 12:43:24 +04:00
|
|
|
'
|
|
|
|
|
2009-01-17 18:41:41 +03:00
|
|
|
test_expect_success 'create and delete remote branch' '
|
2008-02-27 22:28:45 +03: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 19:47:52 +04:00
|
|
|
test_must_fail git show-ref --verify refs/remotes/origin/dev
|
2008-02-27 22:28:45 +03:00
|
|
|
'
|
|
|
|
|
2009-01-17 18:11:51 +03:00
|
|
|
test_expect_success 'MKCOL sends directory names with trailing slashes' '
|
|
|
|
|
|
|
|
! grep "\"MKCOL.*[^/] HTTP/[^ ]*\"" < "$HTTPD_ROOT_PATH"/access.log
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2009-02-27 02:44:40 +03:00
|
|
|
x1="[0-9a-f]"
|
|
|
|
x2="$x1$x1"
|
|
|
|
x5="$x1$x1$x1$x1$x1"
|
|
|
|
x38="$x5$x5$x5$x5$x5$x5$x5$x1$x1$x1"
|
|
|
|
x40="$x38$x2"
|
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 12:52:14 +03:00
|
|
|
|
2009-02-27 02:44:40 +03:00
|
|
|
test_expect_success 'PUT and MOVE sends object to URLs with SHA-1 hash suffix' '
|
2011-08-29 10:42:21 +04:00
|
|
|
sed \
|
|
|
|
-e "s/PUT /OP /" \
|
|
|
|
-e "s/MOVE /OP /" \
|
|
|
|
-e "s|/objects/$x2/${x38}_$x40|WANTED_PATH_REQUEST|" \
|
|
|
|
"$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 12:52:14 +03:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2010-03-02 13:49:26 +03:00
|
|
|
test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
|
|
|
"$ROOT_PATH"/test_repo_clone master
|
|
|
|
|
2011-12-14 04:11:56 +04:00
|
|
|
test_expect_success 'push to password-protected repository (user in URL)' '
|
2011-12-14 00:17:04 +04:00
|
|
|
test_commit pw-user &&
|
2012-08-27 17:24:31 +04:00
|
|
|
set_askpass user@host &&
|
2011-12-14 00:17:04 +04: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 17:24:31 +04:00
|
|
|
test_expect_failure 'user was prompted only once for password' '
|
|
|
|
expect_askpass pass user@host
|
|
|
|
'
|
|
|
|
|
2011-12-14 00:17:04 +04:00
|
|
|
test_expect_failure 'push to password-protected repository (no user in URL)' '
|
|
|
|
test_commit pw-nouser &&
|
2012-08-27 17:24:31 +04:00
|
|
|
set_askpass user@host &&
|
2011-12-14 00:17:04 +04:00
|
|
|
git push "$HTTPD_URL/auth/dumb/test_repo.git" HEAD &&
|
2012-08-27 17:24:31 +04:00
|
|
|
expect_askpass both user@host
|
2011-12-14 00:17:04 +04: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-27 22:28:45 +03:00
|
|
|
stop_httpd
|
|
|
|
|
|
|
|
test_done
|