add open_nofollow() helper
[git] / t / t2004-checkout-cache-temp.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2006 Shawn Pearce
4 #
5
6 test_description='git checkout-index --temp test.
7
8 With --temp flag, git checkout-index writes to temporary merge files
9 rather than the tracked path.'
10
11 . ./test-lib.sh
12
13 test_expect_success 'setup' '
14         mkdir asubdir &&
15         echo tree1path0 >path0 &&
16         echo tree1path1 >path1 &&
17         echo tree1path3 >path3 &&
18         echo tree1path4 >path4 &&
19         echo tree1asubdir/path5 >asubdir/path5 &&
20         git update-index --add path0 path1 path3 path4 asubdir/path5 &&
21         t1=$(git write-tree) &&
22         rm -f path* .merge_* actual .git/index &&
23         echo tree2path0 >path0 &&
24         echo tree2path1 >path1 &&
25         echo tree2path2 >path2 &&
26         echo tree2path4 >path4 &&
27         git update-index --add path0 path1 path2 path4 &&
28         t2=$(git write-tree) &&
29         rm -f path* .merge_* actual .git/index &&
30         echo tree2path0 >path0 &&
31         echo tree3path1 >path1 &&
32         echo tree3path2 >path2 &&
33         echo tree3path3 >path3 &&
34         git update-index --add path0 path1 path2 path3 &&
35         t3=$(git write-tree)
36 '
37
38 test_expect_success 'checkout one stage 0 to temporary file' '
39         rm -f path* .merge_* actual .git/index &&
40         git read-tree $t1 &&
41         git checkout-index --temp -- path1 >actual &&
42         test_line_count = 1 actual &&
43         test $(cut "-d  " -f2 actual) = path1 &&
44         p=$(cut "-d     " -f1 actual) &&
45         test -f $p &&
46         test $(cat $p) = tree1path1
47 '
48
49 test_expect_success 'checkout all stage 0 to temporary files' '
50         rm -f path* .merge_* actual .git/index &&
51         git read-tree $t1 &&
52         git checkout-index -a --temp >actual &&
53         test_line_count = 5 actual &&
54         for f in path0 path1 path3 path4 asubdir/path5
55         do
56                 test $(grep $f actual | cut "-d " -f2) = $f &&
57                 p=$(grep $f actual | cut "-d    " -f1) &&
58                 test -f $p &&
59                 test $(cat $p) = tree1$f
60         done
61 '
62
63 test_expect_success 'setup 3-way merge' '
64         rm -f path* .merge_* actual .git/index &&
65         git read-tree -m $t1 $t2 $t3
66 '
67
68 test_expect_success 'checkout one stage 2 to temporary file' '
69         rm -f path* .merge_* actual &&
70         git checkout-index --stage=2 --temp -- path1 >actual &&
71         test_line_count = 1 actual &&
72         test $(cut "-d  " -f2 actual) = path1 &&
73         p=$(cut "-d     " -f1 actual) &&
74         test -f $p &&
75         test $(cat $p) = tree2path1
76 '
77
78 test_expect_success 'checkout all stage 2 to temporary files' '
79         rm -f path* .merge_* actual &&
80         git checkout-index --all --stage=2 --temp >actual &&
81         test_line_count = 3 actual &&
82         for f in path1 path2 path4
83         do
84                 test $(grep $f actual | cut "-d " -f2) = $f &&
85                 p=$(grep $f actual | cut "-d    " -f1) &&
86                 test -f $p &&
87                 test $(cat $p) = tree2$f
88         done
89 '
90
91 test_expect_success 'checkout all stages of unknown path' '
92         rm -f path* .merge_* actual &&
93         test_must_fail git checkout-index --stage=all --temp \
94                 -- does-not-exist 2>stderr &&
95         test_i18ngrep not.in.the.cache stderr
96 '
97
98 test_expect_success 'checkout all stages/one file to nothing' '
99         rm -f path* .merge_* actual &&
100         git checkout-index --stage=all --temp -- path0 >actual 2>stderr &&
101         test_must_be_empty stderr &&
102         test_line_count = 0 actual
103 '
104
105 test_expect_success 'checkout all stages/one file to temporary files' '
106         rm -f path* .merge_* actual &&
107         git checkout-index --stage=all --temp -- path1 >actual &&
108         test_line_count = 1 actual &&
109         test $(cut "-d  " -f2 actual) = path1 &&
110         cut "-d " -f1 actual | (read s1 s2 s3 &&
111         test -f $s1 &&
112         test -f $s2 &&
113         test -f $s3 &&
114         test $(cat $s1) = tree1path1 &&
115         test $(cat $s2) = tree2path1 &&
116         test $(cat $s3) = tree3path1)
117 '
118
119 test_expect_success 'checkout some stages/one file to temporary files' '
120         rm -f path* .merge_* actual &&
121         git checkout-index --stage=all --temp -- path2 >actual &&
122         test_line_count = 1 actual &&
123         test $(cut "-d  " -f2 actual) = path2 &&
124         cut "-d " -f1 actual | (read s1 s2 s3 &&
125         test $s1 = . &&
126         test -f $s2 &&
127         test -f $s3 &&
128         test $(cat $s2) = tree2path2 &&
129         test $(cat $s3) = tree3path2)
130 '
131
132 test_expect_success 'checkout all stages/all files to temporary files' '
133         rm -f path* .merge_* actual &&
134         git checkout-index -a --stage=all --temp >actual &&
135         test_line_count = 5 actual
136 '
137
138 test_expect_success '-- path0: no entry' '
139         test x$(grep path0 actual | cut "-d     " -f2) = x
140 '
141
142 test_expect_success '-- path1: all 3 stages' '
143         test $(grep path1 actual | cut "-d      " -f2) = path1 &&
144         grep path1 actual | cut "-d     " -f1 | (read s1 s2 s3 &&
145         test -f $s1 &&
146         test -f $s2 &&
147         test -f $s3 &&
148         test $(cat $s1) = tree1path1 &&
149         test $(cat $s2) = tree2path1 &&
150         test $(cat $s3) = tree3path1)
151 '
152
153 test_expect_success '-- path2: no stage 1, have stage 2 and 3' '
154         test $(grep path2 actual | cut "-d      " -f2) = path2 &&
155         grep path2 actual | cut "-d     " -f1 | (read s1 s2 s3 &&
156         test $s1 = . &&
157         test -f $s2 &&
158         test -f $s3 &&
159         test $(cat $s2) = tree2path2 &&
160         test $(cat $s3) = tree3path2)
161 '
162
163 test_expect_success '-- path3: no stage 2, have stage 1 and 3' '
164         test $(grep path3 actual | cut "-d      " -f2) = path3 &&
165         grep path3 actual | cut "-d     " -f1 | (read s1 s2 s3 &&
166         test -f $s1 &&
167         test $s2 = . &&
168         test -f $s3 &&
169         test $(cat $s1) = tree1path3 &&
170         test $(cat $s3) = tree3path3)
171 '
172
173 test_expect_success '-- path4: no stage 3, have stage 1 and 3' '
174         test $(grep path4 actual | cut "-d      " -f2) = path4 &&
175         grep path4 actual | cut "-d     " -f1 | (read s1 s2 s3 &&
176         test -f $s1 &&
177         test -f $s2 &&
178         test $s3 = . &&
179         test $(cat $s1) = tree1path4 &&
180         test $(cat $s2) = tree2path4)
181 '
182
183 test_expect_success '-- asubdir/path5: no stage 2 and 3 have stage 1' '
184         test $(grep asubdir/path5 actual | cut "-d      " -f2) = asubdir/path5 &&
185         grep asubdir/path5 actual | cut "-d     " -f1 | (read s1 s2 s3 &&
186         test -f $s1 &&
187         test $s2 = . &&
188         test $s3 = . &&
189         test $(cat $s1) = tree1asubdir/path5)
190 '
191
192 test_expect_success 'checkout --temp within subdir' '
193         (
194                 cd asubdir &&
195                 git checkout-index -a --stage=all >actual &&
196                 test_line_count = 1 actual &&
197                 test $(grep path5 actual | cut "-d      " -f2) = path5 &&
198                 grep path5 actual | cut "-d     " -f1 | (read s1 s2 s3 &&
199                 test -f ../$s1 &&
200                 test $s2 = . &&
201                 test $s3 = . &&
202                 test $(cat ../$s1) = tree1asubdir/path5)
203         )
204 '
205
206 test_expect_success 'checkout --temp symlink' '
207         rm -f path* .merge_* actual .git/index &&
208         test_ln_s_add path7 path6 &&
209         git checkout-index --temp -a >actual &&
210         test_line_count = 1 actual &&
211         test $(cut "-d  " -f2 actual) = path6 &&
212         p=$(cut "-d     " -f1 actual) &&
213         test -f $p &&
214         test $(cat $p) = path7
215 '
216
217 test_expect_success 'emit well-formed relative path' '
218         rm -f path* .merge_* actual .git/index &&
219         >path0123456789 &&
220         git update-index --add path0123456789 &&
221         (
222                 cd asubdir &&
223                 git checkout-index --temp -- ../path0123456789 >actual &&
224                 test_line_count = 1 actual &&
225                 test $(cut "-d  " -f2 actual) = ../path0123456789
226         )
227 '
228
229 test_done