This is v4 of this patch series. Thanks to Peff, Junio, Jake, and Philip for their feedback about v3. I believe I have addressed all of the comments about v1 [1], v2 [2], and v3 [3]. Changes since v3: * Insert a new first patch correcting the docstring of `refname_is_safe()`. * In "raceproof_create_file(): new function", tweak a comment for clarity as suggested by Peff. * In "log_ref_setup(): separate code for create vs non-create", add a semicolon to an otherwise empty code block as requested by Junio. * Drop the patch "try_remove_empty_parents(): don't accommodate consecutive slashes", for reasons discussed on the ML [4]. Michael [1] http://public-inbox.org/git/cover.1455626201.git.mhagger@xxxxxxxxxxxx/T/#u [2] http://public-inbox.org/git/cover.1456405698.git.mhagger@xxxxxxxxxxxx/T/#u [3] http://public-inbox.org/git/cover.1483153436.git.mhagger@xxxxxxxxxxxx/T/#u [4] http://public-inbox.org/git/5051c78e-51f9-becd-e1a6-9c0b781d6912@xxxxxxxxxxxx/ and surrounding thread. Michael Haggerty (23): files_rename_ref(): tidy up whitespace refname_is_safe(): correct docstring t5505: use "for-each-ref" to test for the non-existence of references safe_create_leading_directories_const(): preserve errno safe_create_leading_directories(): set errno on SCLD_EXISTS raceproof_create_file(): new function lock_ref_sha1_basic(): inline constant lock_ref_sha1_basic(): use raceproof_create_file() rename_tmp_log(): use raceproof_create_file() rename_tmp_log(): improve error reporting log_ref_write(): inline function log_ref_setup(): separate code for create vs non-create log_ref_setup(): improve robustness against races log_ref_setup(): pass the open file descriptor back to the caller log_ref_write_1(): don't depend on logfile argument log_ref_setup(): manage the name of the reflog file internally log_ref_write_1(): inline function delete_ref_loose(): derive loose reference path from lock delete_ref_loose(): inline function try_remove_empty_parents(): rename parameter "name" -> "refname" try_remove_empty_parents(): don't trash argument contents try_remove_empty_parents(): teach to remove parents of reflogs, too files_transaction_commit(): clean up empty directories cache.h | 48 ++++++- refs/files-backend.c | 371 +++++++++++++++++++++++++------------------------- refs/refs-internal.h | 22 ++- sha1_file.c | 76 ++++++++++- t/t1400-update-ref.sh | 27 ++++ t/t5505-remote.sh | 2 +- 6 files changed, 351 insertions(+), 195 deletions(-) -- 2.9.3