|  | #!/bin/sh | 
|  |  | 
|  | test_description='checkout -m -- <conflicted path> | 
|  |  | 
|  | Ensures that checkout -m on a resolved file restores the conflicted file' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  | test_tick && | 
|  | test_commit both.txt both.txt initial && | 
|  | git branch topic && | 
|  | test_commit modified_in_master both.txt in_master && | 
|  | test_commit added_in_master each.txt in_master && | 
|  | git checkout topic && | 
|  | test_commit modified_in_topic both.txt in_topic && | 
|  | test_commit added_in_topic each.txt in_topic | 
|  | ' | 
|  |  | 
|  | test_expect_success 'git merge master' ' | 
|  | test_must_fail git merge master | 
|  | ' | 
|  |  | 
|  | clean_branchnames () { | 
|  | # Remove branch names after conflict lines | 
|  | sed 's/^\([<>]\{5,\}\) .*$/\1/' | 
|  | } | 
|  |  | 
|  | test_expect_success '-m restores 2-way conflicted+resolved file' ' | 
|  | cp each.txt each.txt.conflicted && | 
|  | echo resolved >each.txt && | 
|  | git add each.txt && | 
|  | git checkout -m -- each.txt && | 
|  | clean_branchnames <each.txt >each.txt.cleaned && | 
|  | clean_branchnames <each.txt.conflicted >each.txt.conflicted.cleaned && | 
|  | test_cmp each.txt.conflicted.cleaned each.txt.cleaned | 
|  | ' | 
|  |  | 
|  | test_expect_success '-m restores 3-way conflicted+resolved file' ' | 
|  | cp both.txt both.txt.conflicted && | 
|  | echo resolved >both.txt && | 
|  | git add both.txt && | 
|  | git checkout -m -- both.txt && | 
|  | clean_branchnames <both.txt >both.txt.cleaned && | 
|  | clean_branchnames <both.txt.conflicted >both.txt.conflicted.cleaned && | 
|  | test_cmp both.txt.conflicted.cleaned both.txt.cleaned | 
|  | ' | 
|  |  | 
|  | test_expect_success 'force checkout a conflict file creates stage zero entry' ' | 
|  | git init co-force && | 
|  | ( | 
|  | cd co-force && | 
|  | echo a >a && | 
|  | git add a && | 
|  | git commit -ama && | 
|  | A_OBJ=$(git rev-parse :a) && | 
|  | git branch topic && | 
|  | echo b >a && | 
|  | git commit -amb && | 
|  | B_OBJ=$(git rev-parse :a) && | 
|  | git checkout topic && | 
|  | echo c >a && | 
|  | C_OBJ=$(git hash-object a) && | 
|  | git checkout -m master && | 
|  | test_cmp_rev :1:a $A_OBJ && | 
|  | test_cmp_rev :2:a $B_OBJ && | 
|  | test_cmp_rev :3:a $C_OBJ && | 
|  | git checkout -f topic && | 
|  | test_cmp_rev :0:a $A_OBJ | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_done |