From patchwork Thu Sep 20 18:04:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taylor Blau X-Patchwork-Id: 10608429 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CD09414DA for ; Thu, 20 Sep 2018 18:04:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C58972E5C7 for ; Thu, 20 Sep 2018 18:04:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BA13F2E5CA; Thu, 20 Sep 2018 18:04:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 66AB22E5C7 for ; Thu, 20 Sep 2018 18:04:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387913AbeITXsw (ORCPT ); Thu, 20 Sep 2018 19:48:52 -0400 Received: from mail-io1-f65.google.com ([209.85.166.65]:47032 "EHLO mail-io1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732340AbeITXsw (ORCPT ); Thu, 20 Sep 2018 19:48:52 -0400 Received: by mail-io1-f65.google.com with SMTP id y12-v6so8650309ioj.13 for ; Thu, 20 Sep 2018 11:04:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com; s=google; h=from:date:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=gzNArQoQm45WYjNXbVponfKrICgMkHCFqCa42GW4UMw=; b=WpSIIXzzavElwcTfqouC+O7B0/ltJqqXWf8E/ykJP/kUlFmJsOKSDUkVZBKBawWmms Xid6a8CG/VZLMNqdOpf5dL+/yYjw+xBOHkrdUDKWWwehhAY7tcDUNp91uPdgYUPdSD10 lYz3hEUGqViQAyCHc+f4DEvBNYjSKjUzpiXBM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=gzNArQoQm45WYjNXbVponfKrICgMkHCFqCa42GW4UMw=; b=LcsWhfH1YJKNRUDuzBSHSc58juyb1MuRj5tl4slfLnjbpT31ZbmEkOwifRXr4ahgyC EaqTH7jZdrI6cJQXg/ALK5T2OEZjo//hCakhxZSKGaZbbO0tkVPDl+KazSbprpQziQvX v7vWAZkdfeRPZ38NnFWsHVaajAPBkDbVK+1drG7BONcf2+/JXUPBOB1ccqd3a+qsQ/yp OUFaeql3E0rMVgJefV/a6hWSjuoRntJPfoTtBo2TKyl/Yr7bKEx7p563KVC7NcWyxKED ci5YypLK1t+bhPds5o1wvsieIJxG4L5bJp6D4F9aiEZJPWA/bb2qW6eQBqERkUMOcdOA dHkA== X-Gm-Message-State: APzg51CJ9vc4LKmOB8Lr+7fH2gpSsSX8dkY5WsXBUSYlkqngw3N1Ok3e rX70onIGVUtxmAvJU1xUgF/Z/1uLAvUbwfqiL9CRPkoGiEC7q0Th2NReVjwn6MXJskyPAy123aP xNGkVH4OLppeeaK+3zyl9IWBmUTdZjMqtzXBHaK38AwBBqHIowCgv/ND+Y7KeZw== X-Google-Smtp-Source: ANB0VdZyB+dgBH5I3P4Uie+C6zailZEO84DPHdsULbK4C1wMPQWR+93QHiav2zitIXWipLBeAS7hWw== X-Received: by 2002:a02:1643:: with SMTP id a64-v6mr36772203jaa.133.1537466650573; Thu, 20 Sep 2018 11:04:10 -0700 (PDT) Received: from localhost ([173.225.52.219]) by smtp.gmail.com with ESMTPSA id a64-v6sm1048709itg.40.2018.09.20.11.04.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Sep 2018 11:04:09 -0700 (PDT) From: Taylor Blau X-Google-Original-From: Taylor Blau Date: Thu, 20 Sep 2018 14:04:08 -0400 To: git@vger.kernel.org Cc: peff@peff.net Subject: [PATCH 1/3] transport.c: extract 'fill_alternate_refs_command' Message-ID: <6e3a58afe7cd18d663f481cdc9eb65cc941765b1.1537466087.git.me@ttaylorr.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.5 (2018-04-13) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP To list alternate references, 'read_alternate_refs' creates a child process running 'git for-each-ref' in the alternate's Git directory. Prepare to run other commands besides 'git for-each-ref' by introducing and moving the relevant code from 'read_alternate_refs' to 'fill_alternate_refs_command'. Signed-off-by: Taylor Blau --- transport.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/transport.c b/transport.c index 1c76d64aba..24ae3f375d 100644 --- a/transport.c +++ b/transport.c @@ -1325,6 +1325,17 @@ char *transport_anonymize_url(const char *url) return xstrdup(url); } +static void fill_alternate_refs_command(struct child_process *cmd, + const char *repo_path) +{ + cmd->git_cmd = 1; + argv_array_pushf(&cmd->args, "--git-dir=%s", repo_path); + argv_array_push(&cmd->args, "for-each-ref"); + argv_array_push(&cmd->args, "--format=%(objectname) %(refname)"); + cmd->env = local_repo_env; + cmd->out = -1; +} + static void read_alternate_refs(const char *path, alternate_ref_fn *cb, void *data) @@ -1333,12 +1344,7 @@ static void read_alternate_refs(const char *path, struct strbuf line = STRBUF_INIT; FILE *fh; - cmd.git_cmd = 1; - argv_array_pushf(&cmd.args, "--git-dir=%s", path); - argv_array_push(&cmd.args, "for-each-ref"); - argv_array_push(&cmd.args, "--format=%(objectname) %(refname)"); - cmd.env = local_repo_env; - cmd.out = -1; + fill_alternate_refs_command(&cmd, path); if (start_command(&cmd)) return; From patchwork Thu Sep 20 18:04:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taylor Blau X-Patchwork-Id: 10608431 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 516FC913 for ; Thu, 20 Sep 2018 18:04:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 488A22E5C7 for ; Thu, 20 Sep 2018 18:04:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3CC942E5CA; Thu, 20 Sep 2018 18:04:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2895E2E5C7 for ; Thu, 20 Sep 2018 18:04:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387922AbeITXsz (ORCPT ); Thu, 20 Sep 2018 19:48:55 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:43688 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732340AbeITXsz (ORCPT ); Thu, 20 Sep 2018 19:48:55 -0400 Received: by mail-io1-f67.google.com with SMTP id y10-v6so8661943ioa.10 for ; Thu, 20 Sep 2018 11:04:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com; s=google; h=from:date:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=VoFL34O/3WN167HWDTZOjJ7Q5jnYm70lYMA2ykoccJ4=; b=UnJSan6/rBz0TwWMrj808HHf9ZgQIlejMem+AadcOd3gwU7M/QPAchXp1ot1O002rt K0qn9HJNFUUzbUcJXGZPFSKGqPKTk+9Ov1jWaq5VfoecMLdV5nL2Wq3Qtly24zIgjYQ7 MB+/RrxNV1G1f7oOpIg5OiZrTsiHkb9J/rLng= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=VoFL34O/3WN167HWDTZOjJ7Q5jnYm70lYMA2ykoccJ4=; b=eU5t06aiFAUPfAJ+X6zzU/CdSTpWST6Rjc68aJaSjzits1hOx/fu6AiCDRpLqgV92O 26tO1pKhxWx3o7VMU9r6LLWCdKewH2gAlE76Vu31GDjTHDl6okeCX8fRlASym0M/mgpk L35cT5j+Se9QDWM3GVlAJq2VoqlPihanNoBHAZieEYf8Gp2kCirdcCcK3SXEqCvBulSM NCexRlXZUrfpDuiUvdVY/ixhwVLfYn0eHcTBZpTRJHB12TQA5WVGKchD7D+uecibrziG p3tsab8WV/Lc0+1Fnv0Eiv7rDNe1q9aUX4hYBsf0vebxU0zq7jLIYucEDPGjE8Jzk4dX v/WA== X-Gm-Message-State: APzg51ArO247zanQNG9FDi88179TONOQsoujRruhZ1FHfTzY9Ol5rAcX 5xnj7/sC7VIBrWA+jXY2FqSqrg42DrHpcHfLrKa+O8GV3uP9SdonG0EonZD102yMKcwGBpsyddN 1R5C2nTCvXnhBwhZ5NfzEC5Hh1POXbxnu4sUxtkGSadtGLz+bQwkKonjJYUmLCQ== X-Google-Smtp-Source: ANB0VdZI81F4Xso7YQsBdA/fxpbsqVeP09hvgHOyYYhTuraI5owuQyu5WSf7g/C7B0KyJ62wryMpaw== X-Received: by 2002:a24:198c:: with SMTP id b134-v6mr73019itb.125.1537466653159; Thu, 20 Sep 2018 11:04:13 -0700 (PDT) Received: from localhost ([173.225.52.219]) by smtp.gmail.com with ESMTPSA id y25-v6sm922785ita.3.2018.09.20.11.04.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Sep 2018 11:04:12 -0700 (PDT) From: Taylor Blau X-Google-Original-From: Taylor Blau Date: Thu, 20 Sep 2018 14:04:11 -0400 To: git@vger.kernel.org Cc: peff@peff.net Subject: [PATCH 2/3] transport.c: introduce core.alternateRefsCommand Message-ID: <4c4900722cab253b3ce33cb28910c4602ce44536.1537466087.git.me@ttaylorr.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.5 (2018-04-13) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When in a repository containing one or more alternates, Git would sometimes like to list references from its alternates. For example, 'git receive-pack' list the objects pointed to by alternate references as special ".have" references. Listing ".have" references is designed to make pushing changes from upstream to a fork a lightweight operation, by advertising to the pusher that the fork already has the objects (via its alternate). Thus, the client can avoid sending them. However, when the alternate has a pathologically large number of references, the initial advertisement is too expensive. In fact, it can dominate any such optimization where the pusher avoids sending certain objects. Introduce "core.alternateRefsCommand" in order to provide a facility to limit or filter alternate references. This can be used, for example, to filter out "uninteresting" references from the initial advertisement in the above scenario. Let the repository that has alternates configure this command to avoid trusting the alternate to provide us a safe command to run in the shell. To behave differently on each alternate (e.g., only list tags from alternate A, only heads from B) provide the path of the alternate as the first argument. Signed-off-by: Taylor Blau --- Documentation/config.txt | 6 +++++ t/t5410-receive-pack.sh | 47 ++++++++++++++++++++++++++++++++++++++++ transport.c | 19 ++++++++++++---- 3 files changed, 68 insertions(+), 4 deletions(-) create mode 100755 t/t5410-receive-pack.sh diff --git a/Documentation/config.txt b/Documentation/config.txt index 112041f407..b908bc5825 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -616,6 +616,12 @@ core.preferSymlinkRefs:: This is sometimes needed to work with old scripts that expect HEAD to be a symbolic link. +core.alternateRefsCommand:: + When listing references from an alternate (e.g., in the case of ".have"), use + the shell to execute the specified command instead of + linkgit:git-for-each-ref[1]. The first argument is the path of the alternate. + Output must be of the form: `%(objectname) SPC %(refname)`. + core.bare:: If true this repository is assumed to be 'bare' and has no working directory associated with it. If this is the case a diff --git a/t/t5410-receive-pack.sh b/t/t5410-receive-pack.sh new file mode 100755 index 0000000000..09fb3f39a1 --- /dev/null +++ b/t/t5410-receive-pack.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +test_description='git receive-pack test' + +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit one && + git update-ref refs/heads/a HEAD && + test_commit two && + git update-ref refs/heads/b HEAD && + test_commit three && + git update-ref refs/heads/c HEAD && + git clone --bare . fork && + git clone fork pusher && + ( + cd fork && + git config receive.advertisealternates true && + git update-ref -d refs/heads/a && + git update-ref -d refs/heads/b && + git update-ref -d refs/heads/c && + git update-ref -d refs/heads/master && + git update-ref -d refs/tags/one && + git update-ref -d refs/tags/two && + git update-ref -d refs/tags/three && + printf "../../.git/objects" >objects/info/alternates + ) +' + +extract_haves () { + depacketize - | grep -o '^.* \.have' +} + +test_expect_success 'with core.alternateRefsCommand' ' + test_config -C fork core.alternateRefsCommand \ + "git --git-dir=\"\$1\" for-each-ref \ + --format=\"%(objectname) %(refname)\" \ + refs/heads/a refs/heads/c;:" && + cat >expect <<-EOF && + $(git rev-parse a) .have + $(git rev-parse c) .have + EOF + printf "0000" | git receive-pack fork | extract_haves >actual && + test_cmp expect actual +' + +test_done diff --git a/transport.c b/transport.c index 24ae3f375d..e7d2cdf00b 100644 --- a/transport.c +++ b/transport.c @@ -1328,10 +1328,21 @@ char *transport_anonymize_url(const char *url) static void fill_alternate_refs_command(struct child_process *cmd, const char *repo_path) { - cmd->git_cmd = 1; - argv_array_pushf(&cmd->args, "--git-dir=%s", repo_path); - argv_array_push(&cmd->args, "for-each-ref"); - argv_array_push(&cmd->args, "--format=%(objectname) %(refname)"); + const char *value; + + if (!git_config_get_value("core.alternateRefsCommand", &value)) { + cmd->use_shell = 1; + + argv_array_push(&cmd->args, value); + argv_array_push(&cmd->args, repo_path); + } else { + cmd->git_cmd = 1; + + argv_array_pushf(&cmd->args, "--git-dir=%s", repo_path); + argv_array_push(&cmd->args, "for-each-ref"); + argv_array_push(&cmd->args, "--format=%(objectname) %(refname)"); + } + cmd->env = local_repo_env; cmd->out = -1; } From patchwork Thu Sep 20 18:04:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taylor Blau X-Patchwork-Id: 10608433 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 68688913 for ; Thu, 20 Sep 2018 18:04:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 60B4C2E5CA for ; Thu, 20 Sep 2018 18:04:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 553392E5CC; Thu, 20 Sep 2018 18:04:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DE0092E5CA for ; Thu, 20 Sep 2018 18:04:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387925AbeITXs5 (ORCPT ); Thu, 20 Sep 2018 19:48:57 -0400 Received: from mail-io1-f65.google.com ([209.85.166.65]:39647 "EHLO mail-io1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732340AbeITXs5 (ORCPT ); Thu, 20 Sep 2018 19:48:57 -0400 Received: by mail-io1-f65.google.com with SMTP id l7-v6so8676775iok.6 for ; Thu, 20 Sep 2018 11:04:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com; s=google; h=from:date:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=A+vGjWgxO8q2rhk97ewcoXKKj4H3RgeoDPtYlJeteug=; b=QX8LxJ1NBxXTM2DVmBMClUS4QmUZ0XtZubR7NR/xeJ7LfnNQd0k1fRYPQTVKXJUBrn BGb2cKyQnFyA8XvO5P37F8nrvkiXvd65RVJEMssV2GSQWYDuwF880aUm1SIoJ7koTYYh 0XasHY8yySI7gOLDmq1LARsOMm4s3k/QchWBY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=A+vGjWgxO8q2rhk97ewcoXKKj4H3RgeoDPtYlJeteug=; b=YRnRunC7c+YNgMqlj8JWl6dekBB+Rh6fVG0u60dt4GZLvcw4ZYtFAN1AxPUQXS0JJn +1K3VCFNuRXykmQT0jyGvdUj+YffcZfV37XPErnoIRWW6YYzgzGYjmgFZ7LVbSFB5ECf oMRHoBoGgWRZEDBMdNhvgFlOSF41r16iizS4y4SKG52ePJNbQVtDfp93UGQXjTPhIfxK V/NEWnExVRKkYC86eFGbOQTeN1WnggTuHSz+sXyd7CR8dRoLiuSXVJsYr5G1z0RXki8R Tf4wmDBnDWJxQgD5mOMrGlMU5oT5fNRI+R6QfoBD/P1A2LXQIMEUGhVknZLDtV9qGMWD YVhA== X-Gm-Message-State: APzg51AciFPcOdmFnoUGI1DmcpAD4E8jazS/v6lgOSHZ40+ktZhKwaLY EefhYJmDF5FoPH86hWjsxRxZiVoQYBbU0vGTtAJkBmYPnfKyIXNE+NhpOXC8qgdLIWUn8LrbB27 uN85Cy6KXTWmMqyXaZGwnFtm0tK8wEqI+8u2fWSpJFescOhjND4T3DEAQT5pAvQ== X-Google-Smtp-Source: ANB0VdbNo2OCNm/udmLX02XAvwpCviPjE3+cNClrxSC710jIx5XqtlmQ2IuHhKMyAQTSt2B+iJ2MiQ== X-Received: by 2002:a02:b106:: with SMTP id r6-v6mr38081647jah.115.1537466655410; Thu, 20 Sep 2018 11:04:15 -0700 (PDT) Received: from localhost ([173.225.52.219]) by smtp.gmail.com with ESMTPSA id x68-v6sm1353315ita.2.2018.09.20.11.04.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Sep 2018 11:04:14 -0700 (PDT) From: Taylor Blau X-Google-Original-From: Taylor Blau Date: Thu, 20 Sep 2018 14:04:13 -0400 To: git@vger.kernel.org Cc: peff@peff.net Subject: [PATCH 3/3] transport.c: introduce core.alternateRefsPrefixes Message-ID: <3639e9058859b326f64600fcd0b608171b56ce9f.1537466087.git.me@ttaylorr.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.5 (2018-04-13) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The recently-introduced "core.alternateRefsCommand" allows callers to specify with high flexibility the tips that they wish to advertise from alternates. This flexibility comes at the cost of some inconvenience when the caller only wishes to limit the advertisement to one or more prefixes. For example, to advertise only tags, a caller using 'core.alternateRefsCommand' would have to do: $ git config core.alternateRefsCommand ' \ git -C "$1" for-each-ref refs/tags \ --format="%(objectname) %(refname)" \ ' The above is cumbersome to write, so let's introduce a "core.alternateRefsPrefixes" to address this common case. Instead, the caller can run: $ git config core.alternateRefsPrefixes 'refs/tags' Which will behave identically to the longer example using "core.alternateRefsCommand". Since the value of "core.alternateRefsPrefixes" is appended to 'git for-each-ref' and then executed, include a "--" before taking the configured value to avoid misinterpreting arguments as flags to 'git for-each-ref'. In the case that the caller wishes to specify multiple prefixes, they may separate them by whitespace. If "core.alternateRefsCommand" is set, it will take precedence over "core.alternateRefsPrefixes". Signed-off-by: Taylor Blau --- Documentation/config.txt | 6 ++++++ t/t5410-receive-pack.sh | 11 +++++++++++ transport.c | 5 +++++ 3 files changed, 22 insertions(+) diff --git a/Documentation/config.txt b/Documentation/config.txt index b908bc5825..d768c57310 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -622,6 +622,12 @@ core.alternateRefsCommand:: linkgit:git-for-each-ref[1]. The first argument is the path of the alternate. Output must be of the form: `%(objectname) SPC %(refname)`. +core.alternateRefsPrefixes:: + When listing references from an alternate, list only references that begin + with the given prefix. To list multiple prefixes, separate them with a + whitespace character. If `core.alternateRefsCommand` is set, setting + `core.alternateRefsPrefixes` has no effect. + core.bare:: If true this repository is assumed to be 'bare' and has no working directory associated with it. If this is the case a diff --git a/t/t5410-receive-pack.sh b/t/t5410-receive-pack.sh index 09fb3f39a1..df2830e9f6 100755 --- a/t/t5410-receive-pack.sh +++ b/t/t5410-receive-pack.sh @@ -44,4 +44,15 @@ test_expect_success 'with core.alternateRefsCommand' ' test_cmp expect actual ' +test_expect_success 'with core.alternateRefsPrefixes' ' + test_config -C fork core.alternateRefsPrefixes "refs/tags" && + cat >expect <<-EOF && + $(git rev-parse one) .have + $(git rev-parse three) .have + $(git rev-parse two) .have + EOF + printf "0000" | git receive-pack fork | extract_haves >actual && + test_cmp expect actual +' + test_done diff --git a/transport.c b/transport.c index e7d2cdf00b..9323e5c3cd 100644 --- a/transport.c +++ b/transport.c @@ -1341,6 +1341,11 @@ static void fill_alternate_refs_command(struct child_process *cmd, argv_array_pushf(&cmd->args, "--git-dir=%s", repo_path); argv_array_push(&cmd->args, "for-each-ref"); argv_array_push(&cmd->args, "--format=%(objectname) %(refname)"); + + if (!git_config_get_value("core.alternateRefsPrefixes", &value)) { + argv_array_push(&cmd->args, "--"); + argv_array_split(&cmd->args, value); + } } cmd->env = local_repo_env;