about summary refs log tree commit diff
path: root/t/t2000-conflict-when-checking-files-out.sh
blob: f18616ad2be3eaaf6dc72ab9131c88a0c9bdf2fc (plain) (blame)
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