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