ls-tree: don't use "show_tree_data" for "fast" callbacks

As noted in [1] the code that made it in as part of
9c4d58ff2c (ls-tree: split up "fast path" callbacks, 2022-03-23) was
a "maybe a good idea, maybe not" RFC-quality patch. I hadn't looked
very carefully at the resulting patterns.

The implementation shared the "struct show_tree_data data", which was
introduced in e81517155e (ls-tree: introduce struct "show_tree_data",
2022-03-23) both for use in 455923e0a1 (ls-tree: introduce "--format"
option, 2022-03-23), and because the "fat" callback hadn't been split
up as 9c4d58ff2c did.

Now that that's been done we can see that most of what
show_tree_common() was doing could be done lazily by the callbacks
themselves, who in the pre-image were often using an odd mis-match of
their own arguments and those same arguments stuck into the "data"
structure. Let's also have the callers initialize the "type", rather
than grabbing it from the "data" structure afterwards.

1. https://lore.kernel.org/git/cover-0.7-00000000000-20220310T134811Z-avarab@gmail.com/

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Teng Long <dyronteng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2023-01-12 17:11:30 +08:00 committed by Junio C Hamano
parent c48035d29b
commit 7677417b57

View File

@ -173,19 +173,11 @@ static int show_tree_fmt(const struct object_id *oid, struct strbuf *base,
return recurse;
}
static int show_tree_common(struct show_tree_data *data, int *recurse,
const struct object_id *oid, struct strbuf *base,
const char *pathname, unsigned mode)
static int show_tree_common(int *recurse, struct strbuf *base,
const char *pathname, enum object_type type)
{
enum object_type type = object_type(mode);
int ret = -1;
*recurse = 0;
data->mode = mode;
data->type = type;
data->oid = oid;
data->pathname = pathname;
data->base = base;
if (type == OBJ_BLOB) {
if (ls_options & LS_TREE_ONLY)
@ -217,15 +209,15 @@ static int show_tree_default(const struct object_id *oid, struct strbuf *base,
{
int early;
int recurse;
struct show_tree_data data = { 0 };
enum object_type type = object_type(mode);
early = show_tree_common(&data, &recurse, oid, base, pathname, mode);
early = show_tree_common(&recurse, base, pathname, type);
if (early >= 0)
return early;
printf("%06o %s %s\t", data.mode, type_name(data.type),
find_unique_abbrev(data.oid, abbrev));
show_tree_common_default_long(base, pathname, data.base->len);
printf("%06o %s %s\t", mode, type_name(object_type(mode)),
find_unique_abbrev(oid, abbrev));
show_tree_common_default_long(base, pathname, base->len);
return recurse;
}
@ -235,16 +227,16 @@ static int show_tree_long(const struct object_id *oid, struct strbuf *base,
{
int early;
int recurse;
struct show_tree_data data = { 0 };
char size_text[24];
enum object_type type = object_type(mode);
early = show_tree_common(&data, &recurse, oid, base, pathname, mode);
early = show_tree_common(&recurse, base, pathname, type);
if (early >= 0)
return early;
if (data.type == OBJ_BLOB) {
if (type == OBJ_BLOB) {
unsigned long size;
if (oid_object_info(the_repository, data.oid, &size) == OBJ_BAD)
if (oid_object_info(the_repository, oid, &size) == OBJ_BAD)
xsnprintf(size_text, sizeof(size_text), "BAD");
else
xsnprintf(size_text, sizeof(size_text),
@ -253,9 +245,9 @@ static int show_tree_long(const struct object_id *oid, struct strbuf *base,
xsnprintf(size_text, sizeof(size_text), "-");
}
printf("%06o %s %s %7s\t", data.mode, type_name(data.type),
find_unique_abbrev(data.oid, abbrev), size_text);
show_tree_common_default_long(base, pathname, data.base->len);
printf("%06o %s %s %7s\t", mode, type_name(type),
find_unique_abbrev(oid, abbrev), size_text);
show_tree_common_default_long(base, pathname, base->len);
return recurse;
}
@ -266,9 +258,9 @@ static int show_tree_name_only(const struct object_id *oid, struct strbuf *base,
int early;
int recurse;
const size_t baselen = base->len;
struct show_tree_data data = { 0 };
enum object_type type = object_type(mode);
early = show_tree_common(&data, &recurse, oid, base, pathname, mode);
early = show_tree_common(&recurse, base, pathname, type);
if (early >= 0)
return early;
@ -286,9 +278,9 @@ static int show_tree_object(const struct object_id *oid, struct strbuf *base,
{
int early;
int recurse;
struct show_tree_data data = { 0 };
enum object_type type = object_type(mode);
early = show_tree_common(&data, &recurse, oid, base, pathname, mode);
early = show_tree_common(&recurse, base, pathname, type);
if (early >= 0)
return early;