Skip to content

Commit a28e876

Browse files
committed
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
2 parents f715334 + 6a143aa commit a28e876

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

t/t7201-co.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,23 @@ test_expect_success 'checkout --merge --conflict=diff3 <branch>' '
223223
test_cmp two expect
224224
'
225225

226+
test_expect_success 'switch to another branch while carrying a deletion' '
227+
228+
git checkout -f master && git reset --hard && git clean -f &&
229+
git rm two &&
230+
231+
test_must_fail git checkout simple 2>errs &&
232+
test_i18ngrep overwritten errs &&
233+
234+
git checkout --merge simple 2>errs &&
235+
test_i18ngrep ! overwritten errs &&
236+
git ls-files -u &&
237+
test_must_fail git cat-file -t :0:two &&
238+
test "$(git cat-file -t :1:two)" = blob &&
239+
test "$(git cat-file -t :2:two)" = blob &&
240+
test_must_fail git cat-file -t :3:two
241+
'
242+
226243
test_expect_success 'checkout to detach HEAD (with advice declined)' '
227244
228245
git config advice.detachedHead false &&

unpack-trees.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,7 +1176,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
11761176
static int reject_merge(const struct cache_entry *ce,
11771177
struct unpack_trees_options *o)
11781178
{
1179-
return add_rejected_path(o, ERROR_WOULD_OVERWRITE, ce->name);
1179+
return o->gently ? -1 :
1180+
add_rejected_path(o, ERROR_WOULD_OVERWRITE, ce->name);
11801181
}
11811182

11821183
static int same(const struct cache_entry *a, const struct cache_entry *b)
@@ -1631,15 +1632,15 @@ int threeway_merge(const struct cache_entry * const *stages,
16311632
/* #14, #14ALT, #2ALT */
16321633
if (remote && !df_conflict_head && head_match && !remote_match) {
16331634
if (index && !same(index, remote) && !same(index, head))
1634-
return o->gently ? -1 : reject_merge(index, o);
1635+
return reject_merge(index, o);
16351636
return merged_entry(remote, index, o);
16361637
}
16371638
/*
16381639
* If we have an entry in the index cache, then we want to
16391640
* make sure that it matches head.
16401641
*/
16411642
if (index && !same(index, head))
1642-
return o->gently ? -1 : reject_merge(index, o);
1643+
return reject_merge(index, o);
16431644

16441645
if (head) {
16451646
/* #5ALT, #15 */
@@ -1768,9 +1769,8 @@ int twoway_merge(const struct cache_entry * const *src,
17681769
else
17691770
return merged_entry(newtree, current, o);
17701771
}
1771-
return o->gently ? -1 : reject_merge(current, o);
1772-
}
1773-
else if ((!oldtree && !newtree) || /* 4 and 5 */
1772+
return reject_merge(current, o);
1773+
} else if ((!oldtree && !newtree) || /* 4 and 5 */
17741774
(!oldtree && newtree &&
17751775
same(current, newtree)) || /* 6 and 7 */
17761776
(oldtree && newtree &&
@@ -1779,26 +1779,15 @@ int twoway_merge(const struct cache_entry * const *src,
17791779
!same(oldtree, newtree) && /* 18 and 19 */
17801780
same(current, newtree))) {
17811781
return keep_entry(current, o);
1782-
}
1783-
else if (oldtree && !newtree && same(current, oldtree)) {
1782+
} else if (oldtree && !newtree && same(current, oldtree)) {
17841783
/* 10 or 11 */
17851784
return deleted_entry(oldtree, current, o);
1786-
}
1787-
else if (oldtree && newtree &&
1785+
} else if (oldtree && newtree &&
17881786
same(current, oldtree) && !same(current, newtree)) {
17891787
/* 20 or 21 */
17901788
return merged_entry(newtree, current, o);
1791-
}
1792-
else {
1793-
/* all other failures */
1794-
if (oldtree)
1795-
return o->gently ? -1 : reject_merge(oldtree, o);
1796-
if (current)
1797-
return o->gently ? -1 : reject_merge(current, o);
1798-
if (newtree)
1799-
return o->gently ? -1 : reject_merge(newtree, o);
1800-
return -1;
1801-
}
1789+
} else
1790+
return reject_merge(current, o);
18021791
}
18031792
else if (newtree) {
18041793
if (oldtree && !o->initial_checkout) {

0 commit comments

Comments
 (0)