show-branch: use commit-slab for commit-name instead of commit->util

It's done so that commit->util can be removed. See more explanation in
the commit that removes commit->util.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2018-05-19 07:28:27 +02:00 коммит произвёл Junio C Hamano
Родитель 8fd79a7304
Коммит 60855a5343
1 изменённых файлов: 27 добавлений и 12 удалений

Просмотреть файл

@ -7,6 +7,7 @@
#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"
@ -59,15 +60,27 @@ struct commit_name {
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;
}
@ -79,8 +92,8 @@ static void name_commit(struct commit *commit, const char *head_name, int 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 ||
@ -94,12 +107,12 @@ static int name_first_parent_chain(struct commit *c)
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++;
}
@ -122,7 +135,7 @@ static void name_commits(struct commit_list *list,
/* 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) {
@ -148,9 +161,9 @@ static void name_commits(struct commit_list *list,
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) {
@ -158,7 +171,7 @@ static void name_commits(struct commit_list *list,
struct strbuf newname = STRBUF_INIT;
parents = parents->next;
nth++;
if (p->util)
if (commit_to_name(p))
continue;
switch (n->generation) {
case 0:
@ -271,7 +284,7 @@ static void show_one_commit(struct commit *commit, int no_name)
{
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);
@ -660,6 +673,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
OPT_END()
};
init_commit_name_slab(&name_slab);
git_config(git_show_branch_config, NULL);
/* If nothing is specified, try the default first */