diff --git a/list-objects.c b/list-objects.c index 41736d2372..dc46b9a2b3 100644 --- a/list-objects.c +++ b/list-objects.c @@ -62,7 +62,6 @@ static void process_gitlink(struct rev_info *revs, static void process_tree(struct rev_info *revs, struct tree *tree, show_object_fn show, - struct name_path *path, struct strbuf *base, const char *name, void *cb_data) @@ -86,17 +85,14 @@ static void process_tree(struct rev_info *revs, return; die("bad tree object %s", sha1_to_hex(obj->sha1)); } - obj->flags |= SEEN; - show(obj, path, name, cb_data); - me.up = path; - me.elem = name; - me.elem_len = strlen(name); - if (!match) { - strbuf_addstr(base, name); - if (base->len) - strbuf_addch(base, '/'); - } + obj->flags |= SEEN; + me.base = base; + show(obj, &me, name, cb_data); + + strbuf_addstr(base, name); + if (base->len) + strbuf_addch(base, '/'); init_tree_desc(&desc, tree->buffer, tree->size); @@ -113,7 +109,7 @@ static void process_tree(struct rev_info *revs, if (S_ISDIR(entry.mode)) process_tree(revs, lookup_tree(entry.sha1), - show, &me, base, entry.path, + show, base, entry.path, cb_data); else if (S_ISGITLINK(entry.mode)) process_gitlink(revs, entry.sha1, @@ -220,7 +216,7 @@ void traverse_commit_list(struct rev_info *revs, path = ""; if (obj->type == OBJ_TREE) { process_tree(revs, (struct tree *)obj, show_object, - NULL, &base, path, data); + &base, path, data); continue; } if (obj->type == OBJ_BLOB) { diff --git a/revision.c b/revision.c index cf544b6e96..f8c30341ed 100644 --- a/revision.c +++ b/revision.c @@ -23,26 +23,11 @@ volatile show_early_output_fn_t show_early_output; char *path_name(const struct name_path *path, const char *name) { - const struct name_path *p; - char *n, *m; - int nlen = strlen(name); - int len = nlen + 1; - - for (p = path; p; p = p->up) { - if (p->elem_len) - len += p->elem_len + 1; - } - n = xmalloc(len); - m = n + len - (nlen + 1); - strcpy(m, name); - for (p = path; p; p = p->up) { - if (p->elem_len) { - m -= p->elem_len + 1; - memcpy(m, p->elem, p->elem_len); - m[p->elem_len] = '/'; - } - } - return n; + struct strbuf ret = STRBUF_INIT; + if (path) + strbuf_addbuf(&ret, path->base); + strbuf_addstr(&ret, name); + return strbuf_detach(&ret, NULL); } void show_object_with_name(FILE *out, struct object *obj, diff --git a/revision.h b/revision.h index 0ea8b4e255..5e3c47cb48 100644 --- a/revision.h +++ b/revision.h @@ -257,9 +257,7 @@ extern void mark_parents_uninteresting(struct commit *commit); extern void mark_tree_uninteresting(struct tree *tree); struct name_path { - struct name_path *up; - int elem_len; - const char *elem; + struct strbuf *base; }; char *path_name(const struct name_path *path, const char *name);