Teach fsck and prune about the new location of temporary objects
Since 5723fe7e
, temporary objects are now created in their final destination
directories, rather than in .git/objects/. Teach fsck to recognize and
ignore the temporary objects it encounters, and teach prune to remove them.
Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
parent
186458b11b
commit
0e8316cc16
|
@ -377,6 +377,10 @@ static void fsck_dir(int i, char *path)
|
||||||
if (de->d_name[0] != '.')
|
if (de->d_name[0] != '.')
|
||||||
break;
|
break;
|
||||||
continue;
|
continue;
|
||||||
|
case 14:
|
||||||
|
if (prefixcmp(de->d_name, "tmp_obj_"))
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
case 38:
|
case 38:
|
||||||
sprintf(name, "%02x", i);
|
sprintf(name, "%02x", i);
|
||||||
memcpy(name+2, de->d_name, len+1);
|
memcpy(name+2, de->d_name, len+1);
|
||||||
|
|
|
@ -13,6 +13,22 @@ static const char * const prune_usage[] = {
|
||||||
static int show_only;
|
static int show_only;
|
||||||
static unsigned long expire;
|
static unsigned long expire;
|
||||||
|
|
||||||
|
static int prune_tmp_object(char *path, const char *filename)
|
||||||
|
{
|
||||||
|
const char *fullpath = mkpath("%s/%s", path, filename);
|
||||||
|
if (expire) {
|
||||||
|
struct stat st;
|
||||||
|
if (lstat(fullpath, &st))
|
||||||
|
return error("Could not stat '%s'", fullpath);
|
||||||
|
if (st.st_mtime > expire)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("Removing stale temporary file %s\n", fullpath);
|
||||||
|
if (!show_only)
|
||||||
|
unlink(fullpath);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int prune_object(char *path, const char *filename, const unsigned char *sha1)
|
static int prune_object(char *path, const char *filename, const unsigned char *sha1)
|
||||||
{
|
{
|
||||||
const char *fullpath = mkpath("%s/%s", path, filename);
|
const char *fullpath = mkpath("%s/%s", path, filename);
|
||||||
|
@ -53,6 +69,11 @@ static int prune_dir(int i, char *path)
|
||||||
if (de->d_name[0] != '.')
|
if (de->d_name[0] != '.')
|
||||||
break;
|
break;
|
||||||
continue;
|
continue;
|
||||||
|
case 14:
|
||||||
|
if (prefixcmp(de->d_name, "tmp_obj_"))
|
||||||
|
break;
|
||||||
|
prune_tmp_object(path, de->d_name);
|
||||||
|
continue;
|
||||||
case 38:
|
case 38:
|
||||||
sprintf(name, "%02x", i);
|
sprintf(name, "%02x", i);
|
||||||
memcpy(name+2, de->d_name, len+1);
|
memcpy(name+2, de->d_name, len+1);
|
||||||
|
@ -105,23 +126,9 @@ static void remove_temporary_files(void)
|
||||||
dirname);
|
dirname);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while ((de = readdir(dir)) != NULL) {
|
while ((de = readdir(dir)) != NULL)
|
||||||
if (!prefixcmp(de->d_name, "tmp_")) {
|
if (!prefixcmp(de->d_name, "tmp_"))
|
||||||
char name[PATH_MAX];
|
prune_tmp_object(dirname, de->d_name);
|
||||||
int c = snprintf(name, PATH_MAX, "%s/%s",
|
|
||||||
dirname, de->d_name);
|
|
||||||
if (c < 0 || c >= PATH_MAX)
|
|
||||||
continue;
|
|
||||||
if (expire) {
|
|
||||||
struct stat st;
|
|
||||||
if (stat(name, &st) != 0 || st.st_mtime >= expire)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
printf("Removing stale temporary file %s\n", name);
|
|
||||||
if (!show_only)
|
|
||||||
unlink(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue