From: Junio C Hamano Date: Wed, 23 Mar 2011 04:37:53 +0000 (-0700) Subject: Merge branch 'jc/maint-fetch-alt' X-Git-Tag: v1.7.5-rc0~44 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=91b3c7ce8e189b90d3203265c9625806a15045e1;p=git.git 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 --- 91b3c7ce8e189b90d3203265c9625806a15045e1 diff --cc transport.c index f1c07816e,3dfbc6a79..a02f79aae --- a/transport.c +++ b/transport.c @@@ -1189,3 -1189,37 +1189,37 @@@ char *transport_anonymize_url(const cha literal_copy: return xstrdup(url); } + + int refs_from_alternate_cb(struct alternate_object_database *e, void *cb) + { + char *other; + size_t len; + struct remote *remote; + struct transport *transport; + const struct ref *extra; + alternate_ref_fn *ref_fn = cb; + + e->name[-1] = '\0'; - other = xstrdup(make_absolute_path(e->base)); ++ 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) + ref_fn(extra, NULL); + transport_disconnect(transport); + free(other); + return 0; + }