git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Dmitry Ivankov <divanorama@gmail.com>, git@vger.kernel.org
Subject: Re: git clone (ssh://) skips detached HEAD
Date: Wed, 1 Jun 2011 18:47:54 -0400	[thread overview]
Message-ID: <20110601224754.GA16820@sigill.intra.peff.net> (raw)
In-Reply-To: <7vipspfazy.fsf@alter.siamese.dyndns.org>

On Wed, Jun 01, 2011 at 03:22:09PM -0700, Junio C Hamano wrote:

> > We basically have two choices:
> >
> >   1. Fetch objects for HEAD on clone.
> >
> >   2. Don't checkout a detached HEAD if we don't have the object (or
> >      possibly, don't checkout a detached HEAD at all; we already do
> >      something similar for the case of a HEAD that points to a bogus
> >      branch).
> >
> > I think (2) is more consistent with the refspec we set up, but (1) is
> > probably more convenient to users (and better matches the case where the
> > remote is on a detached HEAD that _does_ point to something we have).
> 
> Probably. As HEAD is usually visible via ls-remote exchange, the usual
> security concern would not come into the picture even if we do (1), even
> though it feels somewhat wrong to do.

Yeah, one can always just do:

  git fetch origin HEAD && git checkout FETCH_HEAD

immediately afterwards. But I think given that we make some effort to
propagate detached-ness across a clone in cases where we can, we should
just do the fetch.

I wrote some tests that document what I think _should_ happen. In
addition to this bug, there's one other (the second in my list below).

I'm done for the day, but may take a look at actually fixing these
tomorrow.

-- >8 --
Subject: [PATCH] t: add tests for cloning remotes with detached HEAD

We didn't test this setup at all, and doing so reveals a few
bugs:

  1. Cloning a repository with an orphaned detached HEAD
     (i.e., one that points to history that is not
     referenced by any ref) will fail.

  2. Cloning a repository with a detached HEAD that points
     to a tag will cause us to write a bogus "refs/tags/..."
     ref into the HEAD symbolic ref. We should probably
     detach instead.

  3. Cloning a repository with a detached HEAD that points
     to a branch will cause us to checkout that branch. This
     is a known limitation of the git protocol (we have to
     guess at HEAD's destination, since the symref contents
     aren't shown to us). This test serves to document the
     desired behavior, which can only be achieved once the
     git protocol learns to share symref information.

Signed-off-by: Jeff King <peff@peff.net>
---
 t/t5707-clone-detached.sh |   76 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 0 deletions(-)
 create mode 100755 t/t5707-clone-detached.sh

diff --git a/t/t5707-clone-detached.sh b/t/t5707-clone-detached.sh
new file mode 100755
index 0000000..fca8609
--- /dev/null
+++ b/t/t5707-clone-detached.sh
@@ -0,0 +1,76 @@
+#!/bin/sh
+
+test_description='test cloning a repository with detached HEAD'
+. ./test-lib.sh
+
+head_is_detached() {
+	git --git-dir=$1/.git rev-parse --verify HEAD &&
+	test_must_fail git --git-dir=$1/.git symbolic-ref HEAD
+}
+
+test_expect_success 'setup' '
+	echo one >file &&
+	git add file &&
+	git commit -m one &&
+	echo two >file &&
+	git commit -a -m two &&
+	git tag two &&
+	echo three >file &&
+	git commit -a -m three
+'
+
+test_expect_success 'clone repo (detached HEAD points to branch)' '
+	git checkout --detach master &&
+	git clone "file://$PWD" detached-branch
+'
+test_expect_success 'cloned HEAD matches' '
+	echo three >expect &&
+	git --git-dir=detached-branch/.git log -1 --format=%s >actual &&
+	test_cmp expect actual
+'
+test_expect_failure 'cloned HEAD is detached' '
+	head_is_detached detached-branch
+'
+
+test_expect_success 'clone repo (detached HEAD points to tag)' '
+	git checkout --detach two &&
+	git clone "file://$PWD" detached-tag
+'
+test_expect_success 'cloned HEAD matches' '
+	echo two >expect &&
+	git --git-dir=detached-tag/.git log -1 --format=%s >actual &&
+	test_cmp expect actual
+'
+test_expect_failure 'cloned HEAD is detached' '
+	head_is_detached detached-tag
+'
+
+test_expect_success 'clone repo (detached HEAD points to history)' '
+	git checkout --detach two^ &&
+	git clone "file://$PWD" detached-history
+'
+test_expect_success 'cloned HEAD matches' '
+	echo one >expect &&
+	git --git-dir=detached-history/.git log -1 --format=%s >actual &&
+	test_cmp expect actual
+'
+test_expect_success 'cloned HEAD is detached' '
+	head_is_detached detached-history
+'
+
+test_expect_failure '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' '
+	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' '
+	head_is_detached detached-orphan
+'
+
+test_done
-- 
1.7.4.4.23.g5df3c

  reply	other threads:[~2011-06-01 22:48 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 [this message]
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
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=20110601224754.GA16820@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=divanorama@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.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).