#include "argv-array.h"
#include "parse-options.h"
#include "dir.h"
+#include "commit-slab.h"
static const char* show_branch_usage[] = {
N_("git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
static struct argv_array default_args = ARGV_ARRAY_INIT;
+/*
+ * TODO: convert this use of commit->object.flags to commit-slab
+ * instead to store a pointer to ref name directly. Then use the same
+ * UNINTERESTING definition from revision.h here.
+ */
#define UNINTERESTING 01
#define REV_SHIFT 2
int generation; /* how many parents away from head_name */
};
+define_commit_slab(commit_name_slab, struct commit_name *);
+static struct commit_name_slab name_slab;
+
+static struct commit_name *commit_to_name(struct commit *commit)
+{
+ return *commit_name_slab_at(&name_slab, commit);
+}
+
+
/* Name the commit as nth generation ancestor of head_name;
* we count only the first-parent relationship for naming purposes.
*/
static void name_commit(struct commit *commit, const char *head_name, int nth)
{
struct commit_name *name;
- if (!commit->util)
- commit->util = xmalloc(sizeof(struct commit_name));
- name = commit->util;
+
+ name = *commit_name_slab_at(&name_slab, commit);
+ if (!name) {
+ name = xmalloc(sizeof(*name));
+ *commit_name_slab_at(&name_slab, commit) = name;
+ }
name->head_name = head_name;
name->generation = nth;
}
*/
static void name_parent(struct commit *commit, struct commit *parent)
{
- struct commit_name *commit_name = commit->util;
- struct commit_name *parent_name = parent->util;
+ struct commit_name *commit_name = commit_to_name(commit);
+ struct commit_name *parent_name = commit_to_name(parent);
if (!commit_name)
return;
if (!parent_name ||
int i = 0;
while (c) {
struct commit *p;
- if (!c->util)
+ if (!commit_to_name(c))
break;
if (!c->parents)
break;
p = c->parents->item;
- if (!p->util) {
+ if (!commit_to_name(p)) {
name_parent(c, p);
i++;
}
/* First give names to the given heads */
for (cl = list; cl; cl = cl->next) {
c = cl->item;
- if (c->util)
+ if (commit_to_name(c))
continue;
for (i = 0; i < num_rev; i++) {
if (rev[i] == c) {
struct commit_name *n;
int nth;
c = cl->item;
- if (!c->util)
+ if (!commit_to_name(c))
continue;
- n = c->util;
+ n = commit_to_name(c);
parents = c->parents;
nth = 0;
while (parents) {
struct strbuf newname = STRBUF_INIT;
parents = parents->next;
nth++;
- if (p->util)
+ if (commit_to_name(p))
continue;
switch (n->generation) {
case 0:
{
struct strbuf pretty = STRBUF_INIT;
const char *pretty_str = "(unavailable)";
- struct commit_name *name = commit->util;
+ struct commit_name *name = commit_to_name(commit);
if (commit->object.parsed) {
pp_commit_easy(CMIT_FMT_ONELINE, commit, &pretty);
OPT_END()
};
+ init_commit_name_slab(&name_slab);
+
git_config(git_show_branch_config, NULL);
/* If nothing is specified, try the default first */