]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repack: drop remove_temporary_files()
authorJeff King <peff@peff.net>
Sat, 22 Oct 2022 00:21:58 +0000 (20:21 -0400)
committerJunio C Hamano <gitster@pobox.com>
Sat, 22 Oct 2022 01:03:52 +0000 (18:03 -0700)
After we've successfully finished the repack, we call
remove_temporary_files(), which looks for and removes any files matching
".tmp-$$-pack-*", where $$ is the pid of the current process. But this
is pointless. If we make it this far in the process, we've already
renamed these tempfiles into place, and there is nothing left to delete.

Nor is there a point in trying to call it to clean up when we _aren't_
successful. It's not safe for using in a signal handler, and the
previous commit already handed that job over to the tempfile API.

It might seem like it would be useful to clean up stray .tmp files left
by other invocations of git-repack. But it won't clean those files; it
only matches ones with its pid, and leaves the rest. Fortunately, those
are cleaned up naturally by successive calls to git-repack; we'll
consider .tmp-*.pack the same as normal packfiles, so "repack -ad", etc,
will roll up their contents and eventually delete them.

The one case that could matter is if pack-objects generates an extension
we don't know about, like ".tmp-pack-$$-$hash.some-new-ext". The current
code will quietly delete such a file, while after this patch we'd leave
it in place. In practice this doesn't happen, and would be indicative of
a bug. Leaving the file as cruft is arguably a better behavior, as it
means somebody is more likely to eventually notice and fix the bug.  If
we really wanted to be paranoid, we could scan for and warn about such
files, but that seems like overkill.

There's nothing to test with regard to the removal of this function. It
was doing nothing, so the behavior should be the same.  However, we can
verify (and protect) our assumption that "repack -ad" will eventually
remove stray files by adding a test for that.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c
t/t7700-repack.sh

index 39f03c3a1df750dec96a2e1f471c301864ae41d2..cd338b161f72dfb24809702779d86e384ad04352 100644 (file)
@@ -91,37 +91,6 @@ static int repack_config(const char *var, const char *value, void *cb)
        return git_default_config(var, value, cb);
 }
 
-/*
- * Remove temporary $GIT_OBJECT_DIRECTORY/pack/.tmp-$$-pack-* files.
- */
-static void remove_temporary_files(void)
-{
-       struct strbuf buf = STRBUF_INIT;
-       size_t dirlen, prefixlen;
-       DIR *dir;
-       struct dirent *e;
-
-       dir = opendir(packdir);
-       if (!dir)
-               return;
-
-       /* Point at the slash at the end of ".../objects/pack/" */
-       dirlen = strlen(packdir) + 1;
-       strbuf_addstr(&buf, packtmp);
-       /* Hold the length of  ".tmp-%d-pack-" */
-       prefixlen = buf.len - dirlen;
-
-       while ((e = readdir(dir))) {
-               if (strncmp(e->d_name, buf.buf + dirlen, prefixlen))
-                       continue;
-               strbuf_setlen(&buf, dirlen);
-               strbuf_addstr(&buf, e->d_name);
-               unlink(buf.buf);
-       }
-       closedir(dir);
-       strbuf_release(&buf);
-}
-
 /*
  * Adds all packs hex strings to either fname_nonkept_list or
  * fname_kept_list based on whether each pack has a corresponding
@@ -1106,7 +1075,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 
        if (run_update_server_info)
                update_server_info(0);
-       remove_temporary_files();
 
        if (git_env_bool(GIT_TEST_MULTI_PACK_INDEX, 0)) {
                unsigned flags = 0;
index 592016f64a683c8f282254c33ffda526fb7418e5..edcda849b9efb9b5056cb133f05d7b4139fd4c09 100755 (executable)
@@ -440,6 +440,14 @@ test_expect_success 'clean up .tmp-* packs on error' '
        test_must_be_empty tmpfiles
 '
 
+test_expect_success 'repack -ad cleans up old .tmp-* packs' '
+       git rev-parse HEAD >input &&
+       git pack-objects $objdir/pack/.tmp-1234 <input &&
+       git repack -ad &&
+       find $objdir/pack -name '.tmp-*' >tmpfiles &&
+       test_must_be_empty tmpfiles
+'
+
 test_expect_success 'setup for update-server-info' '
        git init update-server-info &&
        test_commit -C update-server-info message