2009-10-31 03:47:47 +03:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='test smart pushing over http via http-backend'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
if test -n "$NO_CURL"; then
|
2010-06-24 21:44:48 +04:00
|
|
|
skip_all='skipping test, git built without http support'
|
2009-10-31 03:47:47 +03:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
|
|
|
ROOT_PATH="$PWD"
|
2014-09-16 01:59:00 +04:00
|
|
|
. "$TEST_DIRECTORY"/lib-gpg.sh
|
2009-10-31 03:47:47 +03:00
|
|
|
. "$TEST_DIRECTORY"/lib-httpd.sh
|
2012-01-09 01:06:21 +04:00
|
|
|
. "$TEST_DIRECTORY"/lib-terminal.sh
|
2009-10-31 03:47:47 +03:00
|
|
|
start_httpd
|
|
|
|
|
|
|
|
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 config http.receivepack true &&
|
2012-03-30 11:01:30 +04:00
|
|
|
git config core.logallrefupdates true &&
|
2009-10-31 03:47:47 +03:00
|
|
|
ORIG_HEAD=$(git rev-parse --verify HEAD) &&
|
|
|
|
cd - &&
|
|
|
|
mv test_repo.git "$HTTPD_DOCUMENT_ROOT_PATH"
|
|
|
|
'
|
|
|
|
|
2012-08-27 17:25:36 +04:00
|
|
|
setup_askpass_helper
|
|
|
|
|
2010-04-08 06:15:16 +04:00
|
|
|
cat >exp <<EOF
|
|
|
|
GET /smart/test_repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
|
|
|
|
POST /smart/test_repo.git/git-upload-pack HTTP/1.1 200
|
|
|
|
EOF
|
2010-04-08 06:15:18 +04:00
|
|
|
test_expect_success 'no empty path components' '
|
2010-04-08 06:15:16 +04:00
|
|
|
# In the URL, add a trailing slash, and see if git appends yet another
|
|
|
|
# slash.
|
2009-10-31 03:47:47 +03:00
|
|
|
cd "$ROOT_PATH" &&
|
2010-04-08 06:15:16 +04:00
|
|
|
git clone $HTTPD_URL/smart/test_repo.git/ test_repo_clone &&
|
|
|
|
|
|
|
|
sed -e "
|
|
|
|
s/^.* \"//
|
|
|
|
s/\"//
|
|
|
|
s/ [1-9][0-9]*\$//
|
|
|
|
s/^GET /GET /
|
|
|
|
" >act <"$HTTPD_ROOT_PATH"/access.log &&
|
|
|
|
|
|
|
|
# Clear the log, so that it does not affect the "used receive-pack
|
|
|
|
# service" test which reads the log too.
|
|
|
|
#
|
|
|
|
# We do this before the actual comparison to ensure the log is cleared.
|
|
|
|
echo > "$HTTPD_ROOT_PATH"/access.log &&
|
|
|
|
|
|
|
|
test_cmp exp act
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'clone remote repository' '
|
|
|
|
rm -rf test_repo_clone &&
|
2012-06-24 15:01:37 +04:00
|
|
|
git clone $HTTPD_URL/smart/test_repo.git test_repo_clone &&
|
|
|
|
(
|
|
|
|
cd test_repo_clone && git config push.default matching
|
|
|
|
)
|
2009-10-31 03:47:47 +03:00
|
|
|
'
|
|
|
|
|
2011-05-04 21:19:50 +04:00
|
|
|
test_expect_success 'push to remote repository (standard)' '
|
2009-10-31 03:47:47 +03:00
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
: >path2 &&
|
|
|
|
git add path2 &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m path2 &&
|
|
|
|
HEAD=$(git rev-parse --verify HEAD) &&
|
2011-05-04 21:19:50 +04:00
|
|
|
GIT_CURL_VERBOSE=1 git push -v -v 2>err &&
|
|
|
|
! grep "Expect: 100-continue" err &&
|
|
|
|
grep "POST git-receive-pack ([0-9]* bytes)" err &&
|
2009-10-31 03:47:47 +03:00
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
test $HEAD = $(git rev-parse --verify HEAD))
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push already up-to-date' '
|
|
|
|
git push
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'create and delete remote branch' '
|
|
|
|
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 &&
|
|
|
|
test_must_fail git show-ref --verify refs/remotes/origin/dev
|
|
|
|
'
|
|
|
|
|
remote-curl: Fix push status report when all branches fail
The protocol between transport-helper.c and remote-curl requires
remote-curl to always print a blank line after the push command
has run. If the blank line is ommitted, transport-helper kills its
container process (the git push the user started) with exit(128)
and no message indicating a problem, assuming the helper already
printed reasonable error text to the console.
However if the remote rejects all branches with "ng" commands in the
report-status reply, send-pack terminates with non-zero status, and
in turn remote-curl exited with non-zero status before outputting
the blank line after the helper status printed by send-pack. No
error messages reach the user.
This caused users to see the following from git push over HTTP
when the remote side's update hook rejected the branch:
$ git push http://... master
Counting objects: 4, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 301 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
$
Always print a blank line after the send-pack process terminates,
ensuring the helper status report (if it was output) will be
correctly parsed by the calling transport-helper.c. This ensures
the helper doesn't abort before the status report can be shown to
the user.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-01-20 07:12:09 +04:00
|
|
|
cat >"$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git/hooks/update" <<EOF
|
|
|
|
#!/bin/sh
|
|
|
|
exit 1
|
|
|
|
EOF
|
|
|
|
chmod a+x "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git/hooks/update"
|
|
|
|
|
|
|
|
cat >exp <<EOF
|
|
|
|
remote: error: hook declined to update refs/heads/dev2
|
|
|
|
To http://127.0.0.1:$LIB_HTTPD_PORT/smart/test_repo.git
|
|
|
|
! [remote rejected] dev2 -> dev2 (hook declined)
|
2012-02-14 00:17:14 +04:00
|
|
|
error: failed to push some refs to 'http://127.0.0.1:$LIB_HTTPD_PORT/smart/test_repo.git'
|
remote-curl: Fix push status report when all branches fail
The protocol between transport-helper.c and remote-curl requires
remote-curl to always print a blank line after the push command
has run. If the blank line is ommitted, transport-helper kills its
container process (the git push the user started) with exit(128)
and no message indicating a problem, assuming the helper already
printed reasonable error text to the console.
However if the remote rejects all branches with "ng" commands in the
report-status reply, send-pack terminates with non-zero status, and
in turn remote-curl exited with non-zero status before outputting
the blank line after the helper status printed by send-pack. No
error messages reach the user.
This caused users to see the following from git push over HTTP
when the remote side's update hook rejected the branch:
$ git push http://... master
Counting objects: 4, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 301 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
$
Always print a blank line after the send-pack process terminates,
ensuring the helper status report (if it was output) will be
correctly parsed by the calling transport-helper.c. This ensures
the helper doesn't abort before the status report can be shown to
the user.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-01-20 07:12:09 +04:00
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'rejected update prints status' '
|
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
git checkout -b dev2 &&
|
|
|
|
: >path4 &&
|
|
|
|
git add path4 &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m dev2 &&
|
|
|
|
test_must_fail git push origin dev2 2>act &&
|
|
|
|
sed -e "/^remote: /s/ *$//" <act >cmp &&
|
|
|
|
test_cmp exp cmp
|
|
|
|
'
|
|
|
|
rm -f "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git/hooks/update"
|
|
|
|
|
2009-10-31 03:47:47 +03:00
|
|
|
cat >exp <<EOF
|
2010-04-08 06:15:16 +04:00
|
|
|
|
2009-10-31 03:47:47 +03:00
|
|
|
GET /smart/test_repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
|
|
|
|
POST /smart/test_repo.git/git-upload-pack HTTP/1.1 200
|
|
|
|
GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
|
|
|
|
POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200
|
|
|
|
GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
|
|
|
|
GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
|
|
|
|
POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200
|
|
|
|
GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
|
|
|
|
POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200
|
remote-curl: Fix push status report when all branches fail
The protocol between transport-helper.c and remote-curl requires
remote-curl to always print a blank line after the push command
has run. If the blank line is ommitted, transport-helper kills its
container process (the git push the user started) with exit(128)
and no message indicating a problem, assuming the helper already
printed reasonable error text to the console.
However if the remote rejects all branches with "ng" commands in the
report-status reply, send-pack terminates with non-zero status, and
in turn remote-curl exited with non-zero status before outputting
the blank line after the helper status printed by send-pack. No
error messages reach the user.
This caused users to see the following from git push over HTTP
when the remote side's update hook rejected the branch:
$ git push http://... master
Counting objects: 4, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 301 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
$
Always print a blank line after the send-pack process terminates,
ensuring the helper status report (if it was output) will be
correctly parsed by the calling transport-helper.c. This ensures
the helper doesn't abort before the status report can be shown to
the user.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-01-20 07:12:09 +04:00
|
|
|
GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
|
|
|
|
POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200
|
2009-10-31 03:47:47 +03:00
|
|
|
EOF
|
|
|
|
test_expect_success 'used receive-pack service' '
|
|
|
|
sed -e "
|
|
|
|
s/^.* \"//
|
|
|
|
s/\"//
|
|
|
|
s/ [1-9][0-9]*\$//
|
|
|
|
s/^GET /GET /
|
|
|
|
" >act <"$HTTPD_ROOT_PATH"/access.log &&
|
|
|
|
test_cmp exp act
|
|
|
|
'
|
|
|
|
|
2010-03-02 13:49:26 +03:00
|
|
|
test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
|
2013-08-03 02:14:50 +04:00
|
|
|
"$ROOT_PATH"/test_repo_clone master success
|
2010-01-08 05:12:40 +03:00
|
|
|
|
2010-01-08 05:12:44 +03:00
|
|
|
test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper' '
|
2010-01-08 05:12:41 +03:00
|
|
|
# create a dissimilarly-named remote ref so that git is unable to match the
|
|
|
|
# two refs (viz. local, remote) unless an explicit refspec is provided.
|
|
|
|
git push origin master:retsam
|
|
|
|
|
|
|
|
echo "change changed" > path2 &&
|
|
|
|
git commit -a -m path2 --amend &&
|
|
|
|
|
|
|
|
# push master too; this ensures there is at least one '"'push'"' command to
|
|
|
|
# the remote helper and triggers interaction with the helper.
|
2011-02-23 02:42:12 +03:00
|
|
|
test_must_fail git push -v origin +master master:retsam >output 2>&1'
|
2010-01-08 05:12:41 +03:00
|
|
|
|
2011-02-23 02:42:12 +03:00
|
|
|
test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: remote output' '
|
2010-01-08 05:12:41 +03:00
|
|
|
grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *master -> master (forced update)$" output &&
|
2011-02-23 02:42:12 +03:00
|
|
|
grep "^ ! \[rejected\] *master -> retsam (non-fast-forward)$" output
|
|
|
|
'
|
2010-01-08 05:12:41 +03:00
|
|
|
|
2011-04-13 03:33:39 +04:00
|
|
|
test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: our output' '
|
2012-04-12 21:56:28 +04:00
|
|
|
test_i18ngrep "Updates were rejected because" \
|
2010-01-25 10:42:23 +03:00
|
|
|
output
|
2010-01-08 05:12:41 +03:00
|
|
|
'
|
|
|
|
|
2011-05-04 21:19:50 +04:00
|
|
|
test_expect_success 'push (chunked)' '
|
|
|
|
git checkout master &&
|
|
|
|
test_commit commit path3 &&
|
|
|
|
HEAD=$(git rev-parse --verify HEAD) &&
|
2013-03-25 01:06:08 +04:00
|
|
|
test_config http.postbuffer 4 &&
|
2011-05-04 21:19:50 +04:00
|
|
|
git push -v -v origin $BRANCH 2>err &&
|
|
|
|
grep "POST git-receive-pack (chunked)" err &&
|
|
|
|
(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
test $HEAD = $(git rev-parse --verify HEAD))
|
|
|
|
'
|
|
|
|
|
remote-curl: don't pass back fake refs
When receive-pack advertises its list of refs, it generally hides the
capabilities information after a NUL at the end of the first ref.
However, when we have an empty repository, there are no refs, and
therefore receive-pack writes a fake ref "capabilities^{}" with the
capabilities afterwards.
On the client side, git reads the result with get_remote_heads(). We pick
the capabilities from the end of the line, and then call check_ref() to
make sure the ref name is valid. We see that it isn't, and don't bother
adding it to our list of refs.
However, the call to check_ref() is enabled by passing the REF_NORMAL flag
to get_remote_heads. For the regular git transport, we pass REF_NORMAL in
get_refs_via_connect() if we are doing a push (since only receive-pack
uses this fake ref). But in remote-curl, we never use this flag, and we
accept the fake ref as a real one, passing it back from the helper to the
parent git-push.
Most of the time this bug goes unnoticed, as the fake ref won't match our
refspecs. However, if "--mirror" is used, then we see it as remote cruft
to be pruned, and try to pass along a deletion refspec for it. Of course
this refspec has bogus syntax (because of the ^{}), and the helper
complains, aborting the push.
Let's have remote-curl mirror what the builtin get_refs_via_connect() does
(at least for the case of using git protocol; we can leave the dumb
info/refs reader as it is).
This also fixes pushing with --mirror to a smart-http remote that uses
alternates. The fake ".have" refs the server gives to avoid unnecessary
network transfer has a similar bad interactions with the machinery.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-12-17 14:45:39 +04:00
|
|
|
test_expect_success 'push --all can push to empty repo' '
|
|
|
|
d=$HTTPD_DOCUMENT_ROOT_PATH/empty-all.git &&
|
|
|
|
git init --bare "$d" &&
|
|
|
|
git --git-dir="$d" config http.receivepack true &&
|
|
|
|
git push --all "$HTTPD_URL"/smart/empty-all.git
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push --mirror can push to empty repo' '
|
|
|
|
d=$HTTPD_DOCUMENT_ROOT_PATH/empty-mirror.git &&
|
|
|
|
git init --bare "$d" &&
|
|
|
|
git --git-dir="$d" config http.receivepack true &&
|
|
|
|
git push --mirror "$HTTPD_URL"/smart/empty-mirror.git
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push --all to repo with alternates' '
|
|
|
|
s=$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git &&
|
|
|
|
d=$HTTPD_DOCUMENT_ROOT_PATH/alternates-all.git &&
|
|
|
|
git clone --bare --shared "$s" "$d" &&
|
|
|
|
git --git-dir="$d" config http.receivepack true &&
|
|
|
|
git --git-dir="$d" repack -adl &&
|
|
|
|
git push --all "$HTTPD_URL"/smart/alternates-all.git
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push --mirror to repo with alternates' '
|
|
|
|
s=$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git &&
|
|
|
|
d=$HTTPD_DOCUMENT_ROOT_PATH/alternates-mirror.git &&
|
|
|
|
git clone --bare --shared "$s" "$d" &&
|
|
|
|
git --git-dir="$d" config http.receivepack true &&
|
|
|
|
git --git-dir="$d" repack -adl &&
|
|
|
|
git push --mirror "$HTTPD_URL"/smart/alternates-mirror.git
|
|
|
|
'
|
|
|
|
|
2012-05-01 12:43:08 +04:00
|
|
|
test_expect_success TTY 'push shows progress when stderr is a tty' '
|
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
test_commit noisy &&
|
|
|
|
test_terminal git push >output 2>&1 &&
|
|
|
|
grep "^Writing objects" output
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success TTY 'push --quiet silences status and progress' '
|
2012-01-09 01:06:20 +04:00
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
test_commit quiet &&
|
2012-05-01 12:43:08 +04:00
|
|
|
test_terminal git push --quiet >output 2>&1 &&
|
2012-01-09 01:06:20 +04:00
|
|
|
test_cmp /dev/null output
|
|
|
|
'
|
|
|
|
|
2012-05-01 12:43:08 +04:00
|
|
|
test_expect_success TTY 'push --no-progress silences progress but not status' '
|
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
test_commit no-progress &&
|
|
|
|
test_terminal git push --no-progress >output 2>&1 &&
|
|
|
|
grep "^To http" output &&
|
|
|
|
! grep "^Writing objects"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push --progress shows progress to non-tty' '
|
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
test_commit progress &&
|
|
|
|
git push --progress >output 2>&1 &&
|
|
|
|
grep "^To http" output &&
|
|
|
|
grep "^Writing objects" output
|
|
|
|
'
|
|
|
|
|
2012-03-30 11:01:30 +04:00
|
|
|
test_expect_success 'http push gives sane defaults to reflog' '
|
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
test_commit reflog-test &&
|
|
|
|
git push "$HTTPD_URL"/smart/test_repo.git &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
|
|
|
log -g -1 --format="%gn <%ge>" >actual &&
|
|
|
|
echo "anonymous <anonymous@http.127.0.0.1>" >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'http push respects GIT_COMMITTER_* in reflog' '
|
|
|
|
cd "$ROOT_PATH"/test_repo_clone &&
|
|
|
|
test_commit custom-reflog-test &&
|
|
|
|
git push "$HTTPD_URL"/smart_custom_env/test_repo.git &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
|
|
|
log -g -1 --format="%gn <%ge>" >actual &&
|
|
|
|
echo "Custom User <custom@example.com>" >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2012-08-27 17:25:36 +04:00
|
|
|
test_expect_success 'push over smart http with auth' '
|
|
|
|
cd "$ROOT_PATH/test_repo_clone" &&
|
|
|
|
echo push-auth-test >expect &&
|
|
|
|
test_commit push-auth-test &&
|
2014-01-02 11:38:35 +04:00
|
|
|
set_askpass user@host pass@host &&
|
2012-08-27 17:25:36 +04:00
|
|
|
git push "$HTTPD_URL"/auth/smart/test_repo.git &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
|
|
|
log -1 --format=%s >actual &&
|
|
|
|
expect_askpass both user@host &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
http: prompt for credentials on failed POST
All of the smart-http GET requests go through the http_get_*
functions, which will prompt for credentials and retry if we
see an HTTP 401.
POST requests, however, do not go through any central point.
Moreover, it is difficult to retry in the general case; we
cannot assume the request body fits in memory or is even
seekable, and we don't know how much of it was consumed
during the attempt.
Most of the time, this is not a big deal; for both fetching
and pushing, we make a GET request before doing any POSTs,
so typically we figure out the credentials during the first
request, then reuse them during the POST. However, some
servers may allow a client to get the list of refs from
receive-pack without authentication, and then require
authentication when the client actually tries to POST the
pack.
This is not ideal, as the client may do a non-trivial amount
of work to generate the pack (e.g., delta-compressing
objects). However, for a long time it has been the
recommended example configuration in git-http-backend(1) for
setting up a repository with anonymous fetch and
authenticated push. This setup has always been broken
without putting a username into the URL. Prior to commit
986bbc0, it did work with a username in the URL, because git
would prompt for credentials before making any requests at
all. However, post-986bbc0, it is totally broken. Since it
has been advertised in the manpage for some time, we should
make sure it works.
Unfortunately, it is not as easy as simply calling post_rpc
again when it fails, due to the input issue mentioned above.
However, we can still make this specific case work by
retrying in two specific instances:
1. If the request is large (bigger than LARGE_PACKET_MAX),
we will first send a probe request with a single flush
packet. Since this request is static, we can freely
retry it.
2. If the request is small and we are not using gzip, then
we have the whole thing in-core, and we can freely
retry.
That means we will not retry in some instances, including:
1. If we are using gzip. However, we only do so when
calling git-upload-pack, so it does not apply to
pushes.
2. If we have a large request, the probe succeeds, but
then the real POST wants authentication. This is an
extremely unlikely configuration and not worth worrying
about.
While it might be nice to cover those instances, doing so
would be significantly more complex for very little
real-world gain. In the long run, we will be much better off
when curl learns to internally handle authentication as a
callback, and we can cleanly handle all cases that way.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-08-27 17:27:15 +04:00
|
|
|
test_expect_success 'push to auth-only-for-push repo' '
|
2012-08-27 17:25:53 +04:00
|
|
|
cd "$ROOT_PATH/test_repo_clone" &&
|
|
|
|
echo push-half-auth >expect &&
|
|
|
|
test_commit push-half-auth &&
|
2014-01-02 11:38:35 +04:00
|
|
|
set_askpass user@host pass@host &&
|
2012-08-27 17:25:53 +04:00
|
|
|
git push "$HTTPD_URL"/auth-push/smart/test_repo.git &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
|
|
|
log -1 --format=%s >actual &&
|
|
|
|
expect_askpass both user@host &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-04-13 07:33:36 +04:00
|
|
|
test_expect_success 'create repo without http.receivepack set' '
|
|
|
|
cd "$ROOT_PATH" &&
|
|
|
|
git init half-auth &&
|
|
|
|
(
|
|
|
|
cd half-auth &&
|
|
|
|
test_commit one
|
|
|
|
) &&
|
|
|
|
git clone --bare half-auth "$HTTPD_DOCUMENT_ROOT_PATH/half-auth.git"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'clone via half-auth-complete does not need password' '
|
|
|
|
cd "$ROOT_PATH" &&
|
|
|
|
set_askpass wrong &&
|
|
|
|
git clone "$HTTPD_URL"/half-auth-complete/smart/half-auth.git \
|
|
|
|
half-auth-clone &&
|
|
|
|
expect_askpass none
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push into half-auth-complete requires password' '
|
|
|
|
cd "$ROOT_PATH/half-auth-clone" &&
|
|
|
|
echo two >expect &&
|
|
|
|
test_commit two &&
|
2014-01-02 11:38:35 +04:00
|
|
|
set_askpass user@host pass@host &&
|
2013-04-13 07:33:36 +04:00
|
|
|
git push "$HTTPD_URL/half-auth-complete/smart/half-auth.git" &&
|
|
|
|
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/half-auth.git" \
|
|
|
|
log -1 --format=%s >actual &&
|
|
|
|
expect_askpass both user@host &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2014-09-16 01:59:00 +04:00
|
|
|
test_expect_success GPG 'push with post-receive to inspect certificate' '
|
|
|
|
(
|
|
|
|
cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
|
|
|
|
mkdir -p hooks &&
|
|
|
|
write_script hooks/post-receive <<-\EOF &&
|
|
|
|
# discard the update list
|
|
|
|
cat >/dev/null
|
|
|
|
# record the push certificate
|
|
|
|
if test -n "${GIT_PUSH_CERT-}"
|
|
|
|
then
|
|
|
|
git cat-file blob $GIT_PUSH_CERT >../push-cert
|
|
|
|
fi &&
|
|
|
|
cat >../push-cert-status <<E_O_F
|
|
|
|
SIGNER=${GIT_PUSH_CERT_SIGNER-nobody}
|
|
|
|
KEY=${GIT_PUSH_CERT_KEY-nokey}
|
|
|
|
STATUS=${GIT_PUSH_CERT_STATUS-nostatus}
|
|
|
|
E_O_F
|
|
|
|
EOF
|
|
|
|
|
|
|
|
git config receive.certnonceseed sekrit
|
|
|
|
) &&
|
|
|
|
cd "$ROOT_PATH/test_repo_clone" &&
|
|
|
|
test_commit cert-test &&
|
|
|
|
git push --signed "$HTTPD_URL/smart/test_repo.git" &&
|
|
|
|
(
|
|
|
|
cd "$HTTPD_DOCUMENT_ROOT_PATH" &&
|
|
|
|
cat <<-\EOF
|
|
|
|
SIGNER=C O Mitter <committer@example.com>
|
|
|
|
KEY=13B6F51ECDDE430D
|
|
|
|
STATUS=G
|
|
|
|
EOF
|
|
|
|
) >expect &&
|
|
|
|
test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH/push-cert-status"
|
|
|
|
'
|
|
|
|
|
2009-10-31 03:47:47 +03:00
|
|
|
stop_httpd
|
|
|
|
test_done
|