From patchwork Fri Apr 17 09:45:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiang Xin X-Patchwork-Id: 11494617 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 23BD0186E for ; Fri, 17 Apr 2020 09:45:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F1259221EA for ; Fri, 17 Apr 2020 09:45:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SjXGOdVa" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727814AbgDQJpo (ORCPT ); Fri, 17 Apr 2020 05:45:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725932AbgDQJpn (ORCPT ); Fri, 17 Apr 2020 05:45:43 -0400 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F6BCC061A0F for ; Fri, 17 Apr 2020 02:45:42 -0700 (PDT) Received: by mail-pj1-x102e.google.com with SMTP id a32so868008pje.5 for ; Fri, 17 Apr 2020 02:45:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fmGCmv5C3mkznvYS92yE96WIX4hxINifuURYzvo4Wag=; b=SjXGOdVaon8qCVF88o6a3dWsVSMMc7BmOHJFVUYMzFv0DFhRIea4HEFlG0Wz3mE2XF 23NuePivFCQzTWthEBN7GjvFck+R5Vz+f1Ut58XNhivVzGK1MkrrcEumq8kBBYzHgMIW CfmZLAKhe6DbrFIL2TvUyiOVSMP3zDa8pYePvr4KfjFs7w9d0hQfiOU+0XQvIOkcw68f zIAOfZRCoNHYFf+G5Ijreyc4iRVyri29E6eYHkzOhbTT5mnsNT5H7kBMpPToPSNune2a YmIEb9ARhTmwxgSXgkXKgX9S14khv6o6U0vZ4BdYfIPAE8bBBOjrZIzfr41sK/gq3RMT DZ6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fmGCmv5C3mkznvYS92yE96WIX4hxINifuURYzvo4Wag=; b=X4qZf57TIR43O+mcJOoMeTariRvshQGOo5T3dakI9B50RB4o1kdhwX1piRBovDvJ+l lf02NBQVMi16NILI14HcVgN2pY/ywRFyJ9DibHkCXXyFlEgbjjJeDjU2xLYnc87uzlR/ zV1cdNRm8JFDA3ijDERPCz8zHNN+2nh3SQoHPK8ltmEfvSw1jg8WuNIRVUdil8UzkLFA gs1PR5lyX1XYWx1ZSW8xT/ir3Bl4F654uz0/yIOc6sD4aKR3VkmWnUQIywwwPaAy5diB sFy8RkVPWRd2jnaPOVALDIlPHjRvImNFaJafcvbl8StPr3jUdP09VxU5bNTVZ3FmEi73 Iu3w== X-Gm-Message-State: AGi0PuZuenqI07I6qHIWXhb+7H+5kjGTsTymlBDMw9XUmSX4yBwYmwNa UMgOCkaNUQvQc9/JRmNid5K3mLtXeJk= X-Google-Smtp-Source: APiQypJ7MYdKecoZRs4SsTCN76TMbCUz+N7hhbEoh+Ng4AoT71kRloADheTCf3tM79kwFV4JotlwcA== X-Received: by 2002:a17:90b:3014:: with SMTP id hg20mr3450880pjb.56.1587116742054; Fri, 17 Apr 2020 02:45:42 -0700 (PDT) Received: from tigtog.localdomain.localdomain ([144.34.163.219]) by smtp.gmail.com with ESMTPSA id q145sm4790979pfq.105.2020.04.17.02.45.41 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Apr 2020 02:45:41 -0700 (PDT) From: Jiang Xin To: Junio C Hamano , Git List Cc: Jiang Xin Subject: [PATCH v4 1/5] send-pack: fix inconsistent porcelain output Date: Fri, 17 Apr 2020 05:45:32 -0400 Message-Id: <20200417094536.9463-2-worldhello.net@gmail.com> X-Mailer: git-send-email 2.26.0.rc0 In-Reply-To: <20200416162415.5751-1-worldhello.net@gmail.com> References: <20200416162415.5751-1-worldhello.net@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Jiang Xin The porcelain output of a failed `git-push` command is inconsistent for different protocols. For example, the following `git-push` command may fail due to the failure of the `pre-receive` hook. git push --porcelain origin HEAD:refs/heads/master For SSH protocol, the porcelain output does not end with a "Done" message: To ! HEAD:refs/heads/master [remote rejected] (pre-receive hook declined) While for HTTP protocol, the porcelain output does end with a "Done" message: To ! HEAD:refs/heads/master [remote rejected] (pre-receive hook declined) Done The following code at the end of function `send_pack()` indicates that `send_pack()` should not return an error if some references are rejected in porcelain mode. int send_pack(...) ... ... if (args->porcelain) return 0; for (ref = remote_refs; ref; ref = ref->next) { switch (ref->status) { case REF_STATUS_NONE: case REF_STATUS_UPTODATE: case REF_STATUS_OK: break; default: return -1; } } return 0; } So if atomic push failed, must check the porcelain mode before return an error. And `receive_status()` should not return an error for a failed updated reference, because `send_pack()` will check them instead. Signed-off-by: Jiang Xin --- send-pack.c | 7 +- t/t5504-fetch-receive-strict.sh | 1 + t/t5516-fetch-push.sh | 1 + t/t5548-push-porcelain.sh | 280 ++++++++++++++++++++++++++++++++ transport.c | 10 +- 5 files changed, 294 insertions(+), 5 deletions(-) create mode 100755 t/t5548-push-porcelain.sh diff --git a/send-pack.c b/send-pack.c index 0407841ae8..1835cd5582 100644 --- a/send-pack.c +++ b/send-pack.c @@ -190,10 +190,8 @@ static int receive_status(struct packet_reader *reader, struct ref *refs) if (reader->line[0] == 'o' && reader->line[1] == 'k') hint->status = REF_STATUS_OK; - else { + else hint->status = REF_STATUS_REMOTE_REJECT; - ret = -1; - } hint->remote_status = xstrdup_or_null(msg); /* start our next search from the next ref */ hint = hint->next; @@ -489,7 +487,8 @@ int send_pack(struct send_pack_args *args, if (use_atomic) { strbuf_release(&req_buf); strbuf_release(&cap_buf); - return atomic_push_failure(args, remote_refs, ref); + atomic_push_failure(args, remote_refs, ref); + return args->porcelain ? 0 : -1; } /* else fallthrough */ default: diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh index 645b4c78d3..a32efe2b6c 100755 --- a/t/t5504-fetch-receive-strict.sh +++ b/t/t5504-fetch-receive-strict.sh @@ -65,6 +65,7 @@ test_expect_success 'fetch with transfer.fsckobjects' ' cat >exp <.git/foo "To testrepo" && echo >>.git/foo "! refs/heads/master:refs/heads/master [remote rejected] (branch is currently checked out)" && + echo >>.git/foo "Done" && test_must_fail git push >.git/bar --porcelain testrepo refs/heads/master:refs/heads/master && test_cmp .git/foo .git/bar diff --git a/t/t5548-push-porcelain.sh b/t/t5548-push-porcelain.sh new file mode 100755 index 0000000000..96ba449a38 --- /dev/null +++ b/t/t5548-push-porcelain.sh @@ -0,0 +1,280 @@ +#!/bin/sh +# +# Copyright (c) 2020 Jiang Xin +# +test_description='Test git push porcelain output' + +. ./test-lib.sh + +# Create commits in and assign each commit's oid to shell variables +# given in the arguments (A, B, and C). E.g.: +# +# create_commits_in A B C +# +# NOTE: Never calling this function from a subshell since variable +# assignments will disappear when subshell exits. +create_commits_in () { + repo="$1" && + if ! parent=$(git -C "$repo" rev-parse HEAD^{} --) + then + parent= + fi && + T=$(git -C "$repo" write-tree) && + shift && + while test $# -gt 0 + do + name=$1 && + test_tick && + if test -z "$parent" + then + oid=$(echo $name | git -C "$repo" commit-tree $T) + else + oid=$(echo $name | git -C "$repo" commit-tree -p $parent $T) + fi && + eval $name=$oid && + parent=$oid && + shift || + return 1 + done && + git -C "$repo" update-ref refs/heads/master $oid +} + +# Format the output of git-push, git-show-ref and other commands to make a +# user-friendly and stable text. We can easily prepare the expect text +# without having to worry about future changes of the commit ID and spaces +# of the output. +make_user_friendly_and_stable_output () { + sed \ + -e "s/ *\$//" \ + -e "s/ */ /g" \ + -e "s/ / /g" \ + -e "s/$A//g" \ + -e "s/$B//g" \ + -e "s/$ZERO_OID//g" \ + -e "s/$(echo $A | cut -c1-7)[0-9a-f]*//g" \ + -e "s/$(echo $B | cut -c1-7)[0-9a-f]*//g" \ + -e "s#To $URL_PREFIX/upstream.git#To #" +} + +setup_upstream_and_workbench () { + # Upstream after setup : master(B) foo(A) bar(A) baz(A) + # Workbench after setup : master(A) + test_expect_success "setup upstream repository and workbench" ' + rm -rf upstream.git workbench && + git init --bare upstream.git && + git init workbench && + create_commits_in workbench A B && + ( + cd workbench && + # Try to make a stable fixed width for abbreviated commit ID, + # this fixed-width oid will be replaced with "". + git config core.abbrev 7 && + git remote add origin ../upstream.git && + git update-ref refs/heads/master $A && + git push origin \ + $B:refs/heads/master \ + $A:refs/heads/foo \ + $A:refs/heads/bar \ + $A:refs/heads/baz + ) && + git -C "workbench" config advice.pushUpdateRejected false && + upstream=upstream.git + ' +} + +run_git_push_porcelain_output_test() { + case $1 in + http) + PROTOCOL="HTTP protocol" + URL_PREFIX="http://.*" + ;; + file) + PROTOCOL="builtin protocol" + URL_PREFIX="\.\." + ;; + esac + + # Refs of upstream : master(B) foo(A) bar(A) baz(A) + # Refs of workbench: master(A) baz(A) next(A) + # git-push : master(A) NULL (B) baz(A) next(A) + test_expect_success "porcelain output of successful git-push ($PROTOCOL)" ' + ( + cd workbench && + git update-ref refs/heads/master $A && + git update-ref refs/heads/baz $A && + git update-ref refs/heads/next $A && + git push --porcelain --force origin \ + master \ + :refs/heads/foo \ + $B:bar \ + baz \ + next + ) >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + To + = refs/heads/baz:refs/heads/baz [up to date] + :refs/heads/bar .. + - :refs/heads/foo [deleted] + + refs/heads/master:refs/heads/master ... (forced update) + * refs/heads/next:refs/heads/next [new branch] + Done + EOF + test_cmp expect actual && + + git -C "$upstream" show-ref >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + refs/heads/bar + refs/heads/baz + refs/heads/master + refs/heads/next + EOF + test_cmp expect actual + ' + + # Refs of upstream : master(A) bar(B) baz(A) next(A) + # Refs of workbench: master(B) bar(A) baz(A) next(A) + # git-push : master(B) bar(A) NULL next(A) + test_expect_success "atomic push failed ($PROTOCOL)" ' + ( + cd workbench && + git update-ref refs/heads/master $B && + git update-ref refs/heads/bar $A && + test_must_fail git push --atomic --porcelain origin \ + master \ + bar \ + :baz \ + next + ) >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + To + ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) + ! (delete):refs/heads/baz [rejected] (atomic push failed) + ! refs/heads/master:refs/heads/master [rejected] (atomic push failed) + ! refs/heads/next:refs/heads/next [rejected] (atomic push failed) + Done + EOF + test_cmp expect actual && + + git -C "$upstream" show-ref >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + refs/heads/bar + refs/heads/baz + refs/heads/master + refs/heads/next + EOF + test_cmp expect actual + ' + + test_expect_success "prepare pre-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/pre-receive" <<-EOF + exit 1 + EOF + ' + + # Refs of upstream : master(A) bar(B) baz(A) next(A) + # Refs of workbench: master(B) bar(A) baz(A) next(A) + # git-push : master(B) bar(A) NULL next(A) + test_expect_success "pre-receive hook declined ($PROTOCOL)" ' + ( + cd workbench && + git update-ref refs/heads/master $B && + git update-ref refs/heads/bar $A && + test_must_fail git push --porcelain --force origin \ + master \ + bar \ + :baz \ + next + ) >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + To + = refs/heads/next:refs/heads/next [up to date] + ! refs/heads/bar:refs/heads/bar [remote rejected] (pre-receive hook declined) + ! :refs/heads/baz [remote rejected] (pre-receive hook declined) + ! refs/heads/master:refs/heads/master [remote rejected] (pre-receive hook declined) + Done + EOF + test_cmp expect actual && + + git -C "$upstream" show-ref >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + refs/heads/bar + refs/heads/baz + refs/heads/master + refs/heads/next + EOF + test_cmp expect actual + ' + + test_expect_success "remove pre-receive hook ($PROTOCOL)" ' + rm "$upstream/hooks/pre-receive" + ' + + # Refs of upstream : master(A) bar(B) baz(A) next(A) + # Refs of workbench: master(B) bar(A) baz(A) next(A) + # git-push : master(B) bar(A) NULL next(A) + test_expect_success "non-fastforward push ($PROTOCOL)" ' + ( + cd workbench && + test_must_fail git push --porcelain origin \ + master \ + bar \ + :baz \ + next + ) >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + To + = refs/heads/next:refs/heads/next [up to date] + - :refs/heads/baz [deleted] + refs/heads/master:refs/heads/master .. + ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) + Done + EOF + test_cmp expect actual && + + git -C "$upstream" show-ref >out && + make_user_friendly_and_stable_output actual && + cat >expect <<-EOF && + refs/heads/bar + refs/heads/master + refs/heads/next + EOF + test_cmp expect actual + ' +} + +# Initialize the upstream repository and local workbench. +setup_upstream_and_workbench + +# Run git-push porcelain test on builtin protocol +run_git_push_porcelain_output_test file + +ROOT_PATH="$PWD" +. "$TEST_DIRECTORY"/lib-gpg.sh +. "$TEST_DIRECTORY"/lib-httpd.sh +. "$TEST_DIRECTORY"/lib-terminal.sh +start_httpd + +# Re-initialize the upstream repository and local workbench. +setup_upstream_and_workbench + +test_expect_success "setup for http" ' + git -C upstream.git config http.receivepack true && + upstream="$HTTPD_DOCUMENT_ROOT_PATH/upstream.git" && + mv upstream.git "$upstream" && + + git -C workbench remote set-url origin $HTTPD_URL/smart/upstream.git +' + +setup_askpass_helper + +# Run git-push porcelain test on HTTP protocol +run_git_push_porcelain_output_test http + +test_done diff --git a/transport.c b/transport.c index 1fdc7dac1a..13d638d5fe 100644 --- a/transport.c +++ b/transport.c @@ -715,7 +715,15 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re close(data->fd[1]); close(data->fd[0]); - ret |= finish_connect(data->conn); + /* + * Atomic push may abort the connection early and close the pipe, + * which may cause an error for `finish_connect()`. Ignore this error + * for atomic git-push. + */ + if (ret || args.atomic) + finish_connect(data->conn); + else + ret = finish_connect(data->conn); data->conn = NULL; data->got_remote_heads = 0; From patchwork Fri Apr 17 09:45:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiang Xin X-Patchwork-Id: 11494619 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 90A7A1871 for ; Fri, 17 Apr 2020 09:45:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7A03F221EA for ; Fri, 17 Apr 2020 09:45:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D98X4oA3" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727845AbgDQJpo (ORCPT ); Fri, 17 Apr 2020 05:45:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47608 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727777AbgDQJpo (ORCPT ); Fri, 17 Apr 2020 05:45:44 -0400 Received: from mail-pj1-x1044.google.com (mail-pj1-x1044.google.com [IPv6:2607:f8b0:4864:20::1044]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86E7EC061A0C for ; Fri, 17 Apr 2020 02:45:43 -0700 (PDT) Received: by mail-pj1-x1044.google.com with SMTP id ng8so877407pjb.2 for ; Fri, 17 Apr 2020 02:45:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nyxuMOk9EO/0k84GD8wXJZYoGb6KHR263TB1IprII/0=; b=D98X4oA3var853bKH6+AT5xN3E6Fjf3QSNKgcYw30tYUDXnZb1T3BXb8D//fBy4lWn VBNBU32VBxDjuv0NWMQ3k+/eu75j9wF/EgvUhkt6nSdYvqR/ac/uyODINx9Cu2+47RfM uTLA1q0SgCHFmiuEgxMFy2qNNIp6f0O9jaqTywtfcujsMI9qzH0bECj6G/i0huqrkQSS XcMwzVZv0oLbJHesnewNg53nJi16s5gym1xPP5A7QCOhZWxnoZN+214bZkXx1pQOQ41w djpwp2ots/IIohnR7RUh5oQP0vUmEglFz7bJMTkDJEe8pfDv4KlppuMFTmadUp/cqdj5 W7lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=nyxuMOk9EO/0k84GD8wXJZYoGb6KHR263TB1IprII/0=; b=mJgpjM0FQx80Q6OHZ6ZJ04Um7gh3x9sHo7GLxmMe4rAtRMCuDwUX9Txq2a1ocDj/xR m+WKqid4mVEBJGnOoamJ6Dg+UMNeUfGzIt1hkR7EilCUTJZ5q3cHJfj7RjtT/F7OH13Z BhnceYSegqHAEWgPXo4bejvCW9TGowEdfQml9ezYJSbtr6HLHLkAJwzOSEJNiHDY5j8v mGphS64WyArd4wjFZLKf78TTMQkLxSeuFwHhePFTDgIPnbZXLKIjbejYS/kO/hs5QUpf L6JXN0/rN6uSNHgS2wJzogUeAPwD3G6Dii9sqh9FPWgcVukdC5Zk/CSQMhoQVhjCG5NT OguA== X-Gm-Message-State: AGi0PuaKxuwZOhVqTwZV67IXLf29nCvOyWE/vhZX/QorjaSCrHWsvw/9 KHC1xpKcUcGLWpiJHs6RU74B1rOzatU= X-Google-Smtp-Source: APiQypL+PHoPSdP+/ghbKCYnHS/ZrBMcGB2lVZq1UZEozC5AUSSrRxDR0lTE5F2330jbwnKCQJbwog== X-Received: by 2002:a17:90b:4d07:: with SMTP id mw7mr3401840pjb.94.1587116743055; Fri, 17 Apr 2020 02:45:43 -0700 (PDT) Received: from tigtog.localdomain.localdomain ([144.34.163.219]) by smtp.gmail.com with ESMTPSA id q145sm4790979pfq.105.2020.04.17.02.45.42 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Apr 2020 02:45:42 -0700 (PDT) From: Jiang Xin To: Junio C Hamano , Git List Cc: Jiang Xin Subject: [PATCH v4 2/5] t5543: never report what we do not push Date: Fri, 17 Apr 2020 05:45:33 -0400 Message-Id: <20200417094536.9463-3-worldhello.net@gmail.com> X-Mailer: git-send-email 2.26.0.rc0 In-Reply-To: <20200416162415.5751-1-worldhello.net@gmail.com> References: <20200416162415.5751-1-worldhello.net@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Jiang Xin When we push some references to the git server, we expect git to report the status of the references we are pushing; no more, no less. But when pusing with atomic mode, if some references cannot be pushed, Git reports the reject message on all references in the remote repository. Add new test cases in t5543, and fix them in latter commit. Signed-off-by: Jiang Xin --- t/t5543-atomic-push.sh | 89 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/t/t5543-atomic-push.sh b/t/t5543-atomic-push.sh index 7079bcf9a0..001240eec7 100755 --- a/t/t5543-atomic-push.sh +++ b/t/t5543-atomic-push.sh @@ -27,6 +27,12 @@ test_refs () { test_cmp expect actual } +fmt_status_report () { + sed -n \ + -e "/^To / { s/ */ /g; p; }" \ + -e "/^ ! / { s/ */ /g; p; }" +} + test_expect_success 'atomic push works for a single branch' ' mk_repo_pair && ( @@ -191,4 +197,87 @@ test_expect_success 'atomic push is not advertised if configured' ' test_refs master HEAD@{1} ' +# References in upstream : master(1) one(1) foo(1) +# References in workbench: master(2) foo(1) two(2) bar(2) +# Atomic push : master(2) two(2) bar(2) +test_expect_failure 'atomic push reports (reject by update hook)' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git branch foo && + git push up master one foo && + git tag -d one + ) && + ( + mkdir -p upstream/.git/hooks && + cat >upstream/.git/hooks/update <<-EOF && + #!/bin/sh + + if test "\$1" = "refs/heads/bar" + then + echo >&2 "Pusing to branch bar is prohibited" + exit 1 + fi + EOF + chmod a+x upstream/.git/hooks/update + ) && + ( + cd workbench && + test_commit two && + git branch bar + ) && + test_must_fail git -C workbench \ + push --atomic up master two bar >out 2>&1 && + fmt_status_report actual && + cat >expect <<-EOF && + To ../upstream + ! [remote rejected] master -> master (atomic push failure) + ! [remote rejected] two -> two (atomic push failure) + ! [remote rejected] bar -> bar (hook declined) + EOF + test_cmp expect actual +' + +# References in upstream : master(1) one(1) foo(1) +# References in workbench: master(2) foo(1) two(2) bar(2) +test_expect_failure 'atomic push reports (mirror, but reject by update hook)' ' + ( + cd workbench && + git remote remove up && + git remote add up ../upstream + ) && + test_must_fail git -C workbench \ + push --atomic --mirror up >out 2>&1 && + fmt_status_report actual && + cat >expect <<-EOF && + To ../upstream + ! [remote rejected] master -> master (atomic push failure) + ! [remote rejected] one (atomic push failure) + ! [remote rejected] bar -> bar (hook declined) + ! [remote rejected] two -> two (atomic push failure) + EOF + test_cmp expect actual +' + +# References in upstream : master(2) one(1) foo(1) +# References in workbench: master(1) foo(1) two(2) bar(2) +test_expect_failure 'atomic push reports (reject by non-ff)' ' + rm upstream/.git/hooks/update && + ( + cd workbench && + git push up master && + git reset --hard HEAD^ + ) && + test_must_fail git -C workbench \ + push --atomic up master foo bar >out 2>&1 && + fmt_status_report actual && + cat >expect <<-EOF && + To ../upstream + ! [rejected] master -> master (non-fast-forward) + ! [rejected] bar -> bar (atomic push failed) + EOF + test_cmp expect actual +' + test_done From patchwork Fri Apr 17 09:45:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiang Xin X-Patchwork-Id: 11494625 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D61AC1871 for ; Fri, 17 Apr 2020 09:45:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BD558221EA for ; Fri, 17 Apr 2020 09:45:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kWOycDIh" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727879AbgDQJpr (ORCPT ); Fri, 17 Apr 2020 05:45:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727777AbgDQJpp (ORCPT ); Fri, 17 Apr 2020 05:45:45 -0400 Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6AE4BC061A0F for ; Fri, 17 Apr 2020 02:45:44 -0700 (PDT) Received: by mail-pl1-x644.google.com with SMTP id v2so778345plp.9 for ; Fri, 17 Apr 2020 02:45:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kgjq3ZrAdr8/gFf+YwgeXqiwATBnJ5AhvuT9Wa6tQKg=; b=kWOycDIhaGvlMBYM7pMEa+tEoU4MF1prSdhpi6fxZo7mzMWZkJckSUebrHE+m/jBRd nvl/NqNDs5EFQNP7LG8QbI4SjFjD6gr6nx88eBH4bpX0gDpEEFSD72Q7ZTgEUdo+m7ik R84fzBVj8UGWiNO+StDABp+lZXn8d1sPLW/Wei+HXG0XkfqAeoyMMEfr0Fpr4e+sCK7O BfOtv1RnBw3Wu/tenVbhEMbEJxV6kFlO5HJ1wDqT/+dofnklf99ijy5i3HjPS7CAGL2u 0lAFXvvn8/Tcy8HVqBiVC6DSf6An6lqq9djMERLD/+H6g4aCAArRIYRyho9mhFkMN6O/ y2hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kgjq3ZrAdr8/gFf+YwgeXqiwATBnJ5AhvuT9Wa6tQKg=; b=BHq1SGRS6P0oyqikcvsThfPYiUKeXMxXEqpdYZW7Ka3uYr8RD2SNTyXJvJSxG3WIZ7 d0DjaNHJHcsfblsJ+EswpPv1jFXXps2F37toLolwyV/iVF2GYzpzeimuDybJJz/ok+9E wD9RGDtoIcEiJpl2jift11wxU8qQj3UcjwgsKdueur1ciWP1q3/62+NLe9tw7S4tXGBT uwgOlguMVBbH/G0AZzPMvNWIh9UU9JxykcZ6sXzaQO7dJUVd08H89Ry/FHHJCSGKweV5 x5nrBuiG6TF9/+WXKFpQrdJ5k9w+c/8iECPXgXLzOlIpdKIPBLxRp6zbrqP+Vrq5YFjS zy8g== X-Gm-Message-State: AGi0PuaXb6WpUlI8PWytSHo+ERcfDPEijyXvm68gt75jJKb1uuLTs52V 2LBnTWNX1YLNuxkWWSB1wR8PN7yeX4w= X-Google-Smtp-Source: APiQypLPzs03Wep0KUfVTDRU3HE2xPiKCYPuksIV1cBciTWqzllfmhqorL559DJFca6Y/YKAxeNJBA== X-Received: by 2002:a17:90a:ce08:: with SMTP id f8mr3427277pju.76.1587116744029; Fri, 17 Apr 2020 02:45:44 -0700 (PDT) Received: from tigtog.localdomain.localdomain ([144.34.163.219]) by smtp.gmail.com with ESMTPSA id q145sm4790979pfq.105.2020.04.17.02.45.43 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Apr 2020 02:45:43 -0700 (PDT) From: Jiang Xin To: Junio C Hamano , Git List Cc: Jiang Xin Subject: [PATCH v4 3/5] send-pack: mark failure of atomic push properly Date: Fri, 17 Apr 2020 05:45:34 -0400 Message-Id: <20200417094536.9463-4-worldhello.net@gmail.com> X-Mailer: git-send-email 2.26.0.rc0 In-Reply-To: <20200416162415.5751-1-worldhello.net@gmail.com> References: <20200416162415.5751-1-worldhello.net@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Jiang Xin When pushing with SSH or other smart protocol, references are validated by function `check_to_send_update()` before they are sent in commands to `send_pack()` of "receve-pack". For atomic push, if a reference is rejected after the validation, only references pushed by user should be marked as failure, instead of report failure on all remote references. Commit v2.22.0-1-g3bca1e7f9f (transport-helper: enforce atomic in push_refs_with_push, 2019-07-11) wanted to fix report issue of HTTP protocol, but marked all remote references failure for atomic push. In order to fix the issue of status report for SSH or other built-in smart protocol, revert part of that commit and add additional status for function `atomic_push_failure()`. The additional status for it except the "REF_STATUS_EXPECTING_REPORT" status are: - REF_STATUS_NONE : Not marked as "REF_STATUS_EXPECTING_REPORT" yet. - REF_STATUS_OK : Assume OK for dryrun or status_report is disabled. This fix won't resolve the issue of status report in transport-helper for HTTP or other protocols, and breaks test case in t5541. Will fix it in additional commit. Signed-off-by: Jiang Xin --- send-pack.c | 2 ++ t/t5541-http-push-smart.sh | 2 +- t/t5543-atomic-push.sh | 6 +++--- t/t5548-push-porcelain.sh | 2 +- transport.c | 14 -------------- 5 files changed, 7 insertions(+), 19 deletions(-) diff --git a/send-pack.c b/send-pack.c index 1835cd5582..efefb687b2 100644 --- a/send-pack.c +++ b/send-pack.c @@ -332,6 +332,8 @@ static int atomic_push_failure(struct send_pack_args *args, continue; switch (ref->status) { + case REF_STATUS_NONE: + case REF_STATUS_OK: case REF_STATUS_EXPECTING_REPORT: ref->status = REF_STATUS_ATOMIC_PUSH_FAILED; continue; diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index 23be8ce92d..2c2c3fb0f5 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -177,7 +177,7 @@ test_expect_success 'push (chunked)' ' test $HEAD = $(git rev-parse --verify HEAD)) ' -test_expect_success 'push --atomic also prevents branch creation, reports collateral' ' +test_expect_failure 'push --atomic also prevents branch creation, reports collateral' ' # Setup upstream repo - empty for now d=$HTTPD_DOCUMENT_ROOT_PATH/atomic-branches.git && git init --bare "$d" && diff --git a/t/t5543-atomic-push.sh b/t/t5543-atomic-push.sh index 001240eec7..620c30d58f 100755 --- a/t/t5543-atomic-push.sh +++ b/t/t5543-atomic-push.sh @@ -200,7 +200,7 @@ test_expect_success 'atomic push is not advertised if configured' ' # References in upstream : master(1) one(1) foo(1) # References in workbench: master(2) foo(1) two(2) bar(2) # Atomic push : master(2) two(2) bar(2) -test_expect_failure 'atomic push reports (reject by update hook)' ' +test_expect_success 'atomic push reports (reject by update hook)' ' mk_repo_pair && ( cd workbench && @@ -241,7 +241,7 @@ test_expect_failure 'atomic push reports (reject by update hook)' ' # References in upstream : master(1) one(1) foo(1) # References in workbench: master(2) foo(1) two(2) bar(2) -test_expect_failure 'atomic push reports (mirror, but reject by update hook)' ' +test_expect_success 'atomic push reports (mirror, but reject by update hook)' ' ( cd workbench && git remote remove up && @@ -262,7 +262,7 @@ test_expect_failure 'atomic push reports (mirror, but reject by update hook)' ' # References in upstream : master(2) one(1) foo(1) # References in workbench: master(1) foo(1) two(2) bar(2) -test_expect_failure 'atomic push reports (reject by non-ff)' ' +test_expect_success 'atomic push reports (reject by non-ff)' ' rm upstream/.git/hooks/update && ( cd workbench && diff --git a/t/t5548-push-porcelain.sh b/t/t5548-push-porcelain.sh index 96ba449a38..9f4b7de74b 100755 --- a/t/t5548-push-porcelain.sh +++ b/t/t5548-push-porcelain.sh @@ -136,7 +136,7 @@ run_git_push_porcelain_output_test() { # Refs of upstream : master(A) bar(B) baz(A) next(A) # Refs of workbench: master(B) bar(A) baz(A) next(A) # git-push : master(B) bar(A) NULL next(A) - test_expect_success "atomic push failed ($PROTOCOL)" ' + test_expect_failure "atomic push failed ($PROTOCOL)" ' ( cd workbench && git update-ref refs/heads/master $B && diff --git a/transport.c b/transport.c index 13d638d5fe..a07e39564c 100644 --- a/transport.c +++ b/transport.c @@ -1248,20 +1248,6 @@ int transport_push(struct repository *r, err = push_had_errors(remote_refs); ret = push_ret | err; - if ((flags & TRANSPORT_PUSH_ATOMIC) && err) { - struct ref *it; - for (it = remote_refs; it; it = it->next) - switch (it->status) { - case REF_STATUS_NONE: - case REF_STATUS_UPTODATE: - case REF_STATUS_OK: - it->status = REF_STATUS_ATOMIC_PUSH_FAILED; - break; - default: - break; - } - } - if (!quiet || err) transport_print_push_status(transport->url, remote_refs, verbose | porcelain, porcelain, From patchwork Fri Apr 17 09:45:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiang Xin X-Patchwork-Id: 11494623 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B7D2E13B2 for ; Fri, 17 Apr 2020 09:45:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9E86E21D94 for ; Fri, 17 Apr 2020 09:45:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="culB7OGe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727886AbgDQJpr (ORCPT ); Fri, 17 Apr 2020 05:45:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47608 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727850AbgDQJpp (ORCPT ); Fri, 17 Apr 2020 05:45:45 -0400 Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6F9E3C061A0C for ; Fri, 17 Apr 2020 02:45:45 -0700 (PDT) Received: by mail-pl1-x635.google.com with SMTP id z6so776053plk.10 for ; Fri, 17 Apr 2020 02:45:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=AEl9XdfiAgzLgL0z+IoR/phX8zO1Qe5zurFTiYwMMIc=; b=culB7OGejxpQl6kLAL3nfRdjg5sWClG9bMWnJLw8v+/xZ5B55xBh7yuUsIaTQVvuLn uzUupHKiyCS4tZVByPaCQPNxO4EKDr0AQtErHinh58183lMI5NwtD7Hqb+dSOvyo2PXR zuYTfPaB/xTiJxw7u7Lfam9C1+VieeNI2r0Mnv8ivKxQv+dpKGcc3s6AYRHp/ueuE9q+ wUdHDjrWHpoHncI+eZZSq82pt2/BEYpNXzKvRSbMie2lhvIgye4ZgM/YE7ns9StibK02 iJ+8EAnJnoMt5d1vZsTHkwFS1pG8x6rnSwLGp4D2sgYQJPIiVDAGAwo1NMTkmELH8Cl1 IyEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AEl9XdfiAgzLgL0z+IoR/phX8zO1Qe5zurFTiYwMMIc=; b=QQUur2+EjC5JAAdt68qKg7Fc4YzD2AkQWal+F5g+YYAY8sXkk6w2O8e5vVhowSDqTG Mw4PcCkPs1LUVgMr9uMEOIPtoWC5MV+nqH4kFJiliz7cyMRd/k+H5Y6sp5x3SMwcX/uo p2ALojj31lCIr4QUZ/u2DzUzZmaafa2pVYfUZ9rOLVJUzA0Y/cdWnBleRCiDdX7wu44K f6h9s3ANq5MgitfKL3h3bj/ClGoQJEQNzmg5EPI9jZ9hR+3s1aVW/bNI6vk87BkOPfYV oOgiEE9JSPPnqyftQr9BKMAskUu3xXhErjmKfTyN3UOGVQcQPhxG/MzWWCu5beDMTlvc 5IsA== X-Gm-Message-State: AGi0PuZw0ewI+dBVneYWn+MIAvpgE7fNIvf4tM94NV3rhqPmhPBP/GqF axPxAW476IoyeYkAHRx4i6w= X-Google-Smtp-Source: APiQypJ5fJsFP/6cpSZ9fngcdrs8IoCe/Zr0SmI1kBQHv7LI9KcsHfxkTWjeHntwU5hqituaXSm2fQ== X-Received: by 2002:a17:90a:f313:: with SMTP id ca19mr3309114pjb.7.1587116744867; Fri, 17 Apr 2020 02:45:44 -0700 (PDT) Received: from tigtog.localdomain.localdomain ([144.34.163.219]) by smtp.gmail.com with ESMTPSA id q145sm4790979pfq.105.2020.04.17.02.45.44 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Apr 2020 02:45:44 -0700 (PDT) From: Jiang Xin To: Junio C Hamano , Git List Cc: Jiang Xin Subject: [PATCH v4 4/5] transport-helper: mark failure for atomic push Date: Fri, 17 Apr 2020 05:45:35 -0400 Message-Id: <20200417094536.9463-5-worldhello.net@gmail.com> X-Mailer: git-send-email 2.26.0.rc0 In-Reply-To: <20200416162415.5751-1-worldhello.net@gmail.com> References: <20200416162415.5751-1-worldhello.net@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Jiang Xin Commit v2.22.0-1-g3bca1e7f9f (transport-helper: enforce atomic in push_refs_with_push, 2019-07-11) noticed the incomplete report of failure of an atomic push for HTTP protocol. But the implementation has a flaw that mark all remote references as failure. Only mark necessary references as failure in `push_refs_with_push()` of transport-helper. Signed-off-by: Jiang Xin --- t/t5541-http-push-smart.sh | 14 +++++++++++--- t/t5548-push-porcelain.sh | 5 ++--- transport-helper.c | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index 2c2c3fb0f5..afc680d5e3 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -177,7 +177,10 @@ test_expect_success 'push (chunked)' ' test $HEAD = $(git rev-parse --verify HEAD)) ' -test_expect_failure 'push --atomic also prevents branch creation, reports collateral' ' +## References of remote: atomic1(1) master(2) collateral(2) other(2) +## References of local : atomic2(2) master(1) collateral(3) other(2) collateral1(3) atomic(1) +## Atomic push : master(1) collateral(3) atomic(1) +test_expect_success 'push --atomic also prevents branch creation, reports collateral' ' # Setup upstream repo - empty for now d=$HTTPD_DOCUMENT_ROOT_PATH/atomic-branches.git && git init --bare "$d" && @@ -189,7 +192,8 @@ test_expect_failure 'push --atomic also prevents branch creation, reports collat test_commit atomic2 && git branch collateral && git branch other && - git push "$up" master collateral other && + git push "$up" atomic1 master collateral other && + git tag -d atomic1 && # collateral is a valid push, but should be failed by atomic push git checkout collateral && @@ -224,7 +228,11 @@ test_expect_failure 'push --atomic also prevents branch creation, reports collat # the collateral failure refs should be indicated to the user grep "^ ! .*rejected.* atomic -> atomic .*atomic push failed" output && - grep "^ ! .*rejected.* collateral -> collateral .*atomic push failed" output + grep "^ ! .*rejected.* collateral -> collateral .*atomic push failed" output && + + # never report what we do not push + ! grep "^ ! .*rejected.* atomic1 " output && + ! grep "^ ! .*rejected.* other " output ' test_expect_success 'push --atomic fails on server-side errors' ' diff --git a/t/t5548-push-porcelain.sh b/t/t5548-push-porcelain.sh index 9f4b7de74b..1b19b3ef55 100755 --- a/t/t5548-push-porcelain.sh +++ b/t/t5548-push-porcelain.sh @@ -136,7 +136,7 @@ run_git_push_porcelain_output_test() { # Refs of upstream : master(A) bar(B) baz(A) next(A) # Refs of workbench: master(B) bar(A) baz(A) next(A) # git-push : master(B) bar(A) NULL next(A) - test_expect_failure "atomic push failed ($PROTOCOL)" ' + test_expect_success "atomic push failed ($PROTOCOL)" ' ( cd workbench && git update-ref refs/heads/master $B && @@ -150,10 +150,10 @@ run_git_push_porcelain_output_test() { make_user_friendly_and_stable_output actual && cat >expect <<-EOF && To + = refs/heads/next:refs/heads/next [up to date] ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) ! (delete):refs/heads/baz [rejected] (atomic push failed) ! refs/heads/master:refs/heads/master [rejected] (atomic push failed) - ! refs/heads/next:refs/heads/next [rejected] (atomic push failed) Done EOF test_cmp expect actual && @@ -168,7 +168,6 @@ run_git_push_porcelain_output_test() { EOF test_cmp expect actual ' - test_expect_success "prepare pre-receive hook ($PROTOCOL)" ' write_script "$upstream/hooks/pre-receive" <<-EOF exit 1 diff --git a/transport-helper.c b/transport-helper.c index 20a7185ec4..ab3b52eb14 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -894,6 +894,21 @@ static int push_refs_with_push(struct transport *transport, case REF_STATUS_REJECT_STALE: case REF_STATUS_REJECT_ALREADY_EXISTS: if (atomic) { + /* Mark other refs as failed */ + for (ref = remote_refs; ref; ref = ref->next) { + if (!ref->peer_ref && !mirror) + continue; + + switch (ref->status) { + case REF_STATUS_NONE: + case REF_STATUS_OK: + case REF_STATUS_EXPECTING_REPORT: + ref->status = REF_STATUS_ATOMIC_PUSH_FAILED; + continue; + default: + break; /* do nothing */ + } + } string_list_clear(&cas_options, 0); return 0; } else From patchwork Fri Apr 17 09:45:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiang Xin X-Patchwork-Id: 11494627 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 69C4D174A for ; Fri, 17 Apr 2020 09:45:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 52E4A221EA for ; Fri, 17 Apr 2020 09:45:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DRFV4ZwO" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727897AbgDQJpt (ORCPT ); Fri, 17 Apr 2020 05:45:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727863AbgDQJpq (ORCPT ); Fri, 17 Apr 2020 05:45:46 -0400 Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 761BAC061A0F for ; Fri, 17 Apr 2020 02:45:46 -0700 (PDT) Received: by mail-pf1-x442.google.com with SMTP id r20so818514pfh.9 for ; Fri, 17 Apr 2020 02:45:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=F7X1+/hgYdrwheZ2RW40orwF77yMEqdOCDz+jw7Mq2w=; b=DRFV4ZwOggoVBQLTRsdO6CFjZbZF7ijsgc4D//4XdFv04K2xl9kqkGe2Nz6P/enuDr pbkidzxvDbOpzWkqqz1VH50Y93Q8OYMtrp6B7s/nqWnDsI7dlfYlqXMPcILNIOyLVxPI u2fU3oLuPYEEf7TVng5tCofaO4TFQWxs4EAxm9WNd853rCsokJc0qdwFvUjLDw1lq7mL I370NgNpLbtvH+9K+ZOEsHalMj9spHooFOdpM4VnIjFrhKaS0xt6bkZK1DXZbhYBEbnn DY/N/PNlo4wFPZFcZoTlTQ35w4JRM/IN34Y8eMWFbWucj3i/dwSGtO4bFobzyyK8pmqX ubHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=F7X1+/hgYdrwheZ2RW40orwF77yMEqdOCDz+jw7Mq2w=; b=ZmsIZjfEAji8RKfRvx/Aiyw0G8vgK6ZjgtywNwZIh+ElyqZOGNlpZZgYFpHRS6c4pX Vz6MDNGRxQz/IWeoUvBbJ2VodYmViB+UIGSq5MZ76NR/r/yPYOb9+e3EdtwZYxKDHCUJ qwhGnJk8DjNkXWzGeOxfMhts0ImiOL0Ep8qcw62VL1vhUkEpl/mP0GeFHqYEMyQyr+Ft 6N/aoR3kDL619L1e64tIUBvyJ5RAyBV6dijIeP1WAZ/BU7hve5b9eH5N534V5SV8M1K1 SHOxvqJpfuRcJEVgs06E0bShQkFRsCktOkfv/lISggcR6/sujgCPHTd56OnK5sqAgRoQ CQvw== X-Gm-Message-State: AGi0PuZ4Lo9TZPe895CsaWOv+U/lJVe7xFl6DO1G9QG5qSBMNk/hN9Ki on0heG9Rq+Nw96HgPRt+b8zRR9NwNs8= X-Google-Smtp-Source: APiQypLnNe1eob5QtV7gtu65RWljKvaL7fwyTRaulkJkdDtuq7vdBkE6ySuXbRgr29c9Mr+OKq1whA== X-Received: by 2002:a62:2947:: with SMTP id p68mr2294925pfp.282.1587116746049; Fri, 17 Apr 2020 02:45:46 -0700 (PDT) Received: from tigtog.localdomain.localdomain ([144.34.163.219]) by smtp.gmail.com with ESMTPSA id q145sm4790979pfq.105.2020.04.17.02.45.45 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Apr 2020 02:45:45 -0700 (PDT) From: Jiang Xin To: Junio C Hamano , Git List Cc: Jiang Xin Subject: [PATCH v4 5/5] transport-helper: new method reject_atomic_push() Date: Fri, 17 Apr 2020 05:45:36 -0400 Message-Id: <20200417094536.9463-6-worldhello.net@gmail.com> X-Mailer: git-send-email 2.26.0.rc0 In-Reply-To: <20200416162415.5751-1-worldhello.net@gmail.com> References: <20200416162415.5751-1-worldhello.net@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Jiang Xin Add new method in transport-helper to reject all references if any reference is failed for atomic push. This method is reused in "send-pack.c" and "transport-helper.c", one for SSH, git and file protocols, and the other for HTTP protocol. Signed-off-by: Jiang Xin --- send-pack.c | 29 +++-------------------------- transport-helper.c | 38 +++++++++++++++++++++++--------------- transport.h | 3 +++ 3 files changed, 29 insertions(+), 41 deletions(-) diff --git a/send-pack.c b/send-pack.c index efefb687b2..a7c53193c9 100644 --- a/send-pack.c +++ b/send-pack.c @@ -320,31 +320,6 @@ static int generate_push_cert(struct strbuf *req_buf, return update_seen; } - -static int atomic_push_failure(struct send_pack_args *args, - struct ref *remote_refs, - struct ref *failing_ref) -{ - struct ref *ref; - /* Mark other refs as failed */ - for (ref = remote_refs; ref; ref = ref->next) { - if (!ref->peer_ref && !args->send_mirror) - continue; - - switch (ref->status) { - case REF_STATUS_NONE: - case REF_STATUS_OK: - case REF_STATUS_EXPECTING_REPORT: - ref->status = REF_STATUS_ATOMIC_PUSH_FAILED; - continue; - default: - break; /* do nothing */ - } - } - return error("atomic push failed for ref %s. status: %d\n", - failing_ref->name, failing_ref->status); -} - #define NONCE_LEN_LIMIT 256 static void reject_invalid_nonce(const char *nonce, int len) @@ -489,7 +464,9 @@ int send_pack(struct send_pack_args *args, if (use_atomic) { strbuf_release(&req_buf); strbuf_release(&cap_buf); - atomic_push_failure(args, remote_refs, ref); + reject_atomic_push(remote_refs, args->send_mirror); + error("atomic push failed for ref %s. status: %d\n", + ref->name, ref->status); return args->porcelain ? 0 : -1; } /* else fallthrough */ diff --git a/transport-helper.c b/transport-helper.c index ab3b52eb14..a46afcb69d 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -894,21 +894,7 @@ static int push_refs_with_push(struct transport *transport, case REF_STATUS_REJECT_STALE: case REF_STATUS_REJECT_ALREADY_EXISTS: if (atomic) { - /* Mark other refs as failed */ - for (ref = remote_refs; ref; ref = ref->next) { - if (!ref->peer_ref && !mirror) - continue; - - switch (ref->status) { - case REF_STATUS_NONE: - case REF_STATUS_OK: - case REF_STATUS_EXPECTING_REPORT: - ref->status = REF_STATUS_ATOMIC_PUSH_FAILED; - continue; - default: - break; /* do nothing */ - } - } + reject_atomic_push(remote_refs, mirror); string_list_clear(&cas_options, 0); return 0; } else @@ -1503,3 +1489,25 @@ int bidirectional_transfer_loop(int input, int output) return tloop_spawnwait_tasks(&state); } + +void reject_atomic_push(struct ref *remote_refs, int mirror_mode) +{ + struct ref *ref; + + /* Mark other refs as failed */ + for (ref = remote_refs; ref; ref = ref->next) { + if (!ref->peer_ref && !mirror_mode) + continue; + + switch (ref->status) { + case REF_STATUS_NONE: + case REF_STATUS_OK: + case REF_STATUS_EXPECTING_REPORT: + ref->status = REF_STATUS_ATOMIC_PUSH_FAILED; + continue; + default: + break; /* do nothing */ + } + } + return; +} diff --git a/transport.h b/transport.h index e0131daab9..4298c855be 100644 --- a/transport.h +++ b/transport.h @@ -265,4 +265,7 @@ int transport_refs_pushed(struct ref *ref); void transport_print_push_status(const char *dest, struct ref *refs, int verbose, int porcelain, unsigned int *reject_reasons); +/* common method used by transport-helper.c and send-pack.c */ +void reject_atomic_push(struct ref *refs, int mirror_mode); + #endif