提交 8eee9f92 编写于 作者: J Jeff King 提交者: Junio C Hamano

show_object_with_name: simplify by using path_name()

When "git rev-list" shows an object with its associated path
name, it does so by walking the name_path linked list and
printing each component (stopping at any embedded NULs or
newlines).

We'd like to eventually get rid of name_path entirely in
favor of a single buffer, and dropping this custom printing
code is part of that. As a first step, let's use path_name()
to format the list into a single buffer, and print that.
This is strictly less efficient than the original, but it's
a temporary step in the refactoring; our end game will be to
get the fully formatted name in the first place.
Signed-off-by: NJeff King <peff@peff.net>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 c6bd2a1d
...@@ -45,46 +45,18 @@ char *path_name(const struct name_path *path, const char *name) ...@@ -45,46 +45,18 @@ char *path_name(const struct name_path *path, const char *name)
return n; return n;
} }
static int show_path_component_truncated(FILE *out, const char *name, int len)
{
int cnt;
for (cnt = 0; cnt < len; cnt++) {
int ch = name[cnt];
if (!ch || ch == '\n')
return -1;
fputc(ch, out);
}
return len;
}
static int show_path_truncated(FILE *out, const struct name_path *path)
{
int emitted, ours;
if (!path)
return 0;
emitted = show_path_truncated(out, path->up);
if (emitted < 0)
return emitted;
if (emitted)
fputc('/', out);
ours = show_path_component_truncated(out, path->elem, path->elem_len);
if (ours < 0)
return ours;
return ours || emitted;
}
void show_object_with_name(FILE *out, struct object *obj, void show_object_with_name(FILE *out, struct object *obj,
const struct name_path *path, const char *component) const struct name_path *path, const char *component)
{ {
struct name_path leaf; char *name = path_name(path, component);
leaf.up = (struct name_path *)path; char *p;
leaf.elem = component;
leaf.elem_len = strlen(component);
fprintf(out, "%s ", sha1_to_hex(obj->sha1)); fprintf(out, "%s ", sha1_to_hex(obj->sha1));
show_path_truncated(out, &leaf); for (p = name; *p && *p != '\n'; p++)
fputc(*p, out);
fputc('\n', out); fputc('\n', out);
free(name);
} }
static void mark_blob_uninteresting(struct blob *blob) static void mark_blob_uninteresting(struct blob *blob)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册