return show_ref(&atom->u.refname, ref->refname);
}
+static void get_object(struct ref_array_item *ref, const struct object_id *oid,
+ int deref, struct object **obj)
+{
+ int eaten;
+ unsigned long size;
+ void *buf = get_obj(oid, obj, &size, &eaten);
+ if (!buf)
+ die(_("missing object %s for %s"),
+ oid_to_hex(oid), ref->refname);
+ if (!*obj)
+ die(_("parse_object_buffer failed on %s for %s"),
+ oid_to_hex(oid), ref->refname);
+
+ grab_values(ref->value, deref, *obj, buf, size);
+ if (!eaten)
+ free(buf);
+}
+
/*
* Parse the object referred by ref, and grab needed value.
*/
static void populate_value(struct ref_array_item *ref)
{
- void *buf;
struct object *obj;
- int eaten, i;
- unsigned long size;
+ int i;
const struct object_id *tagged;
ref->value = xcalloc(used_atom_cnt, sizeof(struct atom_value));
for (i = 0; i < used_atom_cnt; i++) {
struct atom_value *v = &ref->value[i];
if (v->s == NULL)
- goto need_obj;
+ break;
}
- return;
-
- need_obj:
- buf = get_obj(&ref->objectname, &obj, &size, &eaten);
- if (!buf)
- die(_("missing object %s for %s"),
- oid_to_hex(&ref->objectname), ref->refname);
- if (!obj)
- die(_("parse_object_buffer failed on %s for %s"),
- oid_to_hex(&ref->objectname), ref->refname);
+ if (used_atom_cnt <= i)
+ return;
- grab_values(ref->value, 0, obj, buf, size);
- if (!eaten)
- free(buf);
+ get_object(ref, &ref->objectname, 0, &obj);
/*
* If there is no atom that wants to know about tagged
* is not consistent with what deref_tag() does
* which peels the onion to the core.
*/
- buf = get_obj(tagged, &obj, &size, &eaten);
- if (!buf)
- die(_("missing object %s for %s"),
- oid_to_hex(tagged), ref->refname);
- if (!obj)
- die(_("parse_object_buffer failed on %s for %s"),
- oid_to_hex(tagged), ref->refname);
- grab_values(ref->value, 1, obj, buf, size);
- if (!eaten)
- free(buf);
+ get_object(ref, tagged, 1, &obj);
}
/*
return NULL;
}
-/* Allocate space for a new ref_array_item and copy the objectname and flag to it */
+/*
+ * Allocate space for a new ref_array_item and copy the name and oid to it.
+ *
+ * Callers can then fill in other struct members at their leisure.
+ */
static struct ref_array_item *new_ref_array_item(const char *refname,
- const unsigned char *objectname,
- int flag)
+ const struct object_id *oid)
{
struct ref_array_item *ref;
+
FLEX_ALLOC_STR(ref, refname, refname);
- hashcpy(ref->objectname.hash, objectname);
- ref->flag = flag;
+ oidcpy(&ref->objectname, oid);
return ref;
}
* to do its job and the resulting list may yet to be pruned
* by maxcount logic.
*/
- ref = new_ref_array_item(refname, oid->hash, flag);
+ ref = new_ref_array_item(refname, oid);
ref->commit = commit;
+ ref->flag = flag;
+ ref->kind = kind;
REALLOC_ARRAY(ref_cbdata->array->items, ref_cbdata->array->nr + 1);
ref_cbdata->array->items[ref_cbdata->array->nr++] = ref;
- ref->kind = kind;
return 0;
}
putchar('\n');
}
-void pretty_print_ref(const char *name, const unsigned char *sha1,
+void pretty_print_ref(const char *name, const struct object_id *oid,
const struct ref_format *format)
{
struct ref_array_item *ref_item;
- ref_item = new_ref_array_item(name, sha1, 0);
+ ref_item = new_ref_array_item(name, oid);
ref_item->kind = ref_kind_from_refname(name);
show_ref_array_item(ref_item, format);
free_array_item(ref_item);