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