From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: Stefan Beller <sbeller@google.com>,
Eric Sunshine <sunshine@sunshineco.com>,
Jeff King <peff@peff.net>,
git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH v2 01/18] t1404: new tests of ref D/F conflicts within transactions
Date: Mon, 11 May 2015 17:25:03 +0200 [thread overview]
Message-ID: <1431357920-25090-2-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1431357920-25090-1-git-send-email-mhagger@alum.mit.edu>
Add some tests of reference D/F conflicts (by which I mean the fact
that references like "refs/foo" and "refs/foo/bar" are not allowed to
coexist) in the context of reference transactions.
The test of creating two conflicting references in the same
transaction fails, leaving the transaction half-completed. This will
be fixed later in this patch series.
Please note that the error messages emitted in the case of conflicts
are not very user-friendly. In particular, when the conflicts involve
loose references, then the errors are reported as
error: there are still refs under 'refs/foo'
fatal: Cannot lock the ref 'refs/foo'.
or
error: unable to resolve reference refs/foo/bar: Not a directory
fatal: Cannot lock the ref 'refs/foo/bar'.
This is because lock_ref_sha1_basic() fails while trying to lock the
new reference, before it even gets to the is_refname_available()
check. This situation will also be improved later in this patch
series.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
t/t1404-update-ref-df-conflicts.sh | 107 +++++++++++++++++++++++++++++++++++++
1 file changed, 107 insertions(+)
create mode 100755 t/t1404-update-ref-df-conflicts.sh
diff --git a/t/t1404-update-ref-df-conflicts.sh b/t/t1404-update-ref-df-conflicts.sh
new file mode 100755
index 0000000..ed1b93e
--- /dev/null
+++ b/t/t1404-update-ref-df-conflicts.sh
@@ -0,1 +1,107 @@
+#!/bin/sh
+
+test_description='Test git update-ref with D/F conflicts'
+. ./test-lib.sh
+
+test_update_rejected () {
+ prefix="$1" &&
+ before="$2" &&
+ pack="$3" &&
+ create="$4" &&
+ error="$5" &&
+ printf "create $prefix/%s $C\n" $before |
+ git update-ref --stdin &&
+ git for-each-ref $prefix >unchanged &&
+ if $pack
+ then
+ git pack-refs --all
+ fi &&
+ printf "create $prefix/%s $C\n" $create >input &&
+ test_must_fail git update-ref --stdin <input 2>output.err &&
+ grep -F "$error" output.err &&
+ git for-each-ref $prefix >actual &&
+ test_cmp unchanged actual
+}
+
+Q="'"
+
+test_expect_success 'setup' '
+
+ git commit --allow-empty -m Initial &&
+ C=$(git rev-parse HEAD)
+
+'
+
+test_expect_success 'existing loose ref is a simple prefix of new' '
+
+ prefix=refs/1l &&
+ test_update_rejected $prefix "a c e" false "b c/x d" \
+ "unable to resolve reference $prefix/c/x: Not a directory"
+
+'
+
+test_expect_success 'existing packed ref is a simple prefix of new' '
+
+ prefix=refs/1p &&
+ test_update_rejected $prefix "a c e" true "b c/x d" \
+ "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
+
+'
+
+test_expect_success 'existing loose ref is a deeper prefix of new' '
+
+ prefix=refs/2l &&
+ test_update_rejected $prefix "a c e" false "b c/x/y d" \
+ "unable to resolve reference $prefix/c/x/y: Not a directory"
+
+'
+
+test_expect_success 'existing packed ref is a deeper prefix of new' '
+
+ prefix=refs/2p &&
+ test_update_rejected $prefix "a c e" true "b c/x/y d" \
+ "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
+
+'
+
+test_expect_success 'new ref is a simple prefix of existing loose' '
+
+ prefix=refs/3l &&
+ test_update_rejected $prefix "a c/x e" false "b c d" \
+ "there are still refs under $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'new ref is a simple prefix of existing packed' '
+
+ prefix=refs/3p &&
+ test_update_rejected $prefix "a c/x e" true "b c d" \
+ "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'new ref is a deeper prefix of existing loose' '
+
+ prefix=refs/4l &&
+ test_update_rejected $prefix "a c/x/y e" false "b c d" \
+ "there are still refs under $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'new ref is a deeper prefix of existing packed' '
+
+ prefix=refs/4p &&
+ test_update_rejected $prefix "a c/x/y e" true "b c d" \
+ "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
+
+'
+
+test_expect_failure 'one new ref is a simple prefix of another' '
+
+ prefix=refs/5 &&
+ test_update_rejected $prefix "a e" false "b c c/x d" \
+ "cannot process $Q$prefix/c$Q and $Q$prefix/c/x$Q at the same time"
+
+'
+
+test_done
--
2.1.4
next prev parent reply other threads:[~2015-05-11 15:25 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-11 15:25 [PATCH v2 00/18] Improve handling of D/F conflicts Michael Haggerty
2015-05-11 15:25 ` Michael Haggerty [this message]
2015-05-11 18:52 ` [PATCH v2 01/18] t1404: new tests of ref D/F conflicts within transactions Junio C Hamano
2015-05-12 8:45 ` Michael Haggerty
2015-05-11 19:37 ` Junio C Hamano
2015-05-12 8:32 ` Michael Haggerty
2015-05-12 15:45 ` Junio C Hamano
2015-05-13 20:19 ` Michael Haggerty
2015-05-14 17:00 ` Junio C Hamano
2015-05-22 22:47 ` Michael Haggerty
2015-05-23 0:52 ` Junio C Hamano
2015-05-11 15:25 ` [PATCH v2 02/18] is_refname_available(): revamp the comments Michael Haggerty
2015-05-12 21:04 ` Junio C Hamano
2015-05-11 15:25 ` [PATCH v2 03/18] is_refname_available(): avoid shadowing "dir" variable Michael Haggerty
2015-05-12 21:06 ` Junio C Hamano
2015-05-11 15:25 ` [PATCH v2 04/18] is_refname_available(): convert local variable "dirname" to strbuf Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 05/18] entry_matches(): inline function Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 06/18] report_refname_conflict(): " Michael Haggerty
2015-05-12 21:21 ` Junio C Hamano
2015-05-11 15:25 ` [PATCH v2 07/18] struct nonmatching_ref_data: store a refname instead of a ref_entry Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 08/18] is_refname_available(): use dirname in first loop Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 09/18] ref_transaction_commit(): use a string_list for detecting duplicates Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 10/18] refs: check for D/F conflicts among refs created in a transaction Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 11/18] verify_refname_available(): rename function Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 12/18] verify_refname_available(): report errors via a "struct strbuf *err" Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 13/18] lock_ref_sha1_basic(): " Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 14/18] lock_ref_sha1_basic(): improve diagnostics for ref D/F conflicts Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 15/18] rename_ref(): integrate lock_ref_sha1_basic() errors into ours Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 16/18] ref_transaction_commit(): provide better error messages Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 17/18] ref_transaction_commit(): delete extra "the" from error message Michael Haggerty
2015-05-11 15:25 ` [PATCH v2 18/18] reflog_expire(): integrate lock_ref_sha1_basic() errors into ours Michael Haggerty
2015-05-11 17:56 ` [PATCH v2 00/18] Improve handling of D/F conflicts Junio C Hamano
2015-05-11 18:10 ` Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1431357920-25090-2-git-send-email-mhagger@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=sbeller@google.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).