forked from TrueCloudLab/neoneo-go
64 lines
1.4 KiB
Text
64 lines
1.4 KiB
Text
|
#!/bin/sh
|
||
|
|
||
|
ARG1=$1
|
||
|
ARG2=$2
|
||
|
if [ -z "$ARG1" ] || [ -z "$ARG2" ]; then
|
||
|
echo one of the arguments is empty
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
|
||
|
compare() {
|
||
|
# replace replaces storage operation from "Changed" to "Added"
|
||
|
# normalize replaces performs replace and sorts keys in lexicographic order
|
||
|
# next we normalize every json file
|
||
|
# and finally compare them as a whole
|
||
|
jq --argfile x "$1" --argfile y "$2" \
|
||
|
-n 'def replace: map(if (.state == "Changed") then (.state="Added") else . end);
|
||
|
def normalize: .storage = (.storage | replace | sort_by(.key));
|
||
|
($x | map(normalize)) as $x
|
||
|
| ($y | map(normalize)) as $y
|
||
|
| $x | range(length) | . as $i | select($x[$i] != $y[$i]) | $x[$i].block | halt_error(1)'
|
||
|
}
|
||
|
|
||
|
if [ -f "$ARG1" ] && [ -f "$ARG2" ]; then
|
||
|
compare "$ARG1" "$ARG2"
|
||
|
if [ $? -ne 0 ]; then
|
||
|
echo failed
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
if [ ! -d "$ARG1" ] || [ ! -d "$ARG2" ]; then
|
||
|
echo both arguments must have the same type and exist
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
FIRST=$3
|
||
|
if [ -z "$FIRST" ]; then
|
||
|
FIRST=1
|
||
|
fi
|
||
|
|
||
|
LAST=$4
|
||
|
if [ -z "$LAST" ]; then
|
||
|
LAST=40 # 40_00000 block
|
||
|
fi
|
||
|
|
||
|
# directories contain 100k blocks
|
||
|
for i in `seq $FIRST $LAST`; do
|
||
|
dir=BlockStorage_${i}00000
|
||
|
echo Processing directory $dir
|
||
|
|
||
|
# files are grouped by 1k blocks
|
||
|
for j in `seq $(((i-1)*100 + 1)) $((i*100))`; do
|
||
|
file=dump-block-${j}000.json
|
||
|
compare "$ARG1/$dir/$file" "$ARG2/$dir/$file"
|
||
|
if [ $? -ne 0 ]; then
|
||
|
echo failed on file $dir/$file
|
||
|
exit 1
|
||
|
fi
|
||
|
done
|
||
|
done
|