static void one_remote_ref(const char *refname) { struct ref *ref; struct object *obj; ref = alloc_ref(refname); if (http_fetch_ref(repo->url, ref) != 0) { fprintf(stderr, "Unable to fetch ref %s from %s\n", refname, repo->url); free(ref); return; } /* * Fetch a copy of the object if it doesn't exist locally - it * may be required for updating server info later. */ if (repo->can_update_info_refs && !has_object_file(&ref->old_oid)) { obj = lookup_unknown_object(ref->old_oid.hash); fprintf(stderr, " fetch %s for %s\n", oid_to_hex(&ref->old_oid), refname); add_fetch_request(obj); } ref->next = remote_refs; remote_refs = ref; }
static struct ref *parse_info_refs(struct discovery *heads) { char *data, *start, *mid; char *ref_name; int i = 0; struct ref *refs = NULL; struct ref *ref = NULL; struct ref *last_ref = NULL; data = heads->buf; start = NULL; mid = data; while (i < heads->len) { if (!start) { start = &data[i]; } if (data[i] == '\t') mid = &data[i]; if (data[i] == '\n') { if (mid - start != 40) die("%sinfo/refs not valid: is this a git repository?", url.buf); data[i] = 0; ref_name = mid + 1; ref = xmalloc(sizeof(struct ref) + strlen(ref_name) + 1); memset(ref, 0, sizeof(struct ref)); strcpy(ref->name, ref_name); get_sha1_hex(start, ref->old_sha1); if (!refs) refs = ref; if (last_ref) last_ref->next = ref; last_ref = ref; start = NULL; } i++; } ref = alloc_ref("HEAD"); if (!http_fetch_ref(url.buf, ref) && !resolve_remote_symref(ref, refs)) { ref->next = refs; refs = ref; } else { free(ref); } return refs; }
static void add_remote_info_ref(struct remote_ls_ctx *ls) { struct strbuf *buf = (struct strbuf *)ls->userData; struct object *o; struct ref *ref; ref = alloc_ref(ls->dentry_name); if (http_fetch_ref(repo->url, ref) != 0) { fprintf(stderr, "Unable to fetch ref %s from %s\n", ls->dentry_name, repo->url); aborted = 1; free(ref); return; } o = parse_object(&ref->old_oid); if (!o) { fprintf(stderr, "Unable to parse object %s for remote ref %s\n", oid_to_hex(&ref->old_oid), ls->dentry_name); aborted = 1; free(ref); return; } strbuf_addf(buf, "%s\t%s\n", oid_to_hex(&ref->old_oid), ls->dentry_name); if (o->type == OBJ_TAG) { o = deref_tag(o, ls->dentry_name, 0); if (o) strbuf_addf(buf, "%s\t%s^{}\n", oid_to_hex(&o->oid), ls->dentry_name); } free(ref); }
static int fetch_ref(struct walker *walker, struct ref *ref) { struct walker_data *data = walker->data; return http_fetch_ref(data->alt->base, ref); }