1d14afb2aSJulio Merino#!/bin/sh 2d14afb2aSJulio Merino# 3*179fa75eSJohn Baldwin# Copyright (c) 2010 Hudson River Trading 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 29d14afb2aSJulio Merino# Various regression tests to test the -I flag to the 'update' command. 30d14afb2aSJulio Merino 31d14afb2aSJulio MerinoFAILED=no 32d14afb2aSJulio MerinoWORKDIR=work 33d14afb2aSJulio Merino 34d14afb2aSJulio Merinousage() 35d14afb2aSJulio Merino{ 36d14afb2aSJulio Merino echo "Usage: ignore.sh [-s script] [-w workdir]" 37d14afb2aSJulio Merino exit 1 38d14afb2aSJulio Merino} 39d14afb2aSJulio Merino 40d14afb2aSJulio Merino# Allow the user to specify an alternate work directory or script. 41d14afb2aSJulio MerinoCOMMAND=etcupdate 42d14afb2aSJulio Merinowhile getopts "s:w:" option; do 43d14afb2aSJulio Merino case $option in 44d14afb2aSJulio Merino s) 45d14afb2aSJulio Merino COMMAND="sh $OPTARG" 46d14afb2aSJulio Merino ;; 47d14afb2aSJulio Merino w) 48d14afb2aSJulio Merino WORKDIR=$OPTARG 49d14afb2aSJulio Merino ;; 50d14afb2aSJulio Merino *) 51d14afb2aSJulio Merino echo 52d14afb2aSJulio Merino usage 53d14afb2aSJulio Merino ;; 54d14afb2aSJulio Merino esac 55d14afb2aSJulio Merinodone 56d14afb2aSJulio Merinoshift $((OPTIND - 1)) 57d14afb2aSJulio Merinoif [ $# -ne 0 ]; then 58d14afb2aSJulio Merino usage 59d14afb2aSJulio Merinofi 60d14afb2aSJulio Merino 61d14afb2aSJulio MerinoCONFLICTS=$WORKDIR/conflicts 62d14afb2aSJulio MerinoOLD=$WORKDIR/old 63d14afb2aSJulio MerinoNEW=$WORKDIR/current 64d14afb2aSJulio MerinoTEST=$WORKDIR/test 65d14afb2aSJulio Merino 66d14afb2aSJulio Merino# These tests deal with ignoring certain patterns of files. We run the 67d14afb2aSJulio Merino# test multiple times ignoring different patterns. 68d14afb2aSJulio Merinobuild_trees() 69d14afb2aSJulio Merino{ 70d14afb2aSJulio Merino local i 71d14afb2aSJulio Merino 72d14afb2aSJulio Merino rm -rf $OLD $NEW $TEST $CONFLICTS 73d14afb2aSJulio Merino mkdir -p $OLD $NEW $TEST 74d14afb2aSJulio Merino 75d14afb2aSJulio Merino for i in $OLD $NEW $TEST; do 76d14afb2aSJulio Merino mkdir -p $i/tree 77d14afb2aSJulio Merino done 78d14afb2aSJulio Merino 79d14afb2aSJulio Merino # tree: Test three different cases (add, modify, remove) that all 80d14afb2aSJulio Merino # match the tree/* glob. 81d14afb2aSJulio Merino echo "foo" > $NEW/tree/add 82d14afb2aSJulio Merino for i in $OLD $TEST; do 83d14afb2aSJulio Merino echo "old" > $i/tree/modify 84d14afb2aSJulio Merino done 85d14afb2aSJulio Merino echo "new" > $NEW/tree/modify 86d14afb2aSJulio Merino for i in $OLD $TEST; do 87d14afb2aSJulio Merino echo "old" > $i/tree/remove 88d14afb2aSJulio Merino done 89d14afb2aSJulio Merino 90d14afb2aSJulio Merino # rmdir: Remove a whole tree. 91d14afb2aSJulio Merino for i in $OLD $TEST; do 92d14afb2aSJulio Merino mkdir $i/rmdir 93d14afb2aSJulio Merino echo "foo" > $i/rmdir/file 94d14afb2aSJulio Merino done 95d14afb2aSJulio Merino} 96d14afb2aSJulio Merino 97d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST 98d14afb2aSJulio Merinomissing() 99d14afb2aSJulio Merino{ 100d14afb2aSJulio Merino if [ -e $TEST/$1 -o -L $TEST/$1 ]; then 101d14afb2aSJulio Merino echo "File $1 should be missing" 102d14afb2aSJulio Merino FAILED=yes 103d14afb2aSJulio Merino fi 104d14afb2aSJulio Merino} 105d14afb2aSJulio Merino 106d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST 107d14afb2aSJulio Merinopresent() 108d14afb2aSJulio Merino{ 109d14afb2aSJulio Merino if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then 110d14afb2aSJulio Merino echo "File $1 should be present" 111d14afb2aSJulio Merino FAILED=yes 112d14afb2aSJulio Merino fi 113d14afb2aSJulio Merino} 114d14afb2aSJulio Merino 115d14afb2aSJulio Merino# $1 - relative path to file that should be a directory in TEST 116d14afb2aSJulio Merinodir() 117d14afb2aSJulio Merino{ 118d14afb2aSJulio Merino if ! [ -d $TEST/$1 ]; then 119d14afb2aSJulio Merino echo "File $1 should be a directory" 120d14afb2aSJulio Merino FAILED=yes 121d14afb2aSJulio Merino fi 122d14afb2aSJulio Merino} 123d14afb2aSJulio Merino 124d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST 125d14afb2aSJulio Merino# $2 - optional string that should match file contents 126d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present 127d14afb2aSJulio Merinofile() 128d14afb2aSJulio Merino{ 129d14afb2aSJulio Merino local contents sum 130d14afb2aSJulio Merino 131d14afb2aSJulio Merino if ! [ -f $TEST/$1 ]; then 132d14afb2aSJulio Merino echo "File $1 should be a regular file" 133d14afb2aSJulio Merino FAILED=yes 134d14afb2aSJulio Merino elif [ $# -eq 2 ]; then 135d14afb2aSJulio Merino contents=`cat $TEST/$1` 136d14afb2aSJulio Merino if [ "$contents" != "$2" ]; then 137d14afb2aSJulio Merino echo "File $1 has wrong contents" 138d14afb2aSJulio Merino FAILED=yes 139d14afb2aSJulio Merino fi 140d14afb2aSJulio Merino elif [ $# -eq 3 ]; then 141d14afb2aSJulio Merino sum=`md5 -q $TEST/$1` 142d14afb2aSJulio Merino if [ "$sum" != "$3" ]; then 143d14afb2aSJulio Merino echo "File $1 has wrong contents" 144d14afb2aSJulio Merino FAILED=yes 145d14afb2aSJulio Merino fi 146d14afb2aSJulio Merino fi 147d14afb2aSJulio Merino} 148d14afb2aSJulio Merino 149d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict 150d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents 151d14afb2aSJulio Merinoconflict() 152d14afb2aSJulio Merino{ 153d14afb2aSJulio Merino local sum 154d14afb2aSJulio Merino 155d14afb2aSJulio Merino if ! [ -f $CONFLICTS/$1 ]; then 156d14afb2aSJulio Merino echo "File $1 missing conflict" 157d14afb2aSJulio Merino FAILED=yes 158d14afb2aSJulio Merino elif [ $# -gt 1 ]; then 159d14afb2aSJulio Merino sum=`md5 -q $CONFLICTS/$1` 160d14afb2aSJulio Merino if [ "$sum" != "$2" ]; then 161d14afb2aSJulio Merino echo "Conflict $1 has wrong contents" 162d14afb2aSJulio Merino FAILED=yes 163d14afb2aSJulio Merino fi 164d14afb2aSJulio Merino fi 165d14afb2aSJulio Merino} 166d14afb2aSJulio Merino 167d14afb2aSJulio Merino# $1 - relative path to a regular file that should not have a conflict 168d14afb2aSJulio Merinonoconflict() 169d14afb2aSJulio Merino{ 170d14afb2aSJulio Merino if [ -f $CONFLICTS/$1 ]; then 171d14afb2aSJulio Merino echo "File $1 should not have a conflict" 172d14afb2aSJulio Merino FAILED=yes 173d14afb2aSJulio Merino fi 174d14afb2aSJulio Merino} 175d14afb2aSJulio Merino 176d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then 177d14afb2aSJulio Merino echo "must be root" 178d14afb2aSJulio Merino exit 0 179d14afb2aSJulio Merinofi 180d14afb2aSJulio Merino 181d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then 182d14afb2aSJulio Merino echo "WARNING: /etc/etcupdate.conf settings may break some tests." 183d14afb2aSJulio Merinofi 184d14afb2aSJulio Merino 185d14afb2aSJulio Merino# First run the test ignoring no patterns. 186d14afb2aSJulio Merino 187d14afb2aSJulio Merinobuild_trees 188d14afb2aSJulio Merino 189d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 190d14afb2aSJulio Merino 191d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 192d14afb2aSJulio Merino D /rmdir/file 193d14afb2aSJulio Merino D /tree/remove 194d14afb2aSJulio Merino D /rmdir 195d14afb2aSJulio Merino U /tree/modify 196d14afb2aSJulio Merino A /tree/add 197d14afb2aSJulio MerinoEOF 198d14afb2aSJulio Merino 199d14afb2aSJulio Merinoecho "Differences for regular:" 200d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 201d14afb2aSJulio Merino || FAILED=yes 202d14afb2aSJulio Merino 203d14afb2aSJulio Merinomissing /tree/remove 204d14afb2aSJulio Merinofile /tree/modify "new" 205d14afb2aSJulio Merinofile /tree/add "foo" 206d14afb2aSJulio Merinomissing /rmdir/file 207d14afb2aSJulio Merinomissing /rmdir 208d14afb2aSJulio Merino 209d14afb2aSJulio Merino# Now test with -I '/tree/*'. This should preserve the /tree files. 210d14afb2aSJulio Merino 211d14afb2aSJulio Merinobuild_trees 212d14afb2aSJulio Merino 213d14afb2aSJulio Merino$COMMAND -r -I '/tree/*' -d $WORKDIR -D $TEST > $WORKDIR/test1.out 214d14afb2aSJulio Merino 215d14afb2aSJulio Merinocat > $WORKDIR/correct1.out <<EOF 216d14afb2aSJulio Merino D /rmdir/file 217d14afb2aSJulio Merino D /rmdir 218d14afb2aSJulio MerinoEOF 219d14afb2aSJulio Merino 220d14afb2aSJulio Merinoecho "Differences for -I '/tree/*':" 221d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct1.out -L "test" $WORKDIR/test1.out \ 222d14afb2aSJulio Merino || FAILED=yes 223d14afb2aSJulio Merino 224d14afb2aSJulio Merinofile /tree/remove "old" 225d14afb2aSJulio Merinofile /tree/modify "old" 226d14afb2aSJulio Merinomissing /tree/add 227d14afb2aSJulio Merinomissing /rmdir/file 228d14afb2aSJulio Merinomissing /rmdir 229d14afb2aSJulio Merino 230d14afb2aSJulio Merino# Now test with two patterns. This should preserve everything. 231d14afb2aSJulio Merino 232d14afb2aSJulio Merinobuild_trees 233d14afb2aSJulio Merino 234d14afb2aSJulio Merino$COMMAND -r -I '/tree/*' -I '/rmdir*' -d $WORKDIR -D $TEST > \ 235d14afb2aSJulio Merino $WORKDIR/test2.out 236d14afb2aSJulio Merino 237d14afb2aSJulio Merinocat > $WORKDIR/correct2.out <<EOF 238d14afb2aSJulio MerinoEOF 239d14afb2aSJulio Merino 240d14afb2aSJulio Merinoecho "Differences for -I '/tree/*' -I '/rmdir*':" 241d14afb2aSJulio Merino 242d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct2.out -L "test" $WORKDIR/test2.out \ 243d14afb2aSJulio Merino || FAILED=yes 244d14afb2aSJulio Merino 245d14afb2aSJulio Merinofile /tree/remove "old" 246d14afb2aSJulio Merinofile /tree/modify "old" 247d14afb2aSJulio Merinomissing /tree/add 248d14afb2aSJulio Merinofile /rmdir/file "foo" 249d14afb2aSJulio Merino 250d14afb2aSJulio Merino# Now test with a pattern that should cause a warning on /rmdir by 251d14afb2aSJulio Merino# only ignoring the files under that directory. Note that this also 252d14afb2aSJulio Merino# tests putting two patterns into a single -I argument. 253d14afb2aSJulio Merino 254d14afb2aSJulio Merinobuild_trees 255d14afb2aSJulio Merino 256d14afb2aSJulio Merino$COMMAND -r -I '/tree/* /rmdir/*' -d $WORKDIR -D $TEST > \ 257d14afb2aSJulio Merino $WORKDIR/test3.out 258d14afb2aSJulio Merino 259d14afb2aSJulio Merinocat > $WORKDIR/correct3.out <<EOF 260d14afb2aSJulio MerinoWarnings: 261d14afb2aSJulio Merino Non-empty directory remains: /rmdir 262d14afb2aSJulio MerinoEOF 263d14afb2aSJulio Merino 264d14afb2aSJulio Merinoecho "Differences for -I '/tree/* /rmdir/*':" 265d14afb2aSJulio Merino 266d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct3.out -L "test" $WORKDIR/test3.out \ 267d14afb2aSJulio Merino || FAILED=yes 268d14afb2aSJulio Merino 269d14afb2aSJulio Merinofile /tree/remove "old" 270d14afb2aSJulio Merinofile /tree/modify "old" 271d14afb2aSJulio Merinomissing /tree/add 272d14afb2aSJulio Merinofile /rmdir/file "foo" 273d14afb2aSJulio Merinodir /rmdir 274d14afb2aSJulio Merino 275d14afb2aSJulio Merino[ "${FAILED}" = no ] 276