From patchwork Tue Aug 20 00:07:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Keller, Jacob E" X-Patchwork-Id: 13769204 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 27D11367 for ; Tue, 20 Aug 2024 00:08:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724112482; cv=none; b=PybkWQo7Q27AWj9ZAPMIX4gJG0b3bxkZ7PttQulYsFC4vuOOLr1B2wT95jsrfis4Gug1USXYODRjG5I1J0kdlKbCoImhW/Pf3w97IgFx/u/TbwUoIxrSnIU34qdF9QhHfJaojP2MnM3DkZTV7u7BQf6micwcVsQu6l3a9KuPLJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724112482; c=relaxed/simple; bh=50jwgXRfAAgBkMdp8J4DtSDva/02mNtPontO33OOLv4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=okq9As0UKMfqEowbqoSh2aa2LFJstYpCqFUYa0Lvg4isQ1Lj07arrBxgg78ardplVJ4IsLd0bPoVM3ivQvKA+Z2orI8J3U/D/p1qdRaTsMqaXO5/ENcANWnMLom5pkGVi1jOcXUGgVYTpBo1hiX7kT63oBkwn4pNt49XGq+DDy0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=jL2In7p7; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="jL2In7p7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724112481; x=1755648481; h=from:date:subject:mime-version:content-transfer-encoding: message-id:references:in-reply-to:to; bh=50jwgXRfAAgBkMdp8J4DtSDva/02mNtPontO33OOLv4=; b=jL2In7p7BprJf6S+sHRheY7yR6mfib3cJK8IXhX75rBaHDDbKlBkirHZ 4yX81jl8Bc2qkYLZmWHxwCsEUU93JU9jYqVZsMXQtKW7yXfwYsi2biT4B +AZytgcxPLYWACFXngaHZhQKL9bzlVWFnnCO73ajVvW7wbCj5aa2w3Fml /laRVABW1dY2cnSk4tSKWjmip+7O2crfqW2VxjphAMNYGI6esmnSGHVI4 /RvSTgukzIjR0Q1/q2HubLD7s+7J5T498tCFobLRautE+4uHRLSGNRlaY EtElSFXtomIt1BHj3wIjIwAhpxMB3hASSgDx9AlNm4+W8INlUxg0+bESC Q==; X-CSE-ConnectionGUID: R2nWWp7rSKGx+PEwfA5nkQ== X-CSE-MsgGUID: lgfNrAQKRfqu2xuo1cXONQ== X-IronPort-AV: E=McAfee;i="6700,10204,11169"; a="33542529" X-IronPort-AV: E=Sophos;i="6.10,160,1719903600"; d="scan'208";a="33542529" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 17:07:58 -0700 X-CSE-ConnectionGUID: zXWzhyadRhGy8/2dbju2Iw== X-CSE-MsgGUID: EoPrhYsMQIu3khLdBxIG/w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,160,1719903600"; d="scan'208";a="91277718" Received: from unknown (HELO localhost.localdomain) ([10.166.241.20]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 17:07:59 -0700 From: Jacob Keller Date: Mon, 19 Aug 2024 17:07:49 -0700 Subject: [PATCH v2 1/3] check-mailmap: accept "user@host" contacts Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240819-jk-send-email-mailmap-support-v2-1-d212c3f9e505@gmail.com> References: <20240819-jk-send-email-mailmap-support-v2-0-d212c3f9e505@gmail.com> In-Reply-To: <20240819-jk-send-email-mailmap-support-v2-0-d212c3f9e505@gmail.com> To: Josh Steadmon , Eric Sunshine , Jeff King , git@vger.kernel.org, Junio C Hamano X-Mailer: b4 0.14.0 From: Jacob Keller git check-mailmap splits each provided contact using split_ident_line. This function requires that the contact either be of the form "Name " or of the form "". In particular, if the mail portion of the contact is not surrounded by angle brackets, split_ident_line will reject it. This results in git check-mailmap rejecting attempts to translate simple email addresses: $ git check-mailmap user@host fatal: unable to parse contact: user@host This limits the usability of check-mailmap as it requires placing angle brackets around plain email addresses. In particular, attempting to use git check-mailmap to support mapping addresses in git send-email is not straight forward. The sanitization and validation functions in git send-email strip angle brackets from plain email addresses. It is not trivial to add brackets prior to invoking git check-mailmap. Instead, modify check_mailmap() to allow such strings as contacts. In particular, treat any line which cannot be split by split_ident_line as a simple email address. No attempt is made to actually parse the address line to validate that it is actually an address. Doing so is non-trivial, and provides little value. Either the provided input will correctly map via the map_user call, or it will fail and be printed out, surrounded by angle brackets: $ git check-mailmap user@host Signed-off-by: Jacob Keller --- builtin/check-mailmap.c | 18 +++++++++++------- Documentation/git-check-mailmap.txt | 8 ++++---- t/t4203-mailmap.sh | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c index b8a05b8e07b5..6b7fb53494f0 100644 --- a/builtin/check-mailmap.c +++ b/builtin/check-mailmap.c @@ -25,13 +25,17 @@ static void check_mailmap(struct string_list *mailmap, const char *contact) size_t namelen, maillen; struct ident_split ident; - if (split_ident_line(&ident, contact, strlen(contact))) - die(_("unable to parse contact: %s"), contact); - - name = ident.name_begin; - namelen = ident.name_end - ident.name_begin; - mail = ident.mail_begin; - maillen = ident.mail_end - ident.mail_begin; + if (!split_ident_line(&ident, contact, strlen(contact))) { + name = ident.name_begin; + namelen = ident.name_end - ident.name_begin; + mail = ident.mail_begin; + maillen = ident.mail_end - ident.mail_begin; + } else { + name = NULL; + namelen = 0; + mail = contact; + maillen = strlen(contact); + } map_user(mailmap, &mail, &maillen, &name, &namelen); diff --git a/Documentation/git-check-mailmap.txt b/Documentation/git-check-mailmap.txt index 02f441832321..7747e38e25e3 100644 --- a/Documentation/git-check-mailmap.txt +++ b/Documentation/git-check-mailmap.txt @@ -15,10 +15,10 @@ SYNOPSIS DESCRIPTION ----------- -For each ``Name $$$$'' or ``$$$$'' from the command-line -or standard input (when using `--stdin`), look up the person's canonical name -and email address (see "Mapping Authors" below). If found, print them; -otherwise print the input as-is. +For each ``Name $$$$'', ``$$$$'', or ``$$user@host$$'' +from the command-line or standard input (when using `--stdin`), look up the +person's canonical name and email address (see "Mapping Authors" below). If +found, print them; otherwise print the input as-is. OPTIONS diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh index 79e5f42760d9..0c1efe0b2e17 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -73,11 +73,40 @@ test_expect_success 'check-mailmap --stdin arguments: mapping' ' ' test_expect_success 'check-mailmap bogus contact' ' - test_must_fail git check-mailmap bogus + cat >expect <<-EOF && + + EOF + git check-mailmap bogus >actual && + test_cmp expect actual ' test_expect_success 'check-mailmap bogus contact --stdin' ' - test_must_fail git check-mailmap --stdin bogus expect <<-EOF && + + EOF + cat >stdin <<-EOF && + bogus + EOF + git check-mailmap --stdin actual && + test_cmp expect actual +' + +test_expect_success 'check-mailmap simple address: mapping' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + New Name <$GIT_AUTHOR_EMAIL> + EOF + cat .mailmap >expect && + git check-mailmap "$GIT_AUTHOR_EMAIL" >actual && + test_cmp expect actual +' + +test_expect_success 'check-mailmap simple address: no mapping' ' + cat >expect <<-EOF && + + EOF + git check-mailmap "bugs@company.xx" >actual && + test_cmp expect actual ' test_expect_success 'No mailmap' ' From patchwork Tue Aug 20 00:07:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Keller, Jacob E" X-Patchwork-Id: 13769205 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 881B5211C for ; Tue, 20 Aug 2024 00:08:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724112483; cv=none; b=bXSvK1TimvL/D7YMlpnb20QK68+2tanqOdscl6BTe+ib3qC4ITjplXaIRtRCoKxPaaFdefU1w3f280YiSmcHFcLH8oM8HzD8ltC2HuEdKKeoQY1XAq9gQxJZQrCX1wKEg3oIPGlJxu1FU0F2z8UT1lSbVJfZ0uWtOIy3nQB9dyY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724112483; c=relaxed/simple; bh=bMngD6mwgNiHh3gcgvWsjnzy6KE+sKQ6Uq1sVDBAZQ0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=V/eRbpthQyYijz2dlJKiwtsdx8ZfMUHywqzUWQcDXc3cmjKv2iQ4UNIrUM3t37FhLdzdk5zQwglUqG56DBbXuZGYXLk5AOuuJlUiftmVaGOBe0jMPk30iyU9sewxwO7h+LdYWxngMlx2LPsAgjzXaqKZZiZyhtVU6nZrOMFDH4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=X6vYYWhT; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="X6vYYWhT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724112481; x=1755648481; h=from:date:subject:mime-version:content-transfer-encoding: message-id:references:in-reply-to:to; bh=bMngD6mwgNiHh3gcgvWsjnzy6KE+sKQ6Uq1sVDBAZQ0=; b=X6vYYWhTgwO96ILgUSX/48726agI2JRyZKrzSuITD4WoXcb2TMDkP8ln fT0fBUwJuQG5RzrmdlxhcRQqFp+9K1RaPGldzen3q1gTWo8GyQ6OMyKo6 yQD2GegNwttAO7RMyi77ts1NIBin18SdBpLI/KzonTSSz/CA2nny1zktj o0+XtKWLTM8dlC+P24Ju3eWHFducFXv0Y2zaE3In2Q0uALNLpHWC2ilGG 3XAmFjkTGynUBKau8LD7+CambhYmTngti5rkcb/+u/iHn5fViNHD9sXMd U+33c/x0XFxV6oEBvxF7tUVavl/gF/CeoiZ0gs+A+D7yTHdDPmbz7LyAQ g==; X-CSE-ConnectionGUID: PAyTgAsSQkaRj7cK037e+w== X-CSE-MsgGUID: KxeMkumoTNGK6q0B8rMhzg== X-IronPort-AV: E=McAfee;i="6700,10204,11169"; a="33542534" X-IronPort-AV: E=Sophos;i="6.10,160,1719903600"; d="scan'208";a="33542534" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 17:07:58 -0700 X-CSE-ConnectionGUID: pe1veYWjSCOWJWOHZzhTWw== X-CSE-MsgGUID: 5g4Ke84LRMWedRm+oqfljw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,160,1719903600"; d="scan'208";a="91277719" Received: from unknown (HELO localhost.localdomain) ([10.166.241.20]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 17:07:59 -0700 From: Jacob Keller Date: Mon, 19 Aug 2024 17:07:50 -0700 Subject: [PATCH 1 v2 2/3] check-mailmap: add options for additional mailmap sources Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240819-jk-send-email-mailmap-support-v2-2-d212c3f9e505@gmail.com> References: <20240819-jk-send-email-mailmap-support-v2-0-d212c3f9e505@gmail.com> In-Reply-To: <20240819-jk-send-email-mailmap-support-v2-0-d212c3f9e505@gmail.com> To: Josh Steadmon , Eric Sunshine , Jeff King , git@vger.kernel.org, Junio C Hamano X-Mailer: b4 0.14.0 From: Jacob Keller The git check-mailmap command reads the mailmap from either the default .mailmap location and then from the mailmap.blob and mailmap.file configurations. A following change to git send-email will want to support new configuration options based on the configured identity. The identity-based configuration and options only make sense in the context of git send-email. Expose the read_mailmap_file and read_mailmap_blob functions from mailmap.c. Teach git check-mailmap the --mailmap-file and --mailmap-blob options which load the additional mailmap sources. Signed-off-by: Jacob Keller --- mailmap.h | 7 +++++++ builtin/check-mailmap.c | 7 +++++++ mailmap.c | 9 +++------ Documentation/git-check-mailmap.txt | 10 ++++++++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/mailmap.h b/mailmap.h index cbda9bc5e0c1..908365e1bffa 100644 --- a/mailmap.h +++ b/mailmap.h @@ -6,6 +6,13 @@ struct string_list; extern char *git_mailmap_file; extern char *git_mailmap_blob; +/* Flags for read_mailmap_file() */ +#define MAILMAP_NOFOLLOW (1<<0) + +int read_mailmap_file(struct string_list *map, const char *filename, + unsigned flags); +int read_mailmap_blob(struct string_list *map, const char *name); + int read_mailmap(struct string_list *map); void clear_mailmap(struct string_list *map); diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c index 6b7fb53494f0..2334b5722275 100644 --- a/builtin/check-mailmap.c +++ b/builtin/check-mailmap.c @@ -9,6 +9,7 @@ #include "write-or-die.h" static int use_stdin; +static const char *mailmap_file, *mailmap_blob; static const char * const check_mailmap_usage[] = { N_("git check-mailmap [] ..."), NULL @@ -16,6 +17,8 @@ NULL static const struct option check_mailmap_options[] = { OPT_BOOL(0, "stdin", &use_stdin, N_("also read contacts from stdin")), + OPT_FILENAME(0, "mailmap-file", &mailmap_file, N_("read additional mailmap entries from file")), + OPT_STRING(0, "mailmap-blob", &mailmap_blob, N_("blob"), N_("read additional mailmap entries from blob")), OPT_END() }; @@ -56,6 +59,10 @@ int cmd_check_mailmap(int argc, const char **argv, const char *prefix) die(_("no contacts specified")); read_mailmap(&mailmap); + if (mailmap_blob) + read_mailmap_blob(&mailmap, mailmap_blob); + if (mailmap_file) + read_mailmap_file(&mailmap, mailmap_file, 0); for (i = 0; i < argc; ++i) check_mailmap(&mailmap, argv[i]); diff --git a/mailmap.c b/mailmap.c index 2acf97f30760..9f9fa3199a85 100644 --- a/mailmap.c +++ b/mailmap.c @@ -142,11 +142,8 @@ static void read_mailmap_line(struct string_list *map, char *buffer) add_mapping(map, name1, email1, name2, email2); } -/* Flags for read_mailmap_file() */ -#define MAILMAP_NOFOLLOW (1<<0) - -static int read_mailmap_file(struct string_list *map, const char *filename, - unsigned flags) +int read_mailmap_file(struct string_list *map, const char *filename, + unsigned flags) { char buffer[1024]; FILE *f; @@ -186,7 +183,7 @@ static void read_mailmap_string(struct string_list *map, char *buf) } } -static int read_mailmap_blob(struct string_list *map, const char *name) +int read_mailmap_blob(struct string_list *map, const char *name) { struct object_id oid; char *buf; diff --git a/Documentation/git-check-mailmap.txt b/Documentation/git-check-mailmap.txt index 7747e38e25e3..966c91c46af7 100644 --- a/Documentation/git-check-mailmap.txt +++ b/Documentation/git-check-mailmap.txt @@ -27,6 +27,16 @@ OPTIONS Read contacts, one per line, from the standard input after exhausting contacts provided on the command-line. +--mailmap-file=:: + In addition to any configured mailmap files, read the specified + mailmap file. Entries in this file take precedence over entries in + either the default mailmap file or any configured mailmap file. + +--mailmap-blob=:: + Like `--mailmap-file`, but consider the value as a reference to a + blob in the repository. If both `--mailmap-file` and + `--mailmap-blob` are specified, entries in `--mailmap-file` will + take precedence. OUTPUT ------ From patchwork Tue Aug 20 00:07:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Keller, Jacob E" X-Patchwork-Id: 13769206 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF7FE256D for ; Tue, 20 Aug 2024 00:08:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724112484; cv=none; b=JfS1+9lS4v+tfG7B8FhVXJL8E607Wl0ADVgO0gusKZ1FKKqgkO3xtEFAGMNkgWK0MwbcssAgR6yVVuBc7TGoZNTtmfWrRyw1FKd3XSDNVnaepEQWIl+NiY1XG+6jro/XSQe9Y2k9Otd6HkS10x4mtKenAi8lgCVj8haO39MSrNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724112484; c=relaxed/simple; bh=R9iWmJ0X1ApjTVgxpL2yib0dM5JnDS/DDko2IU6DZgM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=ScZhJrwp+rBfFIELhoEiquJkSAUTTAdepZyKKqnO8UKZ5EeNBS8jzE+cj/BpcDHHP9XedP5iczhw25/AVoWPnU2nv8K0F3GyOo6HEU5GcQ9P4GSVuTgGFHvZBoTgfRTj2CZ20NcmXP59kkaIO/C1oSd82pvFzv1cQZs3dYy4f6w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Je9582dR; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Je9582dR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724112483; x=1755648483; h=from:date:subject:mime-version:content-transfer-encoding: message-id:references:in-reply-to:to; bh=R9iWmJ0X1ApjTVgxpL2yib0dM5JnDS/DDko2IU6DZgM=; b=Je9582dR3vm2O9HkMglPW6bUkBKeY9IB03ixO5pu3AbWXFpXX/gklWe2 T/CO5ykhCtsu8YPnYkKPhFZ1dtOzd/JAZRwQy0jLnE8K7rto3xZ5pjmgB Sg4Mqvr1xkJ0wUMMen9FOeA7JLQcFrt9aeVVLGiM4taJMVHRtcoEcJvFg eEPvcMfE9qGqXlCU12sZvoZSvE6Xq1Fbl8Nm3QwZyqCqs2JiyfEJiLir6 JqXY1HMtyq/GMvsVoQJdVfBfCVRtY+xJR4XOxj471Xeu8jSAcCNVffwpc 4eWcn4o8ji5M7SBAmaGTawIXXUVZdLsDvYfOhxuMPRdbdyXzmD/tKXUtR A==; X-CSE-ConnectionGUID: xg0LsX3RSGumK6O5ai3qyA== X-CSE-MsgGUID: lRBRRVXmQ+6JBabbfj6zQQ== X-IronPort-AV: E=McAfee;i="6700,10204,11169"; a="33542539" X-IronPort-AV: E=Sophos;i="6.10,160,1719903600"; d="scan'208";a="33542539" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 17:07:59 -0700 X-CSE-ConnectionGUID: f/ShnT4eQZuXlujRH/SprQ== X-CSE-MsgGUID: uZCqBV3WRTiGk7UO1GrJHQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,160,1719903600"; d="scan'208";a="91277720" Received: from unknown (HELO localhost.localdomain) ([10.166.241.20]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 17:07:59 -0700 From: Jacob Keller Date: Mon, 19 Aug 2024 17:07:51 -0700 Subject: [PATCH v2 3/3] send-email: add mailmap support via sendemail.mailmap and --mailmap Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240819-jk-send-email-mailmap-support-v2-3-d212c3f9e505@gmail.com> References: <20240819-jk-send-email-mailmap-support-v2-0-d212c3f9e505@gmail.com> In-Reply-To: <20240819-jk-send-email-mailmap-support-v2-0-d212c3f9e505@gmail.com> To: Josh Steadmon , Eric Sunshine , Jeff King , git@vger.kernel.org, Junio C Hamano X-Mailer: b4 0.14.0 From: Jacob Keller In some cases, a user may be generating a patch for an old commit which now has an out-of-date author or other identity. For example, consider a team member who contributes to an internal fork of an upstream project, but leaves before this change is submitted upstream. In this case, the team members company address may no longer be valid, and will thus bounce when sending email. This can be manually avoided by editing the generated patch files, or by carefully using --suppress- options. This requires a lot of manual intervention and is easy to forget. Git has support for mapping old email addresses and names to a canonical name and address via the .mailmap file (and its associated mailmap.file, mailmap.blob, and log.mailmap options). Teach git send-email to enable mailmap support for all addresses. This ensures that addresses point to the canonical real name and email address. Add the sendemail.mailmap configuration option and its associated --mailmap (and --use-mailmap for compatibility with git log) options. For now, the default behavior is to disable the mailmap in order to avoid any surprises or breaking any existing setups. These options support per-identity configuration via the sendemail.identity configuration blocks. This enables identity-specific configuration in cases where users may not want to enable support. In addition, support send-email specific mailmap data via sendemail.mailmap.file, sendemail.mailmap.blob and their identity-specific variants. The intention of these options is to enable mapping addresses which are no longer valid to a current project or team maintainer. Such mappings may change the actual person being referred to, and may not make sense in a traditional mailmap file which is intended for updating canonical name and address for the same individual. Signed-off-by: Jacob Keller --- git-send-email.perl | 20 +++++++++ t/t9001-send-email.sh | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) diff --git a/git-send-email.perl b/git-send-email.perl index 72044e5ef3a8..8995d5f12d9e 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -46,6 +46,8 @@ sub usage { --compose-encoding * Encoding to assume for introduction. --8bit-encoding * Encoding to assume 8bit mails if undeclared --transfer-encoding * Transfer encoding to use (quoted-printable, 8bit, base64) + --[no-]mailmap * Use mailmap file to map all email addresses to canonical + real names and email addresses. Sending: --envelope-sender * Email envelope sender. @@ -272,12 +274,14 @@ sub do_edit { my ($auto_8bit_encoding); my ($compose_encoding); my ($sendmail_cmd); +my ($mailmap_file, $mailmap_blob); # Variables with corresponding config settings & hardcoded defaults my ($debug_net_smtp) = 0; # Net::SMTP, see send_message() my $thread = 1; my $chain_reply_to = 0; my $use_xmailer = 1; my $validate = 1; +my $mailmap = 0; my $target_xfer_encoding = 'auto'; my $forbid_sendmail_variables = 1; @@ -294,6 +298,7 @@ sub do_edit { "annotate" => \$annotate, "xmailer" => \$use_xmailer, "forbidsendmailvariables" => \$forbid_sendmail_variables, + "mailmap" => \$mailmap, ); my %config_settings = ( @@ -327,6 +332,8 @@ sub do_edit { my %config_path_settings = ( "aliasesfile" => \@alias_files, "smtpsslcertpath" => \$smtp_ssl_cert_path, + "mailmap.file" => \$mailmap_file, + "mailmap.blob" => \$mailmap_blob, ); # Handle Uncouth Termination @@ -524,6 +531,8 @@ sub config_regexp { "thread!" => \$thread, "validate!" => \$validate, "transfer-encoding=s" => \$target_xfer_encoding, + "mailmap!" => \$mailmap, + "use-mailmap!" => \$mailmap, "format-patch!" => \$format_patch, "8bit-encoding=s" => \$auto_8bit_encoding, "compose-encoding=s" => \$compose_encoding, @@ -1085,6 +1094,16 @@ sub expand_one_alias { our ($message_id, %mail, $subject, $in_reply_to, $references, $message, $needs_confirm, $message_num, $ask_default); +sub mailmap_address_list { + return @_ unless @_ and $mailmap; + my @options = (); + push(@options, "--mailmap-file=$mailmap_file") if $mailmap_file; + push(@options, "--mailmap-blob=$mailmap_blob") if $mailmap_blob; + my @addr_list = Git::command('check-mailmap', @options, @_); + s/^<(.*)>$/$1/ for @addr_list; + return @addr_list; +} + sub extract_valid_address { my $address = shift; my $local_part_regexp = qr/[^<>"\s@]+/; @@ -1294,6 +1313,7 @@ sub process_address_list { @addr_list = expand_aliases(@addr_list); @addr_list = sanitize_address_list(@addr_list); @addr_list = validate_address_list(@addr_list); + @addr_list = mailmap_address_list(@addr_list); return @addr_list; } diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 64a4ab3736ef..4bdc793a53a2 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -2379,6 +2379,128 @@ test_expect_success $PREREQ 'leading and trailing whitespaces are removed' ' test_cmp expected-list actual-list ' +test_expect_success $PREREQ 'mailmap support with --to' ' + clean_fake_sendmail && + test_config mailmap.file "mailmap.test" && + cat >mailmap.test <<-EOF && + Some Body + EOF + git format-patch --stdout -1 >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --to=someone@example.org \ + --mailmap \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.com!$" commandline1 +' + +test_expect_success $PREREQ 'sendemail.mailmap configuration' ' + clean_fake_sendmail && + test_config mailmap.file "mailmap.test" && + test_config sendemail.mailmap "true" && + cat >mailmap.test <<-EOF && + Some Body + EOF + git format-patch --stdout -1 >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --to=someone@example.org \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.com!$" commandline1 +' + +test_expect_success $PREREQ 'sendemail.mailmap.file configuration' ' + clean_fake_sendmail && + test_config sendemail.mailmap.file "mailmap.test" && + test_config sendemail.mailmap "true" && + cat >mailmap.test <<-EOF && + Some Body + EOF + git format-patch --stdout -1 >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --to=someone@example.org \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.com!$" commandline1 +' + +test_expect_success $PREREQ 'sendemail.mailmap identity overrides configuration' ' + clean_fake_sendmail && + test_config sendemail.cloud.mailmap.file "mailmap.test" && + test_config sendemail.mailmap "false" && + test_config sendemail.cloud.mailmap "true" && + cat >mailmap.test <<-EOF && + Some Body + EOF + git format-patch --stdout -1 >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --identity=cloud \ + --to=someone@example.org \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.com!$" commandline1 +' + +test_expect_success $PREREQ '--no-mailmap overrides configuration' ' + clean_fake_sendmail && + test_config sendemail.cloud.mailmap.file "mailmap.test" && + test_config sendemail.mailmap "false" && + test_config sendemail.cloud.mailmap "true" && + cat >mailmap.test <<-EOF && + Some Body + EOF + git format-patch --stdout -1 >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --identity=cloud \ + --to=someone@example.org \ + --no-mailmap \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.org!$" commandline1 +' + +test_expect_success $PREREQ 'mailmap support in To header' ' + clean_fake_sendmail && + test_config mailmap.file "mailmap.test" && + cat >mailmap.test <<-EOF && + + EOF + git format-patch --stdout -1 --to=someone@example.org >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --mailmap \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.com!$" commandline1 +' + +test_expect_success $PREREQ 'mailmap support in Cc header' ' + clean_fake_sendmail && + test_config mailmap.file "mailmap.test" && + cat >mailmap.test <<-EOF && + + EOF + git format-patch --stdout -1 --cc=someone@example.org >a.patch && + git send-email \ + --from="Example " \ + --smtp-server="$(pwd)/fake.sendmail" \ + --mailmap \ + a.patch \ + 2>errors >out && + grep "^!someone@example\.com!$" commandline1 +' + test_expect_success $PREREQ 'test using command name with --sendmail-cmd' ' clean_fake_sendmail && PATH="$PWD:$PATH" \