From: Jeff King <peff@peff.net>
To: Sverre Rabbelier <srabbelier@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>,
Dmitry Ivankov <divanorama@gmail.com>,
git@vger.kernel.org, Jonathan Nieder <jrnieder@gmail.com>
Subject: Re: [PATCH 3/3] clone: always fetch remote HEAD
Date: Fri, 3 Jun 2011 14:10:52 -0400 [thread overview]
Message-ID: <20110603181052.GA17538@sigill.intra.peff.net> (raw)
In-Reply-To: <BANLkTim03_3DLdDkc3QgFrcUa0Fqhhqnbw@mail.gmail.com>
On Fri, Jun 03, 2011 at 12:36:50AM -0500, Sverre Rabbelier wrote:
> On Fri, Jun 3, 2011 at 00:18, Jeff King <peff@peff.net> wrote:
> > So I guess it doesn't like us asking for HEAD. But the fact that it
> > sends weird data to fast-import instead of saying "hey, HEAD doesn't
> > exist" has me confused. I'm not sure if this is something one should not
> > be doing with remote helpers, or if the testgit helper is simply buggy
> > or incomplete.
>
> Definitely the latter, quite possibly the former. I don't know if
> asking for "HEAD" makes much sense in a remote-helper context though.
> In Mercurial it does (e.g., tip), and in svn sort of, but I don't know
> about other vcs-es. Perhaps it should be guarded by a capability?
I did some more digging. I don't think the problem is with HEAD at all,
but rather with asking for more than one ref at all.
If we want to fetch multiple refs, and the remote helper has the import
capability, we end up in transport-helper.c:fetch_with_import. This will
generate an "import %s" line for every ref we are interested in.
Meanwhile, the testgit remote helper will read each import line and call
do_import. This ends up in the git_remote_helper library's
exporter.export_repo function, which dumps fast-import data to stdout,
including some "feature" lines.
On the second import line, we have already sent some fast-import data,
but now we send more "feature" lines, which causes fast-import to
complain.
So which of the three (git's transport-helper code, the testgit remote
helper, or the remote helper library) is at fault?
Is it git itself? The fetch_with_import has to be able to ask for
multiple refs, right? Or should it simply say "import" once, and then
pick the refs it wants out of the alternate namespace?
Or is it the fault of testgit for calling exporter.export_repo twice? It
seems to ignore the ref argument it gets to import, and just dumps the
whole repo, albeit into an alternate namespace. Should we then be doing
something per-ref with the result? Or since our particular import
imports everything, should we simply ignore further imports after the
first one?
Or is it the fault of the exporter code, which should not assume it is
the first thing to generate fast-import data on stdout? I don't think
this is the case, since there would be no point to exporting again,
right? We didn't actually restrict the export to a particular ref in the
first place.
So I'm confused about who is supposed to be doing what with remote
helpers and "import". And I wasn't able to find any helpful
documentation or other examples. From reading the transport-helper code,
my guess is:
1. We send the helper a bunch of import lines, one per ref. The helper
can use that ref to generate fast-import data for just that ref. Or
it can ignore it and just import everything (like testgit does).
The result goes into an alternate namespace, like refs/testgit/.
2. Git reads the sha1 values from the alternate namespace into its
list of to-fetch refs. This puts us in the same state we would be
in for other transports (which usually fill in the sha1 earlier,
but in this case, we don't know it until the import is done).
3. Git does the usual write-out of remote sha1 values into their
matching local counterparts.
Does that make sense? If so, then I think the right fix is for testgit
ti ignore all imports after the first one (since the first one will have
done all available refs). And the patch is:
diff --git a/git-remote-testgit.py b/git-remote-testgit.py
index df9d512..7330753 100644
--- a/git-remote-testgit.py
+++ b/git-remote-testgit.py
@@ -111,13 +111,19 @@ def update_local_repo(repo):
return repo
+did_import = False
def do_import(repo, args):
"""Exports a fast-import stream from testgit for git to import.
"""
+ global did_import
if len(args) != 1:
die("Import needs exactly one ref")
+ if did_import:
+ return
+ did_import = True
+
if not repo.gitdir:
die("Need gitdir to import")
-Peff
next prev parent reply other threads:[~2011-06-03 18:11 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-01 21:30 git clone (ssh://) skips detached HEAD Dmitry Ivankov
2011-06-01 22:05 ` Jeff King
2011-06-01 22:18 ` Dmitry Ivankov
2011-06-01 22:22 ` Junio C Hamano
2011-06-01 22:47 ` Jeff King
2011-06-01 22:53 ` Jeff King
2011-06-03 5:09 ` Jeff King
2011-06-03 5:10 ` [PATCH 1/3] t: add tests for cloning remotes with " Jeff King
2011-06-03 5:11 ` [PATCH 2/3] consider only branches in guess_remote_head Jeff King
2011-06-03 5:18 ` [PATCH 3/3] clone: always fetch remote HEAD Jeff King
2011-06-03 5:36 ` Sverre Rabbelier
2011-06-03 5:43 ` Jeff King
2011-06-03 14:51 ` Jeff King
2011-06-03 16:28 ` Junio C Hamano
2011-06-03 18:10 ` Jeff King [this message]
2011-06-04 1:50 ` Sverre Rabbelier
2011-06-06 16:08 ` Jeff King
2011-06-06 0:47 ` Junio C Hamano
2011-06-06 1:00 ` Junio C Hamano
2011-06-06 13:05 ` Sverre Rabbelier
2011-06-06 13:57 ` Junio C Hamano
2011-06-06 16:11 ` Jeff King
2011-06-06 19:05 ` Sverre Rabbelier
2011-06-07 17:10 ` Jeff King
2011-06-07 17:20 ` Sverre Rabbelier
2011-06-07 17:18 ` [PATCH 0/8] minor import/export remote helper fixes Jeff King
2011-06-07 17:19 ` [PATCH 1/8] transport-helper: fix minor leak in push_refs_with_export Jeff King
2011-06-07 17:19 ` [PATCH 2/8] git-remote-testgit: exit gracefully after push Jeff King
2011-06-07 17:48 ` Sverre Rabbelier
2011-06-07 17:20 ` [PATCH 3/8] t5800: factor out some ref tests Jeff King
2011-06-07 17:22 ` Sverre Rabbelier
2011-06-07 17:20 ` [PATCH 4/8] t5800: document some non-functional parts of remote helpers Jeff King
2011-06-07 17:25 ` Sverre Rabbelier
2011-06-07 17:28 ` Jeff King
2011-06-07 17:34 ` Sverre Rabbelier
2011-06-07 17:51 ` Jeff King
2011-06-07 17:53 ` Sverre Rabbelier
2011-06-07 17:55 ` Jeff King
2011-06-08 23:19 ` Junio C Hamano
2011-06-09 0:11 ` Jeff King
2011-06-09 0:43 ` Junio C Hamano
2011-06-09 0:45 ` Jeff King
2011-06-09 6:20 ` Sverre Rabbelier
2011-06-07 17:20 ` [PATCH 5/8] teach remote-testgit to import non-HEAD refs Jeff King
2011-06-08 23:21 ` Junio C Hamano
2011-06-09 0:17 ` Jeff King
2011-06-07 17:21 ` [PATCH 6/8] teach remote-testgit to import multiple refs Jeff King
2011-06-07 17:21 ` [PATCH 7/8] transport-helper: don't feed bogus refs to export push Jeff King
2011-06-07 17:31 ` Sverre Rabbelier
2011-06-07 17:21 ` [PATCH 8/8] git_remote_helpers: push all refs during a non-local export Jeff King
2011-06-07 17:32 ` Sverre Rabbelier
2011-06-07 17:42 ` Jeff King
2011-06-07 17:44 ` Sverre Rabbelier
2011-06-06 20:31 ` [PATCH 3/3] clone: always fetch remote HEAD Junio C Hamano
2011-06-06 22:08 ` Jeff King
2011-06-07 23:01 ` Jeff King
2011-06-07 23:03 ` [PATCH 1/2] make copy_ref globally available Jeff King
2011-06-07 23:03 ` [PATCH 2/2] clone: always fetch remote HEAD Jeff King
2011-06-07 23:18 ` [PATCH 3/3] " Junio C Hamano
2011-06-03 16:11 ` git clone (ssh://) skips detached HEAD Junio C Hamano
2011-06-03 18:48 ` Jeff King
2011-06-01 22:42 ` Jakub Narebski
2011-06-01 22:51 ` Jeff King
2011-06-02 20:02 ` Jakub Narebski
2011-06-03 2:52 ` Jeff King
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110603181052.GA17538@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=divanorama@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=srabbelier@gmail.com \
/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.
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 NNTP newsgroup(s).