From patchwork Fri Nov 13 08:12:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 11902675 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3B43CC388F7 for ; Fri, 13 Nov 2020 08:12:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A729E20936 for ; Fri, 13 Nov 2020 08:12:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="SoftXJuJ"; dkim=temperror (0-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="X+CCH0gE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726162AbgKMIMg (ORCPT ); Fri, 13 Nov 2020 03:12:36 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:49765 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725866AbgKMIMg (ORCPT ); Fri, 13 Nov 2020 03:12:36 -0500 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 537485C0066; Fri, 13 Nov 2020 03:12:34 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 13 Nov 2020 03:12:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=fm2; bh=jqMZZVdUzHZVPKki0+uHcWr0k77 UKyvY0dgP84XfD7Y=; b=SoftXJuJ6nS75rzpCQheOlK2WjptXcilPf3aajv/g1C uMwAc3bXaYgNfcD/iwEeJGUAol2d3CmxmldZaxF1tmAfISgNX9yRC4SH+dNXM9LD r28vlK7uKlKI45wfocKsBFYkwPS/J1Nu+fJJFKU9fY+yHGJhsHACBrMO6vwy37Pb LsvP0SsfC9Ag/wj1UQq942GP2KdGt2MrlkPDi+Ll4Vdigt3edrzPEIlvGOxnZQzG wPJIqmhhQCLwByJgerU2YvfnFFDmFNE2+7WYnOPSPn2Se45PnU0wnN/UFVbgELdY uM3nPLkd0JKBTxpW/BYl5kyOYkGoK01qxSort1jhjZg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=jqMZZV dUzHZVPKki0+uHcWr0k77UKyvY0dgP84XfD7Y=; b=X+CCH0gE/nl9T8UvdEcOO0 22UfES0X//rs6mmELfItvFxu96evvc0clzxtWObPcYcZ6D9yc73gCRGiFgeZrT3n XKsH3DdVXPg3AEabNc3n5YQmdcutivRhNiX21NjQqxQAnuLSU2Ou4oMLWxXymuOs drFC6/y9ivwd9igGsLg9RnFik37qfo83laZ9DPEdpyigGdcAwr74Ic3vTzerds+D Iqx2Q8mMh9zgrjEoqI/ywvGNqbiEoGc2A8ffz+XAKHtAPtXjjCaJkcpGjWFi6AX1 EeWv9Cp1ftHPtGLp7dpdkLvZIZKvNFXZlk5U57NWYUGWK7hy8Z9iZGeF/qF1FexA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedruddvgedguddulecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhepfffhvffukfhfgggtuggjsehgtd erredttddvnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshes phhkshdrihhmqeenucggtffrrghtthgvrhhnpeehgefhtdefueffheekgfffudelffejtd fhvdejkedthfehvdelgfetgfdvtedthfenucfkphepkeelrdduvddrfedurddvfeehnecu vehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehmrghilhhfrhhomhepphhssehpkh hsrdhimh X-ME-Proxy: Received: from vm-mail.pks.im (dynamic-089-012-031-235.89.12.pool.telefonica.de [89.12.31.235]) by mail.messagingengine.com (Postfix) with ESMTPA id 71A3D3064AAE; Fri, 13 Nov 2020 03:12:33 -0500 (EST) Received: from localhost (ncase [10.192.0.11]) by vm-mail.pks.im (OpenSMTPD) with ESMTPSA id ef861b84 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 13 Nov 2020 08:12:31 +0000 (UTC) Date: Fri, 13 Nov 2020 09:12:31 +0100 From: Patrick Steinhardt To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, szeder.dev@gmail.com Subject: [PATCH v4 1/4] t1400: avoid touching refs on filesystem Message-ID: <617d48b00a13c8ef82749f0b610997625f6cf222.1605254957.git.ps@pks.im> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The testcase t1400 exercises the git-update-ref(1) utility. To do so, many tests directly read and write references via the filesystem, assuming that we always use loose and/or packed references. While this is true now, it'll change with the introduction of the reftable backend. Convert those tests to use git-update-ref(1) and git-show-ref(1) where possible. Furthermore, two tests are converted to not delete HEAD anymore, as this results in a broken repository. They've instead been updated to create a non-mandatory symybolic reference and delete that one instead. Some tests remain which exercise behaviour with broken references, which cannot currently be converted to use regular git tooling. Signed-off-by: Patrick Steinhardt --- t/t1400-update-ref.sh | 77 +++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 4c01e08551..b782dafff5 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -48,17 +48,17 @@ test_expect_success "fail to delete $m with stale ref" ' test $B = "$(git show-ref -s --verify $m)" ' test_expect_success "delete $m" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref -d $m $B && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' test_expect_success "delete $m without oldvalue verification" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref $m $A && test $A = $(git show-ref -s --verify $m) && git update-ref -d $m && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' test_expect_success "fail to create $n" ' @@ -80,26 +80,26 @@ test_expect_success "fail to delete $m (by HEAD) with stale ref" ' test $B = $(git show-ref -s --verify $m) ' test_expect_success "delete $m (by HEAD)" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref -d HEAD $B && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' test_expect_success "deleting current branch adds message to HEAD's log" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref $m $A && git symbolic-ref HEAD $m && git update-ref -m delete-$m -d $m && - test_path_is_missing .git/$m && + test_must_fail git show-ref --verify -q $m && grep "delete-$m$" .git/logs/HEAD ' test_expect_success "deleting by HEAD adds message to HEAD's log" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref $m $A && git symbolic-ref HEAD $m && git update-ref -m delete-by-head -d HEAD && - test_path_is_missing .git/$m && + test_must_fail git show-ref --verify -q $m && grep "delete-by-head$" .git/logs/HEAD ' @@ -188,31 +188,37 @@ test_expect_success "move $m (by HEAD)" ' test $B = $(git show-ref -s --verify $m) ' test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref -d HEAD $B && ! grep "$m" .git/packed-refs && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' -cp -f .git/HEAD .git/HEAD.orig test_expect_success 'delete symref without dereference' ' - test_when_finished "cp -f .git/HEAD.orig .git/HEAD" && - git update-ref --no-deref -d HEAD && - test_path_is_missing .git/HEAD + test_when_finished "git update-ref -d $m" && + echo foo >foo.c && + git add foo.c && + git commit -m foo && + git symbolic-ref SYMREF $m && + git update-ref --no-deref -d SYMREF && + git show-ref --verify -q $m && + test_must_fail git show-ref --verify -q SYMREF && + test_must_fail git symbolic-ref SYMREF ' test_expect_success 'delete symref without dereference when the referred ref is packed' ' - test_when_finished "cp -f .git/HEAD.orig .git/HEAD" && + test_when_finished "git update-ref -d $m" && echo foo >foo.c && git add foo.c && git commit -m foo && + git symbolic-ref SYMREF $m && git pack-refs --all && - git update-ref --no-deref -d HEAD && - test_path_is_missing .git/HEAD + git update-ref --no-deref -d SYMREF && + git show-ref --verify -q $m && + test_must_fail git show-ref --verify -q SYMREF && + test_must_fail git symbolic-ref SYMREF ' -git update-ref -d $m - test_expect_success 'update-ref -d is not confused by self-reference' ' git symbolic-ref refs/heads/self refs/heads/self && test_when_finished "rm -f .git/refs/heads/self" && @@ -226,25 +232,25 @@ test_expect_success 'update-ref --no-deref -d can delete self-reference' ' test_when_finished "rm -f .git/refs/heads/self" && test_path_is_file .git/refs/heads/self && git update-ref --no-deref -d refs/heads/self && - test_path_is_missing .git/refs/heads/self + test_must_fail git show-ref --verify -q refs/heads/self ' test_expect_success 'update-ref --no-deref -d can delete reference to bad ref' ' >.git/refs/heads/bad && test_when_finished "rm -f .git/refs/heads/bad" && git symbolic-ref refs/heads/ref-to-bad refs/heads/bad && - test_when_finished "rm -f .git/refs/heads/ref-to-bad" && + test_when_finished "git update-ref -d refs/heads/ref-to-bad" && test_path_is_file .git/refs/heads/ref-to-bad && git update-ref --no-deref -d refs/heads/ref-to-bad && - test_path_is_missing .git/refs/heads/ref-to-bad + test_must_fail git show-ref --verify -q refs/heads/ref-to-bad ' test_expect_success '(not) create HEAD with old sha1' ' test_must_fail git update-ref HEAD $A $B ' test_expect_success "(not) prior created .git/$m" ' - test_when_finished "rm -f .git/$m" && - test_path_is_missing .git/$m + test_when_finished "git update-ref -d $m" && + test_must_fail git show-ref --verify -q $m ' test_expect_success 'create HEAD' ' @@ -254,7 +260,7 @@ test_expect_success '(not) change HEAD with wrong SHA1' ' test_must_fail git update-ref HEAD $B $Z ' test_expect_success "(not) changed .git/$m" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && ! test $B = $(git show-ref -s --verify $m) ' @@ -284,8 +290,8 @@ test_expect_success 'empty directory removal' ' test_path_is_file .git/refs/heads/d1/d2/r1 && test_path_is_file .git/logs/refs/heads/d1/d2/r1 && git branch -d d1/d2/r1 && - test_path_is_missing .git/refs/heads/d1/d2 && - test_path_is_missing .git/logs/refs/heads/d1/d2 && + test_must_fail git show-ref --verify -q refs/heads/d1/d2 && + test_must_fail git show-ref --verify -q logs/refs/heads/d1/d2 && test_path_is_file .git/refs/heads/d1/r2 && test_path_is_file .git/logs/refs/heads/d1/r2 ' @@ -298,8 +304,8 @@ test_expect_success 'symref empty directory removal' ' test_path_is_file .git/refs/heads/e1/e2/r1 && test_path_is_file .git/logs/refs/heads/e1/e2/r1 && git update-ref -d HEAD && - test_path_is_missing .git/refs/heads/e1/e2 && - test_path_is_missing .git/logs/refs/heads/e1/e2 && + test_must_fail git show-ref --verify -q refs/heads/e1/e2 && + test_must_fail git show-ref --verify -q logs/refs/heads/e1/e2 && test_path_is_file .git/refs/heads/e1/r2 && test_path_is_file .git/logs/refs/heads/e1/r2 && test_path_is_file .git/logs/HEAD @@ -1388,7 +1394,8 @@ test_expect_success 'handle per-worktree refs in refs/bisect' ' git rev-parse refs/bisect/something >../worktree-head && git for-each-ref | grep refs/bisect/something ) && - test_path_is_missing .git/refs/bisect && + git show-ref >actual && + ! grep 'refs/bisect' actual && test_must_fail git rev-parse refs/bisect/something && git update-ref refs/bisect/something HEAD && git rev-parse refs/bisect/something >main-head && @@ -1500,7 +1507,7 @@ test_expect_success 'transaction can handle abort' ' git update-ref --stdin actual && printf "%s: ok\n" start abort >expect && test_cmp expect actual && - test_path_is_missing .git/$b + test_must_fail git show-ref --verify -q $b ' test_expect_success 'transaction aborts by default' ' @@ -1511,7 +1518,7 @@ test_expect_success 'transaction aborts by default' ' git update-ref --stdin actual && printf "%s: ok\n" start >expect && test_cmp expect actual && - test_path_is_missing .git/$b + test_must_fail git show-ref --verify -q $b ' test_expect_success 'transaction with prepare aborts by default' ' @@ -1523,7 +1530,7 @@ test_expect_success 'transaction with prepare aborts by default' ' git update-ref --stdin actual && printf "%s: ok\n" start prepare >expect && test_cmp expect actual && - test_path_is_missing .git/$b + test_must_fail git show-ref --verify -q $b ' test_done From patchwork Fri Nov 13 08:12:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 11902673 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE0D0C4742C for ; Fri, 13 Nov 2020 08:12:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 855D920936 for ; Fri, 13 Nov 2020 08:12:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="OYRLkTb1"; dkim=temperror (0-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="lT+1tABz" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726203AbgKMIMj (ORCPT ); Fri, 13 Nov 2020 03:12:39 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:47013 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725866AbgKMIMj (ORCPT ); Fri, 13 Nov 2020 03:12:39 -0500 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 5026C5C0066; Fri, 13 Nov 2020 03:12:38 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 13 Nov 2020 03:12:38 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=fm2; bh=7ftYd8gP8yK3m6DhyMqVT9rg3Hb +/65oeem+Q6qwMGk=; b=OYRLkTb1lP8X+6ZP3uyImU4cvmGrqpV5OziLQkp9del ZDmJ8JOkkITM9T++jYQAusrlK8CUVx0/5cu0j+DZcjBif3UV7Er9GE0NkqI3NGgr 69iAbFwtsVX4XoEaGtACAbxdq0P+3vgy2o4D16bKhqVN2whXC7kWgzO7NV+2/maz 5EJKXxETwcHvPgFkIny+MeOJ+5iUrn4IAmAeF8lsbw1l7OAUi3OoqOM1y0WKC9mX QP/g9a7cGkyjY8NSQK6l8DNE15k4G3k31qJFKip4h9KGl/dBUinrkaH3bcxcHrOo pL42bwt4+y4JmsF4FtWDuSmosWfrG+6Ij3aHt+vDM+A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=7ftYd8 gP8yK3m6DhyMqVT9rg3Hb+/65oeem+Q6qwMGk=; b=lT+1tABzGJazOXNAyYhqhx xxQCYckIUzDN3HnK3VKqAUcawd1Sk5RILyrgVjZde76yA6oBlOIpY7y23FZm6blP oIIxxcI0xDcvWdZfG7+GDgvxOalVV8QYiFAXB1C3i+0G77QfxnEwsh5vDYPHs5FD eAVQxQY+qv5RRhciFlZqblR27ZWyEmwESPs/nPbAFp/szLwRYNp2zV95BEGlwpz3 xftJ104Z2yn1Y9bTkcfsTRctTaZIv/4ejUK07lIEqOKPbx+c2tfjKVudoYGwj01P YSOpi2WGQowssQ4K08NjVdmwDBga2zLFdWiV5TFRzPV8xBp5QBIRNV86QH+2MS4A == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedruddvgedguddulecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhepfffhvffukfhfgggtuggjsehgtd erredttddvnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshes phhkshdrihhmqeenucggtffrrghtthgvrhhnpeehgefhtdefueffheekgfffudelffejtd fhvdejkedthfehvdelgfetgfdvtedthfenucfkphepkeelrdduvddrfedurddvfeehnecu vehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehmrghilhhfrhhomhepphhssehpkh hsrdhimh X-ME-Proxy: Received: from vm-mail.pks.im (dynamic-089-012-031-235.89.12.pool.telefonica.de [89.12.31.235]) by mail.messagingengine.com (Postfix) with ESMTPA id 583E23064AAE; Fri, 13 Nov 2020 03:12:37 -0500 (EST) Received: from localhost (ncase [10.192.0.11]) by vm-mail.pks.im (OpenSMTPD) with ESMTPSA id 39847dd1 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 13 Nov 2020 08:12:36 +0000 (UTC) Date: Fri, 13 Nov 2020 09:12:36 +0100 From: Patrick Steinhardt To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, szeder.dev@gmail.com Subject: [PATCH v4 2/4] update-ref: allow creation of multiple transactions Message-ID: <8a05b48223f2829f536ea1f95f58c017efb8cf3d.1605254957.git.ps@pks.im> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org While git-update-ref has recently grown commands which allow interactive control of transactions in e48cf33b61 (update-ref: implement interactive transaction handling, 2020-04-02), it is not yet possible to create multiple transactions in a single session. To do so, one currently still needs to invoke the executable multiple times. This commit addresses this shortcoming by allowing the "start" command to create a new transaction if the current transaction has already been either committed or aborted. Signed-off-by: Patrick Steinhardt --- Documentation/git-update-ref.txt | 3 +- builtin/update-ref.c | 13 ++++++++- t/t1400-update-ref.sh | 50 ++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt index d401234b03..48b6683071 100644 --- a/Documentation/git-update-ref.txt +++ b/Documentation/git-update-ref.txt @@ -125,7 +125,8 @@ option:: start:: Start a transaction. In contrast to a non-transactional session, a transaction will automatically abort if the session ends without an - explicit commit. + explicit commit. This command may create a new empty transaction when + the current one has been committed or aborted already. prepare:: Prepare to commit the transaction. This will create lock files for all diff --git a/builtin/update-ref.c b/builtin/update-ref.c index 8a2df4459c..bb65129012 100644 --- a/builtin/update-ref.c +++ b/builtin/update-ref.c @@ -446,7 +446,18 @@ static void update_refs_stdin(void) state = cmd->state; break; case UPDATE_REFS_CLOSED: - die("transaction is closed"); + if (cmd->state != UPDATE_REFS_STARTED) + die("transaction is closed"); + + /* + * Open a new transaction if we're currently closed and + * get a "start". + */ + state = cmd->state; + transaction = ref_transaction_begin(&err); + if (!transaction) + die("%s", err.buf); + break; } diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index b782dafff5..3144e98b31 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -1533,4 +1533,54 @@ test_expect_success 'transaction with prepare aborts by default' ' test_must_fail git show-ref --verify -q $b ' +test_expect_success 'transaction can commit multiple times' ' + cat >stdin <<-EOF && + start + create refs/heads/branch-1 $A + commit + start + create refs/heads/branch-2 $B + commit + EOF + git update-ref --stdin actual && + printf "%s: ok\n" start commit start commit >expect && + test_cmp expect actual && + echo "$A" >expect && + git rev-parse refs/heads/branch-1 >actual && + test_cmp expect actual && + echo "$B" >expect && + git rev-parse refs/heads/branch-2 >actual && + test_cmp expect actual +' + +test_expect_success 'transaction can create and delete' ' + cat >stdin <<-EOF && + start + create refs/heads/create-and-delete $A + commit + start + delete refs/heads/create-and-delete $A + commit + EOF + git update-ref --stdin actual && + printf "%s: ok\n" start commit start commit >expect && + test_must_fail git show-ref --verify refs/heads/create-and-delete +' + +test_expect_success 'transaction can commit after abort' ' + cat >stdin <<-EOF && + start + create refs/heads/abort $A + abort + start + create refs/heads/abort $A + commit + EOF + git update-ref --stdin actual && + printf "%s: ok\n" start abort start commit >expect && + echo "$A" >expect && + git rev-parse refs/heads/abort >actual && + test_cmp expect actual +' + test_done From patchwork Fri Nov 13 08:12:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 11902677 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A1D0C4742C for ; Fri, 13 Nov 2020 08:12:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2CDFD20936 for ; Fri, 13 Nov 2020 08:12:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="fa0gSpBC"; dkim=temperror (0-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="KxMnwdN6" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726210AbgKMIMo (ORCPT ); Fri, 13 Nov 2020 03:12:44 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:35197 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725866AbgKMIMo (ORCPT ); Fri, 13 Nov 2020 03:12:44 -0500 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 19A815C00C2; Fri, 13 Nov 2020 03:12:43 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 13 Nov 2020 03:12:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=fm2; bh=/RTGC2nzdT8Y06MDQ7nbnLBvZk/ EdapKQv5H3q+115M=; b=fa0gSpBCJWdKFcEkjySx/9fS4oOgsnPwXMfILfNzAz5 V/coANMsEL19Rj+92agIPyOr57gnSRsWPp5UP7m751Rlu8w19cUt3BHpfTZ1/tTJ XHipitw+LEk22YqWRP33G/CdVaxc+RevPr9+YwY69d+ts8SX61cSUmuGvCZONB/1 N5vgHjSADF+BmxG9YPTmV3GcIAKbU8EzgsJ1BuUxXnt0VFxvHhRBOj5p2EmjH+sB HcP20ETUX0agjui5F1J0g2Q015pjFqsE+wJ9Sp7fwG3GSThlM4IYpva6agiIBJES YbzDVYRltEidSROdpNyTcX7daYRK6CtAXemnxKE7Wug== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=/RTGC2 nzdT8Y06MDQ7nbnLBvZk/EdapKQv5H3q+115M=; b=KxMnwdN6madTgN6Adin0Zh FO1uU5CKK/uwBOvHaqXuFqR287y2D7bl1yiEbtYaXQqYFA+dNSqZBcYb90UDacsb 8whrLtsZEfA4TUPQ3fAOk379+5+wRzX0mUarLa7mNX5Wm4qmzl057Gep0QKEGqcn CEY1J35o185TEcKgmHsJcbgftv12g5zdt0ka4b5ADeyU6SMqc8LPuqCFF/cr4Pdo OLdksZhY6gmybxMNS8hXzyiMPYkrW3Y+q9qpItOzRN9yxDVnBepKhrvebvh32jYi iycp0wS+Os0218MQbXkz7+PICenwU/1Ef9wLbF2yEas3qA6WiqQsufzgH+jfkXFQ == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedruddvgedguddulecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhepfffhvffukfhfgggtuggjsehgtd erredttddvnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshes phhkshdrihhmqeenucggtffrrghtthgvrhhnpeehgefhtdefueffheekgfffudelffejtd fhvdejkedthfehvdelgfetgfdvtedthfenucfkphepkeelrdduvddrfedurddvfeehnecu vehluhhsthgvrhfuihiivgepfeenucfrrghrrghmpehmrghilhhfrhhomhepphhssehpkh hsrdhimh X-ME-Proxy: Received: from vm-mail.pks.im (dynamic-089-012-031-235.89.12.pool.telefonica.de [89.12.31.235]) by mail.messagingengine.com (Postfix) with ESMTPA id 5A07F3064AA6; Fri, 13 Nov 2020 03:12:42 -0500 (EST) Received: from localhost (ncase [10.192.0.11]) by vm-mail.pks.im (OpenSMTPD) with ESMTPSA id e14f75c9 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 13 Nov 2020 08:12:40 +0000 (UTC) Date: Fri, 13 Nov 2020 09:12:41 +0100 From: Patrick Steinhardt To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, szeder.dev@gmail.com Subject: [PATCH v4 3/4] p1400: use `git-update-ref --stdin` to test multiple transactions Message-ID: <4778a60832185971a92b708d533cd03ac2af4973.1605254957.git.ps@pks.im> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org In commit 0a0fbbe3ff (refs: remove lookup cache for reference-transaction hook, 2020-08-25), a new benchmark was added to p1400 which has the intention to exercise creation of multiple transactions in a single process. As git-update-ref wasn't yet able to create multiple transactions with a single run we instead used git-push. As its non-atomic version creates a transaction per reference update, this was the best approximation we could make at that point in time. Now that `git-update-ref --stdin` supports creation of multiple transactions, let's convert the benchmark to use that instead. It has less overhead and it's also a lot clearer what the actual intention is. Signed-off-by: Patrick Steinhardt --- t/perf/p1400-update-ref.sh | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/t/perf/p1400-update-ref.sh b/t/perf/p1400-update-ref.sh index ce5ac3ed85..dda8a74866 100755 --- a/t/perf/p1400-update-ref.sh +++ b/t/perf/p1400-update-ref.sh @@ -7,13 +7,14 @@ test_description="Tests performance of update-ref" test_perf_fresh_repo test_expect_success "setup" ' - git init --bare target-repo.git && test_commit PRE && test_commit POST && - printf "create refs/heads/%d PRE\n" $(test_seq 1000) >create && - printf "update refs/heads/%d POST PRE\n" $(test_seq 1000) >update && - printf "delete refs/heads/%d POST\n" $(test_seq 1000) >delete && - git update-ref --stdin instructions ' test_perf "update-ref" ' @@ -26,14 +27,7 @@ test_perf "update-ref" ' ' test_perf "update-ref --stdin" ' - git update-ref --stdin /dev/null ' test_done From patchwork Fri Nov 13 08:12:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 11902679 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E770AC388F7 for ; Fri, 13 Nov 2020 08:12:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 89952217A0 for ; Fri, 13 Nov 2020 08:12:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="GK0LXHy9"; dkim=temperror (0-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="Xo+9UQIq" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726225AbgKMIMt (ORCPT ); Fri, 13 Nov 2020 03:12:49 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:45613 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725866AbgKMIMs (ORCPT ); Fri, 13 Nov 2020 03:12:48 -0500 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 094A05C00CD; Fri, 13 Nov 2020 03:12:48 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 13 Nov 2020 03:12:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=fm2; bh=hEXYvDI0BT3JMpWB3CuSDeefXYK lpT6cIevo+74so4A=; b=GK0LXHy9GFZiqZLAz2mkj9LKplWsLObEa1RAKh+r6ES oeK33wabueM2QSnEsw9qkmbLD5vQvBMe2DB8ZQOlPkcdwIbIm9K8GfR9WW/VbbWt x0LzQ/CPXKyRYgG0h29017CoeSLUYElEy4x4XtrQgPUE839debn0oaBciAWZjKnL hO115mPT7lwf7+3JXu2/6X01MoRfEHeppmfoiJksQHjFbljXOhPLp4RmdoXUSVGL +mhNJtG55aaHqq21mTJ8zIx7Yq3lf4Ap9rhNAqJR6pcCF47PtuB1zFch+bYoOght NVSRHkQU5I84p+vNIs1f2aOWiQ/KGBpKmankRoWVI7g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=hEXYvD I0BT3JMpWB3CuSDeefXYKlpT6cIevo+74so4A=; b=Xo+9UQIqLhL6fO1YNst0AY UxlIFxWSMlQSbv8vYrIe5SKQrKa4Mo162NPn2QqeQi++OaiNmvR0Xh2G/i/QL3f8 NsYjbHY3R9njL/oovyvmoHRuvwA3f/6iSTkdIEIj/ppOMiF/JPKhrXoBgUkqepF4 LOUdqX9DT+z/cV/jsloNm6rG8Ir6L94Vb7guEF4kEgMOCGWvY6dex33QVSaRz2Rp 7oLMCIRdZ63uVfomP7U5aoJH6D+BQefmY+2lxra7nk3IKvzoznkq4tVBshN3vepV gzOqaMk88NmLZw18OoAEA9XpD7cxAAwLo5c46XDp9WJvb8r124gigPwdDqRrTDPA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedruddvgedguddulecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhepfffhvffukfhfgggtuggjsehgtd erredttddvnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshes phhkshdrihhmqeenucggtffrrghtthgvrhhnpeehgefhtdefueffheekgfffudelffejtd fhvdejkedthfehvdelgfetgfdvtedthfenucfkphepkeelrdduvddrfedurddvfeehnecu vehluhhsthgvrhfuihiivgepgeenucfrrghrrghmpehmrghilhhfrhhomhepphhssehpkh hsrdhimh X-ME-Proxy: Received: from vm-mail.pks.im (dynamic-089-012-031-235.89.12.pool.telefonica.de [89.12.31.235]) by mail.messagingengine.com (Postfix) with ESMTPA id 3A13B3064AA7; Fri, 13 Nov 2020 03:12:47 -0500 (EST) Received: from localhost (ncase [10.192.0.11]) by vm-mail.pks.im (OpenSMTPD) with ESMTPSA id eb129dba (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 13 Nov 2020 08:12:45 +0000 (UTC) Date: Fri, 13 Nov 2020 09:12:45 +0100 From: Patrick Steinhardt To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, szeder.dev@gmail.com Subject: [PATCH v4 4/4] update-ref: disallow "start" for ongoing transactions Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org It is currently possible to write multiple "start" commands into git-update-ref(1) for a single session, but none of them except for the first one actually have any effect. Using such nested "start"s may eventually have a sensible effect. One may imagine that it restarts the current transaction, effectively emptying it and creating a new one. It may also allow for creation of nested transactions. But currently, none of these are implemented. Silently ignoring this misuse is making it hard to iterate in the future if "start" is ever going to have meaningful semantics in such a context. This commit thus makes sure to error out in case we see such use. Signed-off-by: Patrick Steinhardt --- builtin/update-ref.c | 2 ++ t/t1400-update-ref.sh | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/builtin/update-ref.c b/builtin/update-ref.c index bb65129012..6029a80544 100644 --- a/builtin/update-ref.c +++ b/builtin/update-ref.c @@ -436,6 +436,8 @@ static void update_refs_stdin(void) switch (state) { case UPDATE_REFS_OPEN: case UPDATE_REFS_STARTED: + if (state == UPDATE_REFS_STARTED && cmd->state == UPDATE_REFS_STARTED) + die("cannot restart ongoing transaction"); /* Do not downgrade a transaction to a non-transaction. */ if (cmd->state >= state) state = cmd->state; diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 3144e98b31..31b64be521 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -1583,4 +1583,15 @@ test_expect_success 'transaction can commit after abort' ' test_cmp expect actual ' +test_expect_success 'transaction cannot restart ongoing transaction' ' + cat >stdin <<-EOF && + start + create refs/heads/restart $A + start + commit + EOF + test_must_fail git update-ref --stdin actual && + test_must_fail git show-ref --verify refs/heads/restart +' + test_done