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

Re: [PATCH v2 2/4] cat-file: introduce the --filters option

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 24, 2016, 17:46 UTC
Message-ID
<xmqqmvk2qcv8.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<320f5e862e8df12bbd1d918f0b347aeacbd25d17.1472041389.git.johannes.schindelin@gmx.de>
Johannes Schindelin <johannes.schindelin@gmx.de> writes:
Show 23 quoted lines
> +static int filter_object(const char *path, unsigned mode,
> +			 const unsigned char *sha1,
> +			 char **buf, unsigned long *size)
> +{
> +	enum object_type type;
> +
> +	*buf = read_sha1_file(sha1, &type, size);
> +	if (!*buf)
> +		return error(_("cannot read object %s '%s'"),
> +			sha1_to_hex(sha1), path);
> +	if (type != OBJ_BLOB) {
> +		free(*buf);
> +		return error(_("blob expected for %s '%s'"),
> +			sha1_to_hex(sha1), path);
> +	}
> +	if (S_ISREG(mode)) {
> +		struct strbuf strbuf = STRBUF_INIT;
> +		if (convert_to_working_tree(path, *buf, *size, &strbuf)) {
> +			free(*buf);
> +			*size = strbuf.len;
> +			*buf = strbuf_detach(&strbuf, NULL);
> +		}
> +	}

When we see a blob that is not ISREG, what is expected to happen? Is it an error?

We can argue both ways.

Currently the ONLY kind of blob that is not ISREG is a symbolic link, and it might be OK to output it as-is without any conversion [*1*], in which case we can simply lose the S_ISREG(mode) check altogether (and "mode" parameter to this function).

On the other hand, because "cat-file --filters" is meant to be a smaller-granularity operation that could be used as a building block to emulate what "git checkout" does, i.e. "imagine that we had the blob in the index and checking it out from the path, and hand the caller what would have been written out to the filesystem, so that the convert_to_working_tree() logic does not have to be emulated in the userspace", erroring out when we see a symbolic link may be also a valid way to handle it. We know the usual CRLF and other conversions do not apply to them.

In any case, silently succeeding without any output is probably what the end-user least expects.

If we choose to fail the request, the necessary update to the test would look like this, I think.

Show 15 quoted lines
> diff --git a/t/t8010-cat-file-filters.sh b/t/t8010-cat-file-filters.sh
> new file mode 100755
> index 0000000..e466634
> --- /dev/null
> +++ b/t/t8010-cat-file-filters.sh
> @@ -0,0 +1,34 @@
> +#!/bin/sh
> +
> +test_description='git cat-file filters support'
> +. ./test-lib.sh
> +
> +test_expect_success 'setup ' '
> +	echo "*.txt eol=crlf diff=txt" >.gitattributes &&
> +	echo "hello" | append_cr >world.txt &&
> +	git add .gitattributes world.txt &&
	git update-index --cacheinfo :world.txt,$EMPTY_BLOB,symlink &&
Show 23 quoted lines
> +	test_tick &&
> +	git commit -m "Initial commit"
> +'
> +
> +has_cr () {
> +	tr '\015' Q <"$1" | grep Q >/dev/null
> +}
> +
> +test_expect_success 'no filters with `git show`' '
> +	git show HEAD:world.txt >actual &&
> +	! has_cr actual
> +
> +'
> +
> +test_expect_success 'no filters with cat-file' '
> +	git cat-file blob HEAD:world.txt >actual &&
> +	! has_cr actual
> +'
> +
> +test_expect_success 'cat-file --filters converts to worktree version' '
> +	git cat-file --filters HEAD:world.txt >actual &&
> +	has_cr actual
> +'
test_expect_success 'cat-file --filters rejects a non-blob' '
	test_must_fail git cat-file --filters HEAD:
'
test_expect_success 'cat-file --filters rejects a non-regular blob' '
	test_must_fail git cat-file --filters HEAD:symlink
'

And if we choose to accept as long as it is a blob, then the last step can lose test_must_fail (and perhaps the result needs to be checked against "hello" without CR).

[Footnote]
*1* But of course other kinds of non-ISREG blob we would add later
    may not be something you would want to write out as-is.
Previous: Johannes SchindelinNext: Junio C Hamano
Message 36 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.