Merge branch 'jn/unpack-trees-checkout-m-carry-deletion' into maint

* jn/unpack-trees-checkout-m-carry-deletion:
  checkout -m: attempt merge when deletion of path was staged
  unpack-trees: use 'cuddled' style for if-else cascade
  unpack-trees: simplify 'all other failures' case
maint
Junio C Hamano 2014-09-19 14:05:12 -07:00
commit a28e876b9d
2 changed files with 27 additions and 21 deletions

View File

@ -223,6 +223,23 @@ test_expect_success 'checkout --merge --conflict=diff3 <branch>' '
test_cmp two expect test_cmp two expect
' '


test_expect_success 'switch to another branch while carrying a deletion' '

git checkout -f master && git reset --hard && git clean -f &&
git rm two &&

test_must_fail git checkout simple 2>errs &&
test_i18ngrep overwritten errs &&

git checkout --merge simple 2>errs &&
test_i18ngrep ! overwritten errs &&
git ls-files -u &&
test_must_fail git cat-file -t :0:two &&
test "$(git cat-file -t :1:two)" = blob &&
test "$(git cat-file -t :2:two)" = blob &&
test_must_fail git cat-file -t :3:two
'

test_expect_success 'checkout to detach HEAD (with advice declined)' ' test_expect_success 'checkout to detach HEAD (with advice declined)' '


git config advice.detachedHead false && git config advice.detachedHead false &&

View File

@ -1176,7 +1176,8 @@ return_failed:
static int reject_merge(const struct cache_entry *ce, static int reject_merge(const struct cache_entry *ce,
struct unpack_trees_options *o) struct unpack_trees_options *o)
{ {
return add_rejected_path(o, ERROR_WOULD_OVERWRITE, ce->name); return o->gently ? -1 :
add_rejected_path(o, ERROR_WOULD_OVERWRITE, ce->name);
} }


static int same(const struct cache_entry *a, const struct cache_entry *b) static int same(const struct cache_entry *a, const struct cache_entry *b)
@ -1631,7 +1632,7 @@ int threeway_merge(const struct cache_entry * const *stages,
/* #14, #14ALT, #2ALT */ /* #14, #14ALT, #2ALT */
if (remote && !df_conflict_head && head_match && !remote_match) { if (remote && !df_conflict_head && head_match && !remote_match) {
if (index && !same(index, remote) && !same(index, head)) if (index && !same(index, remote) && !same(index, head))
return o->gently ? -1 : reject_merge(index, o); return reject_merge(index, o);
return merged_entry(remote, index, o); return merged_entry(remote, index, o);
} }
/* /*
@ -1639,7 +1640,7 @@ int threeway_merge(const struct cache_entry * const *stages,
* make sure that it matches head. * make sure that it matches head.
*/ */
if (index && !same(index, head)) if (index && !same(index, head))
return o->gently ? -1 : reject_merge(index, o); return reject_merge(index, o);


if (head) { if (head) {
/* #5ALT, #15 */ /* #5ALT, #15 */
@ -1768,9 +1769,8 @@ int twoway_merge(const struct cache_entry * const *src,
else else
return merged_entry(newtree, current, o); return merged_entry(newtree, current, o);
} }
return o->gently ? -1 : reject_merge(current, o); return reject_merge(current, o);
} } else if ((!oldtree && !newtree) || /* 4 and 5 */
else if ((!oldtree && !newtree) || /* 4 and 5 */
(!oldtree && newtree && (!oldtree && newtree &&
same(current, newtree)) || /* 6 and 7 */ same(current, newtree)) || /* 6 and 7 */
(oldtree && newtree && (oldtree && newtree &&
@ -1779,26 +1779,15 @@ int twoway_merge(const struct cache_entry * const *src,
!same(oldtree, newtree) && /* 18 and 19 */ !same(oldtree, newtree) && /* 18 and 19 */
same(current, newtree))) { same(current, newtree))) {
return keep_entry(current, o); return keep_entry(current, o);
} } else if (oldtree && !newtree && same(current, oldtree)) {
else if (oldtree && !newtree && same(current, oldtree)) {
/* 10 or 11 */ /* 10 or 11 */
return deleted_entry(oldtree, current, o); return deleted_entry(oldtree, current, o);
} } else if (oldtree && newtree &&
else if (oldtree && newtree &&
same(current, oldtree) && !same(current, newtree)) { same(current, oldtree) && !same(current, newtree)) {
/* 20 or 21 */ /* 20 or 21 */
return merged_entry(newtree, current, o); return merged_entry(newtree, current, o);
} } else
else { return reject_merge(current, o);
/* all other failures */
if (oldtree)
return o->gently ? -1 : reject_merge(oldtree, o);
if (current)
return o->gently ? -1 : reject_merge(current, o);
if (newtree)
return o->gently ? -1 : reject_merge(newtree, o);
return -1;
}
} }
else if (newtree) { else if (newtree) {
if (oldtree && !o->initial_checkout) { if (oldtree && !o->initial_checkout) {