Merge branch 'sm/mv-dry-run-update' into jch
[git] / t / t2028-worktree-move.sh
1 #!/bin/sh
2
3 test_description='test git worktree move, remove, lock and unlock'
4
5 . ./test-lib.sh
6
7 test_expect_success 'setup' '
8         test_commit init &&
9         git worktree add source &&
10         git worktree list --porcelain | grep "^worktree" >actual &&
11         cat <<-EOF >expected &&
12         worktree $(pwd)
13         worktree $(pwd)/source
14         EOF
15         test_cmp expected actual
16 '
17
18 test_expect_success 'lock main worktree' '
19         test_must_fail git worktree lock .
20 '
21
22 test_expect_success 'lock linked worktree' '
23         git worktree lock --reason hahaha source &&
24         echo hahaha >expected &&
25         test_cmp expected .git/worktrees/source/locked
26 '
27
28 test_expect_success 'lock linked worktree from another worktree' '
29         rm .git/worktrees/source/locked &&
30         git worktree add elsewhere &&
31         git -C elsewhere worktree lock --reason hahaha ../source &&
32         echo hahaha >expected &&
33         test_cmp expected .git/worktrees/source/locked
34 '
35
36 test_expect_success 'lock worktree twice' '
37         test_must_fail git worktree lock source &&
38         echo hahaha >expected &&
39         test_cmp expected .git/worktrees/source/locked
40 '
41
42 test_expect_success 'lock worktree twice (from the locked worktree)' '
43         test_must_fail git -C source worktree lock . &&
44         echo hahaha >expected &&
45         test_cmp expected .git/worktrees/source/locked
46 '
47
48 test_expect_success 'unlock main worktree' '
49         test_must_fail git worktree unlock .
50 '
51
52 test_expect_success 'unlock linked worktree' '
53         git worktree unlock source &&
54         test_path_is_missing .git/worktrees/source/locked
55 '
56
57 test_expect_success 'unlock worktree twice' '
58         test_must_fail git worktree unlock source &&
59         test_path_is_missing .git/worktrees/source/locked
60 '
61
62 test_expect_success 'move non-worktree' '
63         mkdir abc &&
64         test_must_fail git worktree move abc def
65 '
66
67 test_expect_success 'move locked worktree' '
68         git worktree lock source &&
69         test_when_finished "git worktree unlock source" &&
70         test_must_fail git worktree move source destination
71 '
72
73 test_expect_success 'move worktree' '
74         toplevel="$(pwd)" &&
75         git worktree move source destination &&
76         test_path_is_missing source &&
77         git worktree list --porcelain | grep "^worktree.*/destination" &&
78         ! git worktree list --porcelain | grep "^worktree.*/source" >empty &&
79         git -C destination log --format=%s >actual2 &&
80         echo init >expected2 &&
81         test_cmp expected2 actual2
82 '
83
84 test_expect_success 'move main worktree' '
85         test_must_fail git worktree move . def
86 '
87
88 test_expect_success 'move worktree to another dir' '
89         toplevel="$(pwd)" &&
90         mkdir some-dir &&
91         git worktree move destination some-dir &&
92         test_path_is_missing source &&
93         git worktree list --porcelain | grep "^worktree.*/some-dir/destination" &&
94         git -C some-dir/destination log --format=%s >actual2 &&
95         echo init >expected2 &&
96         test_cmp expected2 actual2
97 '
98
99 test_expect_success 'remove main worktree' '
100         test_must_fail git worktree remove .
101 '
102
103 test_expect_success 'move some-dir/destination back' '
104         git worktree move some-dir/destination destination
105 '
106
107 test_expect_success 'remove locked worktree' '
108         git worktree lock destination &&
109         test_when_finished "git worktree unlock destination" &&
110         test_must_fail git worktree remove destination
111 '
112
113 test_expect_success 'remove worktree with dirty tracked file' '
114         echo dirty >>destination/init.t &&
115         test_when_finished "git -C destination checkout init.t" &&
116         test_must_fail git worktree remove destination
117 '
118
119 test_expect_success 'remove worktree with untracked file' '
120         : >destination/untracked &&
121         test_must_fail git worktree remove destination
122 '
123
124 test_expect_success 'force remove worktree with untracked file' '
125         git worktree remove --force destination &&
126         test_path_is_missing destination
127 '
128
129 test_expect_success 'remove missing worktree' '
130         git worktree add to-be-gone &&
131         test -d .git/worktrees/to-be-gone &&
132         mv to-be-gone gone &&
133         git worktree remove to-be-gone &&
134         test_path_is_missing .git/worktrees/to-be-gone
135 '
136
137 test_expect_success 'NOT remove missing-but-locked worktree' '
138         git worktree add gone-but-locked &&
139         git worktree lock gone-but-locked &&
140         test -d .git/worktrees/gone-but-locked &&
141         mv gone-but-locked really-gone-now &&
142         test_must_fail git worktree remove gone-but-locked &&
143         test_path_is_dir .git/worktrees/gone-but-locked
144 '
145
146 test_done