ls-tree: simplify prefix handling

git ls-tree has two prefixes: The one handed to cmd_ls_tree(), i.e. the current subdirectory in the repository (if any) and the "display" prefix used by the show_tree_*() functions. The option --full-name clears the last one, i.e. it shows full paths, and --full-tree clears both, i.e. it acts as if the command was started in the root of the repository. The show_tree_*() functions use the ls_tree_options members chomp_prefix and ls_tree_prefix to determine their prefix values. Calculate it once in cmd_ls_tree() instead, once the main prefix value is finalized. This allows chomp_prefix to become a local variable. Stop using strlen(3) to determine its initial value -- we only care whether we got a non-empty string, not precisely how long it is. Rename ls_tree_prefix to prefix to demonstrate that we converted all users and because the ls_tree_ part is no longer necessary since 030a3d5d9e (ls-tree: use a "struct options", 2023-01-12) turned it from a global variable to a struct member. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Jul 7, 2023 at 20:34 UTC 7b7203e78af7bfe431b9aadd7b726775ed442b3c
1 file changed +10 -14
builtin/ls-tree.c
+10 -14
@@ -50,8 +50,7 @@ struct ls_tree_options {
50 LS_SHOW_TREES = 1 << 2,
51 } ls_options;
52 struct pathspec pathspec;
53 - int chomp_prefix;
54 - const char *ls_tree_prefix;
53 + const char *prefix;
54 const char *format;
55 };
56
@@ -128,8 +127,7 @@ static int show_tree_fmt(const struct object_id *oid, struct strbuf *base,
127 strbuf_add_unique_abbrev(&sb, oid, options->abbrev);
128 else if (skip_prefix(format, "(path)", &format)) {
129 const char *name;
131 - const char *prefix = options->chomp_prefix ?
132 - options->ls_tree_prefix : NULL;
130 + const char *prefix = options->prefix;
131 struct strbuf sbuf = STRBUF_INIT;
132 size_t baselen = base->len;
133
@@ -173,7 +171,7 @@ static void show_tree_common_default_long(struct ls_tree_options *options,
171 const char *pathname,
172 const size_t baselen)
173 {
176 - const char *prefix = options->chomp_prefix ? options->ls_tree_prefix : NULL;
174 + const char *prefix = options->prefix;
175
176 strbuf_addstr(base, pathname);
177
@@ -258,7 +256,7 @@ static int show_tree_name_only(const struct object_id *oid, struct strbuf *base,
256 if (early >= 0)
257 return early;
258
261 - prefix = options->chomp_prefix ? options->ls_tree_prefix : NULL;
259 + prefix = options->prefix;
260 strbuf_addstr(base, pathname);
261 if (options->null_termination) {
262 struct strbuf sb = STRBUF_INIT;
@@ -345,6 +343,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
343 struct object_id oid;
344 struct tree *tree;
345 int i, full_tree = 0;
346 + int chomp_prefix = prefix && *prefix;
347 read_tree_fn_t fn = NULL;
348 enum ls_tree_cmdmode cmdmode = MODE_DEFAULT;
349 int null_termination = 0;
@@ -366,7 +365,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
365 MODE_NAME_STATUS),
366 OPT_CMDMODE(0, "object-only", &cmdmode, N_("list only objects"),
367 MODE_OBJECT_ONLY),
369 - OPT_SET_INT(0, "full-name", &options.chomp_prefix,
368 + OPT_SET_INT(0, "full-name", &chomp_prefix,
369 N_("use full path names"), 0),
370 OPT_BOOL(0, "full-tree", &full_tree,
371 N_("list entire tree; not just current directory "
@@ -381,18 +380,15 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
380 int ret;
381
382 git_config(git_default_config, NULL);
384 - options.ls_tree_prefix = prefix;
385 - if (prefix)
386 - options.chomp_prefix = strlen(prefix);
383
384 argc = parse_options(argc, argv, prefix, ls_tree_options,
385 ls_tree_usage, 0);
386 options.null_termination = null_termination;
387
392 - if (full_tree) {
393 - options.ls_tree_prefix = prefix = NULL;
394 - options.chomp_prefix = 0;
395 - }
388 + if (full_tree)
389 + prefix = NULL;
390 + options.prefix = chomp_prefix ? prefix : NULL;
391 +
392 /*
393 * We wanted to detect conflicts between --name-only and
394 * --name-status, but once we're done with that subsequent