Re: [PATCH] prune: quiet ENOENT on missing directories
- From
- Eric Wong <e@80x24.org>
- Date
- Nov 21, 2022, 10:44 UTC
- Message-ID
- <20221121104427.M268307@dcvr>
- In-Reply-To
- <xmqq5yf8yhe0.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> wrote:
Show 10 quoted lines
> Eric Wong <e@80x24.org> writes: > > > $GIT_DIR/objects/pack may be removed to save inodes in shared > > repositories. Quiet down prune in cases where either > > $GIT_DIR/objects or $GIT_DIR/objects/pack is non-existent, > > Wouldn't setup.c::is_git_directory() say "nope, you do not have a > repository there" if you are missing $GIT_DIR/objects? So I suspect > that the only case this matters in practice is a missing pack/ > subdirectory.
Right. Removing $GIT_DIR/objects isn't currently OK, but maybe someday it could be... Supporting missing pack/ is the primary reason for this change, but making a small step towards allowing objects/-free $GIT_DIR doesn't seem harmful.
Show 21 quoted lines
> I agree that silently ignoring missing objects/pack/ is perfectly
> fine, whether we auto-vivify it when we actually create a pack.
>
> > but emit the system error in other cases to help users diagnose
> > permissions problems or resource constraints.
>
> OK.
>
> > @@ -127,7 +127,9 @@ static void remove_temporary_files(const char *path)
> >
> > dir = opendir(path);
> > if (!dir) {
> > - fprintf(stderr, "Unable to open directory %s\n", path);
> > + if (errno != ENOENT)
> > + fprintf(stderr, "Unable to open directory %s: %s\n",
> > + path, strerror(errno));
> > return;
> > }
>
> This is called twice, with $GIT_OBJECT_DIRECTORY and its pack
> subdirectory, as it does not recurse. Right.
Show 8 quoted lines
> This is a tangent, I have to wonder how effective the first call > would be, though. When writing a loose object file, we compute its > object name first in-core and determine the final filename, create a > temporary file in the same directory as the final file, write into > it and then finally rename the temporary to the final name. The > fan-out $GIT_OBJECT_DIRECTORY/??/ directories may have temporary > files left when such a process crashed, but do we create cruft "git > prune" should remove in $GIT_OBJECT_DIRECTORY/ itself?
Good question, perhaps this could be a followup:
diff --git a/builtin/prune.c b/builtin/prune.c index 2719220108..041c45ecbe 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -188,7 +188,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix) prune_cruft, prune_subdir, &revs); prune_packed_objects(show_only ? PRUNE_PACKED_DRY_RUN : 0); - remove_temporary_files(get_object_directory()); s = mkpathdup("%s/pack", get_object_directory()); remove_temporary_files(s); free(s); OTOH, perhaps there's some 3rd-party tools (e.g. backup tools) that leave stuff in top-level objects/ and we'd risk breaking a rare setup via ENOSPC.