Merge branch 'maint'
[git] / t / t7012-skip-worktree-writing.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2008 Nguyễn Thái Ngọc Duy
4 #
5
6 test_description='test worktree writing operations when skip-worktree is used'
7
8 . ./test-lib.sh
9
10 test_expect_success 'setup' '
11         test_commit init &&
12         echo modified >> init.t &&
13         touch added &&
14         git add init.t added &&
15         git commit -m "modified and added" &&
16         git tag top
17 '
18
19 test_expect_success 'read-tree updates worktree, absent case' '
20         git checkout -f top &&
21         git update-index --skip-worktree init.t &&
22         rm init.t &&
23         git read-tree -m -u HEAD^ &&
24         echo init > expected &&
25         test_cmp expected init.t
26 '
27
28 test_expect_success 'read-tree updates worktree, dirty case' '
29         git checkout -f top &&
30         git update-index --skip-worktree init.t &&
31         echo dirty >> init.t &&
32         test_must_fail git read-tree -m -u HEAD^ &&
33         grep -q dirty init.t &&
34         test "$(git ls-files -t init.t)" = "S init.t" &&
35         git update-index --no-skip-worktree init.t
36 '
37
38 test_expect_success 'read-tree removes worktree, absent case' '
39         git checkout -f top &&
40         git update-index --skip-worktree added &&
41         rm added &&
42         git read-tree -m -u HEAD^ &&
43         test ! -f added
44 '
45
46 test_expect_success 'read-tree removes worktree, dirty case' '
47         git checkout -f top &&
48         git update-index --skip-worktree added &&
49         echo dirty >> added &&
50         test_must_fail git read-tree -m -u HEAD^ &&
51         grep -q dirty added &&
52         test "$(git ls-files -t added)" = "S added" &&
53         git update-index --no-skip-worktree added
54 '
55
56 NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
57 ZERO_SHA0=0000000000000000000000000000000000000000
58 setup_absent() {
59         test -f 1 && rm 1
60         git update-index --remove 1 &&
61         git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
62         git update-index --skip-worktree 1
63 }
64
65 test_absent() {
66         echo "100644 $NULL_SHA1 0       1" > expected &&
67         git ls-files --stage 1 > result &&
68         test_cmp expected result &&
69         test ! -f 1
70 }
71
72 setup_dirty() {
73         git update-index --force-remove 1 &&
74         echo dirty > 1 &&
75         git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
76         git update-index --skip-worktree 1
77 }
78
79 test_dirty() {
80         echo "100644 $NULL_SHA1 0       1" > expected &&
81         git ls-files --stage 1 > result &&
82         test_cmp expected result &&
83         echo dirty > expected
84         test_cmp expected 1
85 }
86
87 cat >expected <<EOF
88 S 1
89 H 2
90 H init.t
91 S sub/1
92 H sub/2
93 EOF
94
95 test_expect_success 'index setup' '
96         git checkout -f init &&
97         mkdir sub &&
98         touch ./1 ./2 sub/1 sub/2 &&
99         git add 1 2 sub/1 sub/2 &&
100         git update-index --skip-worktree 1 sub/1 &&
101         git ls-files -t > result &&
102         test_cmp expected result
103 '
104
105 test_expect_success 'git-add ignores worktree content' '
106         setup_absent &&
107         git add 1 &&
108         test_absent
109 '
110
111 test_expect_success 'git-add ignores worktree content' '
112         setup_dirty &&
113         git add 1 &&
114         test_dirty
115 '
116
117 test_expect_success 'git-rm fails if worktree is dirty' '
118         setup_dirty &&
119         test_must_fail git rm 1 &&
120         test_dirty
121 '
122
123 cat >expected <<EOF
124 Would remove expected
125 Would remove result
126 EOF
127 test_expect_success 'git-clean, absent case' '
128         setup_absent &&
129         git clean -n > result &&
130         test_cmp expected result
131 '
132
133 test_expect_success 'git-clean, dirty case' '
134         setup_dirty &&
135         git clean -n > result &&
136         test_cmp expected result
137 '
138
139 #TODO test_expect_failure 'git-apply adds file' false
140 #TODO test_expect_failure 'git-apply updates file' false
141 #TODO test_expect_failure 'git-apply removes file' false
142 #TODO test_expect_failure 'git-mv to skip-worktree' false
143 #TODO test_expect_failure 'git-mv from skip-worktree' false
144 #TODO test_expect_failure 'git-checkout' false
145
146 test_done