/* Parent is the first parent of the commit. We may name it * as (n+1)th generation ancestor of the same head_name as * commit is nth generation ancestor of, if that generation * number is better than the name it already has. */ static void name_parent(struct commit *commit, struct commit *parent) { struct commit_name *commit_name = commit->util; struct commit_name *parent_name = parent->util; if (!commit_name) return; if (!parent_name || commit_name->generation + 1 < parent_name->generation) name_commit(parent, commit_name->head_name, commit_name->generation + 1); }
static void name_commits(struct commit_list *list, struct commit **rev, char **ref_name, int num_rev) { struct commit_list *cl; struct commit *c; int i; /* First give names to the given heads */ for (cl = list; cl; cl = cl->next) { c = cl->item; if (c->util) continue; for (i = 0; i < num_rev; i++) { if (rev[i] == c) { name_commit(c, ref_name[i], 0); break; } } } /* Then commits on the first parent ancestry chain */ do { i = 0; for (cl = list; cl; cl = cl->next) { i += name_first_parent_chain(cl->item); } } while (i); /* Finally, any unnamed commits */ do { i = 0; for (cl = list; cl; cl = cl->next) { struct commit_list *parents; struct commit_name *n; int nth; c = cl->item; if (!c->util) continue; n = c->util; parents = c->parents; nth = 0; while (parents) { struct commit *p = parents->item; char newname[1000], *en; parents = parents->next; nth++; if (p->util) continue; en = newname; switch (n->generation) { case 0: en += sprintf(en, "%s", n->head_name); break; case 1: en += sprintf(en, "%s^", n->head_name); break; default: en += sprintf(en, "%s~%d", n->head_name, n->generation); break; } if (nth == 1) en += sprintf(en, "^"); else en += sprintf(en, "^%d", nth); name_commit(p, xstrdup(newname), 0); i++; name_first_parent_chain(p); } } } while (i); }
static void name_commits(struct commit_list *list, struct commit **rev, char **ref_name, int num_rev) { struct commit_list *cl; struct commit *c; int i; /* First give names to the given heads */ for (cl = list; cl; cl = cl->next) { c = cl->item; if (c->util) continue; for (i = 0; i < num_rev; i++) { if (rev[i] == c) { name_commit(c, ref_name[i], 0); break; } } } /* Then commits on the first parent ancestry chain */ do { i = 0; for (cl = list; cl; cl = cl->next) { i += name_first_parent_chain(cl->item); } } while (i); /* Finally, any unnamed commits */ do { i = 0; for (cl = list; cl; cl = cl->next) { struct commit_list *parents; struct commit_name *n; int nth; c = cl->item; if (!c->util) continue; n = c->util; parents = c->parents; nth = 0; while (parents) { struct commit *p = parents->item; struct strbuf newname = STRBUF_INIT; parents = parents->next; nth++; if (p->util) continue; switch (n->generation) { case 0: strbuf_addstr(&newname, n->head_name); break; case 1: strbuf_addf(&newname, "%s^", n->head_name); break; default: strbuf_addf(&newname, "%s~%d", n->head_name, n->generation); break; } if (nth == 1) strbuf_addch(&newname, '^'); else strbuf_addf(&newname, "^%d", nth); name_commit(p, strbuf_detach(&newname, NULL), 0); i++; name_first_parent_chain(p); } } } while (i); }