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

Re: [PATCH 3/4] cat-file --textconv/--filters: allow specifying the path separately

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Aug 19, 2016, 14:49 UTC
Message-ID
<alpine.DEB.2.20.1608191521410.4924@virtualbox>
In-Reply-To
<xmqqfuq26mu3.fsf@gitster.mtv.corp.google.com>
Hi Junio,
On Thu, 18 Aug 2016, Junio C Hamano wrote:
Show 6 quoted lines
> Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> 
> > There are circumstances when it is relatively easy to figure out the
> > object name for a given path, but not the revision. For example, when
> 
> revision of the containing tree, I presume?
name of containing tree, actually.
Show 8 quoted lines
> > Let's simplify this dramatically, because we do not really need that
> > revision at all: all we care about is that we know the path. In the
> > scenario described above, we do know the path, and we just want to
> > specify it separately from the object name.
> 
> I wouldn't call it "simplifying dramatically".  It is just to
> support two use cases that is different from the use case where you
> want to use "<tree>:<path>".

"this" was not the code in question. "this" is the use case. Just put my shoes on for a moment. As described: you have a list of object names and their path. Now you need to use the --textconv or --filters option, but you do not have the commit name. What do you do? Concoct a script that goes through `git rev-list --all -- <path>` in the hopes of finding a revision soon? I hope after this little exercise you agree that introducing the --path=<path> option simplifies this use case dramatically.

Show 6 quoted lines
> We already have a precedent in "hash-object --path=<path>" for these
> two different uses cases from the primary one.  That form can be
> used when we know the contents but we do not know where the contents
> came from.  It can also be used when we want to pretend that
> contents came from a specific path, that may be different from the
> file we are hashing.
Agreed. I was unaware of hash-object's existing option.
Show 9 quoted lines
> Let's be consistent and (1) call it "--path", and (2) explain it as
> a feature to allow you to tell the path separately or allow you to
> pretend that the content is at a path different from reality.
> 
> After all, you would want to ignore <path2> part in this construct:
> 
> 	git cat-file --filter --path=<path1> HEAD:<path2>
> 
> for the purpose of filtering, right?
True, and I even make use of that in the test for the batch mode.
Show 40 quoted lines
> > diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> > index 0b74afa..5ff58b3 100644
> > --- a/builtin/cat-file.c
> > +++ b/builtin/cat-file.c
> > @@ -20,6 +20,8 @@ struct batch_options {
> >  	const char *format;
> >  };
> >  
> > +static const char *force_path;
> > +
> >  static int filter_object(const char *path, unsigned mode,
> >  			 const unsigned char *sha1,
> >  			 char **buf, unsigned long *size)
> > @@ -89,21 +91,24 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
> >  		return !has_sha1_file(sha1);
> >  
> >  	case 'w':
> > -		if (!obj_context.path[0])
> > +		if (!force_path && !obj_context.path[0])
> >  			die("git cat-file --filters %s: <object> must be "
> >  			    "<sha1:path>", obj_name);
> >  
> > -		if (filter_object(obj_context.path, obj_context.mode,
> > +		if (filter_object(force_path ? force_path : obj_context.path,
> > +				  force_path ? 0100644 : obj_context.mode,
> >  				  sha1, &buf, &size))
> 
> The mode override is somewhat questionable.  Wouldn't you want to
> reject
> 
> 	git cat-file --filter --path=Makefile HEAD:RelNotes
> 
> when HEAD:RelNotes blob is known to be a symbolic link?  After all,
> you would reject this
> 
> 	git cat-file --filter --path=Makefile HEAD:t/
> 
> and it is quite similar, no?  I think this can be argued both ways,
> but I have a feeling that obj_context.mode, if available, should be
> honored with or without force_path.
I see your point. All I wanted to do was to enable
	git cat-file --filters --path=Makefile cafebabe

in which case obj_context.mode == S_IFINVALID. I fixed it (see interdiff of the next iteration).

Show 23 quoted lines
> > diff --git a/t/t8010-cat-file-filters.sh b/t/t8010-cat-file-filters.sh
> > index e466634..fd17159 100755
> > --- a/t/t8010-cat-file-filters.sh
> > +++ b/t/t8010-cat-file-filters.sh
> > @@ -31,4 +31,17 @@ test_expect_success 'cat-file --filters converts to worktree version' '
> >  	has_cr actual
> >  '
> >  
> > +test_expect_success 'cat-file --filters --use-path=<path> works' '
> > +	sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
> > +	git cat-file --filters --use-path=world.txt $sha1 >actual &&
> > +	has_cr actual
> > +'
> > +
> > +test_expect_success 'cat-file --textconv --use-path=<path> works' '
> > +	sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
> > +	test_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&
> > +	git cat-file --textconv --use-path=hello.txt $sha1 >rot13 &&
> > +	test uryyb = "$(cat rot13 | remove_cr)"
> > +'
> 
> I think I saw some code to ensure "when giving this option you need
> that option in effect, too"; they should be tested here, too, no?

No, I would rather not test for that. These conditionals are purely for any user's convenience, in case they specify an option that has no effect. They are absolutely not essential for the function introduced in this patch series.

Ciao, Dscho

Previous: Junio C HamanoNext: Junio C Hamano
Message 4 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.