|
1
|
# |
|
2
|
# Copyright (c) 2024 Preben Guldnerg <[email protected]> |
|
3
|
# |
|
4
|
# This program is free software; you can redistribute it and/or |
|
5
|
# modify it under the terms of the Simplified BSD License (also |
|
6
|
# known as the "2-Clause License" or "FreeBSD License".) |
|
7
|
# |
|
8
|
# This program is distributed in the hope that it will be useful, |
|
9
|
# but without any warranty; without even the implied warranty of |
|
10
|
# merchantability or fitness for a particular purpose. |
|
11
|
# |
|
12
|
# Author contact information: |
|
13
|
# [email protected] |
|
14
|
# http://www.hwaci.com/drh/ |
|
15
|
# |
|
16
|
############################################################################ |
|
17
|
# |
|
18
|
# Tests for the "update" command. |
|
19
|
# |
|
20
|
|
|
21
|
# Track number of tests we have set up in test_update_setup. This helps ensure |
|
22
|
# that generated files are ordered in `fossil update --verbose` mode. |
|
23
|
set UPDATE_TEST 0 |
|
24
|
|
|
25
|
proc test_update_setup {desc} { |
|
26
|
global UPDATE_TEST |
|
27
|
incr UPDATE_TEST |
|
28
|
fossil revert |
|
29
|
fossil update |
|
30
|
return [format "test-%02u-%s.txt" $UPDATE_TEST $desc] |
|
31
|
} |
|
32
|
|
|
33
|
# The output is in file name order, so massage $RESULT to remove initial UNCHANGED |
|
34
|
# files. Only do this if we have the expected branch information. |
|
35
|
proc test_update {testname message changes {fossil_args ""}} { |
|
36
|
fossil update --verbose {*}$fossil_args |
|
37
|
if { [regsub {\n-{79}\nupdated-from: [0-9a-z]{40} .*} $::RESULT {} test_result ] } { |
|
38
|
regsub {^(?:UNCHANGED [-a-z0-9.]+\n)*} $test_result {} test_result |
|
39
|
} else { |
|
40
|
set test_result $::RESULT |
|
41
|
} |
|
42
|
test "update-message-$testname" {$message == $test_result} |
|
43
|
fossil changes |
|
44
|
test "update-changes-$testname" {$changes == $::RESULT} |
|
45
|
} |
|
46
|
|
|
47
|
# Use a sequence number for file content that is not important for the test. |
|
48
|
set UPDATE_SEQ_NO 0 |
|
49
|
proc write_seq_to_file {fname} { |
|
50
|
global UPDATE_SEQ_NO |
|
51
|
incr UPDATE_SEQ_NO |
|
52
|
write_file $fname "$UPDATE_SEQ_NO\n" |
|
53
|
} |
|
54
|
|
|
55
|
# Make sure we are not in an open repository and initialize new repository |
|
56
|
test_setup |
|
57
|
|
|
58
|
############################################################################### |
|
59
|
|
|
60
|
fossil update --verbose |
|
61
|
test update-already-up-to-date { |
|
62
|
[regexp {^-{79}\ncheckout: .*\nchanges: +None. Already up-to-date.$} $RESULT] |
|
63
|
} |
|
64
|
|
|
65
|
# Remaining tests are carried out in the order update_cmd() performs checks. |
|
66
|
# |
|
67
|
# Common approach for tests below: |
|
68
|
# 1. Set the testname |
|
69
|
# 2. Set the file name, done by calling update_setup |
|
70
|
# 3. Set message and changes, the expected message message and subsequent changes |
|
71
|
# 3. Optionally set up and commit a common base for the next steps |
|
72
|
# 4. Commit a change to the repository (new tip) |
|
73
|
# 5. Update to the previous version |
|
74
|
# 6. Make changes |
|
75
|
# 7. Call test_update to attempt and update to tip |
|
76
|
|
|
77
|
|
|
78
|
set testname "conflict-standard" |
|
79
|
set fname [test_update_setup $testname] |
|
80
|
set message "CONFLICT $fname" |
|
81
|
set changes "EDITED $fname" |
|
82
|
write_seq_to_file $fname |
|
83
|
fossil add $fname |
|
84
|
fossil commit -m "Add $fname" |
|
85
|
fossil up previous |
|
86
|
write_seq_to_file $fname |
|
87
|
fossil add $fname |
|
88
|
test_update $testname $message $changes -expectError |
|
89
|
|
|
90
|
set testname "add-overwrites" |
|
91
|
set fname [test_update_setup $testname] |
|
92
|
set message "ADD $fname - overwrites an unmanaged file, original copy backed up locally" |
|
93
|
set changes "" |
|
94
|
write_seq_to_file $fname |
|
95
|
fossil add $fname |
|
96
|
fossil commit -m "Add $fname" |
|
97
|
fossil up previous |
|
98
|
write_seq_to_file $fname |
|
99
|
test_update $testname $message $changes -expectError |
|
100
|
|
|
101
|
set testname "add-standard" |
|
102
|
set fname [test_update_setup $testname] |
|
103
|
set message "ADD $fname" |
|
104
|
set changes "" |
|
105
|
write_seq_to_file $fname |
|
106
|
fossil add $fname |
|
107
|
fossil commit -m "Add $fname" |
|
108
|
fossil up previous |
|
109
|
test_update $testname $message $changes |
|
110
|
|
|
111
|
set testname "update-change" |
|
112
|
set fname [test_update_setup $testname] |
|
113
|
set message "UPDATE $fname - change to unmanaged file" |
|
114
|
set changes "DELETED $fname" |
|
115
|
write_seq_to_file $fname |
|
116
|
fossil add $fname |
|
117
|
fossil commit -m "Add $fname" |
|
118
|
write_seq_to_file $fname |
|
119
|
fossil commit -m "Update $fname" |
|
120
|
fossil up previous |
|
121
|
fossil rm --hard $fname |
|
122
|
test_update $testname $message $changes |
|
123
|
|
|
124
|
set testname "update-standard" |
|
125
|
set fname [test_update_setup $testname] |
|
126
|
set message "UPDATE $fname" |
|
127
|
set changes "" |
|
128
|
write_seq_to_file $fname |
|
129
|
fossil add $fname |
|
130
|
fossil commit -m "Add $fname" |
|
131
|
write_seq_to_file $fname |
|
132
|
fossil commit -m "Update $testname" |
|
133
|
fossil up previous |
|
134
|
test_update $testname $message $changes |
|
135
|
|
|
136
|
set testname "update-missing" |
|
137
|
set fname [test_update_setup $testname] |
|
138
|
set message "UPDATE $fname" |
|
139
|
set changes "" |
|
140
|
write_seq_to_file $fname |
|
141
|
fossil add $fname |
|
142
|
fossil commit -m "Add $fname" |
|
143
|
write_seq_to_file $fname |
|
144
|
fossil commit -m "Update $fname" |
|
145
|
fossil up previous |
|
146
|
file delete $fname |
|
147
|
test_update $testname $message $changes |
|
148
|
|
|
149
|
set testname "conflict-deleted" |
|
150
|
set fname [test_update_setup $testname] |
|
151
|
set message "CONFLICT $fname - edited locally but deleted by update" |
|
152
|
set changes "" |
|
153
|
write_seq_to_file $fname |
|
154
|
fossil add $fname |
|
155
|
fossil commit -m "Add $fname" |
|
156
|
fossil rm --hard $fname |
|
157
|
fossil commit -m "Remove $fname" |
|
158
|
fossil up previous |
|
159
|
file delete $fname |
|
160
|
test_update $testname $message $changes -expectError |
|
161
|
|
|
162
|
set testname "remove" |
|
163
|
set fname [test_update_setup $testname] |
|
164
|
set message "REMOVE $fname" |
|
165
|
set changes "" |
|
166
|
write_seq_to_file $fname |
|
167
|
fossil add $fname |
|
168
|
fossil commit -m "Add $fname" |
|
169
|
fossil rm --hard $fname |
|
170
|
fossil commit -m "Remove $fname" |
|
171
|
fossil up previous |
|
172
|
test_update $testname $message $changes |
|
173
|
|
|
174
|
set testname "merge-renamed" |
|
175
|
set fname [test_update_setup $testname] |
|
176
|
set message "MERGE $fname -> $fname.renamed" |
|
177
|
set changes "EDITED $fname.renamed" |
|
178
|
write_file $fname "center\n" |
|
179
|
fossil add $fname |
|
180
|
fossil commit -m "Add $fname" |
|
181
|
write_file $fname "top\ncenter\n" |
|
182
|
fossil mv --hard $fname "$fname.renamed" |
|
183
|
fossil commit -m "Update and rename $fname" |
|
184
|
fossil up previous |
|
185
|
write_file $fname "center\nbelow\n" |
|
186
|
test_update $testname $message $changes |
|
187
|
|
|
188
|
set testname "merge-standard" |
|
189
|
set fname [test_update_setup $testname] |
|
190
|
set message "MERGE $fname" |
|
191
|
set changes "EDITED $fname" |
|
192
|
write_file $fname "center\n" |
|
193
|
fossil add $fname |
|
194
|
fossil commit -m "Add $fname" |
|
195
|
write_file $fname "top\ncenter\n" |
|
196
|
fossil commit -m "Update $fname" |
|
197
|
fossil up previous |
|
198
|
write_file $fname "center\nbelow\n" |
|
199
|
test_update $testname $message $changes |
|
200
|
|
|
201
|
# TODO: test for "Cannot merge symlink" would be platform dependent |
|
202
|
|
|
203
|
set testname "merge-conflict" |
|
204
|
set fname [test_update_setup $testname] |
|
205
|
set message "MERGE $fname\n***** 1 merge conflicts in $fname" |
|
206
|
set changes "CONFLICT $fname" |
|
207
|
write_seq_to_file $fname |
|
208
|
fossil add $fname |
|
209
|
fossil commit -m "Add $fname" |
|
210
|
write_seq_to_file $fname |
|
211
|
fossil commit -m "Update $fname" |
|
212
|
fossil up previous |
|
213
|
write_seq_to_file $fname |
|
214
|
test_update $testname $message $changes -expectError |
|
215
|
|
|
216
|
# TODO: test for "Cannot merge binary file"? |
|
217
|
|
|
218
|
set testname "edited" |
|
219
|
set fname [test_update_setup $testname] |
|
220
|
set message "EDITED $fname\nADD $fname.other" |
|
221
|
set changes "EDITED $fname" |
|
222
|
write_seq_to_file $fname |
|
223
|
fossil add $fname |
|
224
|
fossil commit -m "Add $fname" |
|
225
|
write_seq_to_file "$fname.other" |
|
226
|
fossil add $fname.other |
|
227
|
fossil commit -m "Add $fname.other" |
|
228
|
fossil up previous |
|
229
|
write_seq_to_file $fname |
|
230
|
test_update $testname $message $changes |
|
231
|
|
|
232
|
set testname "unchanged" |
|
233
|
set fname [test_update_setup $testname] |
|
234
|
set message "ADD $fname\nUNCHANGED $fname.unchanged" |
|
235
|
set changes "" |
|
236
|
write_seq_to_file "$fname.unchanged" |
|
237
|
fossil add "$fname.unchanged" |
|
238
|
fossil commit -m "Add $fname.unchanged" |
|
239
|
write_seq_to_file "$fname" |
|
240
|
fossil add "$fname" |
|
241
|
fossil commit -m "Add $fname" |
|
242
|
fossil up previous |
|
243
|
test_update $testname $message $changes |
|
244
|
|
|
245
|
############################################################################### |
|
246
|
|
|
247
|
test_cleanup |
|
248
|
|