Re: [GSoC PATCH v2 2/4] pack-write: add helper to fill promisor file after repack
- From
Lorenzo Pegorari <lorenzo.pegorari2002@gmail.com>
- Date
- Mar 26, 2026, 02:01 UTC
- Message-ID
- <acSTY_i4zAueN9jD@lorenzo-VM>
- In-Reply-To
- <xmqqfr5q44jx.fsf@gitster.g>
On Mon, Mar 23, 2026 at 02:30:26PM -0700, Junio C Hamano wrote:
Show 24 quoted lines
> LorenzoPegorari <lorenzo.pegorari2002@gmail.com> writes: > > > Create a `copy_all_promisor_files()` helper function used to copy the > > contents of all ".promisor" files in a `repository` inside another > > ".promisor" file. > > > > This function can be used to preserve the contents of all ".promisor" > > files inside a new ".promisor" file, for example when a repack happens. > > > > This function is written in such a way so that it will read all the > > ".promisor" files inside the given `repository` line by line, and copy > > only the lines that are not already present in the destination file. This > > is done to avoid copying the same lines multiple times that may come from > > multiple (redundant) packfiles. There might be another better/cleaner way > > to achieve this. > > In the previous step, we extablished that these "back then their ref > X used to point at object Y" records are there so that we can > identify which refs were fetched at the time the packfile was > downloaded to help debugging. When repacking, losing these records > certainly would lose information. > > But would concatenating all into a single file help preserve the > useful information? Don't we need do better than that?
Yeah, we absolutely need to! That's why I said that I was not satisfied at all with the patch (in cover letter of v1). I really needed some feedback, because I knew that I was doing things wrong.
Show 17 quoted lines
> A NEEDSWORK comment, as was discussed in another thread or two in > the recent past, is not necessarily a well thought out fully > finished specification of an additional piece of work. "We know > this has a problem, we may need to do something about it, like > concatenating to save the contents, perhaps? We do not know the > answer, and we do not bother thinking it through right at this > moment. It is left to the future developers to figure it out" is > what a NEEDSWORK comment is about. > > Your first response to such a comment may be "yeah, I agree that it > is bad to lose information we added to help debugging", but the > second one should be to wonder if the "like concatenating..." is the > best approach going forward. > > In other words, we should take a NEEDSWORK comment as a mere > starting point, and what NEEDS your work begins at thinking what > needs to be done about the problem raised there.
I fully understand this! Honestly, my biggest weakness that I've discovered about myself as a dev (through past open-source experience, e.g. GSoC'25) is that I get hesitant when I have to work on and submit a patch if I don't have a lot of experience with the codebase. This happens particularly when I have to take a decision, and not only complete a task.
In fact, I decided to work on this specific NEEDSWORK issue to get more experience on promisor remotes (the feature that I want to improve in my GSoC proposal) before the GSoC coding period... if I get selected, of course :-).
I will try my best to improve!
Show 9 quoted lines
> By mixing them up all into a single list, you no longer can tell > when their ref X was observed to be pointing at object Y anymore. > You may have two packs originally, with a record for "ref X pointing > at object Y" in each of them, but by deduping them, you lose the > information that you cloned at one time, and made an additional > fetch on another day, and the fact the ref X was pointing at the > same value at both times. I am not sure if it is a good > implementation if the objective of this topic is to preserve > information that is useful for debugging.
My reasoning was based on the (wrong) assumption that it was impossible for the same record fo "ref X is pointing at object Y" to appear multiple times. Obviously then, deduping them is the wrong solution, as it will lose some debugging information.
> I wonder if it helps to append to each line the file timestamp of > the .promisor file we took the record originally? For the sake of > completeness, we could consider adding the filename as well, but we > can quickly dismiss it as not so useful ;-)
Related to what I said before about getting hesitant... I actually thought about (pretty much) exactly this! My original idea was to add a timestamp of the current time when the repack happened. I discarded it because I didn't want to add any new information (for no particular reason tbh) and because I didn't want ".promisor" file content to potentially become too long if many repacks happen.
Your solution is much cleaner compared to what I originally thought of.
Show 5 quoted lines
> If repacking already repacked promisor packfile, the records would > already contain such a timestamp at the end, so the code to copy > existing records must be prepared to see if the records are the > <ref, oid> tuple, or <ref, oid, timestamp> tuple, and act > accordingly.
Makes perfect sense.
Show 10 quoted lines
> I am *not* saying that without such a "preserve timestamp" column in > the record, copying existing records to a new .promisor file is > useless. But we do not see any explanation why the author thinks > that it is sufficient to copy existing records while silently > deduping. We can implement only one choice backed by series of > decisions like "timestamp might help" and "original filenames would > probably not help", and the design should describe what was > considered and rejected (as opposed to "we didn't think things > through---we just did what the original NEEDSWORK comment suggested > doing").
I 100% agree.
> Thanks.
Thank you Junio for your time and feedback,
Lorenzo