diff options
-rw-r--r-- | transport.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/transport.c b/transport.c index c87147046f..48864b3a9e 100644 --- a/transport.c +++ b/transport.c @@ -1206,6 +1206,42 @@ literal_copy: return xstrdup(url); } +static void read_alternate_refs(const char *path, + alternate_ref_fn *cb, + void *data) +{ + struct child_process cmd = CHILD_PROCESS_INIT; + struct strbuf line = STRBUF_INIT; + FILE *fh; + + cmd.git_cmd = 1; + argv_array_pushf(&cmd.args, "--git-dir=%s", path); + argv_array_push(&cmd.args, "for-each-ref"); + argv_array_push(&cmd.args, "--format=%(objectname) %(refname)"); + cmd.env = local_repo_env; + cmd.out = -1; + + if (start_command(&cmd)) + return; + + fh = xfdopen(cmd.out, "r"); + while (strbuf_getline_lf(&line, fh) != EOF) { + struct object_id oid; + + if (get_oid_hex(line.buf, &oid) || + line.buf[GIT_SHA1_HEXSZ] != ' ') { + warning("invalid line while parsing alternate refs: %s", + line.buf); + break; + } + + cb(line.buf + GIT_SHA1_HEXSZ + 1, &oid, data); + } + + fclose(fh); + finish_command(&cmd); +} + struct alternate_refs_data { alternate_ref_fn *fn; void *data; @@ -1216,9 +1252,6 @@ static int refs_from_alternate_cb(struct alternate_object_database *e, { struct strbuf path = STRBUF_INIT; size_t base_len; - struct remote *remote; - struct transport *transport; - const struct ref *extra; struct alternate_refs_data *cb = data; if (!strbuf_realpath(&path, e->path, 0)) @@ -1233,13 +1266,8 @@ static int refs_from_alternate_cb(struct alternate_object_database *e, goto out; strbuf_setlen(&path, base_len); - remote = remote_get(path.buf); - transport = transport_get(remote, path.buf); - for (extra = transport_get_remote_refs(transport); - extra; - extra = extra->next) - cb->fn(extra->name, &extra->old_oid, cb->data); - transport_disconnect(transport); + read_alternate_refs(path.buf, cb->fn, cb->data); + out: strbuf_release(&path); return 0; |