Write errors when repacking (eg, due to out-of-space conditions) can leave temporary packs (and possibly other files beginning with "tmp_") lying around which no existing codepath removes and which aren't obvious to the casual user. These can also be multi-megabyte files wasting noticeable space. Unfortunately there's no way to definitely tell in builtin-prune that a tmp_ file is not being used by a concurrent process. However, it is documented that pruning should only be done on a quiet repository. The names of removed files are printed. Signed-off-by: David Tweed (david.tweed@xxxxxxxxx) --- Per discussion of previous version, this now unconditionally removes any tmp_ file existing when prune is run. builtin-prune.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) diff --git a/builtin-prune.c b/builtin-prune.c index b5e7684..9db3cf0 100644 --- a/builtin-prune.c +++ b/builtin-prune.c @@ -83,6 +83,30 @@ static void prune_object_dir(const char *path) } } +/* + * Write errors (particularly out of space) can result in + * failed temporary packs (and more rarely indexes and other + * files begining with "tmp_") accumulating in the + * object directory. + */ +static void remove_temporary_files(void) +{ + DIR *dir; + struct dirent *de; + char* dirname=get_object_directory(); + + dir = opendir(dirname); + while ((de = readdir(dir)) != NULL) { + if (strncmp(de->d_name, "tmp_", 4) == 0) { + char name[4096]; + sprintf(name, "%s/%s", dirname, de->d_name); + printf("Removing abandoned pack %s\n", name); + unlink(name); + } + } + closedir(dir); +} + int cmd_prune(int argc, const char **argv, const char *prefix) { int i; @@ -115,5 +139,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix) sync(); prune_packed_objects(show_only); + remove_temporary_files(); return 0; } -- 1.5.4.19.g40d1a-dirty - 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