Merge branch 'jc/maint-fetch-alt'

* jc/maint-fetch-alt:
  fetch-pack: objects in our alternates are available to us
  refs_from_alternate: helper to use refs from alternates

Conflicts:
	builtin/receive-pack.c
This commit is contained in:
Junio C Hamano
2011-03-22 21:37:53 -07:00
5 changed files with 118 additions and 32 deletions

View File

@ -731,43 +731,14 @@ static int delete_only(struct command *commands)
return 1;
}
static int add_refs_from_alternate(struct alternate_object_database *e, void *unused)
static void add_one_alternate_ref(const struct ref *ref, void *unused)
{
char *other;
size_t len;
struct remote *remote;
struct transport *transport;
const struct ref *extra;
e->name[-1] = '\0';
other = xstrdup(real_path(e->base));
e->name[-1] = '/';
len = strlen(other);
while (other[len-1] == '/')
other[--len] = '\0';
if (len < 8 || memcmp(other + len - 8, "/objects", 8))
return 0;
/* Is this a git repository with refs? */
memcpy(other + len - 8, "/refs", 6);
if (!is_directory(other))
return 0;
other[len - 8] = '\0';
remote = remote_get(other);
transport = transport_get(remote, other);
for (extra = transport_get_remote_refs(transport);
extra;
extra = extra->next) {
add_extra_ref(".have", extra->old_sha1, 0);
}
transport_disconnect(transport);
free(other);
return 0;
add_extra_ref(".have", ref->old_sha1, 0);
}
static void add_alternate_refs(void)
{
foreach_alt_odb(add_refs_from_alternate, NULL);
foreach_alt_odb(refs_from_alternate_cb, add_one_alternate_ref);
}
int cmd_receive_pack(int argc, const char **argv, const char *prefix)