summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 23d61f8)
raw | patch | inline | side by side (parent: 23d61f8)
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | |
Fri, 28 Oct 2005 02:47:07 +0000 (04:47 +0200) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sat, 29 Oct 2005 05:56:58 +0000 (22:56 -0700) |
When git-fetch-pack gets the remote refs, it does not need to filter them
right away, but it can see which refs are common (taking advantage of the
patch which makes git-fetch-pack not use git-rev-list).
This means that we ask get_remote_heads() to return all remote refs,
including the funny refs, and filtering them with a separate function later.
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
right away, but it can see which refs are common (taking advantage of the
patch which makes git-fetch-pack not use git-rev-list).
This means that we ask get_remote_heads() to return all remote refs,
including the funny refs, and filtering them with a separate function later.
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
fetch-pack.c | patch | blob | history |
diff --git a/fetch-pack.c b/fetch-pack.c
index 3be77c3a8e76c6bc08414e9467c1dc1d0d91c6d1..b58426431f334c972ec9b508d3217fea65af0ab0 100644 (file)
--- a/fetch-pack.c
+++ b/fetch-pack.c
* reachable and we have already scanned it.
*/
if (((o = lookup_object(remote)) != NULL) &&
- (o->flags & COMPLETE)) {
- o = deref_tag(o);
-
- if (o->type == commit_type) {
- struct commit *commit = (struct commit *)o;
-
- rev_list_push(commit, COMMON_REF | SEEN);
-
- mark_common(commit, 1, 1);
- }
+ (o->flags & COMPLETE)) {
continue;
}
}
}
-static int everything_local(struct ref *refs)
+static void filter_refs(struct ref **refs, int nr_match, char **match)
+{
+ struct ref *prev, *current, *next;
+
+ if (!nr_match)
+ return;
+
+ for (prev = NULL, current = *refs; current; current = next) {
+ next = current->next;
+ if ((!memcmp(current->name, "refs/", 5) &&
+ check_ref_format(current->name + 5)) ||
+ !path_match(current->name, nr_match, match)) {
+ if (prev == NULL)
+ *refs = next;
+ else
+ prev->next = next;
+ free(current);
+ } else
+ prev = current;
+ }
+}
+
+static int everything_local(struct ref **refs, int nr_match, char **match)
{
struct ref *ref;
int retval;
track_object_refs = 0;
save_commit_buffer = 0;
- for (ref = refs; ref; ref = ref->next) {
+ for (ref = *refs; ref; ref = ref->next) {
struct object *o;
o = parse_object(ref->old_sha1);
if (cutoff)
mark_recent_complete_commits(cutoff);
- for (retval = 1; refs ; refs = refs->next) {
- const unsigned char *remote = refs->old_sha1;
+ /*
+ * Mark all complete remote refs as common refs.
+ * Don't mark them common yet; the server has to be told so first.
+ */
+ for (ref = *refs; ref; ref = ref->next) {
+ struct object *o = deref_tag(lookup_object(ref->old_sha1));
+
+ if (!o || o->type != commit_type || !(o->flags & COMPLETE))
+ continue;
+
+ if (!(o->flags & SEEN)) {
+ rev_list_push((struct commit *)o, COMMON_REF | SEEN);
+
+ mark_common((struct commit *)o, 1, 1);
+ }
+ }
+
+ filter_refs(refs, nr_match, match);
+
+ for (retval = 1, ref = *refs; ref ; ref = ref->next) {
+ const unsigned char *remote = ref->old_sha1;
unsigned char local[20];
struct object *o;
- o = parse_object(remote);
+ o = lookup_object(remote);
if (!o || !(o->flags & COMPLETE)) {
retval = 0;
if (!verbose)
continue;
fprintf(stderr,
"want %s (%s)\n", sha1_to_hex(remote),
- refs->name);
+ ref->name);
continue;
}
- memcpy(refs->new_sha1, local, 20);
+ memcpy(ref->new_sha1, local, 20);
if (!verbose)
continue;
fprintf(stderr,
"already have %s (%s)\n", sha1_to_hex(remote),
- refs->name);
+ ref->name);
}
return retval;
}
int status;
pid_t pid;
- get_remote_heads(fd[0], &ref, nr_match, match, 1);
+ get_remote_heads(fd[0], &ref, 0, NULL, 0);
if (!ref) {
packet_flush(fd[1]);
die("no matching remote head");
}
- if (everything_local(ref)) {
+ if (everything_local(&ref, nr_match, match)) {
packet_flush(fd[1]);
goto all_done;
}