From patchwork Fri Oct 11 19:12:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 11186237 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E26B5139A for ; Fri, 11 Oct 2019 19:12:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C253121835 for ; Fri, 11 Oct 2019 19:12:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="A6C0mLnz" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728903AbfJKTM4 (ORCPT ); Fri, 11 Oct 2019 15:12:56 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:44236 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728843AbfJKTMz (ORCPT ); Fri, 11 Oct 2019 15:12:55 -0400 Received: by mail-pg1-f193.google.com with SMTP id e10so2324649pgd.11 for ; Fri, 11 Oct 2019 12:12:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=ZSZH5+2EEJd2sjHV3a18wFzu+QVrscNWnmELBNehQH8=; b=A6C0mLnzOclRHL86KLommwTnrZsmsVMRDZ/cOOTZL82ug8xYDk7sdfwyfi3OSMSoZj +qx+UGvdQllHchPacCl4laNFUn7Ot06/OtkJDGAJuhu1iWc4q20FQLB7ZkOwSuQHVujM wjslBo+HDO0lpsa0Jq+nDE6vQ5YI+wL2tF9mezlmhUsdD6vJpZUJzndBoW+R9KGie6CH SnMsb/5vJqzpEXNEcAuEM47deONGixV/tuAsX7OI8oCdUe113iA3hd77yaFZ3wraCYc/ WQ3kggK+feb/z+6+2ARyAnNM5G/5ZBEI/3imyDQ5PMGmBRHoZhU/lsTMNmGIeProFLgW TftA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=ZSZH5+2EEJd2sjHV3a18wFzu+QVrscNWnmELBNehQH8=; b=fGvcaBjhviy0tUKyxYQikGvAUQ2PTUV71fCZ9EceA/5fUcP/9zKNerrNo+p+ZMPc3q o6CJu6WcG8SkefqwHlDCynUmxsBpMMXamFl+wAxLdLF4PET/O4RbptJFWgKdtUv0H3Au R5ooxdVbh9K32tIhT9E049pz4+qCUoWaowGvwQgUteUP4hHVQK/ITLnNjX0ALlNTs5Az RPG9s0cvxHIVwW+UrdYBYWK1wVDKc00/v/Ms4nyNLjcWvj9uLmx5IPhccOpi0QDhaqrW m4+EjMMGDh2En9ZKX1ZNIi8S+y4J7StvX7PbKRquQgAJEWykjlGjl7TGQnbfNmfFGgDS n+RA== X-Gm-Message-State: APjAAAUrX0p/NAWW30DszKCo+n/HbDmPsRSGIbQCmz0M8UZdgq7Gkx+W 8PieBEdNc5gFzGnoHS3CeXf99XE6 X-Google-Smtp-Source: APXvYqxI8gLO4lVzHhw0kqkwKxGK/DmEdmbRCIlKUJ5zYtUKqUlQUZWiDeGhGLSEGsj6NGbkS501Gg== X-Received: by 2002:a65:51cd:: with SMTP id i13mr18868572pgq.142.1570821174335; Fri, 11 Oct 2019 12:12:54 -0700 (PDT) Received: from generichostname ([204.14.239.54]) by smtp.gmail.com with ESMTPSA id w5sm9733147pfn.96.2019.10.11.12.12.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Oct 2019 12:12:53 -0700 (PDT) Date: Fri, 11 Oct 2019 12:12:52 -0700 From: Denton Liu To: Git Mailing List Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Junio C Hamano , Eric Sunshine , Johannes Sixt , Philip Oakley Subject: [PATCH v4 1/3] format-patch: remove erroneous and condition Message-ID: <5fa7cbbd7a68eae76347b90371201e20cba1c381.1570821015.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.2 (2019-09-21) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Commit 30984ed2e9 (format-patch: support deep threading, 2009-02-19), introduced the following lines: #define THREAD_SHALLOW 1 [...] thread = git_config_bool(var, value) && THREAD_SHALLOW; Since git_config_bool() returns a bool, the trailing `&& THREAD_SHALLOW` is a no-op. Remove this erroneous and condition. Signed-off-by: Denton Liu --- builtin/log.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/log.c b/builtin/log.c index 44b10b3415..7d658cecef 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -835,7 +835,7 @@ static int git_format_config(const char *var, const char *value, void *cb) thread = THREAD_SHALLOW; return 0; } - thread = git_config_bool(var, value) && THREAD_SHALLOW; + thread = git_config_bool(var, value); return 0; } if (!strcmp(var, "format.signoff")) { From patchwork Fri Oct 11 19:12:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 11186241 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6211D139A for ; Fri, 11 Oct 2019 19:12:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4392121835 for ; Fri, 11 Oct 2019 19:12:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UrbAEzjD" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728916AbfJKTM6 (ORCPT ); Fri, 11 Oct 2019 15:12:58 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:39439 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728843AbfJKTM6 (ORCPT ); Fri, 11 Oct 2019 15:12:58 -0400 Received: by mail-pg1-f193.google.com with SMTP id e1so6322621pgj.6 for ; Fri, 11 Oct 2019 12:12:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=orb1ohQste3Ur6dznYHPAYahOGsw8zbQhhPr3gx4pPk=; b=UrbAEzjDYseZqyT9z5XhgBIUvnRhV9x9uz6alu6/iSxU4jKQphF9d29gEaAmIMGDN0 G/KtxmGhVnuw4vM14byvi7kvZG2sTzknf2fLsnxlMMsk28hGA7JRtnemY5clWL1+yQOD PwdReUdE5o+XSvPmxJyKO5coh7+o+RLBUH2CprtNwZb8uW8x7BehV636NJORx/WgWH0s 0xuyWu3V5KgSW9EDLRk8k2HZLUIV90VbzKOAen+0644yXFtuEcCbMNtfGnWlshirO6W0 24Yl0o5OZ2Ab6LmALmQ8wc7UvMokLa9qMf7rAd/hEVZekDu+gKzC/l+8Hof+TSmBPxK9 2XsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=orb1ohQste3Ur6dznYHPAYahOGsw8zbQhhPr3gx4pPk=; b=Wwk9XmP3MtcaiilrlZ0LmWwM9vtdhUjduYcDoQY3JMz8l4ZhurY2AfadFXgm8hEz/O HUBue1URtCZLpq6o2Z//eiDoy+8C4YJVDkZfeY4Blk6t3IuIN80cBUyKmt+NTgzIoi0B oDZ0oOl9rx1QbaGwOm8GQPJ7ikWR4/g/PMD4rB/DJ/Kqhyvj5KMiFCQ3Dsf4KvtONoQO VABgS1UU7iQD4DjXA6yaX6/uU8clsAEyj2hGlvZjZr6UdV4ZQzlgm2zNkRs+KRh1LS2D jjjkgtiNSxPgSXjlMXhqgMrhucfkHY4/XNIYghd+krPICV7wrUKoYFguBP+1WUeJ/Gmz atbQ== X-Gm-Message-State: APjAAAWMXnWpyY4SgoMtKfHH1Ra933iSubFwARgBRXbTJ4Pam9lTw5iz 5Do0Tw3HPgXQqDKSgmcnq9/FWBlu X-Google-Smtp-Source: APXvYqwasO5WFRnbviHyvBTWMrEbZLFB/OnbBT+anfnqzt3qjqel3WvNOR63WVZO/+YY8qirSuARMQ== X-Received: by 2002:a62:2581:: with SMTP id l123mr18362795pfl.197.1570821176741; Fri, 11 Oct 2019 12:12:56 -0700 (PDT) Received: from generichostname ([204.14.239.54]) by smtp.gmail.com with ESMTPSA id z13sm11261827pfg.172.2019.10.11.12.12.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Oct 2019 12:12:56 -0700 (PDT) Date: Fri, 11 Oct 2019 12:12:54 -0700 From: Denton Liu To: Git Mailing List Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Junio C Hamano , Eric Sunshine , Johannes Sixt , Philip Oakley Subject: [PATCH v4 2/3] format-patch: use enum variables Message-ID: <19ee1f71493fa584991f530e952d9198880208eb.1570821015.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.2 (2019-09-21) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Before, `thread` and `config_cover_letter` were defined as ints even though they behaved as enums. Define actual enums and change these variables to use these new definitions. Signed-off-by: Denton Liu --- builtin/log.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index 7d658cecef..f06f5d586b 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -764,24 +764,28 @@ static void add_header(const char *value) item->string[len] = '\0'; } -#define THREAD_SHALLOW 1 -#define THREAD_DEEP 2 -static int thread; +enum cover_setting { + COVER_UNSET, + COVER_OFF, + COVER_ON, + COVER_AUTO +}; + +enum thread_level { + THREAD_UNSET, + THREAD_SHALLOW, + THREAD_DEEP +}; + +static enum thread_level thread; static int do_signoff; static int base_auto; static char *from; static const char *signature = git_version_string; static const char *signature_file; -static int config_cover_letter; +static enum cover_setting config_cover_letter; static const char *config_output_directory; -enum { - COVER_UNSET, - COVER_OFF, - COVER_ON, - COVER_AUTO -}; - static int git_format_config(const char *var, const char *value, void *cb) { struct rev_info *rev = cb; @@ -1248,9 +1252,9 @@ static int output_directory_callback(const struct option *opt, const char *arg, static int thread_callback(const struct option *opt, const char *arg, int unset) { - int *thread = (int *)opt->value; + enum thread_level *thread = (enum thread_level *)opt->value; if (unset) - *thread = 0; + *thread = THREAD_UNSET; else if (!arg || !strcmp(arg, "shallow")) *thread = THREAD_SHALLOW; else if (!strcmp(arg, "deep")) From patchwork Fri Oct 11 19:12:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 11186243 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DF34F139A for ; Fri, 11 Oct 2019 19:13:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A551C21835 for ; Fri, 11 Oct 2019 19:13:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="tOef7Hbq" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728931AbfJKTNA (ORCPT ); Fri, 11 Oct 2019 15:13:00 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:36508 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728843AbfJKTNA (ORCPT ); Fri, 11 Oct 2019 15:13:00 -0400 Received: by mail-pl1-f195.google.com with SMTP id j11so4890019plk.3 for ; Fri, 11 Oct 2019 12:12:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=j2vDLA6P28N7ytTiJQz9UksIOypCpFIR+azTvp/rjsE=; b=tOef7HbqCyxdJULrRsaNDyLwN4ylNd4Xf8ayBeDtyqiyF4eAMznIFlnAmFrKPOBBsf Dpa9bjEsz8Vq8GPdAO8UguoppFMTZCdAms/Nv86/f1k38ITTdTk+8Nx2RtM9+Zdj2irp SZgeMT7RwR0FvlB1rwZtkbEv6B/M2JH4eZN+ciIJ3zRItREwr1PaWtenykgUqGvlS8xU J6UA3TUB/NOJKAwJlC9gzHmZ8ydDrKCLDDnrONm3bCwung94ZLa6PnAES3TjNVvZj1jh DqnfRuJp1ZAW5YNf+BCKDySbNOZ5+J8TnVundOeyFbDoD24XsI5M+RGEEP3VOoqM7n1G IQxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=j2vDLA6P28N7ytTiJQz9UksIOypCpFIR+azTvp/rjsE=; b=OLA9g/qEm/F8oB997kOfMfnzDu6SgXlJNrIUISwDlctAzX19TKvu6fcKQsZ7aHdZgT m7DFRcR1Rg6KVJ0dVE/0nLnLAIN878QXSqK+FHUzHC15QUIKqw78FpQhKhgjKJXFj01H 1zG9TDCWJYvxkkYn63GDnTB7Cenk4ocEWGvDRuMAXAKs6KrfwMhhgZKNGFQdW+oNJy4L 6p7XcvGDm8lXc5PLzMOwLKh4nuJeGUK4t7GNqxREE0QWR5EiSXVInT5ui/kwSq0jBzJA FYsAJmEgNOlhw/IrhoLL1SCPj4yXFmE7efk8+pjM4XVRs29wig1lyQnxT6pwtebHkSXI WGWg== X-Gm-Message-State: APjAAAXHBr8x4xkKYD+f1C7C4gfp/AeNRdZWKi+4cmyizgeLggQcvl/q k3WP5BSvggKDpZ5ua4cst4s5WtTe X-Google-Smtp-Source: APXvYqxNRQU4QArNhkETlm4TYQ/oA7Ojbni32N1qGk3Um8ERbJmRN72HV0o3M/HuyfoV4Ep6eiMQZA== X-Received: by 2002:a17:902:74c3:: with SMTP id f3mr16843348plt.212.1570821178980; Fri, 11 Oct 2019 12:12:58 -0700 (PDT) Received: from generichostname ([204.14.239.54]) by smtp.gmail.com with ESMTPSA id y36sm8790246pgk.66.2019.10.11.12.12.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Oct 2019 12:12:58 -0700 (PDT) Date: Fri, 11 Oct 2019 12:12:56 -0700 From: Denton Liu To: Git Mailing List Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Junio C Hamano , Eric Sunshine , Johannes Sixt , Philip Oakley Subject: [PATCH v4 3/3] format-patch: teach --cover-from-description option Message-ID: <9b8c3dcb539054ba483fc34c6ff509e4ca73517c.1570821015.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.2 (2019-09-21) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Before, when format-patch generated a cover letter, only the body would be populated with a branch's description while the subject would be populated with placeholder text. However, users may want to have the subject of their cover letter automatically populated in the same way. Teach format-patch to accept the `--cover-from-description` option and corresponding `format.coverFromDescription` config, allowing users to populate different parts of the cover letter (including the subject now). Signed-off-by: Denton Liu --- Documentation/config/format.txt | 6 + Documentation/git-format-patch.txt | 22 ++++ builtin/log.c | 84 ++++++++++---- t/t4014-format-patch.sh | 172 +++++++++++++++++++++++++++++ 4 files changed, 263 insertions(+), 21 deletions(-) diff --git a/Documentation/config/format.txt b/Documentation/config/format.txt index cb629fa769..735dfcf827 100644 --- a/Documentation/config/format.txt +++ b/Documentation/config/format.txt @@ -36,6 +36,12 @@ format.subjectPrefix:: The default for format-patch is to output files with the '[PATCH]' subject prefix. Use this variable to change that prefix. +format.coverFromDescription:: + The default mode for format-patch to determine which parts of + the cover letter will be populated using the branch's + description. See the `--cover-from-description` option in + linkgit:git-format-patch[1]. + format.signature:: The default for format-patch is to output a signature containing the Git version number. Use this variable to change that default. diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 0ac56f4b70..86114e4c22 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -19,6 +19,7 @@ SYNOPSIS [--start-number ] [--numbered-files] [--in-reply-to=] [--suffix=.] [--ignore-if-in-upstream] + [--cover-from-description=] [--rfc] [--subject-prefix=] [(--reroll-count|-v) ] [--to=] [--cc=] @@ -171,6 +172,26 @@ will want to ensure that threading is disabled for `git send-email`. patches being generated, and any patch that matches is ignored. +--cover-from-description=:: + Controls which parts of the cover letter will be automatically + populated using the branch's description. ++ +If `` is `message` or `default`, the cover letter subject will be +populated with placeholder text. The body of the cover letter will be +populated with the branch's description. ++ +If `` is `subject`, the beginning of the branch description (up to +the first blank line) will populate the cover letter subject. The +remainder of the description will populate the body of the cover +letter. ++ +If `` is `auto`, if the beginning of the branch description (up to +the first line) is greater than 100 characters then the mode will be +`message`, otherwise `subject` will be used. ++ +If `` is `none`, both the cover letter subject and body will be +populated with placeholder text. + --subject-prefix=:: Instead of the standard '[PATCH]' prefix in the subject line, instead use '[]'. This @@ -347,6 +368,7 @@ with configuration variables. signOff = true outputDirectory = coverLetter = auto + inferCoverSubject = true ------------ diff --git a/builtin/log.c b/builtin/log.c index f06f5d586b..0cc8b59991 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -37,6 +37,7 @@ #include "range-diff.h" #define MAIL_DEFAULT_WRAP 72 +#define COVER_FROM_AUTO_MAX_SUBJECT_LEN 100 /* Set a default date-time format for git log ("log.date" config variable) */ static const char *default_date_mode = NULL; @@ -777,6 +778,13 @@ enum thread_level { THREAD_DEEP }; +enum cover_from_description { + COVER_FROM_NONE, + COVER_FROM_MESSAGE, + COVER_FROM_SUBJECT, + COVER_FROM_AUTO +}; + static enum thread_level thread; static int do_signoff; static int base_auto; @@ -785,6 +793,23 @@ static const char *signature = git_version_string; static const char *signature_file; static enum cover_setting config_cover_letter; static const char *config_output_directory; +static enum cover_from_description cover_from_description_mode = COVER_FROM_MESSAGE; + +static enum cover_from_description parse_cover_from_description(const char *arg) +{ + if (!arg || !strcmp(arg, "default")) + return COVER_FROM_MESSAGE; + else if (!strcmp(arg, "none")) + return COVER_FROM_NONE; + else if (!strcmp(arg, "message")) + return COVER_FROM_MESSAGE; + else if (!strcmp(arg, "subject")) + return COVER_FROM_SUBJECT; + else if (!strcmp(arg, "auto")) + return COVER_FROM_AUTO; + else + die(_("%s: invalid cover from description mode"), arg); +} static int git_format_config(const char *var, const char *value, void *cb) { @@ -891,6 +916,10 @@ static int git_format_config(const char *var, const char *value, void *cb) } return 0; } + if (!strcmp(var, "format.coverfromdescription")) { + cover_from_description_mode = parse_cover_from_description(value); + return 0; + } return git_log_config(var, value, cb); } @@ -997,20 +1026,6 @@ static void print_signature(FILE *file) putc('\n', file); } -static void add_branch_description(struct strbuf *buf, const char *branch_name) -{ - struct strbuf desc = STRBUF_INIT; - if (!branch_name || !*branch_name) - return; - read_branch_desc(&desc, branch_name); - if (desc.len) { - strbuf_addch(buf, '\n'); - strbuf_addbuf(buf, &desc); - strbuf_addch(buf, '\n'); - } - strbuf_release(&desc); -} - static char *find_branch_name(struct rev_info *rev) { int i, positive = -1; @@ -1061,13 +1076,16 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, struct commit *origin, int nr, struct commit **list, const char *branch_name, + enum cover_from_description cover_from_description_mode, int quiet) { const char *committer; - const char *body = "*** SUBJECT HERE ***\n\n*** BLURB HERE ***\n"; - const char *msg; + const char *subject = "*** SUBJECT HERE ***"; + const char *body = "*** BLURB HERE ***"; struct shortlog log; struct strbuf sb = STRBUF_INIT; + struct strbuf description_sb = STRBUF_INIT; + struct strbuf subject_sb = STRBUF_INIT; int i; const char *encoding = "UTF-8"; int need_8bit_cte = 0; @@ -1095,17 +1113,34 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, if (!branch_name) branch_name = find_branch_name(rev); - msg = body; + if (branch_name && *branch_name) + read_branch_desc(&description_sb, branch_name); + + if (cover_from_description_mode != COVER_FROM_NONE && description_sb.len) { + if (cover_from_description_mode == COVER_FROM_SUBJECT || + cover_from_description_mode == COVER_FROM_AUTO) + body = format_subject(&subject_sb, description_sb.buf, " "); + + if (cover_from_description_mode == COVER_FROM_MESSAGE || + (cover_from_description_mode == COVER_FROM_AUTO && + subject_sb.len > COVER_FROM_AUTO_MAX_SUBJECT_LEN)) + body = description_sb.buf; + else + subject = subject_sb.buf; + } + pp.fmt = CMIT_FMT_EMAIL; pp.date_mode.type = DATE_RFC2822; pp.rev = rev; pp.print_email_subject = 1; pp_user_info(&pp, NULL, &sb, committer, encoding); - pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte); - pp_remainder(&pp, &msg, &sb, 0); - add_branch_description(&sb, branch_name); + pp_title_line(&pp, &subject, &sb, encoding, need_8bit_cte); + pp_remainder(&pp, &body, &sb, 0); + strbuf_addch(&sb, '\n'); fprintf(rev->diffopt.file, "%s\n", sb.buf); + strbuf_release(&description_sb); + strbuf_release(&subject_sb); strbuf_release(&sb); shortlog_init(&log); @@ -1545,6 +1580,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) int use_patch_format = 0; int quiet = 0; int reroll_count = -1; + char *cover_from_description_arg = NULL; char *branch_name = NULL; char *base_commit = NULL; struct base_tree_info bases; @@ -1581,6 +1617,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) { OPTION_CALLBACK, 0, "rfc", &rev, NULL, N_("Use [RFC PATCH] instead of [PATCH]"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, rfc_callback }, + OPT_STRING(0, "cover-from-description", &cover_from_description_arg, + N_("cover-from-description-mode"), + N_("generate parts of a cover letter based on a branch's description")), { OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"), N_("Use [] instead of [PATCH]"), PARSE_OPT_NONEG, subject_prefix_callback }, @@ -1672,6 +1711,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH); + if (cover_from_description_arg) + cover_from_description_mode = parse_cover_from_description(cover_from_description_arg); + if (0 < reroll_count) { struct strbuf sprefix = STRBUF_INIT; strbuf_addf(&sprefix, "%s v%d", @@ -1920,7 +1962,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (thread) gen_message_id(&rev, "cover"); make_cover_letter(&rev, use_stdout, - origin, nr, list, branch_name, quiet); + origin, nr, list, branch_name, cover_from_description_mode, quiet); print_bases(&bases, rev.diffopt.file); print_signature(rev.diffopt.file); total++; diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 72b09896cf..88db01308a 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1517,6 +1517,178 @@ test_expect_success 'format patch ignores color.ui' ' test_cmp expect actual ' +test_expect_success 'cover letter with invalid --cover-from-description and config' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_must_fail git format-patch --cover-letter --cover-from-description garbage master && + test_config format.coverFromDescription garbage && + test_must_fail git format-patch --cover-letter master +' + +test_expect_success 'cover letter with format.coverFromDescription = default' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_config format.coverFromDescription default && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with --cover-from-description default' ' + test_config branch.rebuild-1.description "config subject + +body" && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description default master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with format.coverFromDescription = none' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_config format.coverFromDescription none && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + ! grep "^body$" actual +' + +test_expect_success 'cover letter with --cover-from-description none' ' + test_config branch.rebuild-1.description "config subject + +body" && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description none master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + ! grep "^body$" actual +' + +test_expect_success 'cover letter with format.coverFromDescription = message' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_config format.coverFromDescription message && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with --cover-from-description message' ' + test_config branch.rebuild-1.description "config subject + +body" && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description message master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with format.coverFromDescription = subject' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_config format.coverFromDescription subject && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter master >actual && + grep "^Subject: \[PATCH 0/2\] config subject$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with --cover-from-description subject' ' + test_config branch.rebuild-1.description "config subject + +body" && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description subject master >actual && + grep "^Subject: \[PATCH 0/2\] config subject$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with format.coverFromDescription = auto (short subject line)' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_config format.coverFromDescription auto && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter master >actual && + grep "^Subject: \[PATCH 0/2\] config subject$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with --cover-from-description auto (short subject line)' ' + test_config branch.rebuild-1.description "config subject + +body" && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description auto master >actual && + grep "^Subject: \[PATCH 0/2\] config subject$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with format.coverFromDescription = auto (long subject line)' ' + test_config branch.rebuild-1.description "this is a really long first line and it is over 100 characters long which is the threshold for long subjects + +body" && + test_config format.coverFromDescription auto && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with --cover-from-description auto (long subject line)' ' + test_config branch.rebuild-1.description "this is a really long first line and it is over 100 characters long which is the threshold for long subjects + +body" && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description auto master >actual && + grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && + grep "^body$" actual +' + +test_expect_success 'cover letter with command-line --cover-from-description overrides config' ' + test_config branch.rebuild-1.description "config subject + +body" && + test_config format.coverFromDescription none && + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description subject master >actual && + grep "^Subject: \[PATCH 0/2\] config subject$" actual && + ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && + ! grep "^config subject$" actual && + grep "^body$" actual +' + test_expect_success 'cover letter using branch description (1)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && From patchwork Fri Oct 11 19:23:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 11186273 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DA26317D4 for ; Fri, 11 Oct 2019 19:24:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BC3DC206CD for ; Fri, 11 Oct 2019 19:24:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UQijfL44" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728894AbfJKTXL (ORCPT ); Fri, 11 Oct 2019 15:23:11 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:42482 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728776AbfJKTXK (ORCPT ); Fri, 11 Oct 2019 15:23:10 -0400 Received: by mail-pl1-f193.google.com with SMTP id e5so4886411pls.9 for ; Fri, 11 Oct 2019 12:23:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=xmZZKPqBnzwmgiVttNY/y1ubM3JTmIyT4sXJ7fPr4t8=; b=UQijfL44vjIogh3YgsBbHM12z6J61YfYsOjUmAGjravS1cBWsroSkgU45At4KOsGl6 4vaPHj3OTmt9rLcqhU8j0/T+drcCnTkxLj1XyMJYTIjA8wwifVXMy+xNP0iZ/wScK9VX zKLIsMViU2VSBCfX86KQz7S9I5w7yr0ZHMRvH5hlmDlrYAEZdGn48xvlTsHiHA9hmodx eL7KzgRoe4EW9i1qVLjkP7/RxLd2NaOJhATRMUSnZ2x6Lqvq++43RVx93zYn57CtH+vX bb5GB3LIHIzKdI2LEv0HleQtOIdy4VZYwrPlnTu6cce01RdlKbDbxYMs1nJvWKOnEdD8 9jBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=xmZZKPqBnzwmgiVttNY/y1ubM3JTmIyT4sXJ7fPr4t8=; b=Yn+sS983pkPhXMjDlNJMFyTmL2N/RZac/OU/rXpl78BLGK/Mq12bY4uhS9m55bnh/L JYArg+NY0rzxbmPKqdmD1WvsGoQrSZb+B9V5tcdF2l+K+b1GE8So88MeLi8XD9zNH2kx LNE6A2VBL6aNULeyyCvnBRUjtQFSqmP03/z2/Y2cDknJ2qAlHcueQ4MpZODZNtU99/U8 Q9OgCZlqttAmf1vhgUy4QtczBFp0KYNGEbbarl5WXDlXWNrJl61OnuSCl4b8eiJ+b2fF G5EJ5PU3WIdn1101sSRvlC+mxX2pxN52l1PsqxACCtVHeZWSKeNJxerNKh/WaRVAZSdq mxFg== X-Gm-Message-State: APjAAAXaUBRRLBgu+Avz0yInt6JZTPANeCi5BK4Qk9+Qsz2hAutB1n3/ 6wsw8YIzDqpXvn+qCFB3Ps7aGeyE X-Google-Smtp-Source: APXvYqzSRDNch1pC96/SRhTNt04UoEDsQiiLAY68Ku+Y86Apm2eQqNDSKNuKuKeQAwdwY8yAjv592Q== X-Received: by 2002:a17:902:b611:: with SMTP id b17mr16415254pls.23.1570821789910; Fri, 11 Oct 2019 12:23:09 -0700 (PDT) Received: from generichostname ([204.14.239.54]) by smtp.gmail.com with ESMTPSA id 22sm10412861pfj.139.2019.10.11.12.23.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Oct 2019 12:23:09 -0700 (PDT) Date: Fri, 11 Oct 2019 12:23:07 -0700 From: Denton Liu To: Git Mailing List Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Junio C Hamano , Eric Sunshine , Johannes Sixt , Philip Oakley Subject: [PATCH v4 4/3] fixup! format-patch: teach --cover-from-description option Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.2 (2019-09-21) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Denton Liu --- Documentation/git-format-patch.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 86114e4c22..4c652c97f5 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -368,7 +368,7 @@ with configuration variables. signOff = true outputDirectory = coverLetter = auto - inferCoverSubject = true + coverFromDescription = auto ------------