]>
Commit | Line | Data |
---|---|---|
4df3ec63 NTND |
1 | #!/bin/sh |
2 | ||
3 | test_description='restore basic functionality' | |
4 | ||
883b98ef | 5 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
334afbc7 JS |
6 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
7 | ||
4df3ec63 NTND |
8 | . ./test-lib.sh |
9 | ||
10 | test_expect_success 'setup' ' | |
11 | test_commit first && | |
12 | echo first-and-a-half >>first.t && | |
13 | git add first.t && | |
14 | test_commit second && | |
15 | echo one >one && | |
16 | echo two >two && | |
17 | echo untracked >untracked && | |
18 | echo ignored >ignored && | |
19 | echo /ignored >.gitignore && | |
20 | git add one two .gitignore && | |
883b98ef | 21 | git update-ref refs/heads/one main |
4df3ec63 NTND |
22 | ' |
23 | ||
24 | test_expect_success 'restore without pathspec is not ok' ' | |
25 | test_must_fail git restore && | |
26 | test_must_fail git restore --source=first | |
27 | ' | |
28 | ||
29 | test_expect_success 'restore a file, ignoring branch of same name' ' | |
30 | cat one >expected && | |
31 | echo dirty >>one && | |
32 | git restore one && | |
33 | test_cmp expected one | |
34 | ' | |
35 | ||
36 | test_expect_success 'restore a file on worktree from another ref' ' | |
37 | test_when_finished git reset --hard && | |
38 | git cat-file blob first:./first.t >expected && | |
39 | git restore --source=first first.t && | |
40 | test_cmp expected first.t && | |
41 | git cat-file blob HEAD:./first.t >expected && | |
42 | git show :first.t >actual && | |
43 | test_cmp expected actual | |
44 | ' | |
45 | ||
46 | test_expect_success 'restore a file in the index from another ref' ' | |
47 | test_when_finished git reset --hard && | |
48 | git cat-file blob first:./first.t >expected && | |
49 | git restore --source=first --staged first.t && | |
50 | git show :first.t >actual && | |
51 | test_cmp expected actual && | |
52 | git cat-file blob HEAD:./first.t >expected && | |
53 | test_cmp expected first.t | |
54 | ' | |
55 | ||
56 | test_expect_success 'restore a file in both the index and worktree from another ref' ' | |
57 | test_when_finished git reset --hard && | |
58 | git cat-file blob first:./first.t >expected && | |
59 | git restore --source=first --staged --worktree first.t && | |
60 | git show :first.t >actual && | |
61 | test_cmp expected actual && | |
62 | test_cmp expected first.t | |
63 | ' | |
64 | ||
65 | test_expect_success 'restore --staged uses HEAD as source' ' | |
66 | test_when_finished git reset --hard && | |
67 | git cat-file blob :./first.t >expected && | |
68 | echo index-dirty >>first.t && | |
69 | git add first.t && | |
70 | git restore --staged first.t && | |
71 | git cat-file blob :./first.t >actual && | |
72 | test_cmp expected actual | |
73 | ' | |
74 | ||
088018e3 ES |
75 | test_expect_success 'restore --worktree --staged uses HEAD as source' ' |
76 | test_when_finished git reset --hard && | |
77 | git show HEAD:./first.t >expected && | |
78 | echo dirty >>first.t && | |
79 | git add first.t && | |
80 | git restore --worktree --staged first.t && | |
81 | git show :./first.t >actual && | |
82 | test_cmp expected actual && | |
83 | test_cmp expected first.t | |
84 | ' | |
85 | ||
4df3ec63 NTND |
86 | test_expect_success 'restore --ignore-unmerged ignores unmerged entries' ' |
87 | git init unmerged && | |
88 | ( | |
89 | cd unmerged && | |
90 | echo one >unmerged && | |
91 | echo one >common && | |
92 | git add unmerged common && | |
93 | git commit -m common && | |
94 | git switch -c first && | |
95 | echo first >unmerged && | |
96 | git commit -am first && | |
883b98ef | 97 | git switch -c second main && |
4df3ec63 NTND |
98 | echo second >unmerged && |
99 | git commit -am second && | |
100 | test_must_fail git merge first && | |
101 | ||
102 | echo dirty >>common && | |
103 | test_must_fail git restore . && | |
104 | ||
105 | git restore --ignore-unmerged --quiet . >output 2>&1 && | |
106 | git diff common >diff-output && | |
bcba4065 NTND |
107 | test_must_be_empty output && |
108 | test_must_be_empty diff-output | |
4df3ec63 NTND |
109 | ) |
110 | ' | |
111 | ||
620c09e1 VN |
112 | test_expect_success 'restore --staged adds deleted intent-to-add file back to index' ' |
113 | echo "nonempty" >nonempty && | |
114 | >empty && | |
115 | git add nonempty empty && | |
116 | git commit -m "create files to be deleted" && | |
117 | git rm --cached nonempty empty && | |
118 | git add -N nonempty empty && | |
119 | git restore --staged nonempty empty && | |
120 | git diff --cached --exit-code | |
121 | ' | |
122 | ||
e701bab3 JK |
123 | test_expect_success 'restore --staged invalidates cache tree for deletions' ' |
124 | test_when_finished git reset --hard && | |
125 | >new1 && | |
126 | >new2 && | |
127 | git add new1 new2 && | |
128 | ||
129 | # It is important to commit and then reset here, so that the index | |
130 | # contains a valid cache-tree for the "both" tree. | |
131 | git commit -m both && | |
132 | git reset --soft HEAD^ && | |
133 | ||
134 | git restore --staged new1 && | |
135 | git commit -m "just new2" && | |
136 | git rev-parse HEAD:new2 && | |
137 | test_must_fail git rev-parse HEAD:new1 | |
138 | ' | |
139 | ||
54f98fee | 140 | test_expect_success 'restore with merge options are incompatible with certain options' ' |
ee8a8882 AK |
141 | for opts in \ |
142 | "--staged --ours" \ | |
143 | "--staged --theirs" \ | |
144 | "--staged --merge" \ | |
54f98fee JH |
145 | "--source=HEAD --ours" \ |
146 | "--source=HEAD --theirs" \ | |
147 | "--source=HEAD --merge" \ | |
ee8a8882 AK |
148 | "--staged --conflict=diff3" \ |
149 | "--staged --worktree --ours" \ | |
150 | "--staged --worktree --theirs" \ | |
151 | "--staged --worktree --merge" \ | |
152 | "--staged --worktree --conflict=zdiff3" | |
153 | do | |
154 | test_must_fail git restore $opts . 2>err && | |
54f98fee | 155 | grep "cannot be used" err || return |
ee8a8882 AK |
156 | done |
157 | ' | |
158 | ||
4df3ec63 | 159 | test_done |