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

[PATCH v5 0/6] object-name: make ambiguous object output translatable + show tag date

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Nov 25, 2021, 22:03 UTC
Message-ID
<cover-v5-0.6-00000000000-20211125T215529Z-avarab@gmail.com>
In-Reply-To
<cover-v4-0.3-00000000000-20211122T175219Z-avarab@gmail.com>

This topic improves the output we emit on ambiguous objects as noted in 4/6, and makes it translatable, see 3/6. See [1] for v4.

This addresses the feedback Jeff King had on v4. There weren't any tests for cases where we'd return -1 when parsing objects, and I was focused on different object types in earlier iterations, and missed that case.

So this v5 leads with some exhaustive testing of the existing functionality to address that and other blind spots,

I then resurrected the patch from an earlier iteration to buffer the output for a single advice() call at the end. As the exhaustive tests that we have now show if we call error() (which can and will happen several times on invalid objects) while parsing our N objects, we'll split up the header and body for the advice(), by buffering it up we're guaranteed to print errors and the payload separately.

1. https://lore.kernel.org/git/cover-v4-0.3-00000000000-20211122T175219Z-avarab@gmail.com
Ævar Arnfjörð Bjarmason (6):
  object-name tests: add tests for ambiguous object blind spots
  object-name: explicitly handle OBJ_BAD in show_ambiguous_object()
  object-name: make ambiguous object output translatable
  object-name: show date for ambiguous tag objects
  object-name: iterate ambiguous objects before showing header
  object-name: re-use "struct strbuf" in show_ambiguous_object()
 object-name.c                       | 111 +++++++++++++++++++++++++---
 t/t1512-rev-parse-disambiguation.sh |  83 +++++++++++++++++++++
 2 files changed, 182 insertions(+), 12 deletions(-)
Range-diff against v4:
-:  ----------- > 1:  767165d096d object-name tests: add tests for ambiguous object blind spots
1:  2e7090c09f9 ! 2:  ee86912f1c1 object-name: remove unreachable "unknown type" handling
    @@ Metadata
     Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
     
      ## Commit message ##
    -    object-name: remove unreachable "unknown type" handling
    +    object-name: explicitly handle OBJ_BAD in show_ambiguous_object()
     
    -    Remove unreachable "unknown type" handling in the code that displays
    -    the ambiguous object list. See [1] for the current output, and [1] for
    -    the commit that added the "unknown type" handling.
    +    Amend the "unknown type" handling in the code that displays the
    +    ambiguous object list to assert() that we're either going to get the
    +    "real" object types we can pass to type_name(), or a -1 (OBJ_BAD)
    +    return value from oid_object_info().
     
    -    The reason this code wasn't reachable is because we're not passing in
    -    OBJECT_INFO_ALLOW_UNKNOWN_TYPE, so we'll die in sort_ambiguous()
    -    before we get to show_ambiguous_object():
    +    See [1] for the current output, and [1] for the commit that added the
    +    "unknown type" handling.
     
    -        $ git rev-parse 8315
    -        error: short object ID 8315 is ambiguous
    -        hint: The candidates are:
    -        fatal: invalid object type
    +    We are never going to get an "unknown type" in the sense of custom
    +    types crafted with "hash-object --literally", since we're not using
    +    the OBJECT_INFO_ALLOW_UNKNOWN_TYPE flag.
     
    -    We should do better here, but let's leave that for some future
    -    improvement. In a subsequent commit I'll improve the output we do
    -    show, and not having to handle the "unknown type" case simplifies that
    -    change.
    +    If we manage to otherwise unpack such an object without errors we'll
    +    die() in parse_loose_header_extended() called by sort_ambiguous()
    +    before we get to show_ambiguous_object(), as is asserted by the test
    +    added in the preceding commit.
     
    -    Even though we know that this isn't reachable let's back that up with
    -    an assert() both for self-documentation and sanity checking.
    +    So saying "unknown type" here was always misleading, we really meant
    +    to say that we had a failure parsing the object at all, if the problem
    +    is only that it's type is unknown we won't reach this code.
    +
    +    So let's emit a generic "[bad object]" instead. As our tests added in
    +    the preceding commit show, we'll have emitted various "error" output
    +    already in those cases.
    +
    +    We should do better in the truly "unknown type" cases, which we'd need
    +    to handle if we were passing down the OBJECT_INFO_ALLOW_UNKNOWN_TYPE
    +    flag. But let's leave that for some future improvement. In a
    +    subsequent commit I'll improve the output we do show, and not having
    +    to handle the "unknown type" (as in OBJECT_INFO_ALLOW_UNKNOWN_TYPE)
    +    simplifies that change.
     
         1. 5cc044e0257 (get_short_oid: sort ambiguous objects by type,
            then SHA-1, 2018-05-10)
    @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, voi
      		return 0;
      
      	type = oid_object_info(ds->repo, oid, NULL);
    ++
    ++	if (type < 0) {
    ++		strbuf_addstr(&desc, "[bad object]");
    ++		goto out;
    ++	}
    ++
     +	assert(type == OBJ_TREE || type == OBJ_COMMIT ||
     +	       type == OBJ_BLOB || type == OBJ_TAG);
    ++	strbuf_addstr(&desc, type_name(type));
    ++
      	if (type == OBJ_COMMIT) {
      		struct commit *commit = lookup_commit(ds->repo, oid);
      		if (commit) {
     @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, void *data)
    + 			strbuf_addf(&desc, " %s", tag->tag);
    + 	}
      
    - 	advise("  %s %s%s",
    +-	advise("  %s %s%s",
    ++out:
    ++	advise("  %s %s",
      	       repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV),
     -	       type_name(type) ? type_name(type) : "unknown type",
    --	       desc.buf);
    -+	       type_name(type), desc.buf);
    + 	       desc.buf);
      
      	strbuf_release(&desc);
    - 	return 0;
    +
    + ## t/t1512-rev-parse-disambiguation.sh ##
    +@@ t/t1512-rev-parse-disambiguation.sh: test_expect_success POSIXPERM 'ambigous zlib corrupt loose blob' '
    + 	error: unable to unpack cafe... header
    + 	error: inflate: data stream error (incorrect header check)
    + 	error: unable to unpack cafe... header
    +-	hint:   cafe... unknown type
    ++	hint:   cafe... [bad object]
    + 	hint:   cafe... blob
    + 	fatal: ambiguous argument '\''cafe...'\'': unknown revision or path not in the working tree.
    + 	Use '\''--'\'' to separate paths from revisions, like this:
2:  00d84faeb1d ! 3:  b79964483e8 object-name: make ambiguous object output translatable
    @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, voi
      
      	if (ds->fn && !ds->fn(ds->repo, oid, ds->cb_data))
      		return 0;
    -@@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, void *data)
    + 
    ++	hash = repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV);
      	type = oid_object_info(ds->repo, oid, NULL);
    + 
    + 	if (type < 0) {
    +-		strbuf_addstr(&desc, "[bad object]");
    ++		/*
    ++		 * TRANSLATORS: This is a line of ambiguous object
    ++		 * output shown when we cannot look up or parse the
    ++		 * object in question. E.g. "deadbeef [bad object]".
    ++		 */
    ++		strbuf_addf(&desc, _("%s [bad object]"), hash);
    + 		goto out;
    + 	}
    + 
      	assert(type == OBJ_TREE || type == OBJ_COMMIT ||
      	       type == OBJ_BLOB || type == OBJ_TAG);
    -+	hash = repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV);
    -+
    +-	strbuf_addstr(&desc, type_name(type));
    + 
      	if (type == OBJ_COMMIT) {
     +		struct strbuf ad = STRBUF_INIT;
     +		struct strbuf s = STRBUF_INIT;
    @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, voi
     +		 * object output. E.g. "deadbeef blob".
     +		 */
     +		strbuf_addf(&desc, _("%s blob"), hash);
    -+	} else {
    -+		BUG("unreachable");
      	}
      
    --	advise("  %s %s%s",
    ++
    + out:
    +-	advise("  %s %s",
     -	       repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV),
    --	       type_name(type), desc.buf);
    +-	       desc.buf);
     +	/*
    -+	 * TRANSLATORS: This is line item of ambiguous object output,
    -+	 * translated above.
    ++	 * TRANSLATORS: This is line item of ambiguous object output
    ++	 * from describe_ambiguous_object() above.
     +	 */
     +	advise(_("  %s"), desc.buf);
      
3:  9d24bab635d ! 4:  36b6b440c37 object-name: show date for ambiguous tag objects
    @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, voi
      
      		/*
      		 * TRANSLATORS: This is a line of
    -@@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, void *data)
    + 		 * ambiguous tag object output. E.g.:
    + 		 *
    +-		 *    "deadbeef tag Some Tag Message"
    ++		 *    "deadbeef tag 2021-01-01 - Some Tag Message"
    + 		 *
    + 		 * The second argument is the "tag" string from
      		 * object.c, it should (hopefully) already be
      		 * translated.
      		 */
-:  ----------- > 5:  8880c283559 object-name: iterate ambiguous objects before showing header
-:  ----------- > 6:  78bb0995f08 object-name: re-use "struct strbuf" in show_ambiguous_object()
-- 
2.34.1.838.g779e9098efb
Previous: Ævar Arnfjörð BjarmasonNext: Ævar Arnfjörð Bjarmason
Message 31 of 90 in “i18n: improve translatability of ambiguous object output”
  1. 0/2 i18n: improve translatability of ambiguous object outputÆvar Arnfjörð Bjarmason, Oct 4, 2021
  2. 1/2 object-name tests: tighten up advise() output testÆvar Arnfjörð Bjarmason, Oct 4, 2021
  3. Eric SunshineOct 4, 2021
  4. Jeff KingOct 4, 2021
  5. 2/2 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Oct 4, 2021
  6. Jeff KingOct 4, 2021
  7. Ævar Arnfjörð BjarmasonOct 4, 2021
  8. Jeff KingOct 4, 2021
  9. Ævar Arnfjörð BjarmasonOct 4, 2021
  10. Jeff KingOct 4, 2021
  11. 0/2 i18n: improve translatability of ambiguous object outputÆvar Arnfjörð Bjarmason, Oct 4, 2021
  12. 1/2 object.[ch]: mark object type names for translationÆvar Arnfjörð Bjarmason, Oct 4, 2021
  13. Eric SunshineOct 4, 2021
  14. Bagas SanjayaOct 5, 2021
  15. Ævar Arnfjörð BjarmasonOct 5, 2021
  16. Jeff KingOct 6, 2021
  17. Junio C HamanoOct 6, 2021
  18. Jeff KingOct 6, 2021
  19. Junio C HamanoOct 7, 2021
  20. 2/2 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Oct 4, 2021
  21. Jeff KingOct 6, 2021
  22. 0/3 i18n: improve translatability of ambiguous object outputÆvar Arnfjörð Bjarmason, Oct 8, 2021
  23. 1/3 object-name: remove unreachable "unknown type" handlingÆvar Arnfjörð Bjarmason, Oct 8, 2021
  24. 2/3 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Oct 8, 2021
  25. 3/3 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Oct 8, 2021
  26. 0/3 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Nov 22, 2021
  27. 3/3 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Nov 22, 2021
  28. 1/3 object-name: remove unreachable "unknown type" handlingÆvar Arnfjörð Bjarmason, Nov 22, 2021
  29. Jeff KingNov 22, 2021
  30. 2/3 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Nov 22, 2021
  31. 0/6 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Nov 25, 2021
  32. 1/6 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Nov 25, 2021
  33. Josh SteadmonDec 23, 2021
  34. 2/6 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Nov 25, 2021
  35. Josh SteadmonDec 23, 2021
  36. Junio C HamanoDec 23, 2021
  37. 3/6 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Nov 25, 2021
  38. fixup! object-name: make ambiguous object output translatableJosh Steadmon, Dec 23, 2021
  39. Junio C HamanoDec 23, 2021
  40. 4/6 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Nov 25, 2021
  41. 5/6 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Nov 25, 2021
  42. 6/6 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Nov 25, 2021
  43. 0/6 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Dec 28, 2021
  44. 1/6 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Dec 28, 2021
  45. Junio C HamanoDec 30, 2021
  46. 3/6 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Dec 28, 2021
  47. Junio C HamanoDec 30, 2021
  48. 2/6 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Dec 28, 2021
  49. 4/6 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Dec 28, 2021
  50. Junio C HamanoDec 30, 2021
  51. 5/6 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Dec 28, 2021
  52. 6/6 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Dec 28, 2021
  53. 0/7 progress: test fixes / cleanupÆvar Arnfjörð Bjarmason, Dec 28, 2021
  54. 1/7 leak tests: fix a memory leak in "test-progress" helperÆvar Arnfjörð Bjarmason, Dec 28, 2021
  55. 2/7 progress.c test helper: add missing bracesÆvar Arnfjörð Bjarmason, Dec 28, 2021
  56. 3/7 progress.c tests: make start/stop commands on stdinÆvar Arnfjörð Bjarmason, Dec 28, 2021
  57. Johannes AltmanningerDec 28, 2021
  58. 4/7 progress.c tests: test some invalid usageÆvar Arnfjörð Bjarmason, Dec 28, 2021
  59. Johannes AltmanningerDec 28, 2021
  60. 6/7 pack-bitmap-write.c: don't return without stop_progress()Ævar Arnfjörð Bjarmason, Dec 28, 2021
  61. 5/7 progress.c: add temporary variable from progress structÆvar Arnfjörð Bjarmason, Dec 28, 2021
  62. René ScharfeDec 28, 2021
  63. Johannes AltmanningerDec 28, 2021
  64. 7/7 *.c: use isatty(0|2), not isatty(STDIN_FILENO|STDERR_FILENO)Ævar Arnfjörð Bjarmason, Dec 28, 2021
  65. René ScharfeDec 28, 2021
  66. Ævar Arnfjörð BjarmasonDec 28, 2021
  67. Junio C HamanoJan 8, 2022
  68. 0/6 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Jan 12, 2022
  69. 1/6 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Jan 12, 2022
  70. Junio C HamanoJan 13, 2022
  71. Ævar Arnfjörð BjarmasonJan 14, 2022
  72. Junio C HamanoJan 14, 2022
  73. 2/6 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 12, 2022
  74. 3/6 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Jan 12, 2022
  75. 4/6 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Jan 12, 2022
  76. Junio C HamanoJan 13, 2022
  77. Ævar Arnfjörð BjarmasonJan 14, 2022
  78. Junio C HamanoJan 14, 2022
  79. Ævar Arnfjörð BjarmasonJan 14, 2022
  80. 5/6 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Jan 12, 2022
  81. 6/6 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 12, 2022
  82. 0/7 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Jan 27, 2022
  83. 1/7 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Jan 27, 2022
  84. 2/7 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 27, 2022
  85. 3/7 object-name: explicitly handle bad tags in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 27, 2022
  86. 4/7 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Jan 27, 2022
  87. 6/7 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Jan 27, 2022
  88. 5/7 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Jan 27, 2022
  89. 7/7 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 27, 2022
  90. Junio C HamanoJan 27, 2022

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.