unpack-trees: special case read-tree debugging as internal usage

builtin/read-tree.c has some special functionality explicitly designed for debugging unpack-trees.[ch]. Associated with that is two fields that no other external caller would or should use. Mark these as internal to unpack-trees, but allow builtin/read-tree to read or write them for this special case. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Elijah Newren committed Feb 27, 2023 at 15:28 UTC 1ca13dd3ca6e153a2bc5b0b53555996cdd668e93
3 files changed +19 -19
builtin/read-tree.c
+5 -5
@@ -87,9 +87,9 @@ static int debug_merge(const struct cache_entry * const *stages,
87 {
88 int i;
89
90 - printf("* %d-way merge\n", o->merge_size);
90 + printf("* %d-way merge\n", o->internal.merge_size);
91 debug_stage("index", stages[0], o);
92 - for (i = 1; i <= o->merge_size; i++) {
92 + for (i = 1; i <= o->internal.merge_size; i++) {
93 char buf[24];
94 xsnprintf(buf, sizeof(buf), "ent#%d", i);
95 debug_stage(buf, stages[i], o);
@@ -144,7 +144,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
144 OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
145 OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
146 N_("skip applying sparse checkout filter")),
147 - OPT_BOOL(0, "debug-unpack", &opts.debug_unpack,
147 + OPT_BOOL(0, "debug-unpack", &opts.internal.debug_unpack,
148 N_("debug unpack-trees")),
149 OPT_CALLBACK_F(0, "recurse-submodules", NULL,
150 "checkout", "control recursive updating of submodules",
@@ -247,7 +247,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
247 opts.head_idx = 1;
248 }
249
250 - if (opts.debug_unpack)
250 + if (opts.internal.debug_unpack)
251 opts.fn = debug_merge;
252
253 /* If we're going to prime_cache_tree later, skip cache tree update */
@@ -263,7 +263,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
263 if (unpack_trees(nr_trees, t, &opts))
264 return 128;
265
266 - if (opts.debug_unpack || opts.dry_run)
266 + if (opts.internal.debug_unpack || opts.dry_run)
267 return 0; /* do not write the index out */
268
269 /*
unpack-trees.c
+11 -11
@@ -839,7 +839,7 @@ static int traverse_by_cache_tree(int pos, int nr_entries, int nr_names,
839 mark_ce_used(src[0], o);
840 }
841 free(tree_ce);
842 - if (o->debug_unpack)
842 + if (o->internal.debug_unpack)
843 printf("Unpacked %d entries from %s to %s using cache-tree\n",
844 nr_entries,
845 o->src_index->cache[pos]->name,
@@ -1488,7 +1488,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
1488 while (!p->mode)
1489 p++;
1490
1491 - if (o->debug_unpack)
1491 + if (o->internal.debug_unpack)
1492 debug_unpack_callback(n, mask, dirmask, names, info);
1493
1494 /* Are we supposed to look at the index too? */
@@ -1929,7 +1929,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
1929 init_split_index(&o->internal.result);
1930 }
1931 oidcpy(&o->internal.result.oid, &o->src_index->oid);
1932 - o->merge_size = len;
1932 + o->internal.merge_size = len;
1933 mark_all_ce_unused(o->src_index);
1934
1935 o->internal.result.fsmonitor_last_update =
@@ -2882,9 +2882,9 @@ int twoway_merge(const struct cache_entry * const *src,
2882 const struct cache_entry *oldtree = src[1];
2883 const struct cache_entry *newtree = src[2];
2884
2885 - if (o->merge_size != 2)
2885 + if (o->internal.merge_size != 2)
2886 return error("Cannot do a twoway merge of %d trees",
2887 - o->merge_size);
2887 + o->internal.merge_size);
2888
2889 if (oldtree == o->df_conflict_entry)
2890 oldtree = NULL;
@@ -2964,9 +2964,9 @@ int bind_merge(const struct cache_entry * const *src,
2964 const struct cache_entry *old = src[0];
2965 const struct cache_entry *a = src[1];
2966
2967 - if (o->merge_size != 1)
2967 + if (o->internal.merge_size != 1)
2968 return error("Cannot do a bind merge of %d trees",
2969 - o->merge_size);
2969 + o->internal.merge_size);
2970 if (a && old)
2971 return o->quiet ? -1 :
2972 error(ERRORMSG(o, ERROR_BIND_OVERLAP),
@@ -2990,9 +2990,9 @@ int oneway_merge(const struct cache_entry * const *src,
2990 const struct cache_entry *old = src[0];
2991 const struct cache_entry *a = src[1];
2992
2993 - if (o->merge_size != 1)
2993 + if (o->internal.merge_size != 1)
2994 return error("Cannot do a oneway merge of %d trees",
2995 - o->merge_size);
2995 + o->internal.merge_size);
2996
2997 if (!a || a == o->df_conflict_entry)
2998 return deleted_entry(old, old, o);
@@ -3027,8 +3027,8 @@ int stash_worktree_untracked_merge(const struct cache_entry * const *src,
3027 const struct cache_entry *worktree = src[1];
3028 const struct cache_entry *untracked = src[2];
3029
3030 - if (o->merge_size != 2)
3031 - BUG("invalid merge_size: %d", o->merge_size);
3030 + if (o->internal.merge_size != 2)
3031 + BUG("invalid merge_size: %d", o->internal.merge_size);
3032
3033 if (worktree && untracked)
3034 return error(_("worktree and untracked commit have duplicate entries: %s"),
unpack-trees.h
+3 -3
@@ -65,7 +65,6 @@ struct unpack_trees_options {
65 skip_unmerged,
66 initial_checkout,
67 diff_index_cached,
68 - debug_unpack,
68 skip_sparse_checkout,
69 quiet,
70 exiting_early,
@@ -78,7 +77,6 @@ struct unpack_trees_options {
77 merge_fn_t fn;
78
79 int head_idx;
81 - int merge_size;
80
81 struct cache_entry *df_conflict_entry;
82 void *unpack_data;
@@ -90,8 +88,10 @@ struct unpack_trees_options {
88
89 struct unpack_trees_options_internal {
90 unsigned int nontrivial_merge,
93 - show_all_errors;
91 + show_all_errors,
92 + debug_unpack; /* used by read-tree debugging */
93
94 + int merge_size; /* used by read-tree debugging */
95 int cache_bottom;
96 const char *msgs[NB_UNPACK_TREES_WARNING_TYPES];
97 struct strvec msgs_to_free;