[GSoC PATCH v3 0/5] preserve promisor files content after repack
- From
LorenzoPegorari <lorenzo.pegorari2002@gmail.com>
- Date
- Apr 6, 2026, 00:23 UTC
- Message-ID
- <cover.1775431990.git.lorenzo.pegorari2002@gmail.com>
- In-Reply-To
- <cover.1774205661.git.lorenzo.pegorari2002@gmail.com>
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