v->s = xstrfmt("%lu", sz);
}
else if (deref)
- grab_objectname(name, obj->sha1, v);
+ grab_objectname(name, obj->oid.hash, v);
}
}
else if (!strcmp(name, "type") && tag->tagged)
v->s = typename(tag->tagged->type);
else if (!strcmp(name, "object") && tag->tagged)
- v->s = xstrdup(sha1_to_hex(tag->tagged->sha1));
+ v->s = xstrdup(oid_to_hex(&tag->tagged->oid));
}
}
if (deref)
name++;
if (!strcmp(name, "tree")) {
- v->s = xstrdup(sha1_to_hex(commit->tree->object.sha1));
+ v->s = xstrdup(oid_to_hex(&commit->tree->object.oid));
}
else if (!strcmp(name, "numparent")) {
v->ul = commit_list_count(commit->parents);
struct commit *parent = parents->item;
if (parents != commit->parents)
strbuf_addch(&s, ' ');
- strbuf_addstr(&s, sha1_to_hex(parent->object.sha1));
+ strbuf_addstr(&s, oid_to_hex(&parent->object.oid));
}
v->s = strbuf_detach(&s, NULL);
}
return dst;
}
+static const char *strip_ref_components(const char *refname, const char *nr_arg)
+{
+ char *end;
+ long nr = strtol(nr_arg, &end, 10);
+ long remaining = nr;
+ const char *start = refname;
+
+ if (nr < 1 || *end != '\0')
+ die(":strip= requires a positive integer argument");
+
+ while (remaining) {
+ switch (*start++) {
+ case '\0':
+ die("ref '%s' does not have %ld components to :strip",
+ refname, nr);
+ case '/':
+ remaining--;
+ break;
+ }
+ }
+ return start;
+}
+
/*
* Parse the object referred by ref, and grab needed value.
*/
continue;
} else if (match_atom_name(name, "align", &valp)) {
struct align *align = &v->u.align;
- struct strbuf **s, **to_free;
+ struct string_list params = STRING_LIST_INIT_DUP;
+ int i;
int width = -1;
if (!valp)
die(_("expected format: %%(align:<width>,<position>)"));
- /*
- * TODO: Implement a function similar to strbuf_split_str()
- * which would omit the separator from the end of each value.
- */
- s = to_free = strbuf_split_str(valp, ',', 0);
-
align->position = ALIGN_LEFT;
- while (*s) {
- /* Strip trailing comma */
- if (s[1])
- strbuf_setlen(s[0], s[0]->len - 1);
- if (!strtoul_ui(s[0]->buf, 10, (unsigned int *)&width))
+ string_list_split(¶ms, valp, ',', -1);
+ for (i = 0; i < params.nr; i++) {
+ const char *s = params.items[i].string;
+ if (!strtoul_ui(s, 10, (unsigned int *)&width))
;
- else if (!strcmp(s[0]->buf, "left"))
+ else if (!strcmp(s, "left"))
align->position = ALIGN_LEFT;
- else if (!strcmp(s[0]->buf, "right"))
+ else if (!strcmp(s, "right"))
align->position = ALIGN_RIGHT;
- else if (!strcmp(s[0]->buf, "middle"))
+ else if (!strcmp(s, "middle"))
align->position = ALIGN_MIDDLE;
else
- die(_("improper format entered align:%s"), s[0]->buf);
- s++;
+ die(_("improper format entered align:%s"), s);
}
if (width < 0)
die(_("positive width expected with the %%(align) atom"));
align->width = width;
- strbuf_list_free(to_free);
+ string_list_clear(¶ms, 0);
v->handler = align_atom_handler;
continue;
} else if (!strcmp(name, "end")) {
formatp = strchr(name, ':');
if (formatp) {
int num_ours, num_theirs;
+ const char *arg;
formatp++;
if (!strcmp(formatp, "short"))
refname = shorten_unambiguous_ref(refname,
warn_ambiguous_refs);
+ else if (skip_prefix(formatp, "strip=", &arg))
+ refname = strip_ref_components(refname, arg);
else if (!strcmp(formatp, "track") &&
(starts_with(name, "upstream") ||
starts_with(name, "push"))) {
* If it is a tag object, see if we use a value that derefs
* the object, and if we do grab the object it refers to.
*/
- tagged = ((struct tag *)obj)->tagged->sha1;
+ tagged = ((struct tag *)obj)->tagged->oid.hash;
/*
* NEEDSWORK: This derefs tag only once, which
static int in_commit_list(const struct commit_list *want, struct commit *c)
{
for (; want; want = want->next)
- if (!hashcmp(want->item->object.sha1, c->object.sha1))
+ if (!oidcmp(&want->item->object.oid, &c->object.oid))
return 1;
return 0;
}
if (!obj)
die(_("malformed object at '%s'"), refname);
if (obj->type == OBJ_TAG)
- tagged_sha1 = ((struct tag *)obj)->tagged->sha1;
+ tagged_sha1 = ((struct tag *)obj)->tagged->oid.hash;
if (tagged_sha1 && sha1_array_lookup(points_at, tagged_sha1) >= 0)
return tagged_sha1;
return NULL;
if (va->ul < vb->ul)
cmp = -1;
else if (va->ul == vb->ul)
- cmp = 0;
+ cmp = strcmp(a->refname, b->refname);
else
cmp = 1;
}