Re: [PATCH 0/3] cat-file: add %(objectmode) avoid verifying submodules' OIDs
- From
Jeff King <peff@peff.net>
- Date
- Mar 12, 2024, 08:59 UTC
- Message-ID
- <20240312085901.GA69635@coredump.intra.peff.net>
- In-Reply-To
- <xmqqwmq8o36j.fsf@gitster.g>
On Mon, Mar 11, 2024 at 02:43:00PM -0700, Junio C Hamano wrote:
Show 13 quoted lines
> It is somewhat unsatisfying that --batch/--batch-check lacks so > much. Even with %(objectmode) its nature of one-object-at-a-time > makes querying children of a large tree a chore, when you compare it > with something like "cat-file -p HEAD:" that allows you to grab the > needed information for all children with a single invocation. > > This is orthogonal to what the patch wants to do, which is to enrich > the output side with more formatting, bit I wonder if we want to > consider enriching the input side? e.g. instead of feeding just a > single object name from the standard input of "cat-file > --batch/--batch-check", perhaps a syntax can say "Here I have the > object name for a tree-ish object, but please pretend that I gave > you all the objects contained within it", or something?
That is an interesting direction. In practice I guess you might want to expand trees (to show their contents) or perhaps commits (to traverse history and/or look at their trees). And we already have tools to do that.
So for example you can already do:
git ls-tree --format='%(objectname) %(objectmode)' HEAD
Or if you wanted to mix-and-match with other cat-file placeholders, you can do:
git ls-tree --format='%(objectname) %(objectmode)' HEAD | git cat-file --batch-check='%(objectname) %(deltabase) %(rest)'
That is a little less efficient (we look up the object twice), but once you are working with hex object ids it is not too bad (cat-file is heavily optimized here). Of course in the long run I think we should move to a future where the formatting code is shared, and you can just ask ls-tree for deltabase if you want to.
I think leaving this to specialized tools like ls-tree gives them a lot of flexibility that a special input mode to cat-file might find awkward. For example, recurse vs non-recursive tree listing. Or filtering with pathspecs. And of course when you get into commits and traversal, there are many rev-list options. :)
The strategy so far has been making sure cat-file can efficiently take in the output of these other tools to further describe objects. But moving towards a unified output formatting model would be even better, I think. In the meantime, I think cat-file learning %(objectmode) makes sense for single names (rather than listing trees), and fortunately it uses the same (obvious) name that ls-tree does, so we won't have a problem unifying them later.
The patch itself looked reasonable to me, modulo the comments you already made.
-Peff