1d14afb2aSJulio Merino#!/bin/sh
2d14afb2aSJulio Merino#
3179fa75eSJohn 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