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

Re: [GSoC PATCH v5 3/6] repack-promisor: preserve content of promisor files after repack

From
Tian Yuchen <cat@malon.dev>
Date
Apr 11, 2026, 18:25 UTC
Message-ID
<641a7a4c-f836-4811-bbeb-ef534716c3a9@malon.dev>
In-Reply-To
<b483be7558f0efc1a6780b5cff13f4ccc3afd069.1775861047.git.lorenzo.pegorari2002@gmail.com>
On 4/11/26 06:55, LorenzoPegorari wrote:
Show 20 quoted lines
> @@ -171,19 +172,15 @@ static void finish_repacking_promisor_objects(struct repository *repo,
>   
>   		/*
>   		 * pack-objects creates the .pack and .idx files, but not the
> -		 * .promisor file. Create the .promisor file, which is empty.
> -		 *
> -		 * NEEDSWORK: fetch-pack sometimes generates non-empty
> -		 * .promisor files containing the ref names and associated
> -		 * hashes at the point of generation of the corresponding
> -		 * packfile, but this would not preserve their contents. Maybe
> -		 * concatenate the contents of all .promisor files instead of
> -		 * just creating a new empty file.
> +		 * .promisor file. Create the .promisor file.
>   		 */
>   		promisor_name = mkpathdup("%s-%s.promisor", packtmp,
>   					  line.buf);
>   		write_promisor_file(promisor_name, NULL, 0);
>   
> +		/* Now let's fill the content of the newly created .promisor file */
> +		copy_promisor_content(repo, line.buf, packtmp, not_repacked_basenames);

Here, the file opened by copy_promisor_content() is an empty file. Is this line necessary? ;)

...hold on. I recall you mentioning in one of the versions that you had downgraded this helper from a generic function to a static one. Since it now only serves this particular business logic, I think the implementation should be tweaked slightly as well.

Show 5 quoted lines
> +	/* Open the .promisor dest file, and fill dest_content with its content */
> +	dest_promisor_name = mkpathdup("%s-%s.promisor", packtmp, dest_hex);
> +	dest = xfopen(dest_promisor_name, "r+");
> +	while (strbuf_getline(&line, dest) != EOF)
> +		strset_add(&dest_content, line.buf);

If file contains a large number of unique lines, dest_to_write, which is a strbuf, may keep realloc memory until the loop ends, at which point all the memory is released. I wonder if this might be wasting some heap.

If it were me, I might write it like this:
	struct strset seen_lines = STRSET_INIT;
	dest = xfopen(dest_promisor_name, "w");
	while (strbuf_getline(&line, source) != EOF) {
     		if (strset_add(&seen_lines, line.buf)) {
         		fprintf(dest, "%s\n", line.buf);
     		}	
	}
It also prevents file pointer misalignment.

(I think we still need to discuss what should ultimately become of this helper; at the moment, it seems a bit disjointed, doesn’t it?)

Thank you, Yuchen
Previous: LorenzoPegorariNext: Lorenzo Pegorari
Message 61 of 79 in “preserve promisor files content after repack”
  1. 0/3 preserve promisor files content after repackLorenzoPegorari, Mar 21, 2026
  2. 1/3 pack-write: add explanation to promisor file contentLorenzoPegorari, Mar 21, 2026
  3. 2/3 pack-write: add helper to fill promisor file after repackLorenzoPegorari, Mar 21, 2026
  4. Eric SunshineMar 22, 2026
  5. Lorenzo PegorariMar 22, 2026
  6. 3/3 repack-promisor: preserve content of promisor files after repackLorenzoPegorari, Mar 21, 2026
  7. 0/4 preserve promisor files content after repackLorenzoPegorari, Mar 22, 2026
  8. 1/4 pack-write: add explanation to promisor file contentLorenzoPegorari, Mar 22, 2026
  9. Junio C HamanoMar 23, 2026
  10. Lorenzo PegorariMar 25, 2026
  11. 2/4 pack-write: add helper to fill promisor file after repackLorenzoPegorari, Mar 22, 2026
  12. Eric SunshineMar 23, 2026
  13. Lorenzo PegorariMar 26, 2026
  14. Junio C HamanoMar 23, 2026
  15. Lorenzo PegorariMar 26, 2026
  16. 3/4 repack-promisor: preserve content of promisor files after repackLorenzoPegorari, Mar 22, 2026
  17. Junio C HamanoMar 23, 2026
  18. Lorenzo PegorariMar 26, 2026
  19. 4/4 t7700: test for promisor file content after repackLorenzoPegorari, Mar 22, 2026
  20. 0/5 preserve promisor files content after repackLorenzoPegorari, Apr 6, 2026
  21. 1/5 pack-write: add explanation to promisor file contentLorenzoPegorari, Apr 6, 2026
  22. 2/5 pack-write: add helper to fill promisor file after repackLorenzoPegorari, Apr 6, 2026
  23. Tian YuchenApr 6, 2026
  24. Lorenzo PegorariApr 6, 2026
  25. Junio C HamanoApr 6, 2026
  26. Lorenzo PegorariApr 7, 2026
  27. Junio C HamanoApr 7, 2026
  28. Lorenzo PegorariApr 7, 2026
  29. Junio C HamanoApr 7, 2026
  30. Junio C HamanoApr 6, 2026
  31. Lorenzo PegorariApr 7, 2026
  32. 3/5 repack-promisor: preserve content of promisor files after repackLorenzoPegorari, Apr 6, 2026
  33. 4/5 t7700: test for promisor file content after repackLorenzoPegorari, Apr 6, 2026
  34. Junio C HamanoApr 6, 2026
  35. Lorenzo PegorariApr 7, 2026
  36. Junio C HamanoApr 7, 2026
  37. Lorenzo PegorariApr 7, 2026
  38. Lorenzo PegorariApr 8, 2026
  39. 5/5 t7703: test for promisor file content after geometric repackLorenzoPegorari, Apr 6, 2026
  40. 0/5 preserve promisor files content after repackLorenzoPegorari, Apr 10, 2026
  41. 1/5 pack-write: add explanation to promisor file contentLorenzoPegorari, Apr 10, 2026
  42. 2/5 pack-write: add helper to fill promisor file after repackLorenzoPegorari, Apr 10, 2026
  43. Junio C HamanoApr 10, 2026
  44. Lorenzo PegorariApr 10, 2026
  45. CodingGuidelines: st_mtimespec vs st_mtim vs st_mtimeJunio C Hamano, Apr 10, 2026
  46. Elijah NewrenApr 16, 2026
  47. Junio C HamanoApr 17, 2026
  48. 3/5 repack-promisor: preserve content of promisor files after repackLorenzoPegorari, Apr 10, 2026
  49. 4/5 t7700: test for promisor file content after repackLorenzoPegorari, Apr 10, 2026
  50. 5/5 t7703: test for promisor file content after geometric repackLorenzoPegorari, Apr 10, 2026
  51. Junio C HamanoApr 10, 2026
  52. Lorenzo PegorariApr 10, 2026
  53. 0/6 preserve promisor files content after repackLorenzoPegorari, Apr 10, 2026
  54. 1/6 pack-write: add explanation to promisor file contentLorenzoPegorari, Apr 10, 2026
  55. 2/6 repack-promisor add helper to fill promisor file after repackLorenzoPegorari, Apr 10, 2026
  56. Junio C HamanoApr 10, 2026
  57. Lorenzo PegorariApr 11, 2026
  58. Junio C HamanoApr 12, 2026
  59. Lorenzo PegorariApr 17, 2026
  60. 3/6 repack-promisor: preserve content of promisor files after repackLorenzoPegorari, Apr 10, 2026
  61. Tian YuchenApr 11, 2026
  62. Lorenzo PegorariApr 17, 2026
  63. 4/6 t7700: test for promisor file content after repackLorenzoPegorari, Apr 10, 2026
  64. 5/6 t7703: test for promisor file content after geometric repackLorenzoPegorari, Apr 10, 2026
  65. Tian YuchenApr 11, 2026
  66. Lorenzo PegorariApr 17, 2026
  67. 6/6 repack-promisor: add missing headersLorenzoPegorari, Apr 10, 2026
  68. 0/6 preserve promisor files content after repackLorenzoPegorari, Apr 18, 2026
  69. 1/6 pack-write: add explanation to promisor file contentLorenzoPegorari, Apr 18, 2026
  70. 2/6 repack-promisor add helper to fill promisor file after repackLorenzoPegorari, Apr 18, 2026
  71. 3/6 repack-promisor: preserve content of promisor files after repackLorenzoPegorari, Apr 18, 2026
  72. 4/6 t7700: test for promisor file content after repackLorenzoPegorari, Apr 18, 2026
  73. 5/6 t7703: test for promisor file content after geometric repackLorenzoPegorari, Apr 18, 2026
  74. 6/6 repack-promisor: add missing headersLorenzoPegorari, Apr 18, 2026
  75. Junio C HamanoMay 12, 2026
  76. Lorenzo PegorariMay 19, 2026
  77. Junio C HamanoApr 10, 2026
  78. Junio C HamanoApr 11, 2026
  79. Lorenzo PegorariApr 11, 2026

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.