Merge branch 'sb/unpack-trees-super-prefix'

"git read-tree" and its underlying unpack_trees() machinery learned
to report problematic paths prefixed with the --super-prefix option.

* sb/unpack-trees-super-prefix:
  unpack-trees: support super-prefix option
  t1001: modernize style
  t1000: modernize style
  read-tree: use OPT_BOOL instead of OPT_SET_INT
This commit is contained in:
Junio C Hamano
2017-02-03 11:25:18 -08:00
5 changed files with 641 additions and 615 deletions

View File

@ -109,34 +109,34 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
{ OPTION_CALLBACK, 0, "index-output", NULL, N_("file"), { OPTION_CALLBACK, 0, "index-output", NULL, N_("file"),
N_("write resulting index to <file>"), N_("write resulting index to <file>"),
PARSE_OPT_NONEG, index_output_cb }, PARSE_OPT_NONEG, index_output_cb },
OPT_SET_INT(0, "empty", &read_empty, OPT_BOOL(0, "empty", &read_empty,
N_("only empty the index"), 1), N_("only empty the index")),
OPT__VERBOSE(&opts.verbose_update, N_("be verbose")), OPT__VERBOSE(&opts.verbose_update, N_("be verbose")),
OPT_GROUP(N_("Merging")), OPT_GROUP(N_("Merging")),
OPT_SET_INT('m', NULL, &opts.merge, OPT_BOOL('m', NULL, &opts.merge,
N_("perform a merge in addition to a read"), 1), N_("perform a merge in addition to a read")),
OPT_SET_INT(0, "trivial", &opts.trivial_merges_only, OPT_BOOL(0, "trivial", &opts.trivial_merges_only,
N_("3-way merge if no file level merging required"), 1), N_("3-way merge if no file level merging required")),
OPT_SET_INT(0, "aggressive", &opts.aggressive, OPT_BOOL(0, "aggressive", &opts.aggressive,
N_("3-way merge in presence of adds and removes"), 1), N_("3-way merge in presence of adds and removes")),
OPT_SET_INT(0, "reset", &opts.reset, OPT_BOOL(0, "reset", &opts.reset,
N_("same as -m, but discard unmerged entries"), 1), N_("same as -m, but discard unmerged entries")),
{ OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"), { OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"),
N_("read the tree into the index under <subdirectory>/"), N_("read the tree into the index under <subdirectory>/"),
PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP }, PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP },
OPT_SET_INT('u', NULL, &opts.update, OPT_BOOL('u', NULL, &opts.update,
N_("update working tree with merge result"), 1), N_("update working tree with merge result")),
{ OPTION_CALLBACK, 0, "exclude-per-directory", &opts, { OPTION_CALLBACK, 0, "exclude-per-directory", &opts,
N_("gitignore"), N_("gitignore"),
N_("allow explicitly ignored files to be overwritten"), N_("allow explicitly ignored files to be overwritten"),
PARSE_OPT_NONEG, exclude_per_directory_cb }, PARSE_OPT_NONEG, exclude_per_directory_cb },
OPT_SET_INT('i', NULL, &opts.index_only, OPT_BOOL('i', NULL, &opts.index_only,
N_("don't check the working tree after merging"), 1), N_("don't check the working tree after merging")),
OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")), OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout, OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
N_("skip applying sparse checkout filter"), 1), N_("skip applying sparse checkout filter")),
OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack, OPT_BOOL(0, "debug-unpack", &opts.debug_unpack,
N_("debug unpack-trees"), 1), N_("debug unpack-trees")),
OPT_END() OPT_END()
}; };

2
git.c
View File

@ -472,7 +472,7 @@ static struct cmd_struct commands[] = {
{ "prune-packed", cmd_prune_packed, RUN_SETUP }, { "prune-packed", cmd_prune_packed, RUN_SETUP },
{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE }, { "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
{ "push", cmd_push, RUN_SETUP }, { "push", cmd_push, RUN_SETUP },
{ "read-tree", cmd_read_tree, RUN_SETUP }, { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},
{ "receive-pack", cmd_receive_pack }, { "receive-pack", cmd_receive_pack },
{ "reflog", cmd_reflog, RUN_SETUP }, { "reflog", cmd_reflog, RUN_SETUP },
{ "remote", cmd_remote, RUN_SETUP }, { "remote", cmd_remote, RUN_SETUP },

View File

@ -128,29 +128,29 @@ cat >expected <<\EOF
EOF EOF
check_result () { check_result () {
git ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current && git ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
test_cmp expected current test_cmp expected current
} }
# This is done on an empty work directory, which is the normal # This is done on an empty work directory, which is the normal
# merge person behaviour. # merge person behaviour.
test_expect_success \ test_expect_success '3-way merge with git read-tree -m, empty cache' '
'3-way merge with git read-tree -m, empty cache' \ rm -fr [NDMALTS][NDMALTSF] Z &&
"rm -fr [NDMALTS][NDMALTSF] Z && rm .git/index &&
rm .git/index && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
# This starts out with the first head, which is the normal # This starts out with the first head, which is the normal
# patch submitter behaviour. # patch submitter behaviour.
test_expect_success \ test_expect_success '3-way merge with git read-tree -m, match H' '
'3-way merge with git read-tree -m, match H' \ rm -fr [NDMALTS][NDMALTSF] Z &&
"rm -fr [NDMALTS][NDMALTSF] Z && rm .git/index &&
rm .git/index && read_tree_must_succeed $tree_A &&
read_tree_must_succeed $tree_A && git checkout-index -f -u -a &&
git checkout-index -f -u -a && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
: <<\END_OF_CASE_TABLE : <<\END_OF_CASE_TABLE
@ -208,322 +208,304 @@ DF (file) when tree B require DF to be a directory by having DF/DF
END_OF_CASE_TABLE END_OF_CASE_TABLE
test_expect_success '1 - must not have an entry not in A.' " test_expect_success '1 - must not have an entry not in A.' '
rm -f .git/index XX && rm -f .git/index XX &&
echo XX >XX && echo XX >XX &&
git update-index --add XX && git update-index --add XX &&
read_tree_must_fail -m $tree_O $tree_A $tree_B read_tree_must_fail -m $tree_O $tree_A $tree_B
" '
test_expect_success \ test_expect_success '2 - must match B in !O && !A && B case.' '
'2 - must match B in !O && !A && B case.' \ rm -f .git/index NA &&
"rm -f .git/index NA && cp .orig-B/NA NA &&
cp .orig-B/NA NA && git update-index --add NA &&
git update-index --add NA && read_tree_must_succeed -m $tree_O $tree_A $tree_B
read_tree_must_succeed -m $tree_O $tree_A $tree_B" '
test_expect_success \ test_expect_success '2 - matching B alone is OK in !O && !A && B case.' '
'2 - matching B alone is OK in !O && !A && B case.' \ rm -f .git/index NA &&
"rm -f .git/index NA && cp .orig-B/NA NA &&
cp .orig-B/NA NA && git update-index --add NA &&
git update-index --add NA && echo extra >>NA &&
echo extra >>NA && read_tree_must_succeed -m $tree_O $tree_A $tree_B
read_tree_must_succeed -m $tree_O $tree_A $tree_B" '
test_expect_success \ test_expect_success '3 - must match A in !O && A && !B case.' '
'3 - must match A in !O && A && !B case.' \ rm -f .git/index AN &&
"rm -f .git/index AN && cp .orig-A/AN AN &&
cp .orig-A/AN AN && git update-index --add AN &&
git update-index --add AN && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '3 - matching A alone is OK in !O && A && !B case.' '
'3 - matching A alone is OK in !O && A && !B case.' \ rm -f .git/index AN &&
"rm -f .git/index AN && cp .orig-A/AN AN &&
cp .orig-A/AN AN && git update-index --add AN &&
git update-index --add AN && echo extra >>AN &&
echo extra >>AN && read_tree_must_succeed -m $tree_O $tree_A $tree_B
read_tree_must_succeed -m $tree_O $tree_A $tree_B" '
test_expect_success \ test_expect_success '3 (fail) - must match A in !O && A && !B case.' '
'3 (fail) - must match A in !O && A && !B case.' " rm -f .git/index AN &&
rm -f .git/index AN && cp .orig-A/AN AN &&
cp .orig-A/AN AN && echo extra >>AN &&
echo extra >>AN && git update-index --add AN &&
git update-index --add AN && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '4 - must match and be up-to-date in !O && A && B && A!=B case.' '
'4 - must match and be up-to-date in !O && A && B && A!=B case.' \ rm -f .git/index AA &&
"rm -f .git/index AA && cp .orig-A/AA AA &&
cp .orig-A/AA AA && git update-index --add AA &&
git update-index --add AA && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' '
'4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' " rm -f .git/index AA &&
rm -f .git/index AA && cp .orig-A/AA AA &&
cp .orig-A/AA AA && git update-index --add AA &&
git update-index --add AA && echo extra >>AA &&
echo extra >>AA && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' '
'4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' " rm -f .git/index AA &&
rm -f .git/index AA && cp .orig-A/AA AA &&
cp .orig-A/AA AA && echo extra >>AA &&
echo extra >>AA && git update-index --add AA &&
git update-index --add AA && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '5 - must match in !O && A && B && A==B case.' '
'5 - must match in !O && A && B && A==B case.' \ rm -f .git/index LL &&
"rm -f .git/index LL && cp .orig-A/LL LL &&
cp .orig-A/LL LL && git update-index --add LL &&
git update-index --add LL && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '5 - must match in !O && A && B && A==B case.' '
'5 - must match in !O && A && B && A==B case.' \ rm -f .git/index LL &&
"rm -f .git/index LL && cp .orig-A/LL LL &&
cp .orig-A/LL LL && git update-index --add LL &&
git update-index --add LL && echo extra >>LL &&
echo extra >>LL && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '5 (fail) - must match A in !O && A && B && A==B case.' '
'5 (fail) - must match A in !O && A && B && A==B case.' " rm -f .git/index LL &&
rm -f .git/index LL && cp .orig-A/LL LL &&
cp .orig-A/LL LL && echo extra >>LL &&
echo extra >>LL && git update-index --add LL &&
git update-index --add LL && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '6 - must not exist in O && !A && !B case' '
'6 - must not exist in O && !A && !B case' " rm -f .git/index DD &&
rm -f .git/index DD && echo DD >DD &&
echo DD >DD && git update-index --add DD &&
git update-index --add DD && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '7 - must not exist in O && !A && B && O!=B case' '
'7 - must not exist in O && !A && B && O!=B case' " rm -f .git/index DM &&
rm -f .git/index DM && cp .orig-B/DM DM &&
cp .orig-B/DM DM && git update-index --add DM &&
git update-index --add DM && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '8 - must not exist in O && !A && B && O==B case' '
'8 - must not exist in O && !A && B && O==B case' " rm -f .git/index DN &&
rm -f .git/index DN && cp .orig-B/DN DN &&
cp .orig-B/DN DN && git update-index --add DN &&
git update-index --add DN && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '9 - must match and be up-to-date in O && A && !B && O!=A case' '
'9 - must match and be up-to-date in O && A && !B && O!=A case' \ rm -f .git/index MD &&
"rm -f .git/index MD && cp .orig-A/MD MD &&
cp .orig-A/MD MD && git update-index --add MD &&
git update-index --add MD && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' '
'9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' " rm -f .git/index MD &&
rm -f .git/index MD && cp .orig-A/MD MD &&
cp .orig-A/MD MD && git update-index --add MD &&
git update-index --add MD && echo extra >>MD &&
echo extra >>MD && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' '
'9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' " rm -f .git/index MD &&
rm -f .git/index MD && cp .orig-A/MD MD &&
cp .orig-A/MD MD && echo extra >>MD &&
echo extra >>MD && git update-index --add MD &&
git update-index --add MD && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '10 - must match and be up-to-date in O && A && !B && O==A case' '
'10 - must match and be up-to-date in O && A && !B && O==A case' \ rm -f .git/index ND &&
"rm -f .git/index ND && cp .orig-A/ND ND &&
cp .orig-A/ND ND && git update-index --add ND &&
git update-index --add ND && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' '
'10 (fail) - must match and be up-to-date in O && A && !B && O==A case' " rm -f .git/index ND &&
rm -f .git/index ND && cp .orig-A/ND ND &&
cp .orig-A/ND ND && git update-index --add ND &&
git update-index --add ND && echo extra >>ND &&
echo extra >>ND && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' '
'10 (fail) - must match and be up-to-date in O && A && !B && O==A case' " rm -f .git/index ND &&
rm -f .git/index ND && cp .orig-A/ND ND &&
cp .orig-A/ND ND && echo extra >>ND &&
echo extra >>ND && git update-index --add ND &&
git update-index --add ND && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
'11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' \ rm -f .git/index MM &&
"rm -f .git/index MM && cp .orig-A/MM MM &&
cp .orig-A/MM MM && git update-index --add MM &&
git update-index --add MM && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
'11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' " rm -f .git/index MM &&
rm -f .git/index MM && cp .orig-A/MM MM &&
cp .orig-A/MM MM && git update-index --add MM &&
git update-index --add MM && echo extra >>MM &&
echo extra >>MM && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
'11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' " rm -f .git/index MM &&
rm -f .git/index MM && cp .orig-A/MM MM &&
cp .orig-A/MM MM && echo extra >>MM &&
echo extra >>MM && git update-index --add MM &&
git update-index --add MM && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '12 - must match A in O && A && B && O!=A && A==B case' '
'12 - must match A in O && A && B && O!=A && A==B case' \ rm -f .git/index SS &&
"rm -f .git/index SS && cp .orig-A/SS SS &&
cp .orig-A/SS SS && git update-index --add SS &&
git update-index --add SS && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '12 - must match A in O && A && B && O!=A && A==B case' '
'12 - must match A in O && A && B && O!=A && A==B case' \ rm -f .git/index SS &&
"rm -f .git/index SS && cp .orig-A/SS SS &&
cp .orig-A/SS SS && git update-index --add SS &&
git update-index --add SS && echo extra >>SS &&
echo extra >>SS && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '12 (fail) - must match A in O && A && B && O!=A && A==B case' '
'12 (fail) - must match A in O && A && B && O!=A && A==B case' " rm -f .git/index SS &&
rm -f .git/index SS && cp .orig-A/SS SS &&
cp .orig-A/SS SS && echo extra >>SS &&
echo extra >>SS && git update-index --add SS &&
git update-index --add SS && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '13 - must match A in O && A && B && O!=A && O==B case' '
'13 - must match A in O && A && B && O!=A && O==B case' \ rm -f .git/index MN &&
"rm -f .git/index MN && cp .orig-A/MN MN &&
cp .orig-A/MN MN && git update-index --add MN &&
git update-index --add MN && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '13 - must match A in O && A && B && O!=A && O==B case' '
'13 - must match A in O && A && B && O!=A && O==B case' \ rm -f .git/index MN &&
"rm -f .git/index MN && cp .orig-A/MN MN &&
cp .orig-A/MN MN && git update-index --add MN &&
git update-index --add MN && echo extra >>MN &&
echo extra >>MN && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '14 - must match and be up-to-date in O && A && B && O==A && O!=B case' '
'14 - must match and be up-to-date in O && A && B && O==A && O!=B case' \ rm -f .git/index NM &&
"rm -f .git/index NM && cp .orig-A/NM NM &&
cp .orig-A/NM NM && git update-index --add NM &&
git update-index --add NM && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '14 - may match B in O && A && B && O==A && O!=B case' '
'14 - may match B in O && A && B && O==A && O!=B case' \ rm -f .git/index NM &&
"rm -f .git/index NM && cp .orig-B/NM NM &&
cp .orig-B/NM NM && git update-index --add NM &&
git update-index --add NM && echo extra >>NM &&
echo extra >>NM && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' '
'14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' " rm -f .git/index NM &&
rm -f .git/index NM && cp .orig-A/NM NM &&
cp .orig-A/NM NM && git update-index --add NM &&
git update-index --add NM && echo extra >>NM &&
echo extra >>NM && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' '
'14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' " rm -f .git/index NM &&
rm -f .git/index NM && cp .orig-A/NM NM &&
cp .orig-A/NM NM && echo extra >>NM &&
echo extra >>NM && git update-index --add NM &&
git update-index --add NM && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
test_expect_success \ test_expect_success '15 - must match A in O && A && B && O==A && O==B case' '
'15 - must match A in O && A && B && O==A && O==B case' \ rm -f .git/index NN &&
"rm -f .git/index NN && cp .orig-A/NN NN &&
cp .orig-A/NN NN && git update-index --add NN &&
git update-index --add NN && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '15 - must match A in O && A && B && O==A && O==B case' '
'15 - must match A in O && A && B && O==A && O==B case' \ rm -f .git/index NN &&
"rm -f .git/index NN && cp .orig-A/NN NN &&
cp .orig-A/NN NN && git update-index --add NN &&
git update-index --add NN && echo extra >>NN &&
echo extra >>NN && read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
read_tree_must_succeed -m $tree_O $tree_A $tree_B && check_result
check_result" '
test_expect_success \ test_expect_success '15 (fail) - must match A in O && A && B && O==A && O==B case' '
'15 (fail) - must match A in O && A && B && O==A && O==B case' " rm -f .git/index NN &&
rm -f .git/index NN && cp .orig-A/NN NN &&
cp .orig-A/NN NN && echo extra >>NN &&
echo extra >>NN && git update-index --add NN &&
git update-index --add NN && read_tree_must_fail -m $tree_O $tree_A $tree_B
read_tree_must_fail -m $tree_O $tree_A $tree_B '
"
# #16 test_expect_success '16 - A matches in one and B matches in another.' '
test_expect_success \ rm -f .git/index F16 &&
'16 - A matches in one and B matches in another.' \ echo F16 >F16 &&
'rm -f .git/index F16 && git update-index --add F16 &&
echo F16 >F16 && tree0=$(git write-tree) &&
git update-index --add F16 && echo E16 >F16 &&
tree0=$(git write-tree) && git update-index F16 &&
echo E16 >F16 && tree1=$(git write-tree) &&
git update-index F16 && read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&
tree1=$(git write-tree) && git ls-files --stage
read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 && '
git ls-files --stage'
test_done test_done

View File

@ -14,10 +14,10 @@ all the combinations described in the two-tree merge "carry forward"
rules, found in <Documentation/git read-tree.txt>. rules, found in <Documentation/git read-tree.txt>.
In the test, these paths are used: In the test, these paths are used:
bozbar - in H, stays in M, modified from bozbar to gnusto bozbar - in H, stays in M, modified from bozbar to gnusto
frotz - not in H added in M frotz - not in H added in M
nitfol - in H, stays in M unmodified nitfol - in H, stays in M unmodified
rezrov - in H, deleted in M rezrov - in H, deleted in M
yomin - not in H or M yomin - not in H or M
' '
. ./test-lib.sh . ./test-lib.sh
@ -60,336 +60,343 @@ EOF
sed -e 's/bozbar/gnusto (earlier bozbar)/' bozbar-old >bozbar-new sed -e 's/bozbar/gnusto (earlier bozbar)/' bozbar-old >bozbar-new
test_expect_success \ test_expect_success 'setup' '
setup \ echo frotz >frotz &&
'echo frotz >frotz && echo nitfol >nitfol &&
echo nitfol >nitfol && cat bozbar-old >bozbar &&
cat bozbar-old >bozbar && echo rezrov >rezrov &&
echo rezrov >rezrov && echo yomin >yomin &&
echo yomin >yomin && git update-index --add nitfol bozbar rezrov &&
git update-index --add nitfol bozbar rezrov && treeH=$(git write-tree) &&
treeH=$(git write-tree) && echo treeH $treeH &&
echo treeH $treeH && git ls-tree $treeH &&
git ls-tree $treeH &&
cat bozbar-new >bozbar && cat bozbar-new >bozbar &&
git update-index --add frotz bozbar --force-remove rezrov && git update-index --add frotz bozbar --force-remove rezrov &&
git ls-files --stage >M.out && git ls-files --stage >M.out &&
treeM=$(git write-tree) && treeM=$(git write-tree) &&
echo treeM $treeM && echo treeM $treeM &&
git ls-tree $treeM && git ls-tree $treeM &&
git diff-tree $treeH $treeM' git diff-tree $treeH $treeM
'
test_expect_success \
'1, 2, 3 - no carry forward' \
'rm -f .git/index &&
read_tree_twoway $treeH $treeM &&
git ls-files --stage >1-3.out &&
test_cmp M.out 1-3.out &&
check_cache_at bozbar dirty &&
check_cache_at frotz dirty &&
check_cache_at nitfol dirty'
test_expect_success '1, 2, 3 - no carry forward' '
rm -f .git/index &&
read_tree_twoway $treeH $treeM &&
git ls-files --stage >1-3.out &&
test_cmp M.out 1-3.out &&
check_cache_at bozbar dirty &&
check_cache_at frotz dirty &&
check_cache_at nitfol dirty
'
echo '+100644 X 0 yomin' >expected echo '+100644 X 0 yomin' >expected
test_expect_success \ test_expect_success '4 - carry forward local addition.' '
'4 - carry forward local addition.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && git update-index --add yomin &&
git update-index --add yomin && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >4.out &&
git ls-files --stage >4.out && test_must_fail git diff --no-index M.out 4.out >4diff.out &&
test_must_fail git diff --no-index M.out 4.out >4diff.out && compare_change 4diff.out expected &&
compare_change 4diff.out expected && check_cache_at yomin clean
check_cache_at yomin clean' '
test_expect_success \ test_expect_success '5 - carry forward local addition.' '
'5 - carry forward local addition.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo yomin >yomin &&
echo yomin >yomin && git update-index --add yomin &&
git update-index --add yomin && echo yomin yomin >yomin &&
echo yomin yomin >yomin && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >5.out &&
git ls-files --stage >5.out && test_must_fail git diff --no-index M.out 5.out >5diff.out &&
test_must_fail git diff --no-index M.out 5.out >5diff.out && compare_change 5diff.out expected &&
compare_change 5diff.out expected && check_cache_at yomin dirty
check_cache_at yomin dirty' '
test_expect_success \ test_expect_success '6 - local addition already has the same.' '
'6 - local addition already has the same.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && git update-index --add frotz &&
git update-index --add frotz && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >6.out &&
git ls-files --stage >6.out && test_cmp M.out 6.out &&
test_cmp M.out 6.out && check_cache_at frotz clean
check_cache_at frotz clean' '
test_expect_success \ test_expect_success '7 - local addition already has the same.' '
'7 - local addition already has the same.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo frotz >frotz &&
echo frotz >frotz && git update-index --add frotz &&
git update-index --add frotz && echo frotz frotz >frotz &&
echo frotz frotz >frotz && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >7.out &&
git ls-files --stage >7.out && test_cmp M.out 7.out &&
test_cmp M.out 7.out && check_cache_at frotz dirty
check_cache_at frotz dirty' '
test_expect_success \ test_expect_success '8 - conflicting addition.' '
'8 - conflicting addition.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo frotz frotz >frotz &&
echo frotz frotz >frotz && git update-index --add frotz &&
git update-index --add frotz && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
test_expect_success \ test_expect_success '9 - conflicting addition.' '
'9 - conflicting addition.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo frotz frotz >frotz &&
echo frotz frotz >frotz && git update-index --add frotz &&
git update-index --add frotz && echo frotz >frotz &&
echo frotz >frotz && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
test_expect_success \ test_expect_success '10 - path removed.' '
'10 - path removed.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo rezrov >rezrov &&
echo rezrov >rezrov && git update-index --add rezrov &&
git update-index --add rezrov && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >10.out &&
git ls-files --stage >10.out && test_cmp M.out 10.out
test_cmp M.out 10.out' '
test_expect_success \ test_expect_success '11 - dirty path removed.' '
'11 - dirty path removed.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo rezrov >rezrov &&
echo rezrov >rezrov && git update-index --add rezrov &&
git update-index --add rezrov && echo rezrov rezrov >rezrov &&
echo rezrov rezrov >rezrov && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
test_expect_success \ test_expect_success '12 - unmatching local changes being removed.' '
'12 - unmatching local changes being removed.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo rezrov rezrov >rezrov &&
echo rezrov rezrov >rezrov && git update-index --add rezrov &&
git update-index --add rezrov && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
test_expect_success \ test_expect_success '13 - unmatching local changes being removed.' '
'13 - unmatching local changes being removed.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo rezrov rezrov >rezrov &&
echo rezrov rezrov >rezrov && git update-index --add rezrov &&
git update-index --add rezrov && echo rezrov >rezrov &&
echo rezrov >rezrov && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
cat >expected <<EOF cat >expected <<EOF
-100644 X 0 nitfol -100644 X 0 nitfol
+100644 X 0 nitfol +100644 X 0 nitfol
EOF EOF
test_expect_success \ test_expect_success '14 - unchanged in two heads.' '
'14 - unchanged in two heads.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo nitfol nitfol >nitfol &&
echo nitfol nitfol >nitfol && git update-index --add nitfol &&
git update-index --add nitfol && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >14.out &&
git ls-files --stage >14.out && test_must_fail git diff --no-index M.out 14.out >14diff.out &&
test_must_fail git diff --no-index M.out 14.out >14diff.out && compare_change 14diff.out expected &&
compare_change 14diff.out expected && check_cache_at nitfol clean
check_cache_at nitfol clean' '
test_expect_success \ test_expect_success '15 - unchanged in two heads.' '
'15 - unchanged in two heads.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo nitfol nitfol >nitfol &&
echo nitfol nitfol >nitfol && git update-index --add nitfol &&
git update-index --add nitfol && echo nitfol nitfol nitfol >nitfol &&
echo nitfol nitfol nitfol >nitfol && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >15.out &&
git ls-files --stage >15.out && test_must_fail git diff --no-index M.out 15.out >15diff.out &&
test_must_fail git diff --no-index M.out 15.out >15diff.out && compare_change 15diff.out expected &&
compare_change 15diff.out expected && check_cache_at nitfol dirty
check_cache_at nitfol dirty' '
test_expect_success \ test_expect_success '16 - conflicting local change.' '
'16 - conflicting local change.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo bozbar bozbar >bozbar &&
echo bozbar bozbar >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
test_expect_success \ test_expect_success '17 - conflicting local change.' '
'17 - conflicting local change.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && echo bozbar bozbar >bozbar &&
echo bozbar bozbar >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && echo bozbar bozbar bozbar >bozbar &&
echo bozbar bozbar bozbar >bozbar && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
test_expect_success \ test_expect_success '18 - local change already having a good result.' '
'18 - local change already having a good result.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && cat bozbar-new >bozbar &&
cat bozbar-new >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >18.out &&
git ls-files --stage >18.out && test_cmp M.out 18.out &&
test_cmp M.out 18.out && check_cache_at bozbar clean
check_cache_at bozbar clean' '
test_expect_success \ test_expect_success '19 - local change already having a good result, further modified.' '
'19 - local change already having a good result, further modified.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && cat bozbar-new >bozbar &&
cat bozbar-new >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && echo gnusto gnusto >bozbar &&
echo gnusto gnusto >bozbar && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >19.out &&
git ls-files --stage >19.out && test_cmp M.out 19.out &&
test_cmp M.out 19.out && check_cache_at bozbar dirty
check_cache_at bozbar dirty' '
test_expect_success \ test_expect_success '20 - no local change, use new tree.' '
'20 - no local change, use new tree.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && cat bozbar-old >bozbar &&
cat bozbar-old >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && read_tree_twoway $treeH $treeM &&
read_tree_twoway $treeH $treeM && git ls-files --stage >20.out &&
git ls-files --stage >20.out && test_cmp M.out 20.out &&
test_cmp M.out 20.out && check_cache_at bozbar dirty
check_cache_at bozbar dirty' '
test_expect_success \ test_expect_success '21 - no local change, dirty cache.' '
'21 - no local change, dirty cache.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && cat bozbar-old >bozbar &&
cat bozbar-old >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && echo gnusto gnusto >bozbar &&
echo gnusto gnusto >bozbar && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
# This fails with straight two-way fast-forward. # This fails with straight two-way fast-forward.
test_expect_success \ test_expect_success '22 - local change cache updated.' '
'22 - local change cache updated.' \ rm -f .git/index &&
'rm -f .git/index && read_tree_must_succeed $treeH &&
read_tree_must_succeed $treeH && git checkout-index -u -f -q -a &&
git checkout-index -u -f -q -a && sed -e "s/such as/SUCH AS/" bozbar-old >bozbar &&
sed -e "s/such as/SUCH AS/" bozbar-old >bozbar && git update-index --add bozbar &&
git update-index --add bozbar && if read_tree_twoway $treeH $treeM; then false; else :; fi
if read_tree_twoway $treeH $treeM; then false; else :; fi' '
# Also make sure we did not break DF vs DF/DF case. # Also make sure we did not break DF vs DF/DF case.
test_expect_success \ test_expect_success 'DF vs DF/DF case setup.' '
'DF vs DF/DF case setup.' \ rm -f .git/index &&
'rm -f .git/index && echo DF >DF &&
echo DF >DF && git update-index --add DF &&
git update-index --add DF && treeDF=$(git write-tree) &&
treeDF=$(git write-tree) && echo treeDF $treeDF &&
echo treeDF $treeDF && git ls-tree $treeDF &&
git ls-tree $treeDF &&
rm -f DF && rm -f DF &&
mkdir DF && mkdir DF &&
echo DF/DF >DF/DF && echo DF/DF >DF/DF &&
git update-index --add --remove DF DF/DF && git update-index --add --remove DF DF/DF &&
treeDFDF=$(git write-tree) && treeDFDF=$(git write-tree) &&
echo treeDFDF $treeDFDF && echo treeDFDF $treeDFDF &&
git ls-tree $treeDFDF && git ls-tree $treeDFDF &&
git ls-files --stage >DFDF.out' git ls-files --stage >DFDF.out
'
test_expect_success \ test_expect_success 'DF vs DF/DF case test.' '
'DF vs DF/DF case test.' \ rm -f .git/index &&
'rm -f .git/index && rm -fr DF &&
rm -fr DF && echo DF >DF &&
echo DF >DF && git update-index --add DF &&
git update-index --add DF && read_tree_twoway $treeDF $treeDFDF &&
read_tree_twoway $treeDF $treeDFDF && git ls-files --stage >DFDFcheck.out &&
git ls-files --stage >DFDFcheck.out && test_cmp DFDF.out DFDFcheck.out &&
test_cmp DFDF.out DFDFcheck.out && check_cache_at DF/DF dirty &&
check_cache_at DF/DF dirty && :
:' '
test_expect_success \ test_expect_success 'a/b (untracked) vs a case setup.' '
'a/b (untracked) vs a case setup.' \ rm -f .git/index &&
'rm -f .git/index && : >a &&
: >a && git update-index --add a &&
git update-index --add a && treeM=$(git write-tree) &&
treeM=$(git write-tree) && echo treeM $treeM &&
echo treeM $treeM && git ls-tree $treeM &&
git ls-tree $treeM && git ls-files --stage >treeM.out &&
git ls-files --stage >treeM.out &&
rm -f a && rm -f a &&
git update-index --remove a && git update-index --remove a &&
mkdir a && mkdir a &&
: >a/b && : >a/b &&
treeH=$(git write-tree) && treeH=$(git write-tree) &&
echo treeH $treeH && echo treeH $treeH &&
git ls-tree $treeH' git ls-tree $treeH
'
test_expect_success \ test_expect_success 'a/b (untracked) vs a, plus c/d case test.' '
'a/b (untracked) vs a, plus c/d case test.' \ read_tree_u_must_fail -u -m "$treeH" "$treeM" &&
'read_tree_u_must_fail -u -m "$treeH" "$treeM" && git ls-files --stage &&
git ls-files --stage && test -f a/b
test -f a/b' '
test_expect_success \ test_expect_success 'read-tree supports the super-prefix' '
'a/b vs a, plus c/d case setup.' \ cat <<-EOF >expect &&
'rm -f .git/index && error: Updating '\''fictional/a'\'' would lose untracked files in it
rm -fr a && EOF
: >a && test_must_fail git --super-prefix fictional/ read-tree -u -m "$treeH" "$treeM" 2>actual &&
mkdir c && test_cmp expect actual
: >c/d && '
git update-index --add a c/d &&
treeM=$(git write-tree) &&
echo treeM $treeM &&
git ls-tree $treeM &&
git ls-files --stage >treeM.out &&
rm -f a && test_expect_success 'a/b vs a, plus c/d case setup.' '
mkdir a && rm -f .git/index &&
: >a/b && rm -fr a &&
git update-index --add --remove a a/b && : >a &&
treeH=$(git write-tree) && mkdir c &&
echo treeH $treeH && : >c/d &&
git ls-tree $treeH' git update-index --add a c/d &&
treeM=$(git write-tree) &&
echo treeM $treeM &&
git ls-tree $treeM &&
git ls-files --stage >treeM.out &&
test_expect_success \ rm -f a &&
'a/b vs a, plus c/d case test.' \ mkdir a &&
'read_tree_u_must_succeed -u -m "$treeH" "$treeM" && : >a/b &&
git ls-files --stage | tee >treeMcheck.out && git update-index --add --remove a a/b &&
test_cmp treeM.out treeMcheck.out' treeH=$(git write-tree) &&
echo treeH $treeH &&
git ls-tree $treeH
'
test_expect_success 'a/b vs a, plus c/d case test.' '
read_tree_u_must_succeed -u -m "$treeH" "$treeM" &&
git ls-files --stage | tee >treeMcheck.out &&
test_cmp treeM.out treeMcheck.out
'
test_expect_success '-m references the correct modified tree' ' test_expect_success '-m references the correct modified tree' '
echo >file-a && echo >file-a &&

View File

@ -52,6 +52,41 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_ERROR_TYPES] = {
? ((o)->msgs[(type)]) \ ? ((o)->msgs[(type)]) \
: (unpack_plumbing_errors[(type)]) ) : (unpack_plumbing_errors[(type)]) )
static const char *super_prefixed(const char *path)
{
/*
* It is necessary and sufficient to have two static buffers
* here, as the return value of this function is fed to
* error() using the unpack_*_errors[] templates we see above.
*/
static struct strbuf buf[2] = {STRBUF_INIT, STRBUF_INIT};
static int super_prefix_len = -1;
static unsigned idx = ARRAY_SIZE(buf) - 1;
if (super_prefix_len < 0) {
const char *super_prefix = get_super_prefix();
if (!super_prefix) {
super_prefix_len = 0;
} else {
int i;
for (i = 0; i < ARRAY_SIZE(buf); i++)
strbuf_addstr(&buf[i], super_prefix);
super_prefix_len = buf[0].len;
}
}
if (!super_prefix_len)
return path;
if (++idx >= ARRAY_SIZE(buf))
idx = 0;
strbuf_setlen(&buf[idx], super_prefix_len);
strbuf_addstr(&buf[idx], path);
return buf[idx].buf;
}
void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
const char *cmd) const char *cmd)
{ {
@ -172,7 +207,7 @@ static int add_rejected_path(struct unpack_trees_options *o,
const char *path) const char *path)
{ {
if (!o->show_all_errors) if (!o->show_all_errors)
return error(ERRORMSG(o, e), path); return error(ERRORMSG(o, e), super_prefixed(path));
/* /*
* Otherwise, insert in a list for future display by * Otherwise, insert in a list for future display by
@ -196,7 +231,7 @@ static void display_error_msgs(struct unpack_trees_options *o)
something_displayed = 1; something_displayed = 1;
for (i = 0; i < rejects->nr; i++) for (i = 0; i < rejects->nr; i++)
strbuf_addf(&path, "\t%s\n", rejects->items[i].string); strbuf_addf(&path, "\t%s\n", rejects->items[i].string);
error(ERRORMSG(o, e), path.buf); error(ERRORMSG(o, e), super_prefixed(path.buf));
strbuf_release(&path); strbuf_release(&path);
} }
string_list_clear(rejects, 0); string_list_clear(rejects, 0);
@ -1925,7 +1960,9 @@ int bind_merge(const struct cache_entry * const *src,
o->merge_size); o->merge_size);
if (a && old) if (a && old)
return o->gently ? -1 : return o->gently ? -1 :
error(ERRORMSG(o, ERROR_BIND_OVERLAP), a->name, old->name); error(ERRORMSG(o, ERROR_BIND_OVERLAP),
super_prefixed(a->name),
super_prefixed(old->name));
if (!a) if (!a)
return keep_entry(old, o); return keep_entry(old, o);
else else