summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--transport.c48
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;