if (atom->u.remote_ref.option == RR_REF)
*s = show_ref(&atom->u.remote_ref.refname, refname);
else if (atom->u.remote_ref.option == RR_TRACK) {
- if (stat_tracking_info(branch, &num_ours,
- &num_theirs, NULL)) {
+ if (stat_tracking_info(branch, &num_ours, &num_theirs,
+ NULL, AHEAD_BEHIND_FULL) < 0) {
*s = xstrdup(msgs.gone);
} else if (!num_ours && !num_theirs)
*s = "";
free((void *)to_free);
}
} else if (atom->u.remote_ref.option == RR_TRACKSHORT) {
- if (stat_tracking_info(branch, &num_ours,
- &num_theirs, NULL))
+ if (stat_tracking_info(branch, &num_ours, &num_theirs,
+ NULL, AHEAD_BEHIND_FULL) < 0)
return;
if (!num_ours && !num_theirs)
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);
}
/*