From patchwork Wed Oct 2 21:26:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bert Wesarg X-Patchwork-Id: 11171861 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 5A1F51709 for ; Wed, 2 Oct 2019 21:26:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 367EE20815 for ; Wed, 2 Oct 2019 21:26:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=googlemail.com header.i=@googlemail.com header.b="VjueydXf" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728510AbfJBV0S (ORCPT ); Wed, 2 Oct 2019 17:26:18 -0400 Received: from mail-ed1-f68.google.com ([209.85.208.68]:41994 "EHLO mail-ed1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725789AbfJBV0R (ORCPT ); Wed, 2 Oct 2019 17:26:17 -0400 Received: by mail-ed1-f68.google.com with SMTP id y91so497935ede.9 for ; Wed, 02 Oct 2019 14:26:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=T5d3WAgvtWIHP/Xc+rMKVjApDfq4O2I6zUMY1bIpZ/4=; b=VjueydXfwK9x6zEZsTCl3Z+zzTXrg5YJm23HGhIYBmGFNdEE8wbInVngDJ1d79/JOJ XSu/3eguBtn1y9/Llg8a9FTp/JRrDQnXHxZ6DOtqQXbS2wESMvqlqa74thrdZQfRppll gIqAR7bOF89g4S7BwY11/W2qNRNPvRmRdMW/TJkEtIKCnWlJlidEJ/7LXAVPUDszEUY1 1+Wx7ayVNbnVvR2Yjt3pSwkKetetMT5VE4MKghoPZCuu89I6Q+cVovNP61CuAjDEXVml jJOtocROnoLvHsTr9GCpdrHDpLoV/tIzHgvQ9D1dChlmHz8UtlQcHidkFjjKg/r2zlQl Iq7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=T5d3WAgvtWIHP/Xc+rMKVjApDfq4O2I6zUMY1bIpZ/4=; b=aaiH8PIKvTSORo8lL4y9TSv1+O4XhKSqS+akv7Ql972kci75v9lojgKKZgetqWHmvt cR1or+ulK2KsVw8QfnC8+XhtGOruJj/sxon5bxt3YL24kfqNmsDRXOXXsoe7QjAvWV3M ZgXCR6FkbnjF/hEUzDRs9+AQycvIGZYWsxqRslJTBdfjAxZ+Pz1hqOeNve+93TXxyewn yqR4kYlrngwroyLq0DL/pv2AqwVcgIluN6cYegV/RDAsydtwuY8wbuEJi9nbIYXcBPgw oogmLatIhw8ZCb7u3Fr0LffxXaRK7tC1AGB3vNkiJkpNQM3oylxC8Oh2EbFpgGCERQ5s VAIg== X-Gm-Message-State: APjAAAUjD4aqE5C5I01DEc7h/pX0oiVNr3vBAAEbxLSO0CCT5AneHbP7 2l/jJPr1D2CUk2S8VTA= X-Google-Smtp-Source: APXvYqyW79GrthgPIGQFlJNqKFCgve23SsR2soZoiBk8kzKyYyAC1KWYmdBu7CNCVJ5X+0TOiR0Kig== X-Received: by 2002:a50:fa09:: with SMTP id b9mr6139691edq.165.1570051574683; Wed, 02 Oct 2019 14:26:14 -0700 (PDT) Received: from localhost ([2a02:810a:8c80:d2c:4d89:574b:af6e:1a3]) by smtp.gmail.com with ESMTPSA id t4sm63674edq.35.2019.10.02.14.26.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Oct 2019 14:26:14 -0700 (PDT) From: Bert Wesarg To: git@vger.kernel.org Cc: Bert Wesarg Subject: [PATCH 1/3] format-patch: document and exercise that -o does only create the trailing directory Date: Wed, 2 Oct 2019 23:26:11 +0200 Message-Id: <1aeacd8af4b83142f160c63be4746554e823cfc3.1570051490.git.bert.wesarg@googlemail.com> X-Mailer: git-send-email 2.23.0.11.g242cf7f110 MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Bert Wesarg --- Documentation/config/format.txt | 3 ++- Documentation/git-format-patch.txt | 4 +++- t/t4014-format-patch.sh | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Documentation/config/format.txt b/Documentation/config/format.txt index 414a5a8a9d..e17c5d6b0f 100644 --- a/Documentation/config/format.txt +++ b/Documentation/config/format.txt @@ -80,7 +80,8 @@ format.coverLetter:: format.outputDirectory:: Set a custom directory to store the resulting files instead of the - current working directory. + current working directory. Only the trailing directory will be created + though. format.useAutoBase:: A boolean value which lets you enable the `--base=auto` option of diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index b9b97e63ae..fe7492353e 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -66,7 +66,9 @@ they are created in the current working directory. The default path can be set with the `format.outputDirectory` configuration option. The `-o` option takes precedence over `format.outputDirectory`. To store patches in the current working directory even when -`format.outputDirectory` points elsewhere, use `-o .`. +`format.outputDirectory` points elsewhere, use `-o .`. Note that only +the trailing directory will be created by Git, leading directories must +already exists. By default, the subject of a single patch is "[PATCH] " followed by the concatenation of lines from the commit message up to the first blank diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index ca7debf1d4..bf2715a503 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1632,6 +1632,22 @@ test_expect_success 'From line has expected format' ' test_cmp from filtered ' +test_expect_success 'format-patch -o with no leading directories' ' + rm -fr patches && + git format-patch -o patches master..side && + test $(git rev-list master..side | wc -l) -eq $(ls patches | wc -l) +' + +test_expect_success 'format-patch -o with leading existing directories' ' + git format-patch -o patches/side master..side && + test $(git rev-list master..side | wc -l) -eq $(ls patches/side | wc -l) +' + +test_expect_failure 'format-patch -o with leading non-existing directories' ' + rm -fr patches && + git format-patch -o patches/side master..side +' + test_expect_success 'format-patch format.outputDirectory option' ' test_config format.outputDirectory patches && rm -fr patches && From patchwork Wed Oct 2 21:26:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bert Wesarg X-Patchwork-Id: 11171863 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 5BD071709 for ; Wed, 2 Oct 2019 21:26:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 390C620815 for ; Wed, 2 Oct 2019 21:26:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=googlemail.com header.i=@googlemail.com header.b="ZyPgzo0x" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728995AbfJBV0U (ORCPT ); Wed, 2 Oct 2019 17:26:20 -0400 Received: from mail-ed1-f67.google.com ([209.85.208.67]:38794 "EHLO mail-ed1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725789AbfJBV0T (ORCPT ); Wed, 2 Oct 2019 17:26:19 -0400 Received: by mail-ed1-f67.google.com with SMTP id l21so519539edr.5 for ; Wed, 02 Oct 2019 14:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UthzjWFI1Ez/R4sB5IxsWyxOxlbglfqfyZ/1LE53l7A=; b=ZyPgzo0xaGwQWM3hWz8TGWIiLROCqjeGazB2T/TEqWob4w4QI0RV/693AxdZLiTeY/ yXiQYTUYQg+Z51/BRvInYaCrGccdJlCQh4r0bcJ7X8g4h6dPoyhCTgFuuElmgC4IJL/p 5NOfaURmbzAVsJld/e1J0bpcCGZXiAeJvBAqBoA/zUH4Dr8pOL1Q7kPsXXZ8zMUCmRvC GJeMOxdua4V5JgHR76G/1ISewFQlrVFsQ3cD787TiZfMoprCtqzpj+kBIVgsF6efNr8R Hyt3NcVCDA443rnNtWFLQ0x6uDbBVMsOtmLr3+DNyCOrf3l2NfhlW7S+u2M1ocwSHQLv mHZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UthzjWFI1Ez/R4sB5IxsWyxOxlbglfqfyZ/1LE53l7A=; b=iMF5fJV6BC5oExmGLnzDeZ6h9yz/S6TjXj8RePVgpH5UqWnIbCNIEwjjKzpcFcwcQh u1VB+mNTnokgwcIwANIRQbkmSLDQAKQjQhAKq0LNpGac736QKclmZl/R8Gy9LzMZELam zBndYXIcPeBlUZAMXWFZIK5qm6FJiMoKdSYJbG2cPVk7MbQnuPnOyeWKgEOvX6evrbDI UxtW+ieYaQtQQCXQibYKCeRMHuNqucUY6wG4eBPVdCnWlQG1gfJis1qXh1AnDs2VllUV 8vDVyJ0Ac06/KdUxl2mqSj2JxO+o8EGArRopF4FxnCNSaVE+qA6P/7HPWc+Uz1Qlmk7V Ix9Q== X-Gm-Message-State: APjAAAVDl+/qudbD1KVpnCuK9sdh3bqGVS1M10fRZiFa6yWvJgvfrBps 8DPxis+7Z+qq8Lwr/7Q= X-Google-Smtp-Source: APXvYqzuBWg5wyPfP1YGsVkC7KWnVOxVl0Qrl9h0sj/L12RI/y0r/aAd2UDQulv1iHnlroGyma8Rmw== X-Received: by 2002:aa7:c749:: with SMTP id c9mr6207374eds.232.1570051575765; Wed, 02 Oct 2019 14:26:15 -0700 (PDT) Received: from localhost ([2a02:810a:8c80:d2c:4d89:574b:af6e:1a3]) by smtp.gmail.com with ESMTPSA id c6sm27949ejz.79.2019.10.02.14.26.15 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Oct 2019 14:26:15 -0700 (PDT) From: Bert Wesarg To: git@vger.kernel.org Cc: Bert Wesarg Subject: [PATCH 2/3] format-patch: create output directory including leading components Date: Wed, 2 Oct 2019 23:26:12 +0200 Message-Id: X-Mailer: git-send-email 2.23.0.11.g242cf7f110 In-Reply-To: <1aeacd8af4b83142f160c63be4746554e823cfc3.1570051490.git.bert.wesarg@googlemail.com> References: <1aeacd8af4b83142f160c63be4746554e823cfc3.1570051490.git.bert.wesarg@googlemail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Bert Wesarg --- Documentation/config/format.txt | 3 +-- Documentation/git-format-patch.txt | 5 ++--- builtin/log.c | 8 ++++++++ t/t4014-format-patch.sh | 5 +++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Documentation/config/format.txt b/Documentation/config/format.txt index e17c5d6b0f..b6c96ece04 100644 --- a/Documentation/config/format.txt +++ b/Documentation/config/format.txt @@ -80,8 +80,7 @@ format.coverLetter:: format.outputDirectory:: Set a custom directory to store the resulting files instead of the - current working directory. Only the trailing directory will be created - though. + current working directory. All directory components will be created. format.useAutoBase:: A boolean value which lets you enable the `--base=auto` option of diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index fe7492353e..f418f490aa 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -66,9 +66,8 @@ they are created in the current working directory. The default path can be set with the `format.outputDirectory` configuration option. The `-o` option takes precedence over `format.outputDirectory`. To store patches in the current working directory even when -`format.outputDirectory` points elsewhere, use `-o .`. Note that only -the trailing directory will be created by Git, leading directories must -already exists. +`format.outputDirectory` points elsewhere, use `-o .`. All directory +components will be created. By default, the subject of a single patch is "[PATCH] " followed by the concatenation of lines from the commit message up to the first blank diff --git a/builtin/log.c b/builtin/log.c index 44b10b3415..1ab9eb6b78 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1769,6 +1769,14 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) rev.diffopt.use_color = GIT_COLOR_NEVER; if (use_stdout) die(_("standard output, or directory, which one?")); + switch (safe_create_leading_directories_const(output_directory)) { + case SCLD_OK: + case SCLD_EXISTS: + break; + default: + die(_("could not create leading directories " + "of '%s'"), output_directory); + } if (mkdir(output_directory, 0777) < 0 && errno != EEXIST) die_errno(_("could not create directory '%s'"), output_directory); diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index bf2715a503..43d608aa94 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1643,9 +1643,10 @@ test_expect_success 'format-patch -o with leading existing directories' ' test $(git rev-list master..side | wc -l) -eq $(ls patches/side | wc -l) ' -test_expect_failure 'format-patch -o with leading non-existing directories' ' +test_expect_success 'format-patch -o with leading non-existing directories' ' rm -fr patches && - git format-patch -o patches/side master..side + git format-patch -o patches/side master..side && + test $(git rev-list master..side | wc -l) -eq $(ls patches/side | wc -l) ' test_expect_success 'format-patch format.outputDirectory option' ' From patchwork Wed Oct 2 21:26:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bert Wesarg X-Patchwork-Id: 11171865 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 BFFAD1709 for ; Wed, 2 Oct 2019 21:26:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 94A2D215EA for ; Wed, 2 Oct 2019 21:26:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=googlemail.com header.i=@googlemail.com header.b="k76neYBI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729181AbfJBV0W (ORCPT ); Wed, 2 Oct 2019 17:26:22 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:40169 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728883AbfJBV0U (ORCPT ); Wed, 2 Oct 2019 17:26:20 -0400 Received: by mail-ed1-f66.google.com with SMTP id v38so506625edm.7 for ; Wed, 02 Oct 2019 14:26:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3LPlPjWtsf12ikJ3fQw1ZDy/OpJJCzhhxiQZfmU7Y7I=; b=k76neYBIv4WC5y7pY/GF4x2XN0wYyMtpmR0OpwE97TGcCdyQtzk6nhvxI+hZGXeKPS pNsd8/d8DmIDgj/rLvbtSVzAGiVlpeoIc5WZ/CGhkBN229bI31sDDlcHUItAtUk8GkVD c5RovCMkEn+v4bE9EbHm3TleyvCfGxwY3vhGU2TuroF734/o39hgbHuGbTQs72TPCooX iUmli6+PgXmoC56oRZ/yYHHw+cojjJo26ncH6vNLVvKX8jJx4B/LcsWECuJxwL3IxaUr CcPyUlINRf9PP37PKHaMPTLSfrsaVg/DlI45IqS+t/ZHtRpkSkotTZUTZt+NMb4ZCTYU yifQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3LPlPjWtsf12ikJ3fQw1ZDy/OpJJCzhhxiQZfmU7Y7I=; b=j85fXjE7MNJDOCn+Va7BOSAepvpwRERWhKS6ErpePoeJcIo5dvb5817x13syKq4gWI ONl4yLJw1BnxMNWd3d2K7CagMNBvLH5YAu+Sj3IEINsd61yWXUUQyhOZ/mius09V8Cfb ZGlhtpaYnHY2CY8Ww0RAiS68vbTpYyrzV5HhgolO7xa6O2QXfzfHEgUujviZrd8tV464 hcH7Qgj1JdeJoq+rT4RD5HTWjjscdBWBo0n1x6Ev9TrYhfQMBBC2Jo6XMc4XXvWRJp48 IltVtodCYWEX8SlA3Zm83MLReUfPymkHdXlT6XiH6ZLBeD3stVYDa5YYsRH/l8h5kpjs oRXw== X-Gm-Message-State: APjAAAXKPHDZB/Y/PnCsJvF4GBUs59ea3A8gnthpcv0pjDWmsW1Ac+4u FVMN9Y6m/NTFgk7EERI= X-Google-Smtp-Source: APXvYqxHaxHo9iJRBr7BdSZWKrXWPkhqqXlwzlrDar7uRBT2GiCAqueJZRHqeXZnTc5z5uY7qLa6Zw== X-Received: by 2002:a17:906:409b:: with SMTP id u27mr4983207ejj.295.1570051576883; Wed, 02 Oct 2019 14:26:16 -0700 (PDT) Received: from localhost ([2a02:810a:8c80:d2c:4d89:574b:af6e:1a3]) by smtp.gmail.com with ESMTPSA id o26sm63799edi.23.2019.10.02.14.26.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Oct 2019 14:26:16 -0700 (PDT) From: Bert Wesarg To: git@vger.kernel.org Cc: Bert Wesarg , Alexander Kuleshov , Eric Sunshine Subject: [RFC PATCH 3/3] format-patch: use a command to generate the output directory name Date: Wed, 2 Oct 2019 23:26:13 +0200 Message-Id: <431f8a4e372feccf240b9c66c91248a6f53eab47.1570051490.git.bert.wesarg@googlemail.com> X-Mailer: git-send-email 2.23.0.11.g242cf7f110 In-Reply-To: <1aeacd8af4b83142f160c63be4746554e823cfc3.1570051490.git.bert.wesarg@googlemail.com> References: <1aeacd8af4b83142f160c63be4746554e823cfc3.1570051490.git.bert.wesarg@googlemail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Having 'format.outputDirectory' is convenient, but being able to process all produced patches via a wildcard command is even more so. I.e., using an argument like '/*'. Neither '-o' nor 'format.outputDirectory' can be parameterized to produce a new unique directory. Thus provide the new 'format.outputDirectoryCmd' configuration to specify a command which does the job and puts the name to standard output. Signed-off-by: Bert Wesarg --- Cc: Alexander Kuleshov Cc: Eric Sunshine --- Documentation/config/format.txt | 5 +++++ Documentation/git-format-patch.txt | 6 +++++- builtin/log.c | 24 +++++++++++++++++++++++- t/t4014-format-patch.sh | 24 ++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Documentation/config/format.txt b/Documentation/config/format.txt index b6c96ece04..dcce2c67ef 100644 --- a/Documentation/config/format.txt +++ b/Documentation/config/format.txt @@ -82,6 +82,11 @@ format.outputDirectory:: Set a custom directory to store the resulting files instead of the current working directory. All directory components will be created. +format.outputDirectoryCmd:: + The command which is used to name a custom directory to store the + resulting files instead of the current working directory. All directory + components will be created. + format.useAutoBase:: A boolean value which lets you enable the `--base=auto` option of format-patch by default. diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index f418f490aa..0da904255b 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -67,7 +67,11 @@ can be set with the `format.outputDirectory` configuration option. The `-o` option takes precedence over `format.outputDirectory`. To store patches in the current working directory even when `format.outputDirectory` points elsewhere, use `-o .`. All directory -components will be created. +components will be created. The 'format.outputDirectoryCmd' configuration can +be used to name a command to produce the directory name programmatically. The +command should produce the name to its standard output. The +`format.outputDirectory` configuration takes precedence over +`format.outputDirectoryCmd`. By default, the subject of a single patch is "[PATCH] " followed by the concatenation of lines from the commit message up to the first blank diff --git a/builtin/log.c b/builtin/log.c index 1ab9eb6b78..b102e86bea 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -774,6 +774,7 @@ static const char *signature = git_version_string; static const char *signature_file; static int config_cover_letter; static const char *config_output_directory; +static const char *config_output_directory_cmd; enum { COVER_UNSET, @@ -856,6 +857,8 @@ static int git_format_config(const char *var, const char *value, void *cb) } if (!strcmp(var, "format.outputdirectory")) return git_config_string(&config_output_directory, var, value); + if (!strcmp(var, "format.outputdirectorycmd")) + return git_config_string(&config_output_directory_cmd, var, value); if (!strcmp(var, "format.useautobase")) { base_auto = git_config_bool(var, value); return 0; @@ -1756,8 +1759,27 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (rev.show_notes) init_display_notes(&rev.notes_opt); - if (!output_directory && !use_stdout) + if (!output_directory && !use_stdout) { + // outputDirectoryCmd can be preceeded by outputDirectory + if (!config_output_directory && config_output_directory_cmd) { + struct child_process cp = CHILD_PROCESS_INIT; + const char *argv[1]; + struct strbuf buf = STRBUF_INIT; + int rc; + + argv[0] = config_output_directory_cmd; + cp.argv = argv; + cp.use_shell = 1; + rc = capture_command(&cp, &buf, PATH_MAX); + if (rc) + die(_("outputDirectoryCmd command failed: " + "'%s'"), config_output_directory_cmd); + strbuf_setlen(&buf, strcspn(buf.buf, "\r\n")); + config_output_directory = strbuf_detach(&buf, NULL); + } + output_directory = config_output_directory; + } if (!use_stdout) output_directory = set_outdir(prefix, output_directory); diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 43d608aa94..bf2547ce87 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1664,6 +1664,30 @@ test_expect_success 'format-patch -o overrides format.outputDirectory' ' test_path_is_dir patchset ' +test_expect_success 'format-patch format.outputDirectoryCmd option' ' + test_config format.outputDirectoryCmd "echo patches" && + rm -fr patches && + git format-patch master..side && + test $(git rev-list master..side | wc -l) -eq $(ls patches | wc -l) +' + +test_expect_success 'format-patch format.outputDirectory overrides format.outputDirectoryCmd' ' + test_config format.outputDirectoryCmd "echo patches" && + test_config format.outputDirectory patchset && + rm -fr patches patchset && + git format-patch master..side && + test_path_is_missing patches && + test_path_is_dir patchset +' + +test_expect_success 'format-patch -o overrides format.outputDirectoryCmd' ' + test_config format.outputDirectoryCmd "echo patches" && + rm -fr patches patchset && + git format-patch -o patchset master..side && + test_path_is_missing patches && + test_path_is_dir patchset +' + test_expect_success 'format-patch --base' ' git checkout patchid && git format-patch --stdout --base=HEAD~3 -1 | tail -n 7 >actual1 &&