From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
David Turner <novalis@novalis.org>,
Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH v3 00/23] Delete directories left empty after ref deletion
Date: Sat, 31 Dec 2016 04:12:40 +0100 [thread overview]
Message-ID: <cover.1483153436.git.mhagger@alum.mit.edu> (raw)
This is a re-roll of an old patch series. v1 [1] got some feedback,
which I think was all addressed in v2 [2]. But it seems that v2 fell
on the floor, and I didn't bother following up because it was in the
same area of code that was undergoing heavy changes due to the
pluggable reference backend work. Sorry for the long delay before
getting back to it.
It turns out that this patch series is still relevant and didn't even
need all that must adjustment. While rebasing onto the current
`master`, I tidied up a bit, tightened up some code, and improved some
commit messages. But the spirit of the patch series and most of its
code are unchanged.
This patch series is also available from my GitHub account [3] as
branch delete-empty-refs-dirs.
Brief summary (see v1 [1] for more details):
Previously, we were pretty sloppy about leaving empty directories
behind (under both $GIT_DIR/refs and $GIT_DIR/logs) when deleting
references. Such directories could accumulate essentially forever.
It's true that `pack-refs` deletes directories that it empties, but if
a directory is *already* empty, then `pack-refs` doesn't remove it. It
is also true that if an empty directory gets in the way of the
creation of a *new* reference, then it is deleted. But otherwise there
is no systematic cleanup of empty directories.
A reason for the old behavior was that the code paths *creating* new
files in these hierarchies were not always robust against a race with
another process that was cleaning up empty directories. So most of
this patch series is dedicated to hardening up the creation code paths
(via a new function, `raceproof_create_file()`). The last several
patches teach `files_transaction_commit()` to delete empty directories
when deleting references and reflogs.
Michael
[1] http://public-inbox.org/git/cover.1455626201.git.mhagger@alum.mit.edu/T/#u
[2] http://public-inbox.org/git/cover.1456405698.git.mhagger@alum.mit.edu/T/#u
[3] http://github.com/mhagger/git
Michael Haggerty (23):
files_rename_ref(): tidy up whitespace
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(): don't accommodate consecutive slashes
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 | 375 +++++++++++++++++++++++++-------------------------
refs/refs-internal.h | 11 +-
sha1_file.c | 76 +++++++++-
t/t1400-update-ref.sh | 27 ++++
t/t5505-remote.sh | 2 +-
6 files changed, 346 insertions(+), 193 deletions(-)
--
2.9.3
next reply other threads:[~2016-12-31 3:13 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-31 3:12 Michael Haggerty [this message]
2016-12-31 3:12 ` [PATCH v3 01/23] files_rename_ref(): tidy up whitespace Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 02/23] t5505: use "for-each-ref" to test for the non-existence of references Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 03/23] safe_create_leading_directories_const(): preserve errno Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 04/23] safe_create_leading_directories(): set errno on SCLD_EXISTS Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 05/23] raceproof_create_file(): new function Michael Haggerty
2016-12-31 6:11 ` Jeff King
2016-12-31 7:42 ` Michael Haggerty
2017-01-01 2:07 ` Junio C Hamano
2016-12-31 3:12 ` [PATCH v3 06/23] lock_ref_sha1_basic(): inline constant Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 07/23] lock_ref_sha1_basic(): use raceproof_create_file() Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 08/23] rename_tmp_log(): " Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 09/23] rename_tmp_log(): improve error reporting Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 10/23] log_ref_write(): inline function Michael Haggerty
2017-01-01 2:09 ` Junio C Hamano
2017-01-01 8:41 ` Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 11/23] log_ref_setup(): separate code for create vs non-create Michael Haggerty
2016-12-31 6:26 ` Jeff King
2016-12-31 7:52 ` Michael Haggerty
2017-01-01 3:28 ` Junio C Hamano
2017-01-01 8:45 ` Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 12/23] log_ref_setup(): improve robustness against races Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 13/23] log_ref_setup(): pass the open file descriptor back to the caller Michael Haggerty
2016-12-31 6:32 ` Jeff King
2016-12-31 7:58 ` Michael Haggerty
2016-12-31 17:58 ` Jeff King
2017-01-01 10:36 ` Junio C Hamano
2016-12-31 3:12 ` [PATCH v3 14/23] log_ref_write_1(): don't depend on logfile argument Michael Haggerty
2016-12-31 6:35 ` Jeff King
2016-12-31 8:01 ` Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 15/23] log_ref_setup(): manage the name of the reflog file internally Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 16/23] log_ref_write_1(): inline function Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 17/23] delete_ref_loose(): derive loose reference path from lock Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 18/23] delete_ref_loose(): inline function Michael Haggerty
2016-12-31 3:12 ` [PATCH v3 19/23] try_remove_empty_parents(): rename parameter "name" -> "refname" Michael Haggerty
2016-12-31 3:13 ` [PATCH v3 20/23] try_remove_empty_parents(): don't trash argument contents Michael Haggerty
2016-12-31 6:40 ` Jeff King
2017-01-02 16:27 ` Michael Haggerty
2017-01-02 17:10 ` Jeff King
2016-12-31 3:13 ` [PATCH v3 21/23] try_remove_empty_parents(): don't accommodate consecutive slashes Michael Haggerty
2017-01-01 2:30 ` Junio C Hamano
2017-01-01 5:59 ` Jeff King
2017-01-02 18:06 ` Michael Haggerty
2017-01-02 18:26 ` Jeff King
2016-12-31 3:13 ` [PATCH v3 22/23] try_remove_empty_parents(): teach to remove parents of reflogs, too Michael Haggerty
2016-12-31 3:13 ` [PATCH v3 23/23] files_transaction_commit(): clean up empty directories Michael Haggerty
2016-12-31 6:47 ` [PATCH v3 00/23] Delete directories left empty after ref deletion Jeff King
2017-01-01 2:32 ` Junio C Hamano
2017-01-01 9:24 ` Jacob Keller
2017-01-01 9:26 ` Jacob Keller
2017-01-01 12:43 ` Philip Oakley
2017-01-01 20:36 ` Jacob Keller
2017-01-02 4:19 ` Jeff King
2017-01-02 18:14 ` Michael Haggerty
2017-01-02 18:54 ` Jacob Keller
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=cover.1483153436.git.mhagger@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=novalis@novalis.org \
--cc=peff@peff.net \
/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).