1*d14afb2aSJulio Merino#!/bin/sh 2*d14afb2aSJulio Merino# 3*d14afb2aSJulio Merino# Copyright (c) 2010 Advanced Computing Technologies LLC 4*d14afb2aSJulio Merino# Written by: John H. Baldwin <jhb@FreeBSD.org> 5*d14afb2aSJulio Merino# All rights reserved. 6*d14afb2aSJulio Merino# 7*d14afb2aSJulio Merino# Redistribution and use in source and binary forms, with or without 8*d14afb2aSJulio Merino# modification, are permitted provided that the following conditions 9*d14afb2aSJulio Merino# are met: 10*d14afb2aSJulio Merino# 1. Redistributions of source code must retain the above copyright 11*d14afb2aSJulio Merino# notice, this list of conditions and the following disclaimer. 12*d14afb2aSJulio Merino# 2. Redistributions in binary form must reproduce the above copyright 13*d14afb2aSJulio Merino# notice, this list of conditions and the following disclaimer in the 14*d14afb2aSJulio Merino# documentation and/or other materials provided with the distribution. 15*d14afb2aSJulio Merino# 16*d14afb2aSJulio Merino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*d14afb2aSJulio Merino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*d14afb2aSJulio Merino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*d14afb2aSJulio Merino# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*d14afb2aSJulio Merino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*d14afb2aSJulio Merino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*d14afb2aSJulio Merino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*d14afb2aSJulio Merino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*d14afb2aSJulio Merino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*d14afb2aSJulio Merino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*d14afb2aSJulio Merino# SUCH DAMAGE. 27*d14afb2aSJulio Merino# 28*d14afb2aSJulio Merino# $FreeBSD$ 29*d14afb2aSJulio Merino 30*d14afb2aSJulio Merino# Various regression tests to test the -I flag to the 'update' command. 31*d14afb2aSJulio Merino 32*d14afb2aSJulio MerinoFAILED=no 33*d14afb2aSJulio MerinoWORKDIR=work 34*d14afb2aSJulio Merino 35*d14afb2aSJulio Merinousage() 36*d14afb2aSJulio Merino{ 37*d14afb2aSJulio Merino echo "Usage: ignore.sh [-s script] [-w workdir]" 38*d14afb2aSJulio Merino exit 1 39*d14afb2aSJulio Merino} 40*d14afb2aSJulio Merino 41*d14afb2aSJulio Merino# Allow the user to specify an alternate work directory or script. 42*d14afb2aSJulio MerinoCOMMAND=etcupdate 43*d14afb2aSJulio Merinowhile getopts "s:w:" option; do 44*d14afb2aSJulio Merino case $option in 45*d14afb2aSJulio Merino s) 46*d14afb2aSJulio Merino COMMAND="sh $OPTARG" 47*d14afb2aSJulio Merino ;; 48*d14afb2aSJulio Merino w) 49*d14afb2aSJulio Merino WORKDIR=$OPTARG 50*d14afb2aSJulio Merino ;; 51*d14afb2aSJulio Merino *) 52*d14afb2aSJulio Merino echo 53*d14afb2aSJulio Merino usage 54*d14afb2aSJulio Merino ;; 55*d14afb2aSJulio Merino esac 56*d14afb2aSJulio Merinodone 57*d14afb2aSJulio Merinoshift $((OPTIND - 1)) 58*d14afb2aSJulio Merinoif [ $# -ne 0 ]; then 59*d14afb2aSJulio Merino usage 60*d14afb2aSJulio Merinofi 61*d14afb2aSJulio Merino 62*d14afb2aSJulio MerinoCONFLICTS=$WORKDIR/conflicts 63*d14afb2aSJulio MerinoOLD=$WORKDIR/old 64*d14afb2aSJulio MerinoNEW=$WORKDIR/current 65*d14afb2aSJulio MerinoTEST=$WORKDIR/test 66*d14afb2aSJulio Merino 67*d14afb2aSJulio Merino# These tests deal with ignoring certain patterns of files. We run the 68*d14afb2aSJulio Merino# test multiple times ignoring different patterns. 69*d14afb2aSJulio Merinobuild_trees() 70*d14afb2aSJulio Merino{ 71*d14afb2aSJulio Merino local i 72*d14afb2aSJulio Merino 73*d14afb2aSJulio Merino rm -rf $OLD $NEW $TEST $CONFLICTS 74*d14afb2aSJulio Merino mkdir -p $OLD $NEW $TEST 75*d14afb2aSJulio Merino 76*d14afb2aSJulio Merino for i in $OLD $NEW $TEST; do 77*d14afb2aSJulio Merino mkdir -p $i/tree 78*d14afb2aSJulio Merino done 79*d14afb2aSJulio Merino 80*d14afb2aSJulio Merino # tree: Test three different cases (add, modify, remove) that all 81*d14afb2aSJulio Merino # match the tree/* glob. 82*d14afb2aSJulio Merino echo "foo" > $NEW/tree/add 83*d14afb2aSJulio Merino for i in $OLD $TEST; do 84*d14afb2aSJulio Merino echo "old" > $i/tree/modify 85*d14afb2aSJulio Merino done 86*d14afb2aSJulio Merino echo "new" > $NEW/tree/modify 87*d14afb2aSJulio Merino for i in $OLD $TEST; do 88*d14afb2aSJulio Merino echo "old" > $i/tree/remove 89*d14afb2aSJulio Merino done 90*d14afb2aSJulio Merino 91*d14afb2aSJulio Merino # rmdir: Remove a whole tree. 92*d14afb2aSJulio Merino for i in $OLD $TEST; do 93*d14afb2aSJulio Merino mkdir $i/rmdir 94*d14afb2aSJulio Merino echo "foo" > $i/rmdir/file 95*d14afb2aSJulio Merino done 96*d14afb2aSJulio Merino} 97*d14afb2aSJulio Merino 98*d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST 99*d14afb2aSJulio Merinomissing() 100*d14afb2aSJulio Merino{ 101*d14afb2aSJulio Merino if [ -e $TEST/$1 -o -L $TEST/$1 ]; then 102*d14afb2aSJulio Merino echo "File $1 should be missing" 103*d14afb2aSJulio Merino FAILED=yes 104*d14afb2aSJulio Merino fi 105*d14afb2aSJulio Merino} 106*d14afb2aSJulio Merino 107*d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST 108*d14afb2aSJulio Merinopresent() 109*d14afb2aSJulio Merino{ 110*d14afb2aSJulio Merino if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then 111*d14afb2aSJulio Merino echo "File $1 should be present" 112*d14afb2aSJulio Merino FAILED=yes 113*d14afb2aSJulio Merino fi 114*d14afb2aSJulio Merino} 115*d14afb2aSJulio Merino 116*d14afb2aSJulio Merino# $1 - relative path to file that should be a directory in TEST 117*d14afb2aSJulio Merinodir() 118*d14afb2aSJulio Merino{ 119*d14afb2aSJulio Merino if ! [ -d $TEST/$1 ]; then 120*d14afb2aSJulio Merino echo "File $1 should be a directory" 121*d14afb2aSJulio Merino FAILED=yes 122*d14afb2aSJulio Merino fi 123*d14afb2aSJulio Merino} 124*d14afb2aSJulio Merino 125*d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST 126*d14afb2aSJulio Merino# $2 - optional string that should match file contents 127*d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present 128*d14afb2aSJulio Merinofile() 129*d14afb2aSJulio Merino{ 130*d14afb2aSJulio Merino local contents sum 131*d14afb2aSJulio Merino 132*d14afb2aSJulio Merino if ! [ -f $TEST/$1 ]; then 133*d14afb2aSJulio Merino echo "File $1 should be a regular file" 134*d14afb2aSJulio Merino FAILED=yes 135*d14afb2aSJulio Merino elif [ $# -eq 2 ]; then 136*d14afb2aSJulio Merino contents=`cat $TEST/$1` 137*d14afb2aSJulio Merino if [ "$contents" != "$2" ]; then 138*d14afb2aSJulio Merino echo "File $1 has wrong contents" 139*d14afb2aSJulio Merino FAILED=yes 140*d14afb2aSJulio Merino fi 141*d14afb2aSJulio Merino elif [ $# -eq 3 ]; then 142*d14afb2aSJulio Merino sum=`md5 -q $TEST/$1` 143*d14afb2aSJulio Merino if [ "$sum" != "$3" ]; then 144*d14afb2aSJulio Merino echo "File $1 has wrong contents" 145*d14afb2aSJulio Merino FAILED=yes 146*d14afb2aSJulio Merino fi 147*d14afb2aSJulio Merino fi 148*d14afb2aSJulio Merino} 149*d14afb2aSJulio Merino 150*d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict 151*d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents 152*d14afb2aSJulio Merinoconflict() 153*d14afb2aSJulio Merino{ 154*d14afb2aSJulio Merino local sum 155*d14afb2aSJulio Merino 156*d14afb2aSJulio Merino if ! [ -f $CONFLICTS/$1 ]; then 157*d14afb2aSJulio Merino echo "File $1 missing conflict" 158*d14afb2aSJulio Merino FAILED=yes 159*d14afb2aSJulio Merino elif [ $# -gt 1 ]; then 160*d14afb2aSJulio Merino sum=`md5 -q $CONFLICTS/$1` 161*d14afb2aSJulio Merino if [ "$sum" != "$2" ]; then 162*d14afb2aSJulio Merino echo "Conflict $1 has wrong contents" 163*d14afb2aSJulio Merino FAILED=yes 164*d14afb2aSJulio Merino fi 165*d14afb2aSJulio Merino fi 166*d14afb2aSJulio Merino} 167*d14afb2aSJulio Merino 168*d14afb2aSJulio Merino# $1 - relative path to a regular file that should not have a conflict 169*d14afb2aSJulio Merinonoconflict() 170*d14afb2aSJulio Merino{ 171*d14afb2aSJulio Merino if [ -f $CONFLICTS/$1 ]; then 172*d14afb2aSJulio Merino echo "File $1 should not have a conflict" 173*d14afb2aSJulio Merino FAILED=yes 174*d14afb2aSJulio Merino fi 175*d14afb2aSJulio Merino} 176*d14afb2aSJulio Merino 177*d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then 178*d14afb2aSJulio Merino echo "must be root" 179*d14afb2aSJulio Merino exit 0 180*d14afb2aSJulio Merinofi 181*d14afb2aSJulio Merino 182*d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then 183*d14afb2aSJulio Merino echo "WARNING: /etc/etcupdate.conf settings may break some tests." 184*d14afb2aSJulio Merinofi 185*d14afb2aSJulio Merino 186*d14afb2aSJulio Merino# First run the test ignoring no patterns. 187*d14afb2aSJulio Merino 188*d14afb2aSJulio Merinobuild_trees 189*d14afb2aSJulio Merino 190*d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 191*d14afb2aSJulio Merino 192*d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 193*d14afb2aSJulio Merino D /rmdir/file 194*d14afb2aSJulio Merino D /tree/remove 195*d14afb2aSJulio Merino D /rmdir 196*d14afb2aSJulio Merino U /tree/modify 197*d14afb2aSJulio Merino A /tree/add 198*d14afb2aSJulio MerinoEOF 199*d14afb2aSJulio Merino 200*d14afb2aSJulio Merinoecho "Differences for regular:" 201*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 202*d14afb2aSJulio Merino || FAILED=yes 203*d14afb2aSJulio Merino 204*d14afb2aSJulio Merinomissing /tree/remove 205*d14afb2aSJulio Merinofile /tree/modify "new" 206*d14afb2aSJulio Merinofile /tree/add "foo" 207*d14afb2aSJulio Merinomissing /rmdir/file 208*d14afb2aSJulio Merinomissing /rmdir 209*d14afb2aSJulio Merino 210*d14afb2aSJulio Merino# Now test with -I '/tree/*'. This should preserve the /tree files. 211*d14afb2aSJulio Merino 212*d14afb2aSJulio Merinobuild_trees 213*d14afb2aSJulio Merino 214*d14afb2aSJulio Merino$COMMAND -r -I '/tree/*' -d $WORKDIR -D $TEST > $WORKDIR/test1.out 215*d14afb2aSJulio Merino 216*d14afb2aSJulio Merinocat > $WORKDIR/correct1.out <<EOF 217*d14afb2aSJulio Merino D /rmdir/file 218*d14afb2aSJulio Merino D /rmdir 219*d14afb2aSJulio MerinoEOF 220*d14afb2aSJulio Merino 221*d14afb2aSJulio Merinoecho "Differences for -I '/tree/*':" 222*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct1.out -L "test" $WORKDIR/test1.out \ 223*d14afb2aSJulio Merino || FAILED=yes 224*d14afb2aSJulio Merino 225*d14afb2aSJulio Merinofile /tree/remove "old" 226*d14afb2aSJulio Merinofile /tree/modify "old" 227*d14afb2aSJulio Merinomissing /tree/add 228*d14afb2aSJulio Merinomissing /rmdir/file 229*d14afb2aSJulio Merinomissing /rmdir 230*d14afb2aSJulio Merino 231*d14afb2aSJulio Merino# Now test with two patterns. This should preserve everything. 232*d14afb2aSJulio Merino 233*d14afb2aSJulio Merinobuild_trees 234*d14afb2aSJulio Merino 235*d14afb2aSJulio Merino$COMMAND -r -I '/tree/*' -I '/rmdir*' -d $WORKDIR -D $TEST > \ 236*d14afb2aSJulio Merino $WORKDIR/test2.out 237*d14afb2aSJulio Merino 238*d14afb2aSJulio Merinocat > $WORKDIR/correct2.out <<EOF 239*d14afb2aSJulio MerinoEOF 240*d14afb2aSJulio Merino 241*d14afb2aSJulio Merinoecho "Differences for -I '/tree/*' -I '/rmdir*':" 242*d14afb2aSJulio Merino 243*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct2.out -L "test" $WORKDIR/test2.out \ 244*d14afb2aSJulio Merino || FAILED=yes 245*d14afb2aSJulio Merino 246*d14afb2aSJulio Merinofile /tree/remove "old" 247*d14afb2aSJulio Merinofile /tree/modify "old" 248*d14afb2aSJulio Merinomissing /tree/add 249*d14afb2aSJulio Merinofile /rmdir/file "foo" 250*d14afb2aSJulio Merino 251*d14afb2aSJulio Merino# Now test with a pattern that should cause a warning on /rmdir by 252*d14afb2aSJulio Merino# only ignoring the files under that directory. Note that this also 253*d14afb2aSJulio Merino# tests putting two patterns into a single -I argument. 254*d14afb2aSJulio Merino 255*d14afb2aSJulio Merinobuild_trees 256*d14afb2aSJulio Merino 257*d14afb2aSJulio Merino$COMMAND -r -I '/tree/* /rmdir/*' -d $WORKDIR -D $TEST > \ 258*d14afb2aSJulio Merino $WORKDIR/test3.out 259*d14afb2aSJulio Merino 260*d14afb2aSJulio Merinocat > $WORKDIR/correct3.out <<EOF 261*d14afb2aSJulio MerinoWarnings: 262*d14afb2aSJulio Merino Non-empty directory remains: /rmdir 263*d14afb2aSJulio MerinoEOF 264*d14afb2aSJulio Merino 265*d14afb2aSJulio Merinoecho "Differences for -I '/tree/* /rmdir/*':" 266*d14afb2aSJulio Merino 267*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct3.out -L "test" $WORKDIR/test3.out \ 268*d14afb2aSJulio Merino || FAILED=yes 269*d14afb2aSJulio Merino 270*d14afb2aSJulio Merinofile /tree/remove "old" 271*d14afb2aSJulio Merinofile /tree/modify "old" 272*d14afb2aSJulio Merinomissing /tree/add 273*d14afb2aSJulio Merinofile /rmdir/file "foo" 274*d14afb2aSJulio Merinodir /rmdir 275*d14afb2aSJulio Merino 276*d14afb2aSJulio Merino[ "${FAILED}" = no ] 277