git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: Stefan Beller <sbeller@google.com>, Jeff King <peff@peff.net>,
	git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH 00/18] Improve handling of D/F conflicts
Date: Fri,  1 May 2015 14:25:40 +0200	[thread overview]
Message-ID: <1430483158-14349-1-git-send-email-mhagger@alum.mit.edu> (raw)

We currently don't handle D/F conflicts very well.

A "D/F conflict" is what we call a conflict between references like
"refs/foo" and "refs/foo/bar". Such references cannot coexist because,
when stored as loose references, "refs/foo" would have to be both a
directory and a file.

The problems fixed by this series:

* We had no tests of D/F conflict handling within transactions.

* D/F conflicts between references being created in a single
  transaction used to be detected too late, possibly after part of the
  transaction had already been committed.

* D/F errors against loose references were typically reported as
  locking errors, which was not very illuminating. Also, D/F errors
  were typically reported in two separate error messages, like

      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'.

  which was confusing.

There is probably still room for improving the error messages.

This patch series applies on top of
mh/ref-lock-avoid-running-out-of-fds. I did it that way because I
expected significant conflicts between the series, and the older
series is simple/mature enough that I expect it to be merged early in
the post-2.4 cycle. But in retrospect it turns out that there are only
minor conflicts between the two series. So if you would like me to
rebase this series to another starting point, please let me know.

This series is also available from my GitHub account,

    https://github.com/mhagger/git branch check-df-conflicts-earlier

Michael Haggerty (18):
  t1404: new tests of D/F conflicts within ref transactions
  is_refname_available(): explain the reason for an early exit
  is_refname_available(): avoid shadowing "dir" variable
  is_refname_available(): convert local variable "dirname" to strbuf
  entry_matches(): inline function
  report_refname_conflict(): inline function
  struct nonmatching_ref_data: store a refname instead of a ref_entry
  is_refname_available(): use dirname in first loop
  ref_transaction_commit(): use a string_list for detecting duplicates
  refs: check for D/F conflicts among refs processed in a transaction
  verify_refname_available(): rename function
  verify_refname_available(): report errors via a "struct strbuf *err"
  lock_ref_sha1_basic(): report errors via a "struct strbuf *err"
  lock_ref_sha1_basic(): improve diagnostics for D/F conflicts
  rename_ref(): integrate lock_ref_sha1_basic() errors into ours
  ref_transaction_commit(): provide better error messages
  ref_transaction_commit(): delete extra "the" from error message
  reflog_expire(): integrate lock_ref_sha1_basic() errors into ours

 refs.c                             | 280 +++++++++++++++++++++++--------------
 t/t1400-update-ref.sh              |  14 +-
 t/t1404-update-ref-df-conflicts.sh | 107 ++++++++++++++
 3 files changed, 286 insertions(+), 115 deletions(-)
 create mode 100755 t/t1404-update-ref-df-conflicts.sh

-- 
2.1.4

             reply	other threads:[~2015-05-01 12:26 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-01 12:25 Michael Haggerty [this message]
2015-05-01 12:25 ` [PATCH 01/18] t1404: new tests of D/F conflicts within ref transactions Michael Haggerty
2015-05-05  5:12   ` Eric Sunshine
2015-05-05 15:27     ` Michael Haggerty
2015-05-01 12:25 ` [PATCH 02/18] is_refname_available(): explain the reason for an early exit Michael Haggerty
2015-05-01 17:21   ` Stefan Beller
2015-05-05 15:03     ` Michael Haggerty
2015-05-01 12:25 ` [PATCH 03/18] is_refname_available(): avoid shadowing "dir" variable Michael Haggerty
2015-05-01 12:25 ` [PATCH 04/18] is_refname_available(): convert local variable "dirname" to strbuf Michael Haggerty
2015-05-01 12:25 ` [PATCH 05/18] entry_matches(): inline function Michael Haggerty
2015-05-01 12:25 ` [PATCH 06/18] report_refname_conflict(): " Michael Haggerty
2015-05-01 12:25 ` [PATCH 07/18] struct nonmatching_ref_data: store a refname instead of a ref_entry Michael Haggerty
2015-05-01 12:25 ` [PATCH 08/18] is_refname_available(): use dirname in first loop Michael Haggerty
2015-05-01 12:25 ` [PATCH 09/18] ref_transaction_commit(): use a string_list for detecting duplicates Michael Haggerty
2015-05-01 12:25 ` [PATCH 10/18] refs: check for D/F conflicts among refs processed in a transaction Michael Haggerty
2015-05-01 12:25 ` [PATCH 11/18] verify_refname_available(): rename function Michael Haggerty
2015-05-01 12:25 ` [PATCH 12/18] verify_refname_available(): report errors via a "struct strbuf *err" Michael Haggerty
2015-05-01 12:25 ` [PATCH 13/18] lock_ref_sha1_basic(): " Michael Haggerty
2015-05-01 12:25 ` [PATCH 14/18] lock_ref_sha1_basic(): improve diagnostics for D/F conflicts Michael Haggerty
2015-05-01 12:25 ` [PATCH 15/18] rename_ref(): integrate lock_ref_sha1_basic() errors into ours Michael Haggerty
2015-05-01 12:25 ` [PATCH 16/18] ref_transaction_commit(): provide better error messages Michael Haggerty
2015-05-01 12:25 ` [PATCH 17/18] ref_transaction_commit(): delete extra "the" from error message Michael Haggerty
2015-05-01 12:25 ` [PATCH 18/18] reflog_expire(): integrate lock_ref_sha1_basic() errors into ours Michael Haggerty
2015-05-03  2:09 ` [PATCH 00/18] Improve handling of D/F conflicts Junio C Hamano
2015-05-05 16:12   ` Michael Haggerty

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1430483158-14349-1-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 \
    /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.
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 NNTP newsgroup(s).