git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/3] prepare_packed_git(): find more garbage

From
Jeff King <peff@peff.net>
Date
Dec 15, 2015, 23:09 UTC
Message-ID
<20151215230957.GA30353@sigill.intra.peff.net>
In-Reply-To
<1448518529-2659-1-git-send-email-dougk.ff7@gmail.com>
On Thu, Nov 26, 2015 at 12:15:29AM -0600, Doug Kelly wrote:
Show 14 quoted lines
> diff --git a/builtin/count-objects.c b/builtin/count-objects.c
> index ba92919..5197b57 100644
> --- a/builtin/count-objects.c
> +++ b/builtin/count-objects.c
> @@ -17,19 +17,15 @@ static off_t loose_size;
>  
>  static const char *bits_to_msg(unsigned seen_bits)
>  {
> -	switch (seen_bits) {
> -	case 0:
> -		return "no corresponding .idx or .pack";
> -	case PACKDIR_FILE_GARBAGE:
> +	if (seen_bits ==  PACKDIR_FILE_GARBAGE)
>  		return "garbage found";

It seems weird to use "==" on a bitfield. I think it is the case now that we would never see GARBAGE alongside anything else, but I wonder if we should future-proof that as:

  if (seen_bits & PACKDIR_FILE_GARBAGE)

Specifically, I am wondering what would happen if we had "foo.pack" and "foo.bogus", where we do not know about the latter at all.

Show 13 quoted lines
> -	case PACKDIR_FILE_PACK:
> +	else if (seen_bits & PACKDIR_FILE_PACK && !(seen_bits & PACKDIR_FILE_IDX))
>  		return "no corresponding .idx";
> -	case PACKDIR_FILE_IDX:
> +	else if (seen_bits & PACKDIR_FILE_IDX && !(seen_bits & PACKDIR_FILE_PACK))
>  		return "no corresponding .pack";
> -	case PACKDIR_FILE_PACK|PACKDIR_FILE_IDX:
> -	default:
> -		return NULL;
> -	}
> +	else if (seen_bits == 0 || !(seen_bits & (PACKDIR_FILE_IDX|PACKDIR_FILE_PACK)))
> +		return "no corresponding .idx or .pack";
> +	return NULL;

This bottom conditional is interesting. I understand the second half: we saw something pack-like, but there is not matching .idx or .pack at all (if we saw one but not the other, we would have caught it above).

But when will we get an empty seen_bits? What did we see that triggered this function, but didn't trigger a bit (even GARBAGE)?

I don't mind if the answer is "nothing, this is future-proofing", but am mostly curious.

Show 17 quoted lines
> diff --git a/sha1_file.c b/sha1_file.c
> index 3d56746..5f939e4 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -1225,6 +1225,15 @@ static void report_helper(const struct string_list *list,
>  	if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX))
>  		return;
>  
> +	if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX|PACKDIR_FILE_BITMAP))
> +		return;
> +
> +	if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX|PACKDIR_FILE_KEEP))
> +		return;
> +
> +	if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX|PACKDIR_FILE_BITMAP|PACKDIR_FILE_KEEP))
> +		return;
> +

It seems like we're enumerating a lot of cases here that will explode if we get even one more file type (e.g., we add "pack-XXX.foo" in the future). If I understand this function correctly, we're just trying to get rid of "boring" cases that do not need to be reported.

Isn't any case that has both a pack and an idx boring (no matter if it has a .bitmap or .keep)?

IOW, can these four conditionals just become:
  unsigned pack_with_idx = PACKDIR_FILE_PACK | PACKDIR_FILE_IDX;
  if ((seen_bits & pack_with_idx) == pack_with_idx)
	return;
?
-Peff
Previous: Doug KellyNext: Jeff King
Message 10 of 33 in “Add cleanup for garbage .bitmap files”
  1. 0/3 Add cleanup for garbage .bitmap filesDoug Kelly, Nov 14, 2015
  2. 1/3 prepare_packed_git(): find more garbageDoug Kelly, Nov 14, 2015
  3. Stefan BellerNov 14, 2015
  4. 1/3 prepare_packed_git(): find more garbageDoug Kelly, Nov 14, 2015
  5. 2/3 t5304: Add test for .bitmap garbage filesDoug Kelly, Nov 14, 2015
  6. 3/3 gc: Clean garbage .bitmap files from pack dirDoug Kelly, Nov 14, 2015
  7. Jeff KingDec 15, 2015
  8. Stefan BellerNov 25, 2015
  9. 1/3 prepare_packed_git(): find more garbageDoug Kelly, Nov 26, 2015
  10. Jeff KingDec 15, 2015
  11. Jeff KingDec 15, 2015
  12. 0/3 prepare_packed_git(): find more garbageDoug Kelly, Dec 19, 2015
  13. 1/3 prepare_packed_git(): find more garbageDoug Kelly, Dec 19, 2015
  14. 2/3 t5304: Add test for .bitmap garbage filesDoug Kelly, Dec 19, 2015
  15. 3/3 gc: Clean garbage .bitmap files from pack dirDoug Kelly, Dec 19, 2015
  16. Jeff KingDec 19, 2015
  17. Jeff KingDec 19, 2015
  18. Jeff KingDec 19, 2015
  19. Stefan BellerJan 11, 2016
  20. 0/4 gc: Clean garbage .bitmap files from pack dirDoug Kelly, Jan 13, 2016
  21. 1/4 prepare_packed_git(): find more garbageDoug Kelly, Jan 13, 2016
  22. 2/4 t5304: Add test for .bitmap garbage filesDoug Kelly, Jan 13, 2016
  23. Junio C HamanoJan 13, 2016
  24. 3/4 t5304: Ensure wanted files are not deletedDoug Kelly, Jan 13, 2016
  25. Junio C HamanoJan 13, 2016
  26. Doug KellyJan 18, 2016
  27. Junio C HamanoJan 19, 2016
  28. 4/4 gc: Clean garbage .bitmap files from pack dirDoug Kelly, Jan 13, 2016
  29. Doug KellyNov 26, 2015
  30. Doug KellyNov 14, 2015
  31. 2/3 t5304: Add test for .bitmap garbage filesDoug Kelly, Nov 14, 2015
  32. Stefan BellerNov 14, 2015
  33. 3/3 gc: Clean garbage .bitmap files from pack dirDoug Kelly, Nov 14, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.