From: Johan Herland <johan@herland.net>
To: Daniel Barkalow <barkalow@iabervon.org>
Cc: git@vger.kernel.org, "Kristian Høgsberg" <krh@redhat.com>,
"Santi Béjar" <sbejar@gmail.com>
Subject: Re: [RFC] Build in clone
Date: Tue, 26 Feb 2008 03:21:13 +0100 [thread overview]
Message-ID: <200802260321.14038.johan@herland.net> (raw)
In-Reply-To: <alpine.LNX.1.00.0802251604460.19024@iabervon.org>
On Monday 25 February 2008, Daniel Barkalow wrote:
> This version is still a mess, but it passes all of the tests.
Not for me:
*** t5700-clone-reference.sh ***
* ok 1: preparing first repository
* ok 2: preparing second repository
* FAIL 3: cloning with reference (-l -s)
git clone -l -s --reference B A C
* ok 4: existence of info/alternates
* ok 5: pulling from reference
* ok 6: that reference gets used
* FAIL 7: cloning with reference (no -l -s)
git clone --reference B file://`pwd`/A D
* ok 8: existence of info/alternates
* ok 9: pulling from reference
* ok 10: that reference gets used
* ok 11: updating origin
* ok 12: pulling changes from origin
* ok 13: that alternate to origin gets used
* ok 14: pulling changes from origin
* ok 15: check objects expected to exist locally
* failed 2 among 15 test(s)
make[1]: *** [t5700-clone-reference.sh] Error 1
> I'm somewhat unconvinced by the test ccoverage for clone, however; the
> last failure I found was actually for which heads get created in a
> bare repository, and it was only failing when there was an extra one
> in a non-bare clone in a test for something entirely different.
>
> This is largely based on Kristian Høgsberg's version from December, but
> the introduced warnings and two whitespace errors I haven't located are
> mine.
>
> I'm still working on getting it cleaned up, but I thought it would be good
> to get it some exposure and testing, since people have been talking about
> builtin-clone today.
Other than the failing tests, it seems to work fairly well. I've been
playing around with it for a few minutes, and on a test repo I have with
1001 branches and 10000 tags, it cuts down the runtime of a local git-clone
from 25 seconds to ~1.5 seconds. (simply by eliminating the overhead of
invoking git-update-ref for every single ref) :)
I've tried to test this by diffing a cloned repo against an equivalent
clone done by the old script. Below I pasted in a few immediate fixes I
found. With these fixes, the only remaining diff between the clones is
that refs/remotes/origin/HEAD used to be a symbolic ref (with no reflog),
but is now a "regular" ref (with reflog).
The fixes are, in order of importance:
- Call git_config(git_default_config) in order to properly set up
user.name and user.email for reflogs (This BREAKS test #9 in
t1020-subdirectory.sh. Have yet to figure out why)
- Fix "clone from $repo" reflog messages (using strbufs; something tells
me more of this code would benefit from using strbufs)
- Høgsberg's name should be in UTF-8 (not sure if this will survive this
mail)
- The two whitespace errors you mentioned
I'm sorry that my patch below sucks from a style POV. Feel free to ignore.
Will redo when it's not in the middle of the night.
Have fun! :)
...Johan
-8<----------------8<---------------------8<-
[PATCH] WIP: Minor fixes on top of builtin-clone
Signed-off-by: Johan Herland <johan@herland.net>
---
builtin-clone.c | 19 +++++++++++++------
1 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/builtin-clone.c b/builtin-clone.c
index 5aa75e1..7eed340 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -1,7 +1,7 @@
/*
* Builtin "git clone"
*
- * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
+ * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
* Based on git-commit.sh by Junio C Hamano and Linus Torvalds
*
* Clone a repository into a different directory that does not yet exist.
@@ -79,7 +79,7 @@ static char *get_repo_path(const char *repo)
if (!stat(repo, &buf) && S_ISDIR(buf.st_mode))
return xstrdup(make_absolute_path(repo));
-
+
return NULL;
}
@@ -347,6 +347,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
char *path, *dir, *head, *ref_temp;
struct ref *refs, *r, *remote_head, *head_points_at, *remote_master;
char branch_top[256], key[256], refname[256], value[256];
+ struct strbuf reflog_msg;
+
+ git_config(git_default_config);
clone_pid = getpid();
@@ -459,6 +462,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
snprintf(branch_top, sizeof branch_top,
"refs/remotes/%s", option_origin);
+ strbuf_init(&reflog_msg, strlen(repo) + 12);
+ strbuf_addf(&reflog_msg, "clone: from %s", repo);
+
printf("%p\n", refs);
remote_head = NULL;
remote_master = NULL;
@@ -487,7 +493,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
continue;
}
- update_ref("clone from $repo",
+ update_ref(reflog_msg.buf,
refname, r->old_sha1, NULL, 0, DIE_ON_ERR);
}
@@ -495,7 +501,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
if (!remote_head) {
/* If there isn't one, oh well. */
} else if (remote_master && !hashcmp(remote_master->old_sha1,
- remote_head->old_sha1)) {
+ remote_head->old_sha1)) {
/* If refs/heads/master could be right, it is. */
head_points_at = remote_master;
} else
@@ -552,7 +558,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
git_config_set(key, head_points_at->name);
} else if (remote_head) {
/* Source had detached HEAD pointing somewhere. */
- update_ref("clone from $repo", "HEAD", remote_head->old_sha1,
+ update_ref(reflog_msg.buf, "HEAD", remote_head->old_sha1,
NULL, REF_NODEREF, DIE_ON_ERR);
} else {
/* Nothing to checkout out */
@@ -591,7 +597,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
commit_locked_index(&lock_file))
die("unable to write new index file");
}
-
+
+ strbuf_release(&reflog_msg);
junk_work_tree = NULL;
junk_git_dir = NULL;
return 0;
--
1.5.4.3.328.gcaed
next prev parent reply other threads:[~2008-02-26 2:22 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-25 21:12 [RFC] Build in clone Daniel Barkalow
2008-02-26 2:21 ` Johan Herland [this message]
2008-02-26 11:14 ` Johannes Schindelin
2008-02-26 12:19 ` Johan Herland
2008-02-26 12:58 ` Johan Herland
2008-02-26 13:37 ` Johan Herland
2008-02-26 15:35 ` [PATCH] Fix premature free of ref_lists while writing temporary refs to file Johan Herland
2008-02-26 15:42 ` Johannes Schindelin
2008-02-26 17:17 ` Johan Herland
2008-02-26 23:07 ` Daniel Barkalow
2008-02-26 23:11 ` Johan Herland
2008-02-26 15:40 ` [PATCH] Fix premature call to git_config() causing t1020-subdirectory to fail Johan Herland
2008-02-26 15:47 ` Johannes Schindelin
2008-02-26 22:12 ` Daniel Barkalow
2008-02-26 22:40 ` Johannes Schindelin
2008-02-26 22:49 ` Daniel Barkalow
2008-02-27 0:20 ` Junio C Hamano
2008-02-27 0:53 ` Daniel Barkalow
2008-02-27 1:34 ` Junio C Hamano
2008-02-27 19:47 ` Daniel Barkalow
2008-02-27 20:09 ` Junio C Hamano
2008-02-27 20:31 ` Daniel Barkalow
2008-02-26 17:36 ` [RFC] Build in clone Daniel Barkalow
2008-02-26 18:53 ` Kristian Høgsberg
2008-03-02 5:57 ` [PATCH] builtin-clone: create remotes/origin/HEAD symref, if guessed Johannes Schindelin
2008-03-02 6:25 ` [PATCH, fixed] " Johannes Schindelin
2008-03-02 7:46 ` [PATCH] builtin clone: support bundles Johannes Schindelin
2008-03-02 16:19 ` Daniel Barkalow
2008-03-03 0:04 ` Santi Béjar
2008-03-02 16:48 ` Daniel Barkalow
2008-03-02 17:34 ` Johannes Schindelin
2008-03-02 17:50 ` Junio C Hamano
2008-03-02 17:54 ` Junio C Hamano
2008-03-03 9:04 ` [PATCH] Add test for cloning with "--reference" repo being a subset of source repo Johan Herland
2008-03-03 16:36 ` Daniel Barkalow
2008-03-03 18:21 ` Daniel Barkalow
2008-03-04 3:02 ` Johan Herland
2008-03-04 3:04 ` [PATCH 1/2] Add test illustrating issues with sha1_file_name() and switching repos Johan Herland
2008-03-04 3:05 ` [PATCH 2/2] Overly simplistic fix for issue " Johan Herland
2008-03-04 23:10 ` [PATCH] Add test for cloning with "--reference" repo being a subset of source repo Daniel Barkalow
2008-03-05 0:24 ` Daniel Barkalow
2008-03-05 23:56 ` Johan Herland
2008-03-03 17:05 ` [PATCH, fixed] builtin-clone: create remotes/origin/HEAD symref, if guessed Kristian Høgsberg
2008-03-03 17:09 ` Pierre Habouzit
2008-03-03 19:55 ` Johannes Schindelin
2008-03-03 17:10 ` Johannes Schindelin
2008-03-03 17:41 ` Johan Herland
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=200802260321.14038.johan@herland.net \
--to=johan@herland.net \
--cc=barkalow@iabervon.org \
--cc=git@vger.kernel.org \
--cc=krh@redhat.com \
--cc=sbejar@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.