Thanks to David, Junio, and Peff for their comments on v1 of this patch series [1]. I think I have addressed all of the points that were brought up. Plus I fixed a pre-existing bug that I noticed myself while adding some more tests; see the first bullet point below for more information. Changes between v1 and v2: * Prefixed the patch series with three new patches that demonstrate and fix some bugs in reference resolution that I noticed while inspecting this series: * "t1404: demonstrate a bug resolving references" -- this demonstrates a bug that has existed since at least 2.5.0. * "read_raw_ref(): don't get confused by an empty directory" * "commit_ref(): if there is an empty dir in the way, delete it" * Added a patch "read_raw_ref(): move docstring to header file". * "ref_transaction_create(): disallow recursive pruning": Add a comment that `REF_ISPRUNING` must only be used with `REF_NODEREF`. * "refs: don't dereference on rename": explain why we can't pass an `old_sha1` argument to `delete_ref()`. Inline `resolve_flags` constant to make the code more transparent. * "add_update(): initialize the whole ref_update": move some more checks from `ref_transaction_update()` to `add_update()`. * "refs: resolve symbolic refs first": * Remove unused `deleting` parameter from `lock_raw_ref()` * Fix a comment, add another. * "lock_ref_sha1_basic(): only handle REF_NODEREF mode": initialize `ref_name` only once, as its value can be reused. This patch series is also available from my GitHub repo [2] as branch "split-under-lock". [1] http://thread.gmane.org/gmane.comp.version-control.git/292772 [2] https://github.com/mhagger/git David Turner (2): refs: allow log-only updates refs: don't dereference on rename Michael Haggerty (31): t1404: demonstrate a bug resolving references commit_ref(): if there is an empty dir in the way, delete it read_raw_ref(): don't get confused by an empty directory safe_create_leading_directories(): improve docstring remove_dir_recursively(): add docstring refname_is_safe(): use skip_prefix() refname_is_safe(): don't allow the empty string refname_is_safe(): insist that the refname already be normalized commit_ref_update(): write error message to *err, not stderr rename_ref(): remove unneeded local variable ref_transaction_commit(): remove local variable n read_raw_ref(): rename flags argument to type read_raw_ref(): clear *type at start of function read_raw_ref(): rename symref argument to referent read_raw_ref(): improve docstring read_raw_ref(): move docstring to header file lock_ref_sha1_basic(): remove unneeded local variable refs: make error messages more consistent ref_transaction_create(): disallow recursive pruning ref_transaction_commit(): correctly report close_ref() failure delete_branches(): use resolve_refdup() verify_refname_available(): adjust constness in declaration add_update(): initialize the whole ref_update lock_ref_for_update(): new function unlock_ref(): move definition higher in the file ref_transaction_update(): check refname_is_safe() at a minimum refs: resolve symbolic refs first lock_ref_for_update(): don't re-read non-symbolic references lock_ref_for_update(): don't resolve symrefs commit_ref_update(): remove the flags parameter lock_ref_sha1_basic(): only handle REF_NODEREF mode builtin/branch.c | 19 +- cache.h | 5 + dir.h | 23 + refs.c | 96 ++-- refs/files-backend.c | 909 ++++++++++++++++++++++++++++--------- refs/refs-internal.h | 95 +++- t/t1400-update-ref.sh | 41 +- t/t1404-update-ref-df-conflicts.sh | 76 +++- t/t1430-bad-ref-name.sh | 2 +- t/t3200-branch.sh | 9 + 10 files changed, 1013 insertions(+), 262 deletions(-) -- 2.8.1 -- 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