xref: /freebsd/usr.sbin/etcupdate/tests/fbsdid_test.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1d14afb2aSJulio Merino#!/bin/sh
2d14afb2aSJulio Merino#
3*179fa75eSJohn Baldwin# Copyright (c) 2010 Hudson River Trading LLC
4d14afb2aSJulio Merino# Written by: John H. Baldwin <jhb@FreeBSD.org>
5d14afb2aSJulio Merino# All rights reserved.
6d14afb2aSJulio Merino#
7d14afb2aSJulio Merino# Redistribution and use in source and binary forms, with or without
8d14afb2aSJulio Merino# modification, are permitted provided that the following conditions
9d14afb2aSJulio Merino# are met:
10d14afb2aSJulio Merino# 1. Redistributions of source code must retain the above copyright
11d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer.
12d14afb2aSJulio Merino# 2. Redistributions in binary form must reproduce the above copyright
13d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer in the
14d14afb2aSJulio Merino#    documentation and/or other materials provided with the distribution.
15d14afb2aSJulio Merino#
16d14afb2aSJulio Merino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17d14afb2aSJulio Merino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18d14afb2aSJulio Merino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19d14afb2aSJulio Merino# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20d14afb2aSJulio Merino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d14afb2aSJulio Merino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22d14afb2aSJulio Merino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d14afb2aSJulio Merino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d14afb2aSJulio Merino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d14afb2aSJulio Merino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d14afb2aSJulio Merino# SUCH DAMAGE.
27d14afb2aSJulio Merino#
28d14afb2aSJulio Merino
29d14afb2aSJulio Merino# Various regression tests to test the -F flag to the 'update' command.
30d14afb2aSJulio Merino
31d14afb2aSJulio MerinoFAILED=no
32d14afb2aSJulio MerinoWORKDIR=work
33d14afb2aSJulio Merino
34d14afb2aSJulio Merinousage()
35d14afb2aSJulio Merino{
36d14afb2aSJulio Merino	echo "Usage: fbsdid.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# Store a FreeBSD ID string in a specified file.  The first argument
67d14afb2aSJulio Merino# is the file, the remaining arguments are the comment to use.
68d14afb2aSJulio Merinostore_id()
69d14afb2aSJulio Merino{
70d14afb2aSJulio Merino	local file
71d14afb2aSJulio Merino
72d14afb2aSJulio Merino	file=$1
73d14afb2aSJulio Merino	shift
74d14afb2aSJulio Merino
75d14afb2aSJulio Merino	echo -n '# $FreeBSD' >> $file
76d14afb2aSJulio Merino	echo -n "$@" >> $file
77d14afb2aSJulio Merino	echo '$' >> $file
78d14afb2aSJulio Merino}
79d14afb2aSJulio Merino
80d14afb2aSJulio Merino# These tests deal with FreeBSD ID string conflicts.  We run the test
81d14afb2aSJulio Merino# twice, once without -F and once with -F.
82d14afb2aSJulio Merinobuild_trees()
83d14afb2aSJulio Merino{
84d14afb2aSJulio Merino	local i
85d14afb2aSJulio Merino
86d14afb2aSJulio Merino	rm -rf $OLD $NEW $TEST $CONFLICTS
87d14afb2aSJulio Merino	mkdir -p $OLD $NEW $TEST
88d14afb2aSJulio Merino
89d14afb2aSJulio Merino	# remove: Remove a file where the only local difference is a
90d14afb2aSJulio Merino	# change in the FreeBSD ID string.
91d14afb2aSJulio Merino	store_id $OLD/remove
92d14afb2aSJulio Merino	store_id $TEST/remove ": head/remove 12345 jhb "
93d14afb2aSJulio Merino
94d14afb2aSJulio Merino	# old: Modify a file where the only local difference between
95d14afb2aSJulio Merino	# the old and test files is a change in the FreeBSD ID string.
96d14afb2aSJulio Merino	store_id $OLD/old ": src/old,v 1.1 jhb Exp "
97d14afb2aSJulio Merino	store_id $NEW/old ": head/old 12345 jhb "
98d14afb2aSJulio Merino	store_id $TEST/old ": head/old 12000 jhb "
99d14afb2aSJulio Merino	for i in $OLD $TEST; do
100d14afb2aSJulio Merino		cat >> $i/old <<EOF
101d14afb2aSJulio Merino
102d14afb2aSJulio Merinoan old file
103d14afb2aSJulio MerinoEOF
104d14afb2aSJulio Merino	done
105d14afb2aSJulio Merino	cat >> $NEW/old <<EOF
106d14afb2aSJulio Merino
107d14afb2aSJulio Merinoa new file
108d14afb2aSJulio MerinoEOF
109d14afb2aSJulio Merino
110d14afb2aSJulio Merino	# already: Modify a file where the local file already matches
111d14afb2aSJulio Merino	# the new file except for a change in the FreeBSD ID string.
112d14afb2aSJulio Merino	store_id $OLD/already ": src/already,v 1.1 jhb Exp "
113d14afb2aSJulio Merino	store_id $NEW/already ": head/already 12345 jhb "
114d14afb2aSJulio Merino	store_id $TEST/already ": src/already,v 1.2 jhb Exp "
115d14afb2aSJulio Merino	cat >> $OLD/already <<EOF
116d14afb2aSJulio Merino
117d14afb2aSJulio Merinoanother old file
118d14afb2aSJulio MerinoEOF
119d14afb2aSJulio Merino	for i in $NEW $TEST; do
120d14afb2aSJulio Merino		cat >> $i/already <<EOF
121d14afb2aSJulio Merino
122d14afb2aSJulio Merinoanother new file
123d14afb2aSJulio MerinoEOF
124d14afb2aSJulio Merino	done
125d14afb2aSJulio Merino
126d14afb2aSJulio Merino	# add: Add a file that already exists where the only local
127d14afb2aSJulio Merino	# difference is a change in the FreeBSD ID string.
128d14afb2aSJulio Merino	store_id $NEW/add ": head/add 12345 jhb "
129d14afb2aSJulio Merino	store_id $TEST/add ""
130d14afb2aSJulio Merino
131d14afb2aSJulio Merino	# conflict: Modify a file where the local file has a different
132d14afb2aSJulio Merino	# FreeBSD ID string.  This should still generate a conflict
133d14afb2aSJulio Merino	# even in the -F case.
134d14afb2aSJulio Merino	store_id $OLD/conflict ": head/conflict 12000 jhb "
135d14afb2aSJulio Merino	store_id $NEW/conflict ": head/conflict 12345 jhb "
136d14afb2aSJulio Merino	store_id $TEST/conflict ""
137d14afb2aSJulio Merino	cat >> $OLD/conflict <<EOF
138d14afb2aSJulio Merino
139d14afb2aSJulio Merinothis is the old file
140d14afb2aSJulio MerinoEOF
141d14afb2aSJulio Merino	cat >> $NEW/conflict <<EOF
142d14afb2aSJulio Merino
143d14afb2aSJulio Merinothis is the new file
144d14afb2aSJulio MerinoEOF
145d14afb2aSJulio Merino	cat >> $TEST/conflict <<EOF
146d14afb2aSJulio Merino
147d14afb2aSJulio Merinothis is the local file
148d14afb2aSJulio MerinoEOF
149d14afb2aSJulio Merino
150d14afb2aSJulio Merino	# local: A file with local modifications has a different
151d14afb2aSJulio Merino	# FreeBSD ID string and the only differences between the old
152d14afb2aSJulio Merino	# and new versions are a change in the FreeBSD ID string.
153d14afb2aSJulio Merino	# This will just update the FreeBSD ID string in the -F case.
154d14afb2aSJulio Merino	for i in $OLD $NEW $TEST; do
155d14afb2aSJulio Merino		cat >> $i/local <<EOF
156d14afb2aSJulio Merino# Some leading text
157d14afb2aSJulio Merino#
158d14afb2aSJulio MerinoEOF
159d14afb2aSJulio Merino	done
160d14afb2aSJulio Merino
161d14afb2aSJulio Merino	store_id $OLD/local ": head/local 12000 jhb "
162d14afb2aSJulio Merino	store_id $NEW/local ": head/local 12345 jhb "
163d14afb2aSJulio Merino	store_id $TEST/local ": src/local,v 1.5 jhb Exp "
164d14afb2aSJulio Merino
165d14afb2aSJulio Merino	for i in $OLD $NEW $TEST; do
166d14afb2aSJulio Merino		cat >> $i/local <<EOF
167d14afb2aSJulio Merino
168d14afb2aSJulio Merinothis is a file
169d14afb2aSJulio MerinoEOF
170d14afb2aSJulio Merino	done
171d14afb2aSJulio Merino
172d14afb2aSJulio Merino	cat >> $TEST/local <<EOF
173d14afb2aSJulio Merino
174d14afb2aSJulio Merinothese are some local mods to the file
175d14afb2aSJulio MerinoEOF
176d14afb2aSJulio Merino
177d14afb2aSJulio Merino	# local-already: A file with local modifications has the same
178d14afb2aSJulio Merino	# FreeBSD ID string as the new version of the file and the
179d14afb2aSJulio Merino	# only differences between the old and new versions are a
180d14afb2aSJulio Merino	# change in the FreeBSD ID string.  Nothing should happen in
181d14afb2aSJulio Merino	# the -F case.
182d14afb2aSJulio Merino	store_id $OLD/local-already ": head/local 12000 jhb "
183d14afb2aSJulio Merino	for i in $NEW $TEST; do
184d14afb2aSJulio Merino		store_id $i/local-already ": head/local 12345 jhb "
185d14afb2aSJulio Merino	done
186d14afb2aSJulio Merino
187d14afb2aSJulio Merino	for i in $OLD $NEW $TEST; do
188d14afb2aSJulio Merino		cat >> $i/local-already <<EOF
189d14afb2aSJulio Merino
190d14afb2aSJulio Merinothis is a file
191d14afb2aSJulio MerinoEOF
192d14afb2aSJulio Merino	done
193d14afb2aSJulio Merino
194d14afb2aSJulio Merino	cat >> $TEST/local-already <<EOF
195d14afb2aSJulio Merino
196d14afb2aSJulio Merinothese are some local mods to the file
197d14afb2aSJulio MerinoEOF
198d14afb2aSJulio Merino
199d14afb2aSJulio Merino	# local-remove: A file removed locally changed it's FreeBSD ID
200d14afb2aSJulio Merino	# but nothing else
201d14afb2aSJulio Merino	store_id $OLD/local-remove ": head/local-remove 12000 jhb "
202d14afb2aSJulio Merino	store_id $NEW/local-remove ": head/local-remove 12345 jhb "
203d14afb2aSJulio Merino	for i in $OLD $NEW; do
204d14afb2aSJulio Merino		cat >> $i/local-remove <<EOF
205d14afb2aSJulio Merino
206d14afb2aSJulio Merinothis is a file
207d14afb2aSJulio MerinoEOF
208d14afb2aSJulio Merino	done
209d14afb2aSJulio Merino}
210d14afb2aSJulio Merino
211d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST
212d14afb2aSJulio Merinomissing()
213d14afb2aSJulio Merino{
214d14afb2aSJulio Merino	if [ -e $TEST/$1 -o -L $TEST/$1 ]; then
215d14afb2aSJulio Merino		echo "File $1 should be missing"
216d14afb2aSJulio Merino		FAILED=yes
217d14afb2aSJulio Merino	fi
218d14afb2aSJulio Merino}
219d14afb2aSJulio Merino
220d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST
221d14afb2aSJulio Merinopresent()
222d14afb2aSJulio Merino{
223d14afb2aSJulio Merino	if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then
224d14afb2aSJulio Merino		echo "File $1 should be present"
225d14afb2aSJulio Merino		FAILED=yes
226d14afb2aSJulio Merino	fi
227d14afb2aSJulio Merino}
228d14afb2aSJulio Merino
229d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST
230d14afb2aSJulio Merino# $2 - optional string that should match file contents
231d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present
232d14afb2aSJulio Merinofile()
233d14afb2aSJulio Merino{
234d14afb2aSJulio Merino	local contents sum
235d14afb2aSJulio Merino
236d14afb2aSJulio Merino	if ! [ -f $TEST/$1 ]; then
237d14afb2aSJulio Merino		echo "File $1 should be a regular file"
238d14afb2aSJulio Merino		FAILED=yes
239d14afb2aSJulio Merino	elif [ $# -eq 2 ]; then
240d14afb2aSJulio Merino		contents=`cat $TEST/$1`
241d14afb2aSJulio Merino		if [ "$contents" != "$2" ]; then
242d14afb2aSJulio Merino			echo "File $1 has wrong contents"
243d14afb2aSJulio Merino			FAILED=yes
244d14afb2aSJulio Merino		fi
245d14afb2aSJulio Merino	elif [ $# -eq 3 ]; then
246d14afb2aSJulio Merino		sum=`md5 -q $TEST/$1`
247d14afb2aSJulio Merino		if [ "$sum" != "$3" ]; then
248d14afb2aSJulio Merino			echo "File $1 has wrong contents"
249d14afb2aSJulio Merino			FAILED=yes
250d14afb2aSJulio Merino		fi
251d14afb2aSJulio Merino	fi
252d14afb2aSJulio Merino}
253d14afb2aSJulio Merino
254d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict
255d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents
256d14afb2aSJulio Merinoconflict()
257d14afb2aSJulio Merino{
258d14afb2aSJulio Merino	local sum
259d14afb2aSJulio Merino
260d14afb2aSJulio Merino	if ! [ -f $CONFLICTS/$1 ]; then
261d14afb2aSJulio Merino		echo "File $1 missing conflict"
262d14afb2aSJulio Merino		FAILED=yes
263d14afb2aSJulio Merino	elif [ $# -gt 1 ]; then
264d14afb2aSJulio Merino		sum=`md5 -q $CONFLICTS/$1`
265d14afb2aSJulio Merino		if [ "$sum" != "$2" ]; then
266d14afb2aSJulio Merino			echo "Conflict $1 has wrong contents"
267d14afb2aSJulio Merino			FAILED=yes
268d14afb2aSJulio Merino		fi
269d14afb2aSJulio Merino	fi
270d14afb2aSJulio Merino}
271d14afb2aSJulio Merino
272d14afb2aSJulio Merino# $1 - relative path to a regular file that should not have a conflict
273d14afb2aSJulio Merinonoconflict()
274d14afb2aSJulio Merino{
275d14afb2aSJulio Merino	if [ -f $CONFLICTS/$1 ]; then
276d14afb2aSJulio Merino		echo "File $1 should not have a conflict"
277d14afb2aSJulio Merino		FAILED=yes
278d14afb2aSJulio Merino	fi
279d14afb2aSJulio Merino}
280d14afb2aSJulio Merino
281d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then
282d14afb2aSJulio Merino	echo "must be root"
283d14afb2aSJulio Merino	exit 0
284d14afb2aSJulio Merinofi
285d14afb2aSJulio Merino
286d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then
287d14afb2aSJulio Merino	echo "WARNING: /etc/etcupdate.conf settings may break some tests."
288d14afb2aSJulio Merinofi
289d14afb2aSJulio Merino
290d14afb2aSJulio Merino# First run the test without -F.
291d14afb2aSJulio Merino
292d14afb2aSJulio Merinobuild_trees
293d14afb2aSJulio Merino
294d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
295d14afb2aSJulio Merino
296d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
297d14afb2aSJulio Merino  C /already
298d14afb2aSJulio Merino  C /conflict
299d14afb2aSJulio Merino  C /local
300d14afb2aSJulio Merino  M /local-already
301d14afb2aSJulio Merino  C /old
302d14afb2aSJulio Merino  C /add
303d14afb2aSJulio MerinoWarnings:
304d14afb2aSJulio Merino  Modified regular file remains: /remove
305d14afb2aSJulio Merino  Removed file changed: /local-remove
306d14afb2aSJulio MerinoEOF
307d14afb2aSJulio Merino
308d14afb2aSJulio Merinoecho "Differences for regular:"
309d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
310d14afb2aSJulio Merino    || FAILED=yes
311d14afb2aSJulio Merino
312d14afb2aSJulio Merinofile /remove "" 1bb4776213af107077be78fead8a351c
313d14afb2aSJulio Merinofile /old "" 2f799a7addc4132563ef9b44adc66157
314d14afb2aSJulio Merinoconflict /old 8441be64a1540f2ff584015279682425
315d14afb2aSJulio Merinofile /already "" aa53bd506f65d01d766e7ba028585e1d
316d14afb2aSJulio Merinoconflict /already f44105abb1fa3293e95c5d77e428d418
317d14afb2aSJulio Merinofile /add "" 1dc8c617e541d1fd1b4c70212f71d8ae
318d14afb2aSJulio Merinoconflict /add f99081e0da9a07f3cfebb430c0414941
319d14afb2aSJulio Merinofile /conflict "" dc27978df125b0daeb7d9b93265f03fd
320d14afb2aSJulio Merinoconflict /conflict 868452f666fea1c60ffb918ad9ad9607
321d14afb2aSJulio Merinofile /local "" aa33e614b5e749449f230e2a2b0072eb
322d14afb2aSJulio Merinoconflict /local 3df93e64043c8e348fc625b93ea220f4
323d14afb2aSJulio Merinofile /local-already "" 0298b958a603049f45ae6a109c4f7fea
324d14afb2aSJulio Merinomissing /local-remove
325d14afb2aSJulio Merino
326d14afb2aSJulio Merino# Now test with -F.
327d14afb2aSJulio Merino
328d14afb2aSJulio Merinobuild_trees
329d14afb2aSJulio Merino
330d14afb2aSJulio Merino$COMMAND -rF -d $WORKDIR -D $TEST > $WORKDIR/testF.out
331d14afb2aSJulio Merino
332d14afb2aSJulio Merinocat > $WORKDIR/correctF.out <<EOF
333d14afb2aSJulio Merino  D /remove
334d14afb2aSJulio Merino  U /already
335d14afb2aSJulio Merino  C /conflict
336d14afb2aSJulio Merino  M /local
337d14afb2aSJulio Merino  U /old
338d14afb2aSJulio Merino  U /add
339d14afb2aSJulio MerinoEOF
340d14afb2aSJulio Merino
341d14afb2aSJulio Merinoecho "Differences for -F:"
342d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correctF.out -L "test" $WORKDIR/testF.out \
343d14afb2aSJulio Merino    || FAILED=yes
344d14afb2aSJulio Merino
345d14afb2aSJulio Merinomissing /remove
346d14afb2aSJulio Merinofile /old "" 6a9f34f109d94406a4de3bc5d72de259
347d14afb2aSJulio Merinonoconflict /old
348d14afb2aSJulio Merinofile /already "" 21f4eca3aacc702c49878c8da7afd3d0
349d14afb2aSJulio Merinonoconflict /already
350d14afb2aSJulio Merinofile /add "" 0208bd647111fedf6318511712ab9e97
351d14afb2aSJulio Merinonoconflict /add
352d14afb2aSJulio Merinofile /conflict "" dc27978df125b0daeb7d9b93265f03fd
353d14afb2aSJulio Merinoconflict /conflict 868452f666fea1c60ffb918ad9ad9607
354d14afb2aSJulio Merinofile /local "" 3ed5a35e380c8a93fb5f599d4c052713
355d14afb2aSJulio Merinofile /local-already "" 0298b958a603049f45ae6a109c4f7fea
356d14afb2aSJulio Merinomissing /local-remove
357d14afb2aSJulio Merino
358d14afb2aSJulio Merino# Now test with -F and -A forcing all installs.  (-A should have
359d14afb2aSJulio Merino# precedence over -F)
360d14afb2aSJulio Merino
361d14afb2aSJulio Merinobuild_trees
362d14afb2aSJulio Merino
363d14afb2aSJulio Merino$COMMAND -A '/*' -rF -d $WORKDIR -D $TEST > $WORKDIR/testAF.out
364d14afb2aSJulio Merino
365d14afb2aSJulio Merinocat > $WORKDIR/correctAF.out <<EOF
366d14afb2aSJulio Merino  D /remove
367d14afb2aSJulio Merino  U /already
368d14afb2aSJulio Merino  U /conflict
369d14afb2aSJulio Merino  U /local
370d14afb2aSJulio Merino  U /local-already
371d14afb2aSJulio Merino  A /local-remove
372d14afb2aSJulio Merino  U /old
373d14afb2aSJulio Merino  U /add
374d14afb2aSJulio MerinoEOF
375d14afb2aSJulio Merino
376d14afb2aSJulio Merinoecho "Differences for -A '/*' -F:"
377d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correctAF.out -L "test" $WORKDIR/testAF.out \
378d14afb2aSJulio Merino    || FAILED=yes
379d14afb2aSJulio Merino
380d14afb2aSJulio Merinomissing /remove
381d14afb2aSJulio Merinofile /old "" 6a9f34f109d94406a4de3bc5d72de259
382d14afb2aSJulio Merinonoconflict /old
383d14afb2aSJulio Merinofile /already "" 21f4eca3aacc702c49878c8da7afd3d0
384d14afb2aSJulio Merinonoconflict /already
385d14afb2aSJulio Merinofile /add "" 0208bd647111fedf6318511712ab9e97
386d14afb2aSJulio Merinonoconflict /add
387d14afb2aSJulio Merinofile /conflict "" 75ee141c4136beaf14e39de92efa84e4
388d14afb2aSJulio Merinonoconflict /conflict
389d14afb2aSJulio Merinofile /local "" 6a8fc5c2755b7a49015089f5e1dbe092
390d14afb2aSJulio Merinofile /local-already "" 49045f8b51542dd634655301cd296f66
391d14afb2aSJulio Merinofile /local-remove "" 5c38322efed4014797d7127f5c652d9d
392d14afb2aSJulio Merino
393d14afb2aSJulio Merino[ "${FAILED}" = no ]
394