Subject: [GSoC PATCH v3 0/5] preserve promisor files content after repack

From: LorenzoPegorari <[email-masked]>
Date: Mon, 6 Apr 2026 02:23:48 +0200

The goal of this patch is to solve the NEEDSWORK comment added by
5374a290 (fetch-pack: write fetched refs to .promisor, 14/10/2019). This
is done by adding a helper function that takes the content of all
.promisor files in the `repository`, and copies it inside the first
.promisor file created by the repack.

Also, I added a comment explaining what is the purpose of the content of
the .promisor files, since this wasn't explained anywhere (I found
information regarding this only in the message of the previously cited
commit).

Finally, I added some tests to "t7700-repack.sh" and
"t7703-repack-geometric.sh" that check if the content of .promisor files
are correctly copied into the .promisor files created by a repack.

This version is significantly different from the previous one. Maybe I
should have created a completely different patch series. Let me know for
the future.

IMPORTANT:
The "CodingGuidelines" explicitly state that:
 "A C file must directly include the header files that declare the
  functions and the types it uses, except for the functions and types
  that are made available to it by including one of the header files
  it must include by the previous rule"
where "the previous rule" is (if I understand correctly), the one related
to "<git-compat-util.h>". From what I understand then, I should have
added an include for "strmap.h" (which is needed for `strset`), correct?
And if I am correct, shouldn't "strbuf.h", "hash.h", "odb.h",
"string-list.h" and "strvec.h" also be included?

V3 DIFF:
 * Made the helper function "copy_promisor_content()" a static function,
   because, in my opinion, it is too specific to be used anywhere else
   (at least in the near future).
 * Modified the helper function to add a <time> piece of information when
   coping the content of repacked ".promisor" files, as suggested by
   Junio Hamano. This is done to give an additional piece of information
   so that, after a repack, it is still possible to know when the ref
   <ref> was observed to be pointing at object <oid>.
 * Modified the helper function so that it copies each line only if the
   <oid> appears in the pack associated with the newly created
   ".promisor" file. This is done so that it is possible correctly copy
   each line in the correct newly created ".promisor" file, instead of
   simply appending everything inside the first created ".promisor" file.
   I have done some tests with a git repo that contains around 1M objects
   and with ".promisor" files that contain in total around 100k lines,
   and this operation doesn't seem to meaningfully increase the execution
   time of the repack (it seems to add around 0.5% of execution time on 
   average).
 * Modified the helper function to implement a "promisor ignorelist", so
   that we can explicitly tell to ignore certain packs that we know that
   we excluded (for example during a geometric repack).
 * Implemented better tests.

LorenzoPegorari (5):
  pack-write: add explanation to promisor file content
  pack-write: add helper to fill promisor file after repack
  repack-promisor: preserve content of promisor files after repack
  t7700: test for promisor file content after repack
  t7703: test for promisor file content after geometric repack

 Documentation/git-repack.adoc |   4 +-
 pack-write.c                  |   9 ++
 repack-promisor.c             | 149 +++++++++++++++++++++++++++++++---
 t/t7700-repack.sh             |  63 ++++++++++++++
 t/t7703-repack-geometric.sh   |  42 ++++++++++
 5 files changed, 252 insertions(+), 15 deletions(-)

-- 
2.53.0.585.g1533fa96a8