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