From: Kirill Smelkov <kirr@nexedi.com>
To: Junio C Hamano <gitster@pobox.com>, Jeff King <peff@peff.net>
Cc: Eric Sunshine <sunshine@sunshineco.com>,
Jonathan Tan <jonathantanmy@google.com>,
Brandon Williams <bmwill@google.com>,
Takuto Ikuta <tikuta@chromium.org>,
Jeff Hostetler <jeffhost@microsoft.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Michael Haggerty <mhagger@alum.mit.edu>,
Git List <git@vger.kernel.org>
Subject: [PATCH] fetch-pack: demonstrate --all failure when remote is empty
Date: Wed, 13 Jun 2018 12:55:53 +0000 [thread overview]
Message-ID: <20180613125549.4mshuymvdpwh44qk@deco.navytux.spb.ru> (raw)
In-Reply-To: <20180612185413.GA21856@deco.navytux.spb.ru>
( Junio, please pick up the patch provided in the end )
On Tue, Jun 12, 2018 at 06:54:17PM +0000, Kirill Smelkov wrote:
> On Tue, Jun 12, 2018 at 05:48:49AM -0400, Jeff King wrote:
> > On Mon, Jun 11, 2018 at 09:43:02AM +0000, Kirill Smelkov wrote:
[...]
> > > I'm not sure, but I would say that `fetch-pack --all` from an empty
> > > repository should not fail and should just give empty output as fetch
> > > does.
> >
> > Yeah, that seems reasonable to me. The die() that catches this dates
> > back to 2005-era, and we later taught the "fetch" porcelain to handle
> > this. I don't _think_ anybody would be upset that the plumbing learned
> > to treat this as a noop. It's probably a one-liner change in
> > fetch_pack() to return early instead of dying.
>
> Ok, I will try to send related testcase, and it is indeed easy to find
> - the fix itself.
I started doing it in full with the following
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -1581,6 +1581,8 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
if (!ref) {
packet_flush(fd[1]);
+ if (nr_sought == 0) // XXX or better args->fetch_all
+ return NULL; /* nothing to fetch */
die(_("no matching remote head"));
}
prepare_shallow_info(&si, shallow);
but then came to the fact that !ref fetch_pack() return is analyzed in 2
places:
- in builtin/fetch-pack.c itself:
ref = fetch_pack(&args, fd, conn, ref, dest, sought, nr_sought,
&shallow, pack_lockfile_ptr, protocol_v0);
...
ret = !ref;
- and in transport.c in fetch_refs_via_pack():
case protocol_v1:
case protocol_v0:
refs = fetch_pack(&args, data->fd, data->conn,
refs_tmp ? refs_tmp : transport->remote_refs,
dest, to_fetch, nr_heads, &data->shallow,
&transport->pack_lockfile, data->version);
break;
...
if (refs == NULL)
ret = -1;
As I don't know git codebase well-enough I don't see offhand how to
distinguish empty result from a real error when something was requested
and not fetched. If it would be only builtin/fetch-pack I could start to
play ugly games with analyzing too in the calling site args.fetch_all
and nr_though and if at that level we also know we requested nothing,
don't treat !refs as an error.
However with transport.c being there too, since I'm no longer using
`fetch-pack --all`, now it is best for me to not delve into this story
and just stop with attached patch.
Thanks,
Kirill
---- 8< ----
From 76d80ffcfd4574715545c62413d64d40af063d09 Mon Sep 17 00:00:00 2001
From: Kirill Smelkov <kirr@nexedi.com>
Date: Wed, 13 Jun 2018 15:46:00 +0300
Subject: [PATCH] fetch-pack: demonstrate --all failure when remote is empty
Currently `fetch-pack --all` from an empty repository gives:
fatal: no matching remote head
However it would be logical for this fetch operation to succeed with
empty result. Add test showing the failure.
Signed-off-by: Kirill Smelkov <kirr@nexedi.com>
---
t/t5500-fetch-pack.sh | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index 82aee1c2d8..2234bad411 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -528,6 +528,14 @@ test_expect_success 'test --all with tag to non-tip' '
)
'
+test_expect_failure 'test --all wrt empty.git' '
+ git init --bare empty.git &&
+ (
+ cd client &&
+ git fetch-pack --all ../empty.git
+ )
+'
+
test_expect_success 'shallow fetch with tags does not break the repository' '
mkdir repo1 &&
(
--
2.18.0.rc1.253.gf85a566b11.dirty
next prev parent reply other threads:[~2018-06-13 13:10 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-10 14:32 [PATCH] fetch-pack: demonstrate --all breakage when remote have tags to non-commit objects Kirill Smelkov
2018-06-11 4:20 ` Jeff King
2018-06-11 4:47 ` [PATCH] fetch-pack: don't try to fetch peeled values with --all Jeff King
2018-06-11 5:28 ` Eric Sunshine
2018-06-11 5:53 ` [PATCH v2] fetch-pack: don't try to fetch peel " Jeff King
2018-06-11 9:43 ` Kirill Smelkov
2018-06-12 9:48 ` Jeff King
2018-06-12 18:54 ` Kirill Smelkov
2018-06-13 11:18 ` [PATCH] fetch-pack: test explicitly that --all can fetch tag references pointing to non-commits Kirill Smelkov
2018-06-13 17:42 ` Junio C Hamano
2018-06-13 18:43 ` Kirill Smelkov
2018-06-13 21:05 ` Jeff King
2018-06-13 23:11 ` Jeff King
2018-06-14 5:25 ` Kirill Smelkov
2018-06-14 16:07 ` Junio C Hamano
2018-06-14 17:51 ` Kirill Smelkov
2018-06-13 12:55 ` Kirill Smelkov [this message]
2018-06-13 17:13 ` [PATCH] fetch-pack: demonstrate --all failure when remote is empty Junio C Hamano
2018-06-13 18:21 ` Kirill Smelkov
2018-06-13 21:13 ` [PATCH v2] fetch-pack: don't try to fetch peel values with --all Jeff King
2018-06-14 5:29 ` Kirill Smelkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180613125549.4mshuymvdpwh44qk@deco.navytux.spb.ru \
--to=kirr@nexedi.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jeffhost@microsoft.com \
--cc=jonathantanmy@google.com \
--cc=mhagger@alum.mit.edu \
--cc=peff@peff.net \
--cc=sunshine@sunshineco.com \
--cc=tikuta@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).