Skip to content

Commit

Permalink
prepare_packed_git(): refactor garbage reporting in pack directory
Browse files Browse the repository at this point in the history
The hook to report "garbage" files in $GIT_OBJECT_DIRECTORY/pack/
could be generic but is too specific to count-object's needs.

Move the part to produce human-readable messages to count-objects,
and refine the interface to callback with the "bits" with values
defined in the cache.h header file, so that other callers (e.g.
prune) can later use the same mechanism to enumerate different
kinds of garbage files and do something intelligent about them,
other than reporting in textual messages.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Aug 17, 2015
1 parent e88b858 commit 0a489b0
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 22 deletions.
26 changes: 24 additions & 2 deletions builtin/count-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,31 @@ static int verbose;
static unsigned long loose, packed, packed_loose;
static off_t loose_size;

static void real_report_garbage(const char *desc, const char *path)
static const char *bits_to_msg(unsigned seen_bits)
{
switch (seen_bits) {
case 0:
return "no corresponding .idx or .pack";
case PACKDIR_FILE_GARBAGE:
return "garbage found";
case PACKDIR_FILE_PACK:
return "no corresponding .idx";
case PACKDIR_FILE_IDX:
return "no corresponding .pack";
case PACKDIR_FILE_PACK|PACKDIR_FILE_IDX:
default:
return NULL;
}
}

static void real_report_garbage(unsigned seen_bits, const char *path)
{
struct stat st;
const char *desc = bits_to_msg(seen_bits);

if (!desc)
return;

if (!stat(path, &st))
size_garbage += st.st_size;
warning("%s: %s", desc, path);
Expand All @@ -27,7 +49,7 @@ static void real_report_garbage(const char *desc, const char *path)
static void loose_garbage(const char *path)
{
if (verbose)
report_garbage("garbage found", path);
report_garbage(PACKDIR_FILE_GARBAGE, path);
}

static int count_loose(const unsigned char *sha1, const char *path, void *data)
Expand Down
7 changes: 5 additions & 2 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1255,8 +1255,11 @@ struct pack_entry {

extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);

/* A hook for count-objects to report invalid files in pack directory */
extern void (*report_garbage)(const char *desc, const char *path);
/* A hook to report invalid files in pack directory */
#define PACKDIR_FILE_PACK 1
#define PACKDIR_FILE_IDX 2
#define PACKDIR_FILE_GARBAGE 4
extern void (*report_garbage)(unsigned seen_bits, const char *path);

extern void prepare_packed_git(void);
extern void reprepare_packed_git(void);
Expand Down
2 changes: 1 addition & 1 deletion path.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ void report_linked_checkout_garbage(void)
strbuf_setlen(&sb, len);
strbuf_addstr(&sb, path);
if (file_exists(sb.buf))
report_garbage("unused in linked checkout", sb.buf);
report_garbage(PACKDIR_FILE_GARBAGE, sb.buf);
}
strbuf_release(&sb);
}
Expand Down
23 changes: 6 additions & 17 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -1183,27 +1183,16 @@ void install_packed_git(struct packed_git *pack)
packed_git = pack;
}

void (*report_garbage)(const char *desc, const char *path);
void (*report_garbage)(unsigned seen_bits, const char *path);

static void report_helper(const struct string_list *list,
int seen_bits, int first, int last)
{
const char *msg;
switch (seen_bits) {
case 0:
msg = "no corresponding .idx or .pack";
break;
case 1:
msg = "no corresponding .idx";
break;
case 2:
msg = "no corresponding .pack";
break;
default:
if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX))
return;
}

for (; first < last; first++)
report_garbage(msg, list->items[first].string);
report_garbage(seen_bits, list->items[first].string);
}

static void report_pack_garbage(struct string_list *list)
Expand All @@ -1226,7 +1215,7 @@ static void report_pack_garbage(struct string_list *list)
if (baselen == -1) {
const char *dot = strrchr(path, '.');
if (!dot) {
report_garbage("garbage found", path);
report_garbage(PACKDIR_FILE_GARBAGE, path);
continue;
}
baselen = dot - path + 1;
Expand Down Expand Up @@ -1298,7 +1287,7 @@ static void prepare_packed_git_one(char *objdir, int local)
ends_with(de->d_name, ".keep"))
string_list_append(&garbage, path.buf);
else
report_garbage("garbage found", path.buf);
report_garbage(PACKDIR_FILE_GARBAGE, path.buf);
}
closedir(dir);
report_pack_garbage(&garbage);
Expand Down

0 comments on commit 0a489b0

Please sign in to comment.