1d14afb2aSJulio Merino#!/bin/sh 2d14afb2aSJulio Merino# 3d14afb2aSJulio Merino# Copyright (c) 2010 Advanced Computing Technologies LLC 4d14afb2aSJulio Merino# Written by: John H. Baldwin <jhb@FreeBSD.org> 5d14afb2aSJulio Merino# All rights reserved. 6d14afb2aSJulio Merino# 7d14afb2aSJulio Merino# Redistribution and use in source and binary forms, with or without 8d14afb2aSJulio Merino# modification, are permitted provided that the following conditions 9d14afb2aSJulio Merino# are met: 10d14afb2aSJulio Merino# 1. Redistributions of source code must retain the above copyright 11d14afb2aSJulio Merino# notice, this list of conditions and the following disclaimer. 12d14afb2aSJulio Merino# 2. Redistributions in binary form must reproduce the above copyright 13d14afb2aSJulio Merino# notice, this list of conditions and the following disclaimer in the 14d14afb2aSJulio Merino# documentation and/or other materials provided with the distribution. 15d14afb2aSJulio Merino# 16d14afb2aSJulio Merino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17d14afb2aSJulio Merino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18d14afb2aSJulio Merino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19d14afb2aSJulio Merino# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20d14afb2aSJulio Merino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21d14afb2aSJulio Merino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22d14afb2aSJulio Merino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23d14afb2aSJulio Merino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24d14afb2aSJulio Merino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25d14afb2aSJulio Merino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26d14afb2aSJulio Merino# SUCH DAMAGE. 27d14afb2aSJulio Merino# 28d14afb2aSJulio Merino# $FreeBSD$ 29d14afb2aSJulio Merino 30d14afb2aSJulio Merino# Various regression tests to test the -A flag to the 'update' command. 31d14afb2aSJulio Merino 32d14afb2aSJulio MerinoFAILED=no 33d14afb2aSJulio MerinoWORKDIR=work 34d14afb2aSJulio Merino 35d14afb2aSJulio Merinousage() 36d14afb2aSJulio Merino{ 37d14afb2aSJulio Merino echo "Usage: always.sh [-s script] [-w workdir]" 38d14afb2aSJulio Merino exit 1 39d14afb2aSJulio Merino} 40d14afb2aSJulio Merino 41d14afb2aSJulio Merino# Allow the user to specify an alternate work directory or script. 42d14afb2aSJulio MerinoCOMMAND=etcupdate 43d14afb2aSJulio Merinowhile getopts "s:w:" option; do 44d14afb2aSJulio Merino case $option in 45d14afb2aSJulio Merino s) 46d14afb2aSJulio Merino COMMAND="sh $OPTARG" 47d14afb2aSJulio Merino ;; 48d14afb2aSJulio Merino w) 49d14afb2aSJulio Merino WORKDIR=$OPTARG 50d14afb2aSJulio Merino ;; 51d14afb2aSJulio Merino *) 52d14afb2aSJulio Merino echo 53d14afb2aSJulio Merino usage 54d14afb2aSJulio Merino ;; 55d14afb2aSJulio Merino esac 56d14afb2aSJulio Merinodone 57d14afb2aSJulio Merinoshift $((OPTIND - 1)) 58d14afb2aSJulio Merinoif [ $# -ne 0 ]; then 59d14afb2aSJulio Merino usage 60d14afb2aSJulio Merinofi 61d14afb2aSJulio Merino 62d14afb2aSJulio MerinoCONFLICTS=$WORKDIR/conflicts 63d14afb2aSJulio MerinoOLD=$WORKDIR/old 64d14afb2aSJulio MerinoNEW=$WORKDIR/current 65d14afb2aSJulio MerinoTEST=$WORKDIR/test 66d14afb2aSJulio Merino 67d14afb2aSJulio Merino# The various states of the comparison of a file between two trees. 68d14afb2aSJulio Merinostates="equal first second difftype difflinks difffiles" 69d14afb2aSJulio Merino 70d14afb2aSJulio Merino# These tests deal with ignoring certain patterns of files. We run 71d14afb2aSJulio Merino# the test multiple times forcing the install of different patterns. 72d14afb2aSJulio Merinobuild_trees() 73d14afb2aSJulio Merino{ 74d14afb2aSJulio Merino local i 75d14afb2aSJulio Merino 76d14afb2aSJulio Merino rm -rf $OLD $NEW $TEST $CONFLICTS 77d14afb2aSJulio Merino 78d14afb2aSJulio Merino for i in $states; do 79d14afb2aSJulio Merino for j in $states; do 80d14afb2aSJulio Merino for k in $states; do 81d14afb2aSJulio Merino mkdir -p $OLD/$i/$j/$k $NEW/$i/$j/$k \ 82d14afb2aSJulio Merino $TEST/$i/$j/$k 83d14afb2aSJulio Merino done 84d14afb2aSJulio Merino done 85d14afb2aSJulio Merino done 86d14afb2aSJulio Merino 87d14afb2aSJulio Merino # What follows are the various warning/conflict cases from the 88d14afb2aSJulio Merino # larger regression tests. These results of many of these 89d14afb2aSJulio Merino # tests should be changed when installation is forced. The 90d14afb2aSJulio Merino # cases when these updates should still fail even when forced 91d14afb2aSJulio Merino # are: 1) it should not force the removal of a modified file 92d14afb2aSJulio Merino # and 2) it should not remove a subdirectory that contains a 93d14afb2aSJulio Merino # modified or added file. 94d14afb2aSJulio Merino 95d14afb2aSJulio Merino # /first/difftype/second: File with different local type 96d14afb2aSJulio Merino # removed. Should generate a warning. 97d14afb2aSJulio Merino mkfifo $OLD/first/difftype/second/fifo 98d14afb2aSJulio Merino mkdir $TEST/first/difftype/second/fifo 99d14afb2aSJulio Merino 100d14afb2aSJulio Merino # /first/difflinks/second: Modified link removed. Should 101d14afb2aSJulio Merino # generate a warning. 102d14afb2aSJulio Merino ln -s "old link" $OLD/first/difflinks/second/link 103d14afb2aSJulio Merino ln -s "test link" $TEST/first/difflinks/second/link 104d14afb2aSJulio Merino 105d14afb2aSJulio Merino # /first/difffiles/second: Modified file removed. Should 106d14afb2aSJulio Merino # generate a warning. 107d14afb2aSJulio Merino echo "foo" > $OLD/first/difffiles/second/file 108d14afb2aSJulio Merino echo "bar" > $TEST/first/difffiles/second/file 109d14afb2aSJulio Merino 110d14afb2aSJulio Merino # /second/second/difftype: Newly added file conflicts with 111d14afb2aSJulio Merino # existing file in test tree of a different type. Should 112d14afb2aSJulio Merino # generate a warning. 113d14afb2aSJulio Merino mkdir $NEW/second/second/difftype/dir 114d14afb2aSJulio Merino mkfifo $TEST/second/second/difftype/dir 115d14afb2aSJulio Merino 116d14afb2aSJulio Merino # /second/second/difflinks: Newly added link conflicts with 117d14afb2aSJulio Merino # existing link in test tree. Should generate a warning. 118d14afb2aSJulio Merino ln -s "new link" $NEW/second/second/difflinks/link 119d14afb2aSJulio Merino ln -s "test link" $TEST/second/second/difflinks/link 120d14afb2aSJulio Merino 121d14afb2aSJulio Merino # /second/second/difffiles: Newly added file conflicts with 122d14afb2aSJulio Merino # existing file in test tree. Should generate a warning. 123d14afb2aSJulio Merino echo "new" > $NEW/second/second/difffiles/file 124d14afb2aSJulio Merino echo "test" > $TEST/second/second/difffiles/file 125d14afb2aSJulio Merino 126d14afb2aSJulio Merino # /difftype/first/first: A removed file has changed type. 127d14afb2aSJulio Merino # This should generate a warning. 128d14afb2aSJulio Merino mkfifo $OLD/difftype/first/first/fifo 129d14afb2aSJulio Merino mkdir $NEW/difftype/first/first/fifo 130d14afb2aSJulio Merino 131d14afb2aSJulio Merino # /difftype/difftype/difftype: All three files (old, new, and 132d14afb2aSJulio Merino # test) are different types from each other. This should 133d14afb2aSJulio Merino # generate a warning. 134d14afb2aSJulio Merino mkfifo $OLD/difftype/difftype/difftype/one 135d14afb2aSJulio Merino mkdir $NEW/difftype/difftype/difftype/one 136d14afb2aSJulio Merino echo "foo" > $TEST/difftype/difftype/difftype/one 137d14afb2aSJulio Merino mkdir $OLD/difftype/difftype/difftype/two 138d14afb2aSJulio Merino echo "baz" > $NEW/difftype/difftype/difftype/two 139d14afb2aSJulio Merino ln -s "bar" $TEST/difftype/difftype/difftype/two 140d14afb2aSJulio Merino 141d14afb2aSJulio Merino # /difftype/difftype/difflinks: A file has changed from a 142d14afb2aSJulio Merino # non-link to a link in both the new and test trees, but the 143d14afb2aSJulio Merino # target of the new and test links differ. This should 144d14afb2aSJulio Merino # generate a new link conflict. 145d14afb2aSJulio Merino mkfifo $OLD/difftype/difftype/difflinks/link 146d14afb2aSJulio Merino ln -s "new" $NEW/difftype/difftype/difflinks/link 147d14afb2aSJulio Merino ln -s "test" $TEST/difftype/difftype/difflinks/link 148d14afb2aSJulio Merino 149d14afb2aSJulio Merino # /difftype/difftype/difffile: A file has changed from a 150d14afb2aSJulio Merino # non-regular file to a regular file in both the new and test 151d14afb2aSJulio Merino # trees, but the contents in the new and test files differ. 152d14afb2aSJulio Merino # This should generate a new file conflict. 153d14afb2aSJulio Merino ln -s "old" $OLD/difftype/difftype/difffiles/file 154d14afb2aSJulio Merino echo "foo" > $NEW/difftype/difftype/difffiles/file 155d14afb2aSJulio Merino echo "bar" > $TEST/difftype/difftype/difffiles/file 156d14afb2aSJulio Merino 157d14afb2aSJulio Merino # /difflinks/first/first: A modified link is missing in the 158d14afb2aSJulio Merino # test tree. This should generate a warning. 159d14afb2aSJulio Merino ln -s "old" $OLD/difflinks/first/first/link 160d14afb2aSJulio Merino ln -s "new" $NEW/difflinks/first/first/link 161d14afb2aSJulio Merino 162d14afb2aSJulio Merino # /difflinks/difftype/difftype: An updated link has been 163d14afb2aSJulio Merino # changed to a different file type in the test tree. This 164d14afb2aSJulio Merino # should generate a warning. 165d14afb2aSJulio Merino ln -s "old" $OLD/difflinks/difftype/difftype/link 166d14afb2aSJulio Merino ln -s "new" $NEW/difflinks/difftype/difftype/link 167d14afb2aSJulio Merino echo "test" > $TEST/difflinks/difftype/difftype/link 168d14afb2aSJulio Merino 169d14afb2aSJulio Merino # /difflinks/difflinks/difflinks: An updated link has been 170d14afb2aSJulio Merino # modified in the test tree and doesn't match either the old 171d14afb2aSJulio Merino # or new links. This should generate a warning. 172d14afb2aSJulio Merino ln -s "old" $OLD/difflinks/difflinks/difflinks/link 173d14afb2aSJulio Merino ln -s "new" $NEW/difflinks/difflinks/difflinks/link 174d14afb2aSJulio Merino ln -s "test" $TEST/difflinks/difflinks/difflinks/link 175d14afb2aSJulio Merino 176d14afb2aSJulio Merino # /difffiles/first/first: A removed file has been changed in 177d14afb2aSJulio Merino # the new tree. This should generate a warning. 178d14afb2aSJulio Merino echo "foo" > $OLD/difffiles/first/first/file 179d14afb2aSJulio Merino echo "bar" > $NEW/difffiles/first/first/file 180d14afb2aSJulio Merino 181d14afb2aSJulio Merino # /difffiles/difftype/difftype: An updated regular file has 182d14afb2aSJulio Merino # been changed to a different file type in the test tree. 183d14afb2aSJulio Merino # This should generate a warning. 184d14afb2aSJulio Merino echo "old" > $OLD/difffiles/difftype/difftype/file 185d14afb2aSJulio Merino echo "new" > $NEW/difffiles/difftype/difftype/file 186d14afb2aSJulio Merino mkfifo $TEST/difffiles/difftype/difftype/file 187d14afb2aSJulio Merino 188d14afb2aSJulio Merino # /difffiles/difffiles/difffiles: A modified regular file was 189d14afb2aSJulio Merino # updated in the new tree. The changes should be merged into 190d14afb2aSJulio Merino # to the new file if possible. If the merge fails, a conflict 191d14afb2aSJulio Merino # should be generated. For this test we just include the 192d14afb2aSJulio Merino # conflict case. 193d14afb2aSJulio Merino cat > $OLD/difffiles/difffiles/difffiles/conflict <<EOF 194d14afb2aSJulio Merinothis is an old file 195d14afb2aSJulio MerinoEOF 196d14afb2aSJulio Merino cat > $NEW/difffiles/difffiles/difffiles/conflict <<EOF 197d14afb2aSJulio Merinothis is a new file 198d14afb2aSJulio MerinoEOF 199d14afb2aSJulio Merino cat > $TEST/difffiles/difffiles/difffiles/conflict <<EOF 200d14afb2aSJulio Merinothis is a test file 201d14afb2aSJulio MerinoEOF 202d14afb2aSJulio Merino 203d14afb2aSJulio Merino ## Tests for adding directories 204d14afb2aSJulio Merino mkdir -p $OLD/adddir $NEW/adddir $TEST/adddir 205d14afb2aSJulio Merino 206d14afb2aSJulio Merino # /adddir/conflict: Add a new file in a directory that already 207d14afb2aSJulio Merino # exists as a file. This should generate two warnings. 208d14afb2aSJulio Merino mkdir $NEW/adddir/conflict 209d14afb2aSJulio Merino touch $NEW/adddir/conflict/newfile 210d14afb2aSJulio Merino touch $TEST/adddir/conflict 211d14afb2aSJulio Merino 212d14afb2aSJulio Merino ## Tests for removing directories 213d14afb2aSJulio Merino mkdir -p $OLD/rmdir $NEW/rmdir $TEST/rmdir 214d14afb2aSJulio Merino 215d14afb2aSJulio Merino # /rmdir/extra: Do not remove a directory with an extra local file. 216d14afb2aSJulio Merino # This should generate a warning. 217d14afb2aSJulio Merino for i in $OLD $TEST; do 218d14afb2aSJulio Merino mkdir $i/rmdir/extra 219d14afb2aSJulio Merino done 220d14afb2aSJulio Merino echo "foo" > $TEST/rmdir/extra/localfile.txt 221d14afb2aSJulio Merino 222d14afb2aSJulio Merino # /rmdir/conflict: Do not remove a directory with a conflicted 223d14afb2aSJulio Merino # remove file. This should generate a warning. 224d14afb2aSJulio Merino for i in $OLD $TEST; do 225d14afb2aSJulio Merino mkdir $i/rmdir/conflict 226d14afb2aSJulio Merino done 227d14afb2aSJulio Merino mkfifo $OLD/rmdir/conflict/difftype 228d14afb2aSJulio Merino mkdir $TEST/rmdir/conflict/difftype 229d14afb2aSJulio Merino 230d14afb2aSJulio Merino ## Tests for converting files to directories and vice versa 231d14afb2aSJulio Merino for i in $OLD $NEW $TEST; do 232d14afb2aSJulio Merino for j in already old fromdir todir; do 233d14afb2aSJulio Merino mkdir -p $i/dirchange/$j 234d14afb2aSJulio Merino done 235d14afb2aSJulio Merino done 236d14afb2aSJulio Merino 237d14afb2aSJulio Merino # /dirchange/fromdir/extradir: Convert a directory tree to a 238d14afb2aSJulio Merino # file. The test tree includes an extra file in the directory 239d14afb2aSJulio Merino # that is not present in the old tree. This should generate a 240d14afb2aSJulio Merino # warning. 241d14afb2aSJulio Merino for i in $OLD $TEST; do 242d14afb2aSJulio Merino mkdir $i/dirchange/fromdir/extradir 243d14afb2aSJulio Merino echo "foo" > $i/dirchange/fromdir/extradir/file 244d14afb2aSJulio Merino done 245d14afb2aSJulio Merino mkfifo $TEST/dirchange/fromdir/extradir/fifo 246d14afb2aSJulio Merino ln -s "bar" $NEW/dirchange/fromdir/extradir 247d14afb2aSJulio Merino 248d14afb2aSJulio Merino # /dirchange/fromdir/conflict: Convert a directory tree to a 249d14afb2aSJulio Merino # file. The test tree includes a local change that generates 250d14afb2aSJulio Merino # a warning and prevents the removal of the directory. 251d14afb2aSJulio Merino for i in $OLD $TEST; do 252d14afb2aSJulio Merino mkdir $i/dirchange/fromdir/conflict 253d14afb2aSJulio Merino done 254d14afb2aSJulio Merino echo "foo" > $OLD/dirchange/fromdir/conflict/somefile 255d14afb2aSJulio Merino echo "bar" > $TEST/dirchange/fromdir/conflict/somefile 256d14afb2aSJulio Merino mkfifo $NEW/dirchange/fromdir/conflict 257d14afb2aSJulio Merino 258d14afb2aSJulio Merino # /dirchange/todir/difffile: Convert a file to a directory 259d14afb2aSJulio Merino # tree. The test tree has a locally modified version of the 260d14afb2aSJulio Merino # file so that the conversion fails with a warning. 261d14afb2aSJulio Merino echo "foo" > $OLD/dirchange/todir/difffile 262d14afb2aSJulio Merino mkdir $NEW/dirchange/todir/difffile 263d14afb2aSJulio Merino echo "baz" > $NEW/dirchange/todir/difffile/file 264d14afb2aSJulio Merino echo "bar" > $TEST/dirchange/todir/difffile 265d14afb2aSJulio Merino 266d14afb2aSJulio Merino # /dirchange/todir/difftype: Similar to the previous test, but 267d14afb2aSJulio Merino # the conflict is due to a change in the file type. 268d14afb2aSJulio Merino echo "foo" > $OLD/dirchange/todir/difftype 269d14afb2aSJulio Merino mkdir $NEW/dirchange/todir/difftype 270d14afb2aSJulio Merino echo "baz" > $NEW/dirchange/todir/difftype/file 271d14afb2aSJulio Merino mkfifo $TEST/dirchange/todir/difftype 272d14afb2aSJulio Merino} 273d14afb2aSJulio Merino 274d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST 275d14afb2aSJulio Merinomissing() 276d14afb2aSJulio Merino{ 277d14afb2aSJulio Merino if [ -e $TEST/$1 -o -L $TEST/$1 ]; then 278d14afb2aSJulio Merino echo "File $1 should be missing" 279d14afb2aSJulio Merino FAILED=yes 280d14afb2aSJulio Merino fi 281d14afb2aSJulio Merino} 282d14afb2aSJulio Merino 283d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST 284d14afb2aSJulio Merinopresent() 285d14afb2aSJulio Merino{ 286d14afb2aSJulio Merino if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then 287d14afb2aSJulio Merino echo "File $1 should be present" 288d14afb2aSJulio Merino FAILED=yes 289d14afb2aSJulio Merino fi 290d14afb2aSJulio Merino} 291d14afb2aSJulio Merino 292d14afb2aSJulio Merino# $1 - relative path to file that should be a fifo in TEST 293d14afb2aSJulio Merinofifo() 294d14afb2aSJulio Merino{ 295d14afb2aSJulio Merino if ! [ -p $TEST/$1 ]; then 296d14afb2aSJulio Merino echo "File $1 should be a FIFO" 297d14afb2aSJulio Merino FAILED=yes 298d14afb2aSJulio Merino fi 299d14afb2aSJulio Merino} 300d14afb2aSJulio Merino 301d14afb2aSJulio Merino# $1 - relative path to file that should be a directory in TEST 302d14afb2aSJulio Merinodir() 303d14afb2aSJulio Merino{ 304d14afb2aSJulio Merino if ! [ -d $TEST/$1 ]; then 305d14afb2aSJulio Merino echo "File $1 should be a directory" 306d14afb2aSJulio Merino FAILED=yes 307d14afb2aSJulio Merino fi 308d14afb2aSJulio Merino} 309d14afb2aSJulio Merino 310d14afb2aSJulio Merino# $1 - relative path to file that should be a symlink in TEST 311d14afb2aSJulio Merino# $2 - optional value of the link 312d14afb2aSJulio Merinolink() 313d14afb2aSJulio Merino{ 314d14afb2aSJulio Merino local val 315d14afb2aSJulio Merino 316d14afb2aSJulio Merino if ! [ -L $TEST/$1 ]; then 317d14afb2aSJulio Merino echo "File $1 should be a link" 318d14afb2aSJulio Merino FAILED=yes 319d14afb2aSJulio Merino elif [ $# -gt 1 ]; then 320d14afb2aSJulio Merino val=`readlink $TEST/$1` 321d14afb2aSJulio Merino if [ "$val" != "$2" ]; then 322d14afb2aSJulio Merino echo "Link $1 should link to \"$2\"" 323d14afb2aSJulio Merino FAILED=yes 324d14afb2aSJulio Merino fi 325d14afb2aSJulio Merino fi 326d14afb2aSJulio Merino} 327d14afb2aSJulio Merino 328d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST 329d14afb2aSJulio Merino# $2 - optional string that should match file contents 330d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present 331d14afb2aSJulio Merinofile() 332d14afb2aSJulio Merino{ 333d14afb2aSJulio Merino local contents sum 334d14afb2aSJulio Merino 335d14afb2aSJulio Merino if ! [ -f $TEST/$1 ]; then 336d14afb2aSJulio Merino echo "File $1 should be a regular file" 337d14afb2aSJulio Merino FAILED=yes 338d14afb2aSJulio Merino elif [ $# -eq 2 ]; then 339d14afb2aSJulio Merino contents=`cat $TEST/$1` 340d14afb2aSJulio Merino if [ "$contents" != "$2" ]; then 341d14afb2aSJulio Merino echo "File $1 has wrong contents" 342d14afb2aSJulio Merino FAILED=yes 343d14afb2aSJulio Merino fi 344d14afb2aSJulio Merino elif [ $# -eq 3 ]; then 345d14afb2aSJulio Merino sum=`md5 -q $TEST/$1` 346d14afb2aSJulio Merino if [ "$sum" != "$3" ]; then 347d14afb2aSJulio Merino echo "File $1 has wrong contents" 348d14afb2aSJulio Merino FAILED=yes 349d14afb2aSJulio Merino fi 350d14afb2aSJulio Merino fi 351d14afb2aSJulio Merino} 352d14afb2aSJulio Merino 353d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict 354d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents 355d14afb2aSJulio Merinoconflict() 356d14afb2aSJulio Merino{ 357d14afb2aSJulio Merino local sum 358d14afb2aSJulio Merino 359d14afb2aSJulio Merino if ! [ -f $CONFLICTS/$1 ]; then 360d14afb2aSJulio Merino echo "File $1 missing conflict" 361d14afb2aSJulio Merino FAILED=yes 362d14afb2aSJulio Merino elif [ $# -gt 1 ]; then 363d14afb2aSJulio Merino sum=`md5 -q $CONFLICTS/$1` 364d14afb2aSJulio Merino if [ "$sum" != "$2" ]; then 365d14afb2aSJulio Merino echo "Conflict $1 has wrong contents" 366d14afb2aSJulio Merino FAILED=yes 367d14afb2aSJulio Merino fi 368d14afb2aSJulio Merino fi 369d14afb2aSJulio Merino} 370d14afb2aSJulio Merino 371d14afb2aSJulio Merino# $1 - relative path to a regular file that should not have a conflict 372d14afb2aSJulio Merinonoconflict() 373d14afb2aSJulio Merino{ 374d14afb2aSJulio Merino if [ -f $CONFLICTS/$1 ]; then 375d14afb2aSJulio Merino echo "File $1 should not have a conflict" 376d14afb2aSJulio Merino FAILED=yes 377d14afb2aSJulio Merino fi 378d14afb2aSJulio Merino} 379d14afb2aSJulio Merino 380d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then 381d14afb2aSJulio Merino echo "must be root" 382d14afb2aSJulio Merino exit 0 383d14afb2aSJulio Merinofi 384d14afb2aSJulio Merino 385d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then 386d14afb2aSJulio Merino echo "WARNING: /etc/etcupdate.conf settings may break some tests." 387d14afb2aSJulio Merinofi 388d14afb2aSJulio Merino 389d14afb2aSJulio Merino# First run the test ignoring no patterns. 390d14afb2aSJulio Merino 391d14afb2aSJulio Merinobuild_trees 392d14afb2aSJulio Merino 393d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 394d14afb2aSJulio Merino 395d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 396d14afb2aSJulio Merino D /dirchange/fromdir/extradir/file 397d14afb2aSJulio Merino C /difffiles/difffiles/difffiles/conflict 398d14afb2aSJulio Merino C /difftype/difftype/difffiles/file 399d14afb2aSJulio Merino C /second/second/difffiles/file 400d14afb2aSJulio MerinoWarnings: 401d14afb2aSJulio Merino Modified regular file remains: /dirchange/fromdir/conflict/somefile 402d14afb2aSJulio Merino Modified regular file remains: /first/difffiles/second/file 403d14afb2aSJulio Merino Modified symbolic link remains: /first/difflinks/second/link 404d14afb2aSJulio Merino Modified directory remains: /first/difftype/second/fifo 405d14afb2aSJulio Merino Modified directory remains: /rmdir/conflict/difftype 406d14afb2aSJulio Merino Non-empty directory remains: /rmdir/extra 407d14afb2aSJulio Merino Non-empty directory remains: /rmdir/conflict 408d14afb2aSJulio Merino Modified mismatch: /difffiles/difftype/difftype/file (regular file vs fifo file) 409d14afb2aSJulio Merino Removed file changed: /difffiles/first/first/file 410d14afb2aSJulio Merino Modified link changed: /difflinks/difflinks/difflinks/link ("old" became "new") 411d14afb2aSJulio Merino Modified mismatch: /difflinks/difftype/difftype/link (symbolic link vs regular file) 412d14afb2aSJulio Merino Removed link changed: /difflinks/first/first/link ("old" became "new") 413d14afb2aSJulio Merino New link conflict: /difftype/difftype/difflinks/link ("new" vs "test") 414d14afb2aSJulio Merino Modified regular file changed: /difftype/difftype/difftype/one (fifo file became directory) 415d14afb2aSJulio Merino Modified symbolic link changed: /difftype/difftype/difftype/two (directory became regular file) 416d14afb2aSJulio Merino Remove mismatch: /difftype/first/first/fifo (fifo file became directory) 417d14afb2aSJulio Merino Modified directory changed: /dirchange/fromdir/conflict (directory became fifo file) 418d14afb2aSJulio Merino Modified directory changed: /dirchange/fromdir/extradir (directory became symbolic link) 419d14afb2aSJulio Merino Modified regular file changed: /dirchange/todir/difffile (regular file became directory) 420d14afb2aSJulio Merino Modified fifo file changed: /dirchange/todir/difftype (regular file became directory) 421d14afb2aSJulio Merino New file mismatch: /adddir/conflict (directory vs regular file) 422d14afb2aSJulio Merino Directory mismatch: $TEST/adddir/conflict (regular file) 423d14afb2aSJulio Merino Directory mismatch: $TEST/dirchange/todir/difffile (regular file) 424d14afb2aSJulio Merino Directory mismatch: $TEST/dirchange/todir/difftype (fifo file) 425d14afb2aSJulio Merino New link conflict: /second/second/difflinks/link ("new link" vs "test link") 426d14afb2aSJulio Merino New file mismatch: /second/second/difftype/dir (directory vs fifo file) 427d14afb2aSJulio MerinoEOF 428d14afb2aSJulio Merino 429d14afb2aSJulio Merinoecho "Differences for regular:" 430d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 431d14afb2aSJulio Merino || FAILED=yes 432d14afb2aSJulio Merino 433d14afb2aSJulio Merino## /first/difftype/second: 434d14afb2aSJulio Merinopresent /first/difftype/second/fifo 435d14afb2aSJulio Merino 436d14afb2aSJulio Merino## /first/difflinks/second: 437d14afb2aSJulio Merinolink /first/difflinks/second/link "test link" 438d14afb2aSJulio Merino 439d14afb2aSJulio Merino## /first/difffiles/second: 440d14afb2aSJulio Merinofile /first/difffiles/second/file "bar" 441d14afb2aSJulio Merino 442d14afb2aSJulio Merino## /second/second/difftype: 443d14afb2aSJulio Merinofifo /second/second/difftype/dir 444d14afb2aSJulio Merino 445d14afb2aSJulio Merino## /second/second/difflinks: 446d14afb2aSJulio Merinolink /second/second/difflinks/link "test link" 447d14afb2aSJulio Merino 448d14afb2aSJulio Merino## /second/second/difffiles: 449d14afb2aSJulio Merinofile /second/second/difffiles/file "test" 450d14afb2aSJulio Merinoconflict /second/second/difffiles/file 4f2ee8620a251fd53f06bb6112eb6ffa 451d14afb2aSJulio Merino 452d14afb2aSJulio Merino## /difftype/first/first: 453d14afb2aSJulio Merinomissing /difftype/first/first/fifo 454d14afb2aSJulio Merino 455d14afb2aSJulio Merino## /difftype/difftype/difftype: 456d14afb2aSJulio Merinofile /difftype/difftype/difftype/one "foo" 457d14afb2aSJulio Merinolink /difftype/difftype/difftype/two "bar" 458d14afb2aSJulio Merino 459d14afb2aSJulio Merino## /difftype/difftype/difflinks: 460d14afb2aSJulio Merinolink /difftype/difftype/difflinks/link "test" 461d14afb2aSJulio Merino 462d14afb2aSJulio Merino## /difftype/difftype/difffile: 463d14afb2aSJulio Merinoconflict /difftype/difftype/difffiles/file 117f2bcd1f6491f6044e79e5a57a9229 464d14afb2aSJulio Merino 465d14afb2aSJulio Merino## /difflinks/first/first: 466d14afb2aSJulio Merinomissing /difflinks/first/first/link 467d14afb2aSJulio Merino 468d14afb2aSJulio Merino## /difflinks/difftype/difftype: 469d14afb2aSJulio Merinofile /difflinks/difftype/difftype/link "test" 470d14afb2aSJulio Merino 471d14afb2aSJulio Merino## /difflinks/difflinks/difflinks: 472d14afb2aSJulio Merinolink /difflinks/difflinks/difflinks/link "test" 473d14afb2aSJulio Merino 474d14afb2aSJulio Merino## /difffiles/first/first: 475d14afb2aSJulio Merinomissing /difffiles/first/first/file 476d14afb2aSJulio Merino 477d14afb2aSJulio Merino## /difffiles/difftype/difftype: 478d14afb2aSJulio Merinofifo /difffiles/difftype/difftype/file 479d14afb2aSJulio Merino 480d14afb2aSJulio Merino## /difffiles/difffiles/difffiles: 481d14afb2aSJulio Merinofile /difffiles/difffiles/difffiles/conflict "this is a test file" 482d14afb2aSJulio Merinoconflict /difffiles/difffiles/difffiles/conflict \ 483d14afb2aSJulio Merino 8261cfdd89280c4a6c26e4ac86541fe9 484d14afb2aSJulio Merino 485d14afb2aSJulio Merino## /adddir/conflict: 486d14afb2aSJulio Merinofile /adddir/conflict 487d14afb2aSJulio Merino 488d14afb2aSJulio Merino## /rmdir/extra: 489d14afb2aSJulio Merinodir /rmdir/extra 490d14afb2aSJulio Merinofile /rmdir/extra/localfile.txt "foo" 491d14afb2aSJulio Merino 492d14afb2aSJulio Merino## /rmdir/conflict: 493d14afb2aSJulio Merinodir /rmdir/conflict/difftype 494d14afb2aSJulio Merinopresent /rmdir/conflict 495d14afb2aSJulio Merino 496d14afb2aSJulio Merino## /dirchange/fromdir/extradir: 497d14afb2aSJulio Merinomissing /dirchange/fromdir/extradir/file 498d14afb2aSJulio Merinofifo /dirchange/fromdir/extradir/fifo 499d14afb2aSJulio Merino 500d14afb2aSJulio Merino## /dirchange/fromdir/conflict: 501d14afb2aSJulio Merinofile /dirchange/fromdir/conflict/somefile "bar" 502d14afb2aSJulio Merino 503d14afb2aSJulio Merino## /dirchange/todir/difffile: 504d14afb2aSJulio Merinofile /dirchange/todir/difffile "bar" 505d14afb2aSJulio Merino 506d14afb2aSJulio Merino## /dirchange/todir/difftype: 507d14afb2aSJulio Merinofifo /dirchange/todir/difftype 508d14afb2aSJulio Merino 509d14afb2aSJulio Merino# Now test with -A '/first*' -A '/second* /*di*'. This should remove 510d14afb2aSJulio Merino# most of the warnings and conflicts. 511d14afb2aSJulio Merino 512d14afb2aSJulio Merinobuild_trees 513d14afb2aSJulio Merino 514d14afb2aSJulio Merino$COMMAND -r -A '/first*' -A '/second* /*di*' -d $WORKDIR -D $TEST > \ 515d14afb2aSJulio Merino $WORKDIR/test1.out 516d14afb2aSJulio Merino 517d14afb2aSJulio Merinocat > $WORKDIR/correct1.out <<EOF 518d14afb2aSJulio Merino D /dirchange/fromdir/extradir/file 519d14afb2aSJulio Merino U /difffiles/difffiles/difffiles/conflict 520d14afb2aSJulio Merino U /difffiles/difftype/difftype/file 521d14afb2aSJulio Merino A /difffiles/first/first/file 522d14afb2aSJulio Merino U /difflinks/difflinks/difflinks/link 523d14afb2aSJulio Merino U /difflinks/difftype/difftype/link 524d14afb2aSJulio Merino A /difflinks/first/first/link 525d14afb2aSJulio Merino U /difftype/difftype/difffiles/file 526d14afb2aSJulio Merino U /difftype/difftype/difflinks/link 527d14afb2aSJulio Merino D /difftype/difftype/difftype/one 528d14afb2aSJulio Merino U /difftype/difftype/difftype/two 529d14afb2aSJulio Merino U /dirchange/todir/difffile 530d14afb2aSJulio Merino U /dirchange/todir/difftype 531d14afb2aSJulio Merino U /adddir/conflict 532d14afb2aSJulio Merino A /adddir/conflict/newfile 533d14afb2aSJulio Merino A /dirchange/todir/difffile/file 534d14afb2aSJulio Merino A /dirchange/todir/difftype/file 535d14afb2aSJulio Merino U /second/second/difffiles/file 536d14afb2aSJulio Merino U /second/second/difflinks/link 537d14afb2aSJulio Merino D /second/second/difftype/dir 538d14afb2aSJulio MerinoWarnings: 539d14afb2aSJulio Merino Modified regular file remains: /dirchange/fromdir/conflict/somefile 540d14afb2aSJulio Merino Modified regular file remains: /first/difffiles/second/file 541d14afb2aSJulio Merino Modified symbolic link remains: /first/difflinks/second/link 542d14afb2aSJulio Merino Modified directory remains: /first/difftype/second/fifo 543d14afb2aSJulio Merino Modified directory remains: /rmdir/conflict/difftype 544d14afb2aSJulio Merino Non-empty directory remains: /rmdir/extra 545d14afb2aSJulio Merino Non-empty directory remains: /rmdir/conflict 546d14afb2aSJulio Merino Modified directory changed: /dirchange/fromdir/conflict (directory became fifo file) 547d14afb2aSJulio Merino Modified directory changed: /dirchange/fromdir/extradir (directory became symbolic link) 548d14afb2aSJulio MerinoEOF 549d14afb2aSJulio Merino 550d14afb2aSJulio Merinoecho "Differences for -A '/first*' -A '/second* /*di*':" 551d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct1.out -L "test" $WORKDIR/test1.out \ 552d14afb2aSJulio Merino || FAILED=yes 553d14afb2aSJulio Merino 554d14afb2aSJulio Merino## /first/difftype/second: 555d14afb2aSJulio Merinopresent /first/difftype/second/fifo 556d14afb2aSJulio Merino 557d14afb2aSJulio Merino## /first/difflinks/second: 558d14afb2aSJulio Merinolink /first/difflinks/second/link "test link" 559d14afb2aSJulio Merino 560d14afb2aSJulio Merino## /first/difffiles/second: 561d14afb2aSJulio Merinofile /first/difffiles/second/file "bar" 562d14afb2aSJulio Merino 563d14afb2aSJulio Merino## /second/second/difftype: 564d14afb2aSJulio Merinomissing /second/second/difftype/dir 565d14afb2aSJulio Merino 566d14afb2aSJulio Merino## /second/second/difflinks: 567d14afb2aSJulio Merinolink /second/second/difflinks/link "new link" 568d14afb2aSJulio Merino 569d14afb2aSJulio Merino## /second/second/difffiles: 570d14afb2aSJulio Merinofile /second/second/difffiles/file "new" 571d14afb2aSJulio Merinonoconflict /second/second/difffiles/file 572d14afb2aSJulio Merino 573d14afb2aSJulio Merino## /difftype/first/first: 574d14afb2aSJulio Merinomissing /difftype/first/first/fifo 575d14afb2aSJulio Merino 576d14afb2aSJulio Merino## /difftype/difftype/difftype: 577d14afb2aSJulio Merinomissing /difftype/difftype/difftype/one 578d14afb2aSJulio Merinofile /difftype/difftype/difftype/two "baz" 579d14afb2aSJulio Merino 580d14afb2aSJulio Merino## /difftype/difftype/difflinks: 581d14afb2aSJulio Merinolink /difftype/difftype/difflinks/link "new" 582d14afb2aSJulio Merino 583d14afb2aSJulio Merino## /difftype/difftype/difffile: 584d14afb2aSJulio Merinonoconflict /difftype/difftype/difffiles/file 585d14afb2aSJulio Merinofile /difftype/difftype/difffiles/file "foo" 586d14afb2aSJulio Merino 587d14afb2aSJulio Merino## /difflinks/first/first: 588d14afb2aSJulio Merinolink /difflinks/first/first/link "new" 589d14afb2aSJulio Merino 590d14afb2aSJulio Merino## /difflinks/difftype/difftype: 591d14afb2aSJulio Merinolink /difflinks/difftype/difftype/link "new" 592d14afb2aSJulio Merino 593d14afb2aSJulio Merino## /difflinks/difflinks/difflinks: 594d14afb2aSJulio Merinolink /difflinks/difflinks/difflinks/link "new" 595d14afb2aSJulio Merino 596d14afb2aSJulio Merino## /difffiles/first/first: 597d14afb2aSJulio Merinofile /difffiles/first/first/file "bar" 598d14afb2aSJulio Merino 599d14afb2aSJulio Merino## /difffiles/difftype/difftype: 600d14afb2aSJulio Merinofile /difffiles/difftype/difftype/file "new" 601d14afb2aSJulio Merino 602d14afb2aSJulio Merino## /difffiles/difffiles/difffiles: 603d14afb2aSJulio Merinonoconflict /difffiles/difffiles/difffiles/conflict 604d14afb2aSJulio Merinofile /difffiles/difffiles/difffiles/conflict "this is a new file" 605d14afb2aSJulio Merino 606d14afb2aSJulio Merino## /adddir/conflict: 607d14afb2aSJulio Merinofile /adddir/conflict/newfile 608d14afb2aSJulio Merino 609d14afb2aSJulio Merino## /rmdir/extra: 610d14afb2aSJulio Merinodir /rmdir/extra 611d14afb2aSJulio Merinofile /rmdir/extra/localfile.txt "foo" 612d14afb2aSJulio Merino 613d14afb2aSJulio Merino## /rmdir/conflict: 614d14afb2aSJulio Merinodir /rmdir/conflict/difftype 615d14afb2aSJulio Merinopresent /rmdir/conflict 616d14afb2aSJulio Merino 617d14afb2aSJulio Merino## /dirchange/fromdir/extradir: 618d14afb2aSJulio Merinomissing /dirchange/fromdir/extradir/file 619d14afb2aSJulio Merinofifo /dirchange/fromdir/extradir/fifo 620d14afb2aSJulio Merino 621d14afb2aSJulio Merino## /dirchange/fromdir/conflict: 622d14afb2aSJulio Merinofile /dirchange/fromdir/conflict/somefile "bar" 623d14afb2aSJulio Merino 624d14afb2aSJulio Merino## /dirchange/todir/difffile: 625d14afb2aSJulio Merinofile /dirchange/todir/difffile/file "baz" 626d14afb2aSJulio Merino 627d14afb2aSJulio Merino## /dirchange/todir/difftype: 628d14afb2aSJulio Merinofile /dirchange/todir/difftype/file "baz" 629d14afb2aSJulio Merino 630d14afb2aSJulio Merino[ "${FAILED}" = no ] 631