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