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

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

From
LorenzoPegorari <lorenzo.pegorari2002@gmail.com>
Date
Apr 18, 2026, 14:17 UTC
Message-ID
<cfa3fe43b027306805e7fcb5e7517d7dcbb473a8.1776384902.git.lorenzo.pegorari2002@gmail.com>
In-Reply-To
<cover.1776384902.git.lorenzo.pegorari2002@gmail.com>

When a `repack` involving promisor packfiles happens, the new ".promisor" file is created empty, losing all the debug info that might be present inside the ".promisor" files before the `repack`.

Use the previously created "write_promisor_file_after_repack()" function to preserve the contents of all ".promisor" files inside the ".promisor" files created by the `repack`.

For geometric repacking, we have to create a `strset` that contains the basenames of all excluded packs. For "normal" repacking this is not necessary, since there should be no excluded packs.

Also, update the documentation accordingly.
Helped-by: Tian Yuchen <cat@malon.dev>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: LorenzoPegorari <lorenzo.pegorari2002@gmail.com>
---
 Documentation/git-repack.adoc |  4 ++--
 repack-promisor.c             | 39 ++++++++++++++++++-----------------
 2 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/Documentation/git-repack.adoc b/Documentation/git-repack.adoc
index 673ce91083..33d3c8afbd 100644
--- a/Documentation/git-repack.adoc
+++ b/Documentation/git-repack.adoc
@@ -45,8 +45,8 @@ other objects in that pack they already have locally.
 +
 Promisor packfiles are repacked separately: if there are packfiles that
 have an associated ".promisor" file, these packfiles will be repacked
-into another separate pack, and an empty ".promisor" file corresponding
-to the new separate pack will be written.
+into another separate pack, and a ".promisor" file corresponding to the
+new separate pack will be written (with arbitrary contents).
 
 -A::
 	Same as `-a`, unless `-d` is used.  Then any unreachable
diff --git a/repack-promisor.c b/repack-promisor.c
index 8fc541d2cf..06393ef06e 100644
--- a/repack-promisor.c
+++ b/repack-promisor.c
@@ -186,7 +186,8 @@ static void write_promisor_file_after_repack(struct repository *repo,
 static void finish_repacking_promisor_objects(struct repository *repo,
 					      struct child_process *cmd,
 					      struct string_list *names,
-					      const char *packtmp)
+					      const char *packtmp,
+					      struct strset *not_repacked_basenames)
 {
 	struct strbuf line = STRBUF_INIT;
 	FILE *out;
@@ -196,7 +197,6 @@ static void finish_repacking_promisor_objects(struct repository *repo,
 	out = xfdopen(cmd->out, "r");
 	while (strbuf_getline_lf(&line, out) != EOF) {
 		struct string_list_item *item;
-		char *promisor_name;
 
 		if (line.len != repo->hash_algo->hexsz)
 			die(_("repack: Expecting full hex object ID lines only from pack-objects."));
@@ -204,22 +204,16 @@ 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. To create the "".promisor" file, we don't use the
+		 * helper function write_promisor_file(), but instead we use the
+		 * specific function write_promisor_file_after_repack(), which creates
+		 * the file and appropriately fills it with the content of the
+		 * ".promisor" files used for the repack.
 		 */
-		promisor_name = mkpathdup("%s-%s.promisor", packtmp,
-					  line.buf);
-		write_promisor_file(promisor_name, NULL, 0);
+		write_promisor_file_after_repack(repo, line.buf, packtmp,
+						not_repacked_basenames);
 
 		item->util = generated_pack_populate(item->string, packtmp);
-
-		free(promisor_name);
 	}
 
 	fclose(out);
@@ -256,7 +250,7 @@ void repack_promisor_objects(struct repository *repo,
 		return;
 	}
 
-	finish_repacking_promisor_objects(repo, &cmd, names, packtmp);
+	finish_repacking_promisor_objects(repo, &cmd, names, packtmp, NULL);
 }
 
 void pack_geometry_repack_promisors(struct repository *repo,
@@ -267,6 +261,7 @@ void pack_geometry_repack_promisors(struct repository *repo,
 {
 	struct child_process cmd = CHILD_PROCESS_INIT;
 	FILE *in;
+	struct strset not_repacked_basenames = STRSET_INIT;
 
 	if (!geometry->promisor_split)
 		return;
@@ -280,9 +275,15 @@ void pack_geometry_repack_promisors(struct repository *repo,
 	in = xfdopen(cmd.in, "w");
 	for (size_t i = 0; i < geometry->promisor_split; i++)
 		fprintf(in, "%s\n", pack_basename(geometry->promisor_pack[i]));
-	for (size_t i = geometry->promisor_split; i < geometry->promisor_pack_nr; i++)
-		fprintf(in, "^%s\n", pack_basename(geometry->promisor_pack[i]));
+	for (size_t i = geometry->promisor_split; i < geometry->promisor_pack_nr; i++) {
+		const char *name = pack_basename(geometry->promisor_pack[i]);
+		fprintf(in, "^%s\n", name);
+		strset_add(&not_repacked_basenames, name);
+	}
 	fclose(in);
 
-	finish_repacking_promisor_objects(repo, &cmd, names, packtmp);
+	finish_repacking_promisor_objects(repo, &cmd, names, packtmp,
+			strset_get_size(&not_repacked_basenames) ? &not_repacked_basenames : NULL);
+
+	strset_clear(&not_repacked_basenames);
 }
-- 
2.53.0.584.g6b87e8e9dd
Previous: LorenzoPegorariNext: LorenzoPegorari
Message 71 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.