Since v2 the "commit", "tag" etc. types in object.c are no longer marked for translation. There's a new 1/3 where we lead with an assert() and commit message showing that the existing "unknown type" code is gone, which makes what comes after simpler. In 2/3 we no longer have to deal with special-cases related to corrupt or otherwise bad objects, which makes for less work for translators. In 3/3 I added the tag date to ambiguous tag objects, which is now consistent with how commit objects are shown. Ævar Arnfjörð Bjarmason (3): object-name: remove unreachable "unknown type" handling object-name: make ambiguous object output translatable object-name: show date for ambiguous tag objects object-name.c | 68 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 7 deletions(-) Range-diff against v2: 1: 55bde16aa23 < -: ----------- object.[ch]: mark object type names for translation -: ----------- > 1: fb29e10ee35 object-name: remove unreachable "unknown type" handling 2: c0e873543f5 ! 2: 587a5717e47 object-name: make ambiguous object output translatable @@ Commit message object-name: make ambiguous object output translatable Change the output of show_ambiguous_object() added in [1] and last - tweaked in [2] to be more friendly to translators. By being able to - customize the sprintf formats we're even ready for RTL languages. - - The "unknown type" message here is unreachable, and has been since - [1], i.e. that code has never worked. If we craft an object of a bogus - type with a conflicting prefix we'll just die: - - $ git rev-parse 8315 - error: short object ID 8315 is ambiguous - hint: The candidates are: - fatal: invalid object type - - But let's continue to pretend that this works, we can eventually use - the API improvements in my ab/fsck-unexpected-type (once it lands) to - inspect these objects and emit the actual type here, or at least not - die as we emit "unknown type". + tweaked in [2] and the preceding commit to be more friendly to + translators. By being able to customize the "<SP><SP>%s\n" format + we're even ready for RTL languages, who'd presumably like to change + that to "%s<SP><SP>\n". 1. 1ffa26c461 (get_short_sha1: list ambiguous objects on error, 2016-09-26) @@ Commit message ## object-name.c ## @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, void *data) - { const struct disambiguate_state *ds = data; struct strbuf desc = STRBUF_INIT; -+ struct strbuf ci_ad = STRBUF_INIT; -+ struct strbuf ci_s = STRBUF_INIT; int type; -+ const char *tag_desc = NULL; -+ const char *abbrev; ++ const char *hash; 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) + type = oid_object_info(ds->repo, oid, NULL); + assert(type == OBJ_TREE || type == OBJ_COMMIT || + type == OBJ_BLOB || type == OBJ_TAG); ++ hash = repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV); ++ + if (type == OBJ_COMMIT) { ++ struct strbuf ad = STRBUF_INIT; ++ struct strbuf s = STRBUF_INIT; + struct commit *commit = lookup_commit(ds->repo, oid); ++ if (commit) { struct pretty_print_context pp = {0}; pp.date_mode.type = DATE_SHORT; - format_commit_message(commit, " %ad - %s", &desc, &pp); -+ format_commit_message(commit, "%ad", &ci_ad, &pp); -+ format_commit_message(commit, "%s", &ci_s, &pp); ++ format_commit_message(commit, "%ad", &ad, &pp); ++ format_commit_message(commit, "%s", &s, &pp); } - } else if (type == OBJ_TAG) { - struct tag *tag = lookup_tag(ds->repo, oid); - if (!parse_tag(tag) && tag->tag) -- strbuf_addf(&desc, " %s", tag->tag); -+ tag_desc = tag->tag; - } - -- advise(" %s %s%s", -- repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV), -- type_name(type) ? type_name(type) : "unknown type", -- desc.buf); -+ abbrev = repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV); -+ if (type == OBJ_COMMIT) { ++ + /* + * TRANSLATORS: This is a line of ambiguous commit + * object output. E.g.: + * + * "deadbeef commit 2021-01-01 - Some Commit Message" -+ * -+ * The second argument is the "commit" string from -+ * object.c, it should (hopefully) already be -+ * translated. + */ -+ strbuf_addf(&desc, _("%s %s %s - %s"), abbrev, ci_ad.buf, -+ _(type_name(type)), ci_s.buf); -+ } else if (tag_desc) { ++ strbuf_addf(&desc, _("%s commit %s - %s"), hash, ad.buf, s.buf); ++ ++ strbuf_release(&ad); ++ strbuf_release(&s); + } else if (type == OBJ_TAG) { + struct tag *tag = lookup_tag(ds->repo, oid); ++ const char *tag_tag = ""; ++ + if (!parse_tag(tag) && tag->tag) +- strbuf_addf(&desc, " %s", tag->tag); ++ tag_tag = tag->tag; ++ + /* + * TRANSLATORS: This is a line of + * ambiguous tag object output. E.g.: @@ object-name.c: static int show_ambiguous_object(const struct object_id *oid, voi + * object.c, it should (hopefully) already be + * translated. + */ -+ strbuf_addf(&desc, _("%s %s %s"), abbrev, _(type_name(type)), -+ tag_desc); -+ } else { -+ const char *tname = type_name(type) ? _(type_name(type)) : -+ _(unknown_type); ++ strbuf_addf(&desc, _("%s tag %s"), hash, tag_tag); ++ } else if (type == OBJ_TREE) { + /* + * TRANSLATORS: This is a line of ambiguous <type> -+ * object output. Where <type> is one of the object -+ * types of "tree", "blob", "tag" ("commit" is handled -+ * above). -+ * -+ * "deadbeef tree" -+ * "deadbeef blob" -+ * "deadbeef tag" -+ * "deadbeef unknown type" -+ * -+ * Note that annotated tags use a separate format -+ * outlined above. -+ * -+ * The second argument is the "tree", "blob" or "tag" -+ * string from object.c, or the "unknown type" string -+ * in the case of an unknown type. All of them should -+ * (hopefully) already be translated. ++ * object output. E.g. "deadbeef tree". + */ -+ strbuf_addf(&desc, _("%s %s"), abbrev, tname); -+ } -+ ++ strbuf_addf(&desc, _("%s tree"), hash); ++ } else if (type == OBJ_BLOB) { ++ /* ++ * TRANSLATORS: This is a line of ambiguous <type> ++ * object output. E.g. "deadbeef blob". ++ */ ++ strbuf_addf(&desc, _("%s blob"), hash); ++ } else { ++ BUG("unreachable"); + } + +- advise(" %s %s%s", +- repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV), +- type_name(type), desc.buf); + /* + * TRANSLATORS: This is line item of ambiguous object output, + * translated above. + */ -+ advise(_(" %s\n"), desc.buf); ++ advise(_(" %s"), desc.buf); strbuf_release(&desc); -+ strbuf_release(&ci_ad); -+ strbuf_release(&ci_s); return 0; - } - -: ----------- > 3: 8bde4e174b7 object-name: show date for ambiguous tag objects -- 2.33.0.1492.g76eb1af92bc