|  | #!/bin/sh | 
|  |  | 
|  | test_description='apply same filename' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | modify () { | 
|  | sed -e "$1" < "$2" > "$2".x && | 
|  | mv "$2".x "$2" | 
|  | } | 
|  |  | 
|  | test_expect_success setup ' | 
|  | for i in a b c d e f g h i j k l m | 
|  | do | 
|  | echo $i | 
|  | done >same_fn && | 
|  | cp same_fn other_fn && | 
|  | git add same_fn other_fn && | 
|  | git commit -m initial | 
|  | ' | 
|  | test_expect_success 'apply same filename with independent changes' ' | 
|  | modify "s/^d/z/" same_fn && | 
|  | git diff > patch0 && | 
|  | git add same_fn && | 
|  | modify "s/^i/y/" same_fn && | 
|  | git diff >> patch0 && | 
|  | cp same_fn same_fn2 && | 
|  | git reset --hard && | 
|  | git apply patch0 && | 
|  | test_cmp same_fn same_fn2 | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply same filename with overlapping changes' ' | 
|  | git reset --hard && | 
|  | modify "s/^d/z/" same_fn && | 
|  | git diff > patch0 && | 
|  | git add same_fn && | 
|  | modify "s/^e/y/" same_fn && | 
|  | git diff >> patch0 && | 
|  | cp same_fn same_fn2 && | 
|  | git reset --hard && | 
|  | git apply patch0 && | 
|  | test_cmp same_fn same_fn2 | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply same new filename after rename' ' | 
|  | git reset --hard && | 
|  | git mv same_fn new_fn && | 
|  | modify "s/^d/z/" new_fn && | 
|  | git add new_fn && | 
|  | git diff -M --cached > patch1 && | 
|  | modify "s/^e/y/" new_fn && | 
|  | git diff >> patch1 && | 
|  | cp new_fn new_fn2 && | 
|  | git reset --hard && | 
|  | git apply --index patch1 && | 
|  | test_cmp new_fn new_fn2 | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply same old filename after rename -- should fail.' ' | 
|  | git reset --hard && | 
|  | git mv same_fn new_fn && | 
|  | modify "s/^d/z/" new_fn && | 
|  | git add new_fn && | 
|  | git diff -M --cached > patch1 && | 
|  | git mv new_fn same_fn && | 
|  | modify "s/^e/y/" same_fn && | 
|  | git diff >> patch1 && | 
|  | git reset --hard && | 
|  | test_must_fail git apply patch1 | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply A->B (rename), C->A (rename), A->A -- should pass.' ' | 
|  | git reset --hard && | 
|  | git mv same_fn new_fn && | 
|  | modify "s/^d/z/" new_fn && | 
|  | git add new_fn && | 
|  | git diff -M --cached > patch1 && | 
|  | git commit -m "a rename" && | 
|  | git mv other_fn same_fn && | 
|  | modify "s/^e/y/" same_fn && | 
|  | git add same_fn && | 
|  | git diff -M --cached >> patch1 && | 
|  | modify "s/^g/x/" same_fn && | 
|  | git diff >> patch1 && | 
|  | git reset --hard HEAD^ && | 
|  | git apply patch1 | 
|  | ' | 
|  |  | 
|  | test_done |