From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Dmitry Ivankov <divanorama@gmail.com>,
git@vger.kernel.org, Sverre Rabbelier <srabbelier@gmail.com>,
Jonathan Nieder <jrnieder@gmail.com>
Subject: [PATCH 3/3] clone: always fetch remote HEAD
Date: Fri, 3 Jun 2011 01:18:05 -0400 [thread overview]
Message-ID: <20110603051805.GC1008@sigill.intra.peff.net> (raw)
In-Reply-To: <20110603050901.GA883@sigill.intra.peff.net>
In most cases, fetching the remote HEAD explicitly is
unnecessary. It's just a symref pointing to a branch which
we are already fetching, so we will already ask for its sha1.
However, if the remote has a detached HEAD, things are less
certain. We do not ask for HEAD's sha1, but we do try to
write it into a local detached HEAD. In most cases this is
fine, as the remote HEAD is pointing to some part of the
history graph that we will fetch via the refs.
But if the remote HEAD points to an "orphan" commit (one
which was is not an ancestor of any refs), then we will not
have the object, and update_ref will complain when we try to
write the detached HEAD, aborting the whole clone.
This patch makes clone always explicitly ask the remote for
the sha1 of its HEAD commit. In the non-detached case, this
is a no-op, as we were going to ask for that sha1 anyway. In
the regular detached case, this will add an extra "want" to
the protocol negotiation, but will not change the history
that gets sent. And in the detached orphan case, we will
fetch the orphaned history so that we can write it into our
local detached HEAD.
Signed-off-by: Jeff King <peff@peff.net>
---
[+cc Sverre and Jonathan for remote-helper advice]
This fails t5800, with:
expecting success:
git clone "testgit::${PWD}/server" localclone &&
test_cmp public/file localclone/file
Cloning into localclone...
fatal: Got feature command 'relative-marks' after data command
fast-import: dumping crash report to ...
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.
builtin/clone.c | 10 +++++++---
t/t5707-clone-detached.sh | 6 +++---
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index f579794..a99f1c8 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -343,8 +343,9 @@ static void remove_junk_on_signal(int signo)
static struct ref *wanted_peer_refs(const struct ref *refs,
struct refspec *refspec)
{
- struct ref *local_refs = NULL;
- struct ref **tail = &local_refs;
+ struct ref *head = get_remote_ref(refs, "HEAD");
+ struct ref *local_refs = head;
+ struct ref **tail = head ? &head->next : &local_refs;
get_fetch_map(refs, refspec, &tail, 0);
if (!option_mirror)
@@ -357,8 +358,11 @@ static void write_remote_refs(const struct ref *local_refs)
{
const struct ref *r;
- for (r = local_refs; r; r = r->next)
+ for (r = local_refs; r; r = r->next) {
+ if (!r->peer_ref)
+ continue;
add_extra_ref(r->peer_ref->name, r->old_sha1, 0);
+ }
pack_refs(PACK_REFS_ALL);
clear_extra_refs();
diff --git a/t/t5707-clone-detached.sh b/t/t5707-clone-detached.sh
index db4af95..82ecbce 100755
--- a/t/t5707-clone-detached.sh
+++ b/t/t5707-clone-detached.sh
@@ -58,18 +58,18 @@ test_expect_success 'cloned HEAD is detached' '
head_is_detached detached-history
'
-test_expect_failure 'clone repo (orphan detached HEAD)' '
+test_expect_success 'clone repo (orphan detached HEAD)' '
git checkout --detach master &&
echo four >file &&
git commit -a -m four &&
git clone "file://$PWD" detached-orphan
'
-test_expect_failure 'cloned HEAD matches' '
+test_expect_success 'cloned HEAD matches' '
echo four >expect &&
git --git-dir=detached-orphan/.git log -1 --format=%s >actual &&
test_cmp expect actual
'
-test_expect_failure 'cloned HEAD is detached' '
+test_expect_success 'cloned HEAD is detached' '
head_is_detached detached-orphan
'
--
1.7.6.rc0.36.g5a0d
next prev parent reply other threads:[~2011-06-03 5:18 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 ` Jeff King [this message]
2011-06-03 5:36 ` [PATCH 3/3] clone: always fetch remote HEAD 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
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=20110603051805.GC1008@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).