Skip to content

Commit 04988c8

Browse files
newrengitster
authored andcommitted
unpack-trees: introduce preserve_ignored to unpack_trees_options
Currently, every caller of unpack_trees() that wants to ensure ignored files are overwritten by default needs to: * allocate unpack_trees_options.dir * flip the DIR_SHOW_IGNORED flag in unpack_trees_options.dir->flags * call setup_standard_excludes AND then after the call to unpack_trees() needs to * call dir_clear() * deallocate unpack_trees_options.dir That's a fair amount of boilerplate, and every caller uses identical code. Make this easier by instead introducing a new boolean value where the default value (0) does what we want so that new callers of unpack_trees() automatically get the appropriate behavior. And move all the handling of unpack_trees_options.dir into unpack_trees() itself. While preserve_ignored = 0 is the behavior we feel is the appropriate default, we defer fixing commands to use the appropriate default until a later commit. So, this commit introduces several locations where we manually set preserve_ignored=1. This makes it clear where code paths were previously preserving ignored files when they should not have been; a future commit will flip these to instead use a value of 0 to get the behavior we want. Signed-off-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 491a757 commit 04988c8

14 files changed

+35
-40
lines changed

builtin/am.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,6 +1919,9 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
19191919
opts.update = 1;
19201920
opts.merge = 1;
19211921
opts.reset = reset;
1922+
if (!reset)
1923+
/* FIXME: Default should be to remove ignored files */
1924+
opts.preserve_ignored = 1;
19221925
opts.fn = twoway_merge;
19231926
init_tree_desc(&t[0], head->buffer, head->size);
19241927
init_tree_desc(&t[1], remote->buffer, remote->size);

builtin/checkout.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
648648
opts.skip_unmerged = !worktree;
649649
opts.reset = 1;
650650
opts.merge = 1;
651+
opts.preserve_ignored = 0;
651652
opts.fn = oneway_merge;
652653
opts.verbose_update = o->show_progress;
653654
opts.src_index = &the_index;
@@ -746,11 +747,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
746747
new_branch_info->commit ?
747748
&new_branch_info->commit->object.oid :
748749
&new_branch_info->oid, NULL);
749-
if (opts->overwrite_ignore) {
750-
topts.dir = xcalloc(1, sizeof(*topts.dir));
751-
topts.dir->flags |= DIR_SHOW_IGNORED;
752-
setup_standard_excludes(topts.dir);
753-
}
750+
topts.preserve_ignored = !opts->overwrite_ignore;
754751
tree = parse_tree_indirect(old_branch_info->commit ?
755752
&old_branch_info->commit->object.oid :
756753
the_hash_algo->empty_tree);
@@ -760,10 +757,6 @@ static int merge_working_tree(const struct checkout_opts *opts,
760757
init_tree_desc(&trees[1], tree->buffer, tree->size);
761758

762759
ret = unpack_trees(2, trees, &topts);
763-
if (topts.dir) {
764-
dir_clear(topts.dir);
765-
FREE_AND_NULL(topts.dir);
766-
}
767760
clear_unpack_trees_porcelain(&topts);
768761
if (ret == -1) {
769762
/*

builtin/clone.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,8 @@ static int checkout(int submodule_progress)
803803
opts.update = 1;
804804
opts.merge = 1;
805805
opts.clone = 1;
806+
/* FIXME: Default should be to remove ignored files */
807+
opts.preserve_ignored = 1;
806808
opts.fn = oneway_merge;
807809
opts.verbose_update = (option_verbosity >= 0);
808810
opts.src_index = &the_index;

builtin/merge.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,8 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
681681
opts.verbose_update = 1;
682682
opts.trivial_merges_only = 1;
683683
opts.merge = 1;
684+
/* FIXME: Default should be to remove ignored files */
685+
opts.preserve_ignored = 1;
684686
trees[nr_trees] = parse_tree_indirect(common);
685687
if (!trees[nr_trees++])
686688
return -1;

builtin/read-tree.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,9 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
201201
if ((opts.update || opts.index_only) && !opts.merge)
202202
die("%s is meaningless without -m, --reset, or --prefix",
203203
opts.update ? "-u" : "-i");
204-
if (opts.update && !opts.reset) {
205-
CALLOC_ARRAY(opts.dir, 1);
206-
opts.dir->flags |= DIR_SHOW_IGNORED;
207-
setup_standard_excludes(opts.dir);
208-
}
204+
if (opts.update && !opts.reset)
205+
opts.preserve_ignored = 0;
206+
/* otherwise, opts.preserve_ignored is irrelevant */
209207
if (opts.merge && !opts.index_only)
210208
setup_work_tree();
211209

@@ -245,11 +243,6 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
245243
if (unpack_trees(nr_trees, t, &opts))
246244
return 128;
247245

248-
if (opts.dir) {
249-
dir_clear(opts.dir);
250-
FREE_AND_NULL(opts.dir);
251-
}
252-
253246
if (opts.debug_unpack || opts.dry_run)
254247
return 0; /* do not write the index out */
255248

builtin/reset.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t
6767
case KEEP:
6868
case MERGE:
6969
opts.update = 1;
70+
/* FIXME: Default should be to remove ignored files */
71+
opts.preserve_ignored = 1;
7072
break;
7173
case HARD:
7274
opts.update = 1;

builtin/stash.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
258258
opts.merge = 1;
259259
opts.reset = reset;
260260
opts.update = update;
261+
if (update && !reset)
262+
/* FIXME: Default should be to remove ignored files */
263+
opts.preserve_ignored = 1;
261264
opts.fn = oneway_merge;
262265

263266
if (unpack_trees(nr_trees, t, &opts))

merge-ort.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4045,20 +4045,14 @@ static int checkout(struct merge_options *opt,
40454045
unpack_opts.quiet = 0; /* FIXME: sequencer might want quiet? */
40464046
unpack_opts.verbose_update = (opt->verbosity > 2);
40474047
unpack_opts.fn = twoway_merge;
4048-
if (1/* FIXME: opts->overwrite_ignore*/) {
4049-
CALLOC_ARRAY(unpack_opts.dir, 1);
4050-
unpack_opts.dir->flags |= DIR_SHOW_IGNORED;
4051-
setup_standard_excludes(unpack_opts.dir);
4052-
}
4048+
unpack_opts.preserve_ignored = 0; /* FIXME: !opts->overwrite_ignore*/
40534049
parse_tree(prev);
40544050
init_tree_desc(&trees[0], prev->buffer, prev->size);
40554051
parse_tree(next);
40564052
init_tree_desc(&trees[1], next->buffer, next->size);
40574053

40584054
ret = unpack_trees(2, trees, &unpack_opts);
40594055
clear_unpack_trees_porcelain(&unpack_opts);
4060-
dir_clear(unpack_opts.dir);
4061-
FREE_AND_NULL(unpack_opts.dir);
40624056
return ret;
40634057
}
40644058

merge-recursive.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,7 @@ static int unpack_trees_start(struct merge_options *opt,
411411
else {
412412
opt->priv->unpack_opts.update = 1;
413413
/* FIXME: should only do this if !overwrite_ignore */
414-
CALLOC_ARRAY(opt->priv->unpack_opts.dir, 1);
415-
opt->priv->unpack_opts.dir->flags |= DIR_SHOW_IGNORED;
416-
setup_standard_excludes(opt->priv->unpack_opts.dir);
414+
opt->priv->unpack_opts.preserve_ignored = 0;
417415
}
418416
opt->priv->unpack_opts.merge = 1;
419417
opt->priv->unpack_opts.head_idx = 2;
@@ -428,10 +426,6 @@ static int unpack_trees_start(struct merge_options *opt,
428426
init_tree_desc_from_tree(t+2, merge);
429427

430428
rc = unpack_trees(3, t, &opt->priv->unpack_opts);
431-
if (opt->priv->unpack_opts.dir) {
432-
dir_clear(opt->priv->unpack_opts.dir);
433-
FREE_AND_NULL(opt->priv->unpack_opts.dir);
434-
}
435429
cache_tree_free(&opt->repo->index->cache_tree);
436430

437431
/*

merge.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ int checkout_fast_forward(struct repository *r,
5353
struct unpack_trees_options opts;
5454
struct tree_desc t[MAX_UNPACK_TREES];
5555
int i, nr_trees = 0;
56-
struct dir_struct dir = DIR_INIT;
5756
struct lock_file lock_file = LOCK_INIT;
5857

5958
refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
@@ -80,11 +79,7 @@ int checkout_fast_forward(struct repository *r,
8079
}
8180

8281
memset(&opts, 0, sizeof(opts));
83-
if (overwrite_ignore) {
84-
dir.flags |= DIR_SHOW_IGNORED;
85-
setup_standard_excludes(&dir);
86-
opts.dir = &dir;
87-
}
82+
opts.preserve_ignored = !overwrite_ignore;
8883

8984
opts.head_idx = 1;
9085
opts.src_index = r->index;
@@ -101,7 +96,6 @@ int checkout_fast_forward(struct repository *r,
10196
clear_unpack_trees_porcelain(&opts);
10297
return -1;
10398
}
104-
dir_clear(&dir);
10599
clear_unpack_trees_porcelain(&opts);
106100

107101
if (write_locked_index(r->index, &lock_file, COMMIT_LOCK))

reset.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action,
5656
unpack_tree_opts.fn = reset_hard ? oneway_merge : twoway_merge;
5757
unpack_tree_opts.update = 1;
5858
unpack_tree_opts.merge = 1;
59+
/* FIXME: Default should be to remove ignored files */
60+
unpack_tree_opts.preserve_ignored = 1;
5961
init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL);
6062
if (!detach_head)
6163
unpack_tree_opts.reset = 1;

sequencer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3690,6 +3690,8 @@ static int do_reset(struct repository *r,
36903690
unpack_tree_opts.fn = oneway_merge;
36913691
unpack_tree_opts.merge = 1;
36923692
unpack_tree_opts.update = 1;
3693+
/* FIXME: Default should be to remove ignored files */
3694+
unpack_tree_opts.preserve_ignored = 1;
36933695
init_checkout_metadata(&unpack_tree_opts.meta, name, &oid, NULL);
36943696

36953697
if (repo_read_index_unmerged(r)) {

unpack-trees.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,12 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
17051705
ensure_full_index(o->dst_index);
17061706
}
17071707

1708+
if (!o->preserve_ignored) {
1709+
CALLOC_ARRAY(o->dir, 1);
1710+
o->dir->flags |= DIR_SHOW_IGNORED;
1711+
setup_standard_excludes(o->dir);
1712+
}
1713+
17081714
if (!core_apply_sparse_checkout || !o->update)
17091715
o->skip_sparse_checkout = 1;
17101716
if (!o->skip_sparse_checkout && !o->pl) {
@@ -1866,6 +1872,10 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
18661872
done:
18671873
if (free_pattern_list)
18681874
clear_pattern_list(&pl);
1875+
if (o->dir) {
1876+
dir_clear(o->dir);
1877+
FREE_AND_NULL(o->dir);
1878+
}
18691879
trace2_region_leave("unpack_trees", "unpack_trees", the_repository);
18701880
trace_performance_leave("unpack_trees");
18711881
return ret;

unpack-trees.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct unpack_trees_options {
4949
unsigned int reset,
5050
merge,
5151
update,
52+
preserve_ignored,
5253
clone,
5354
index_only,
5455
nontrivial_merge,

0 commit comments

Comments
 (0)