On Fri, May 12, 2023 at 05:24:56PM -0400, Jeff King wrote: > > This patch introduces a new configuration, `pack.recentObjectsHook` > > which allows the caller to specify a program (or set of programs) whose > > output is treated as a set of objects to treat as recent, regardless of > > their true age. > > I was going to complain about putting this in the "pack" section, > because I thought by touching reachable.c, we'd also affect git-prune. > But I don't think we do, because it does its own direct mtime check on > the loose objects. > > But I'm not sure that's the right behavior. > > It feels like even before your patch, this is a huge gap in our > object-retention strategy. During repacking, we try to avoid dropping > objects which are reachable from recent-but-unreachable things we're > keeping (since otherwise it effectively corrupts those recent objects, > making them less valuable to keep). But git-prune will happily drop them > anyway! > > And I think the same thing would apply to your hook. If the hook says > "object XYZ is precious even if unreachable, keep it", then git-prune > ignoring that seems like it would be a source of errors. > > I suspect both could be fixed by having git-prune trigger the same > add_unseen_recent_objects_to_traversal() call either as part of > the perform_reachability_traversal() walk, or maybe in its own walk (I > think maybe it has to be its own because the second walk should avoid > complaining about missing objects). I might be missing something, but I think we already (kind of) do the right thing here. AFAICT, the path is: - cmd_prune() - for_each_loose_file_in_objdir() - prune_object() (as a callback to the above) - is_object_reachable() - perform_reachability_traversal() - mark_reachable_objects() - add_unseen_recent_objects_to_traversal() That only happens when `mark_recent != 0`, though. Thanks, Taylor