X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=transport.c;h=a02f79aae3d91ea4109d21a9ed9ca2d962125375;hb=02a481fc6aef5d8a52f900448657d1cbe7c963ef;hp=f1c07816e01bb0b1ad93d7665b1374e8cd36e6cb;hpb=785d6989dac6a61eabdc06c781ee0f47d10f36c0;p=git.git diff --git a/transport.c b/transport.c index f1c07816e..a02f79aae 100644 --- a/transport.c +++ b/transport.c @@ -1189,3 +1189,37 @@ char *transport_anonymize_url(const char *url) 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(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; +}