From patchwork Mon Oct 4 14:27:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12534119 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9529CC433FE for ; Mon, 4 Oct 2021 14:27:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 617F361354 for ; Mon, 4 Oct 2021 14:27:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233799AbhJDO24 (ORCPT ); Mon, 4 Oct 2021 10:28:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48470 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233767AbhJDO2z (ORCPT ); Mon, 4 Oct 2021 10:28:55 -0400 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B4DFBC061746 for ; Mon, 4 Oct 2021 07:27:06 -0700 (PDT) Received: by mail-wm1-x32e.google.com with SMTP id g198-20020a1c20cf000000b0030d60cd7fd6so163724wmg.0 for ; Mon, 04 Oct 2021 07:27:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IgfTX8JdndOwx9UB8CihT9dHk1WDiMqiNSW8xaYOY5U=; b=kY7jy/SVyO5z4LtRx/TxWlqTSlIKM6q6iyRCKSgowIB/bocYjNZ7J/RINy0oiUmwSI 97vgK9IuDdU8eZ9+sur+jpWkrnGhjS/oMGUAzZgQBXHzNfCPpzozphMapZAWEM52MEZn K/7TyQwzxSUXPD2uwSyCciY706KFKNurmAU6nJx7+ExNmHrhtaCi4FbybGsgiNyC5Wl/ vzILm5OFd32d5sQKwqdwu/apTCQxRRMlr4c6UpcGJ+Cf7lI2SnQc//NFH+/PTg/FIhVB qb8aqIq90QqQfaqF3FHZbU/6gftOnqEp7/0DLgjJseK6Ap7p6VxhcfrY5TLEGxQHY2+9 pzBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IgfTX8JdndOwx9UB8CihT9dHk1WDiMqiNSW8xaYOY5U=; b=sycvNfa5/MmFiza3QLgb8FjFTtjoi07AgGeVm7F/lTeTrZMW+rdjN3zsxFDCFQDPo7 lbJ8sfsjB9zedNW587bQeB5Tj5HDgC1QOkxfxkGCGj1268vR/PyFvtiyJ/5SnzsJy6yq T8QPQ7bKSdGI8MKMfFHt28TU3mVp8Do1cLg+iDBW3M64c67kJwxZCCLLDpY1z3vtJieF ZynzZgPuHsdbalacx1D1CnheVaJ43q4FqQoapzqICcOcDnZBeXIDYM3q7l7T5vAmnHj4 8+M2oPU/RYh8gQUPnPnryg+HOXEnmAlmLhqjSlg4QdSYza6ykTyzlfv1MwNYVzJD+cPC RDlQ== X-Gm-Message-State: AOAM530AIqmNmxwd56JLe83RTpiwhjbs3JLG786JcDJde60P/PxgNL82 n6tKIrQlUAxsTRrF7s8sVFOU503MtsQE9Q== X-Google-Smtp-Source: ABdhPJxDhiz+aMlcXhQ3FIzJG4l9IKblLviniLzLKekLbymQiMPV5AlMJQnFBSSNi/wP6EI1QqrejQ== X-Received: by 2002:a05:600c:4f8d:: with SMTP id n13mr4243099wmq.89.1633357625039; Mon, 04 Oct 2021 07:27:05 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id f9sm17368315wmf.3.2021.10.04.07.27.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Oct 2021 07:27:04 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 1/2] object.[ch]: mark object type names for translation Date: Mon, 4 Oct 2021 16:27:01 +0200 Message-Id: X-Mailer: git-send-email 2.33.0.1409.ge73c1ecc5b4 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Mark the "commit", "tree", "blob" and "tag" types for translation, and add an extern "unknown type" string for the OBJ_NONE case. It is usually bad practice to translate individual words like this, but for e.g. the list list output emitted by the "short object ID dead is ambiguous" advice it makes sense. A subsequent commit will make that output translatable, and use these translation markings to do so. Well, we won't use "commit", but let's mark it up anyway for consistency. It'll probably come in handy sooner than later to have it already be translated, and it's to much of a burden to place on translators if they're translating the other three object types anyway. Aside: I think it would probably make sense to change the "NULL" entry for type_name() to be the "unknown type". I've ran into cases where type_name() was unconditionally interpolated in e.g. an sprintf() format, but let's leave that for #leftoverbits as that would be changing the behavior of the type_name() function. All of these will be new in the git.pot file, except "blob" which will be shared with a "cat-file" command-line option, see 7bcf3414535 (cat-file --textconv/--filters: allow specifying the path separately, 2016-09-09) for its introduction. Signed-off-by: Ævar Arnfjörð Bjarmason --- object.c | 27 +++++++++++++++++++++++---- object.h | 1 + 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/object.c b/object.c index 4e85955a941..47dbe0d8a2a 100644 --- a/object.c +++ b/object.c @@ -22,12 +22,31 @@ struct object *get_indexed_object(unsigned int idx) static const char *object_type_strings[] = { NULL, /* OBJ_NONE = 0 */ - "commit", /* OBJ_COMMIT = 1 */ - "tree", /* OBJ_TREE = 2 */ - "blob", /* OBJ_BLOB = 3 */ - "tag", /* OBJ_TAG = 4 */ + /* + * TRANSLATORS: "commit", "tree", "blob" and "tag" are the + * name of Git's object types. These names are interpolated + * stand-alone when doing so is unambiguous for translation + * and doesn't require extra context. E.g. as part of an + * already-translated string that needs to have a type name + * quoted verbatim, or the short description of a command-line + * option expecting a given type. + */ + N_("commit"), /* OBJ_COMMIT = 1 */ + N_("tree"), /* OBJ_TREE = 2 */ + N_("blob"), /* OBJ_BLOB = 3 */ + N_("tag"), /* OBJ_TAG = 4 */ }; +/* + * TRANSLATORS: This is the short type name of an object that's not + * one of Git's known object types, as opposed to "commit", "tree", + * "blob" and "tag" above. + * + * A user is unlikely to ever encounter these, but they can be + * manually created with "git hash-object --literally". + */ +const char *unknown_type = N_("unknown type"); + const char *type_name(unsigned int type) { if (type >= ARRAY_SIZE(object_type_strings)) diff --git a/object.h b/object.h index 549f2d256bc..0510dc4b3ea 100644 --- a/object.h +++ b/object.h @@ -91,6 +91,7 @@ struct object { struct object_id oid; }; +extern const char *unknown_type; const char *type_name(unsigned int type); int type_from_string_gently(const char *str, ssize_t, int gentle); #define type_from_string(str) type_from_string_gently(str, -1, 0) From patchwork Mon Oct 4 14:27:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12534121 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5E181C433EF for ; Mon, 4 Oct 2021 14:27:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4159C61264 for ; Mon, 4 Oct 2021 14:27:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233858AbhJDO3D (ORCPT ); Mon, 4 Oct 2021 10:29:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233767AbhJDO25 (ORCPT ); Mon, 4 Oct 2021 10:28:57 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E11EAC061745 for ; Mon, 4 Oct 2021 07:27:07 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id t8so31211486wri.1 for ; Mon, 04 Oct 2021 07:27:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7Wdq70nnke78EyJJaguHdsmnLN3TB+hJkcoKf9qRri4=; b=o7Y/WQ0M65V7xptZba2VkCY9VsCZKo6s02PwLqkJgfDgucjMwE72WcdTyMtbv+ddrA j54A07welLw2ql4wHk9VdCJ8WlBKGwodI3uMK3QFe1xLAJ+N4D90NfiVLYBEKEOst3I7 CfS17Q4pu8X9ImVo3G9cjBiZ43pDoOJ93uS9AvqLUbR8/+/mhFVGT4P3+/RzfHvu3evl nKpH0q78T49C+QltFqOWVSUPWCg2kWPylaDj+NYVs3fuIwoGkqqDhr0fIZTM0/k6Ha4T k2WOexJ/xCocqnnZm27VSlB0qCud7ZCP3SX9f6CmgVSHlkZMwzhrbClt4Rh4OGhjdZLx VanQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7Wdq70nnke78EyJJaguHdsmnLN3TB+hJkcoKf9qRri4=; b=30sl4ACLNKiQbiXbnkH4BzvJC/dZ8FXpTEXdCsv3g9Mkd4LY69VNpFDmUcVDHH3BF/ qlg+j1u0whoLgp27HNqUXMD3MVZzPvfS4jVi0bAjsi1kmGB5cuXE8HO7aExBdarzZtHx gkPhvcLHg38/Yvhak4IgtswMKM12cA38lYAPXOAxG9wKM8Jt5TPQ2Vs7/hd7i4bQzazs TruE8rvAYDLtc6ERN6HovQ6Z3ZD9DrtLsUKZjhQWddd//yZyehkC015qKyhhcASsFLlJ E+3bOAnf/wxzv9RfJuoIzS8iArXfOrMUBJw3saXqA7Pfv4D0XUkGeAbizskCd/btiX4S 1ncg== X-Gm-Message-State: AOAM532fhbafQznt/n/chcE0XWs9SARNIWPYTgy0kLWrgGm3S5KzJQhp jk2KNIsYmq2FLUTTazcIY73darorT8cduQ== X-Google-Smtp-Source: ABdhPJy5UMEU1CuO93cpxOu1a03cU/3pZ6TtF3baDMUQ0DoLqni2zBGNGTb/JdtU7Pi/fX407WFTSQ== X-Received: by 2002:a5d:6d81:: with SMTP id l1mr14806205wrs.404.1633357626070; Mon, 04 Oct 2021 07:27:06 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id f9sm17368315wmf.3.2021.10.04.07.27.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Oct 2021 07:27:05 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 2/2] object-name: make ambiguous object output translatable Date: Mon, 4 Oct 2021 16:27:02 +0200 Message-Id: X-Mailer: git-send-email 2.33.0.1409.ge73c1ecc5b4 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org 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". 1. 1ffa26c461 (get_short_sha1: list ambiguous objects on error, 2016-09-26) 2. 5cc044e0257 (get_short_oid: sort ambiguous objects by type, then SHA-1, 2018-05-10) Signed-off-by: Ævar Arnfjörð Bjarmason --- object-name.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/object-name.c b/object-name.c index fdff4601b2c..73c946f1117 100644 --- a/object-name.c +++ b/object-name.c @@ -355,7 +355,11 @@ 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; if (ds->fn && !ds->fn(ds->repo, oid, ds->cb_data)) return 0; @@ -366,20 +370,76 @@ static int show_ambiguous_object(const struct object_id *oid, void *data) 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); } } 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) { + /* + * TRANSLATORS: This is a line of + * ambiguous tag object output. E.g.: + * + * "deadbeef tag Some Tag Message" + * + * The second argument is the "tag" string from + * 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); + /* + * TRANSLATORS: This is a line of ambiguous + * object output. Where 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. + */ + strbuf_addf(&desc, _("%s %s"), abbrev, tname); + } + + /* + * TRANSLATORS: This is line item of ambiguous object output, + * translated above. + */ + advise(_(" %s\n"), desc.buf); strbuf_release(&desc); + strbuf_release(&ci_ad); + strbuf_release(&ci_s); return 0; }