1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
|
#
# Copyright (c) 2013 D. Richard Hipp
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the Simplified BSD License (also
# known as the "2-Clause License" or "FreeBSD License".)
#
# This program is distributed in the hope that it will be useful,
# but without any warranty; without even the implied warranty of
# merchantability or fitness for a particular purpose.
#
# Author contact information:
# drh@hwaci.com
# http://www.hwaci.com/drh/
#
############################################################################
#
#
# Tests for 'fossil revert'
#
#
# Test 'fossil revert' against expected results from 'fossil changes' and
# 'fossil addremove -n', as well as by verifying the existence of files
# on the file system. 'fossil undo' is called after each test
#
proc revert-test {testid revertArgs expectedRevertOutput args} {
global RESULT
set passed 1
set args [dict merge {
-changes {} -addremove {} -exists {} -notexists {}
} $args]
set result [fossil revert {*}$revertArgs]
test_status_list revert-$testid $result $expectedRevertOutput
set statusListTests [list -changes changes -addremove {addremove -n}]
foreach {key fossilArgs} $statusListTests {
set expected [dict get $args $key]
set result [fossil {*}$fossilArgs]
test_status_list revert-$testid$key $result $expected
}
set fileExistsTests [list -exists 1 does -notexists 0 should]
foreach {key expected verb} $fileExistsTests {
foreach path [dict get $args $key] {
if {[file exists $path] != $expected} {
set passed 0
protOut " Failure: File $verb not exist: $path"
}
}
test revert-$testid$key $passed
}
fossil undo
}
require_no_open_checkout
test_setup
# Prepare first commit
#
write_file f1 "f1"
write_file f2 "f2"
write_file f3 "f3"
fossil add f1 f2 f3
fossil commit -m "c1"
# Make changes to be reverted
#
# Add f0
write_file f0 "f0"
fossil add f0
# Remove f1
file delete f1
fossil rm f1
# Edit f2
write_file f2 "f2.1"
# Rename f3 to f3n
file rename -force f3 f3n
fossil mv f3 f3n
# Test 'fossil revert' with no arguments
#
revert-test 1-1 {} {
UNMANAGE f0
REVERT f1
REVERT f2
REVERT f3
DELETE f3n
} -addremove {
ADDED f0
} -exists {f0 f1 f2 f3} -notexists f3n
# Test with a single filename argument
#
revert-test 1-2 f0 {
UNMANAGE f0
} -changes {
DELETED f1
EDITED f2
RENAMED f3 -> f3n
} -addremove {
ADDED f0
} -exists {f0 f2 f3n} -notexists f3
revert-test 1-3 f1 {
REVERT f1
} -changes {
ADDED f0
EDITED f2
RENAMED f3 -> f3n
} -exists {f0 f1 f2 f3n} -notexists f3
revert-test 1-4 f2 {
REVERT f2
} -changes {
ADDED f0
DELETED f1
RENAMED f3 -> f3n
} -exists {f0 f2 f3n} -notexists {f1 f3}
# Both files involved in a rename are reverted regardless of which filename
# is used as an argument to 'fossil revert'
#
revert-test 1-5 f3 {
REVERT f3
DELETE f3n
} -changes {
ADDED f0
DELETED f1
EDITED f2
} -exists {f0 f2 f3} -notexists {f1 f3n}
revert-test 1-6 f3n {
REVERT f3
DELETE f3n
} -changes {
ADDED f0
DELETED f1
EDITED f2
} -exists {f0 f2 f3} -notexists {f1 f3n}
# Test with multiple filename arguments
#
revert-test 1-7 {f0 f2 f3n} {
UNMANAGE f0
REVERT f2
REVERT f3
DELETE f3n
} -changes {
DELETED f1
} -addremove {
ADDED f0
} -exists {f0 f2 f3} -notexists {f1 f3n}
# Test reverting the combination of a renamed file and an added file that
# uses the renamed file's original filename.
#
test_setup
write_file f1 "f1"
fossil add f1
fossil commit -m "add f1"
write_file f1n "f1n"
fossil mv f1 f1n
write_file f1 "f1b"
fossil add f1
revert-test 2-1 {} {
REVERT f1
DELETE f1n
} -exists {f1} -notexists {f1n}
# Test reverting a rename in the repo but not completed in the file
# system
test_setup
write_file f1 "f1"
fossil add f1
fossil commit -m "add f1"
fossil mv --soft f1 f1new
test 3-mv-1 {[file exists f1]}
test 3-mv-2 {![file exists f1new]}
revert-test 3-1 {} {
REVERT f1
DELETE f1new
} -exists {f1} -notexists {f1n}
# Test reverting of files under a sub-directory
test_setup
file mkdir d
write_file d/f1 "d/f1"
write_file d/f2 "d/f2"
write_file d/f3 "d/f3"
write_file d/f4 "d/f4"
fossil add d
fossil delete d/f1
fossil commit -m "d/f2 d/f3 d/f4"
## Changes to revert
fossil add d/f1
write_file d/f2 "4-1:d/f2"
fossil changes d/f2
fossil delete --soft d/f3
revert-test 4-1 {d/f1} {
UNMANAGE d/f1
} -changes {
EDITED d/f2
DELETED d/f3
} -addremove {
ADDED d/f1
} -exists {d/f1 d/f2 d/f3}
revert-test 4-2 {d/f2} {
REVERT d/f2
} -changes {
ADDED d/f1
DELETED d/f3
} -exists {d/f1 d/f2 d/f3}
revert-test 4-3 {d/f3} {
REVERT d/f3
} -changes {
ADDED d/f1
EDITED d/f2
} -exists {d/f1 d/f2 d/f3}
fossil mv --soft d/f4 d/f4new
test 4-4-mv-1 {[file exists d/f4]}
test 4-4-mv-2 {![file exists d/f4new]}
revert-test 4-4 {d/f4} {
DELETE d/f4new
REVERT d/f4
} -changes {
ADDED d/f1
EDITED d/f2
DELETED d/f3
} -exists {d/f4} -notexists {d/f4new}
## Commit changes before testing reverting of directory rename,
## otherwise there're could be sequencing issues
fossil redo
fossil commit -m "4-5:setup"
fossil mv --soft d dnew
revert-test 4-5 {d/f1 d/f2 d/f3 d/f4} {
REVERT d/f1
REVERT d/f2
UNMANAGE d/f3
REVERT d/f4
DELETE dnew/f1
DELETE dnew/f2
DELETE dnew/f4
} -addremove {
ADDED d/f3
} -exists {d/f1 d/f2 d/f3 d/f4} -notexists {dnew}
## Test reverting of changes in whole sub-directory tree
test_setup
file mkdir d
write_file f0 "f0"
write_file d/f1 "d/f1"
write_file d/f2 "d/f2"
write_file d/f3 "d/f3"
write_file d/f4 "d/f4"
fossil add f0 d
fossil delete d/f1
fossil commit -m "f0 d/f2 d/f3 d/f4"
## Changes to revert
fossil add d/f1
write_file d/f2 "5-1:d/f2"
fossil changes d/f2
fossil delete --soft d/f3
revert-test 5-1 {d} {
UNMANAGE d/f1
REVERT d/f2
REVERT d/f3
} -addremove {
ADDED d/f1
} -exists {f0 d/f1 d/f2 d/f3}
write_file f0 "5-2:f0"
fossil changes f0
revert-test 5-2 {f0 d} {
UNMANAGE d/f1
REVERT d/f2
REVERT d/f3
REVERT f0
} -addremove {
ADDED d/f1
} -exists {f0 d/f1 d/f2 d/f3}
## Commit changes before testing the revert of directory rename,
## otherwise there're could be sequencing issues
fossil commit -m "5-3:setup"
fossil changes
fossil mv --soft d dnew
revert-test 5-3 {d} {
REVERT d/f1
REVERT d/f2
REVERT d/f4
DELETE dnew/f1
DELETE dnew/f2
DELETE dnew/f4
} -addremove {
ADDED d/f3
} -exists {f0 d/f1 d/f2 d/f3 d/f4} -notexists {dnew}
## Reset/redo the undone results of revert to get to a clean checkout
fossil redo
file mkdir d/e
file mkdir d/e/f
write_file d/e/fe1 "d/e/fe1"
write_file d/e/f/ff1 "d/e/f/ff1"
file mkdir d1
file mkdir d1/e
write_file d1/e/fe1 "d1/e/fe1"
write_file d1/e/fe2 "d1/e/fe2"
fossil add d1/e/fe1
fossil commit d1/e/fe1 -m "d1/e/fe1"
write_file d1/e/fe1 "5-4:d1/e/fe1"
fossil changes d1/e/fe1
fossil add d d1
revert-test 5-4 {d d1} {
UNMANAGE d/f3
UNMANAGE d/e/fe1
UNMANAGE d/e/f/ff1
REVERT d1/e/fe1
UNMANAGE d1/e/fe2
} -addremove {
ADDED d/f3
ADDED d/e/fe1
ADDED d/e/f/ff1
ADDED d1/e/fe2
} -exists {d/f1 d/f2 d/f3 d/f4 d/e/fe1 d/e/fe1 d/e/f/ff1
d1/e/fe1 d1/e/fe2}
###############################################################################
test_cleanup
|