git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 0/4] cat-file: optionally convert to worktree version

From
Jeff King <peff@peff.net>
Date
Aug 24, 2016, 17:32 UTC
Message-ID
<20160824173248.ami3hgadea5zjvf3@sigill.intra.peff.net>
In-Reply-To
<xmqqr39eqevk.fsf@gitster.mtv.corp.google.com>
On Wed, Aug 24, 2016 at 10:02:39AM -0700, Junio C Hamano wrote:
Show 39 quoted lines
> Jeff King <peff@peff.net> writes:
> 
> > On Wed, Aug 24, 2016 at 09:09:06AM -0700, Junio C Hamano wrote:
> >
> >> >  +	if (!path)
> >> >  +		path = obj_context.path;
> >> >  +	else if (obj_context.mode == S_IFINVALID)
> >> >  +		obj_context.mode = 0100644;
> >> >  +
> >> >   	buf = NULL;
> >> >   	switch (opt) {
> >> >   	case 't':
> >> 
> >> The above two hunks make all the difference in the ease of reading
> >> the remainder of the function.  Very good.
> >
> > Yeah, I agree. Though it took me a moment to figure out why we were
> > setting obj_context.mode but not obj_context.path; the reason is that
> > "mode" is convenient to use as local storage, but "path" is not, because
> > it is not a pointer but an array.
> 
> Wait a minute.  Why is it a cascaded if/elseif, not two independent
> if statements that gives a default value?  In other words, wouldn't
> these two independent and orthogonal decisions?
> 
>  * When forced to use some path, we ignore obj_context.path
> 
>  * Whether we are forced to use a path or not, if we do not know the
>    mode from the lookup context, we want to use the regular blob
>    mode.
> 
> So that part of the patch is wrong after all, I would have to say.
> 
> 	if (!path)
>         	path = obj_context.path;
> 	if (obj_context.mode == S_IFINVALID)
>         	obj_context.mode = 0100644;
> 
> or something like that, perhaps.

Oh, hrm, you are right. I assumed we wanted to force the mode when --path was in effect, but that is not what the original does. If you say:

  --path=foo HEAD:bar

then we will take the mode for "bar", whatever it is (maybe a tree or symlink). But if you say:

  --path=foo $(git rev-parse HEAD:bar)
then we will use 100644, regardless of what "bar" is in HEAD.

I have not thought about it enough to know if that is a good thing or a bad thing. But I'll bet Dscho has, so I will wait for him to comment. :)

Show 27 quoted lines
> >   if (!force_path) {
> > 	/* use file info from sha1 lookup */
> > 	path = obj_context.path;
> > 	mode = obj_context.mode;
> >   } else {
> > 	/* use path requested by user, and assume it is a regular file */
> > 	path = force_path;
> > 	mode = 0100644;
> >   }
> 
> Hmph, if you read it that way, then if/elseif makes some sense, but
> we need to assume that the obj_context.mode can be garbage and have
> a fallback for it.
> 
> Just like
> 
> 	git cat-file --filters --path=git.c HEAD:t
> 
> would error out because HEAD:t is not even a blob, I would expect
> 
> 	git cat-file --filters --path=git.c :RelNotes
> 
> to error out, because the object itself _is_ known to be a
> blob that is not a regular file.
> 
> And that kind of type checking will not be possible with "if the
> user gave us a path, assume it is a regular file".

Right, I agree that is the outcome, but I just wasn't sure that the second case _should_ error out. IOW, does "--filters --path" mean "treat this as a regular file at path X", or is the "regular file" part not implied?

I don't suppose anybody cares that much either way, but it feels weird to behave differently depending on how we looked up the blob (whereas for the HEAD:t case, a tree is always a tree).

-Peff
Previous: Junio C HamanoNext: Junio C Hamano
Message 49 of 66 in “cat-file: optionally convert to worktree version”
  1. 0/4 cat-file: optionally convert to worktree versionJohannes Schindelin, Aug 18, 2016
  2. 3/4 cat-file --textconv/--filters: allow specifying the path separatelyJohannes Schindelin, Aug 18, 2016
  3. Junio C HamanoAug 18, 2016
  4. Johannes SchindelinAug 19, 2016
  5. Junio C HamanoAug 19, 2016
  6. Johannes SchindelinAug 24, 2016
  7. 2/4 cat-file: introduce the --filters optionJohannes Schindelin, Aug 18, 2016
  8. Junio C HamanoAug 18, 2016
  9. Johannes SchindelinAug 19, 2016
  10. Torsten BögershausenAug 18, 2016
  11. Johannes SchindelinAug 19, 2016
  12. Junio C HamanoAug 19, 2016
  13. Torsten BögershausenAug 19, 2016
  14. Johannes SchindelinAug 19, 2016
  15. Junio C HamanoAug 19, 2016
  16. Torsten BögershausenAug 22, 2016
  17. Johannes SchindelinAug 24, 2016
  18. 4/4 cat-file: support --textconv/--filters in batch modeJohannes Schindelin, Aug 18, 2016
  19. Junio C HamanoAug 18, 2016
  20. Johannes SchindelinAug 19, 2016
  21. Jeff KingAug 19, 2016
  22. Jeff KingAug 18, 2016
  23. Junio C HamanoAug 18, 2016
  24. Johannes SchindelinAug 19, 2016
  25. Johannes SchindelinAug 19, 2016
  26. Jeff KingAug 19, 2016
  27. Torsten BögershausenAug 18, 2016
  28. Johannes SchindelinAug 19, 2016
  29. Jeff KingAug 19, 2016
  30. Junio C HamanoAug 19, 2016
  31. 1/4 cat-file: fix a grammo in the man pageJohannes Schindelin, Aug 18, 2016
  32. Junio C HamanoAug 18, 2016
  33. 0/4 cat-file: optionally convert to worktree versionJohannes Schindelin, Aug 24, 2016
  34. 4/4 cat-file: support --textconv/--filters in batch modeJohannes Schindelin, Aug 24, 2016
  35. 2/4 cat-file: introduce the --filters optionJohannes Schindelin, Aug 24, 2016
  36. Junio C HamanoAug 24, 2016
  37. Junio C HamanoAug 24, 2016
  38. Johannes SchindelinAug 31, 2016
  39. Junio C HamanoAug 31, 2016
  40. 1/4 cat-file: fix a grammo in the man pageJohannes Schindelin, Aug 24, 2016
  41. 3/4 cat-file --textconv/--filters: allow specifying the path separatelyJohannes Schindelin, Aug 24, 2016
  42. Junio C HamanoAug 24, 2016
  43. Junio C HamanoAug 24, 2016
  44. Johannes SchindelinAug 31, 2016
  45. Junio C HamanoAug 31, 2016
  46. Junio C HamanoAug 24, 2016
  47. Jeff KingAug 24, 2016
  48. Junio C HamanoAug 24, 2016
  49. Jeff KingAug 24, 2016
  50. Junio C HamanoAug 24, 2016
  51. Junio C HamanoAug 29, 2016
  52. Johannes SchindelinAug 31, 2016
  53. 0/4 cat-file: optionally convert to worktree versionJohannes Schindelin, Sep 9, 2016
  54. 1/4 cat-file: fix a grammo in the man pageJohannes Schindelin, Sep 9, 2016
  55. 3/4 cat-file --textconv/--filters: allow specifying the path separatelyJohannes Schindelin, Sep 9, 2016
  56. Junio C HamanoSep 9, 2016
  57. Johannes SchindelinSep 10, 2016
  58. 4/4 cat-file: support --textconv/--filters in batch modeJohannes Schindelin, Sep 9, 2016
  59. 2/4 cat-file: introduce the --filters optionJohannes Schindelin, Sep 9, 2016
  60. Junio C HamanoSep 9, 2016
  61. Johannes SchindelinSep 9, 2016
  62. Junio C HamanoSep 9, 2016
  63. Junio C HamanoSep 9, 2016
  64. Junio C HamanoSep 9, 2016
  65. Johannes SchindelinSep 10, 2016
  66. Junio C HamanoSep 11, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.