1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#
test_description='git conflicts when checking files out test.'
# The first test registers the following filesystem structure in the
# cache:
#
# path0 - a file
# path1/file1 - a file in a directory
#
# And then tries to checkout in a work tree that has the following:
#
# path0/file0 - a file in a directory
# path1 - a file
#
# The git checkout-index command should fail when attempting to checkout
# path0, finding it is occupied by a directory, and path1/file1, finding
# path1 is occupied by a non-directory. With "-f" flag, it should remove
# the conflicting paths and succeed.
. ./test-lib.sh
show_files() {
# show filesystem files, just [-dl] for type and name
find path? -ls |
sed -e 's/^[0-9]* * [0-9]* * \([-bcdl]\)[^ ]* *[0-9]* *[^ ]* *[^ ]* *[0-9]* [A-Z][a-z][a-z] [0-9][0-9] [^ ]* /fs: \1 /'
# what's in the cache, just mode and name
git ls-files --stage |
sed -e 's/^\([0-9]*\) [0-9a-f]* [0-3] /ca: \1 /'
# what's in the tree, just mode and name.
git ls-tree -r "$1" |
sed -e 's/^\([0-9]*\) [^ ]* [0-9a-f]* /tr: \1 /'
}
date >path0
mkdir path1
date >path1/file1
test_expect_success \
'git update-index --add various paths.' \
'git update-index --add path0 path1/file1'
rm -fr path0 path1
mkdir path0
date >path0/file0
date >path1
test_expect_success \
'git checkout-index without -f should fail on conflicting work tree.' \
'test_must_fail git checkout-index -a'
test_expect_success \
'git checkout-index with -f should succeed.' \
'git checkout-index -f -a'
test_expect_success \
'git checkout-index conflicting paths.' \
'test -f path0 && test -d path1 && test -f path1/file1'
test_expect_success SYMLINKS 'checkout-index -f twice with --prefix' '
mkdir -p tar/get &&
ln -s tar/get there &&
echo first &&
git checkout-index -a -f --prefix=there/ &&
echo second &&
git checkout-index -a -f --prefix=there/
'
# The second test registers the following filesystem structure in the cache:
#
# path2/file0 - a file in a directory
# path3/file1 - a file in a directory
#
# and attempts to check it out when the work tree has:
#
# path2/file0 - a file in a directory
# path3 - a symlink pointing at "path2"
#
# Checkout cache should fail to extract path3/file1 because the leading
# path path3 is occupied by a non-directory. With "-f" it should remove
# the symlink path3 and create directory path3 and file path3/file1.
mkdir path2
date >path2/file0
test_expect_success \
'git update-index --add path2/file0' \
'git update-index --add path2/file0'
test_expect_success \
'writing tree out with git write-tree' \
'tree1=$(git write-tree)'
test_debug 'show_files $tree1'
mkdir path3
date >path3/file1
test_expect_success \
'git update-index --add path3/file1' \
'git update-index --add path3/file1'
test_expect_success \
'writing tree out with git write-tree' \
'tree2=$(git write-tree)'
test_debug 'show_files $tree2'
rm -fr path3
test_expect_success \
'read previously written tree and checkout.' \
'git read-tree -m $tree1 && git checkout-index -f -a'
test_debug 'show_files $tree1'
test_expect_success \
'add a symlink' \
'test_ln_s_add path2 path3'
test_expect_success \
'writing tree out with git write-tree' \
'tree3=$(git write-tree)'
test_debug 'show_files $tree3'
# Morten says "Got that?" here.
# Test begins.
test_expect_success \
'read previously written tree and checkout.' \
'git read-tree $tree2 && git checkout-index -f -a'
test_debug 'show_files $tree2'
test_expect_success \
'checking out conflicting path with -f' \
'test ! -h path2 && test -d path2 &&
test ! -h path3 && test -d path3 &&
test ! -h path2/file0 && test -f path2/file0 &&
test ! -h path3/file1 && test -f path3/file1'
test_done
|