diff options
| author | cashmere <cashmere@autistici.org> | 2026-09-04 09:05:24 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-09-04 09:05:24 +0200 |
| commit | 4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch) | |
| tree | c296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /test/revert.test | |
| download | relic-master.tar.gz | |
Diffstat (limited to 'test/revert.test')
| -rw-r--r-- | test/revert.test | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/test/revert.test b/test/revert.test new file mode 100644 index 0000000..7cd5dea --- /dev/null +++ b/test/revert.test @@ -0,0 +1,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 |
