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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html