Browse Source

Alejandro Mery:


			
			
				rocklinux
			
			
		
Alejandro Mery 20 years ago
parent
commit
598cf4f0b5
1 changed files with 201 additions and 0 deletions
  1. +201
    -0
      misc/archive/compare.sh

+ 201
- 0
misc/archive/compare.sh

@ -0,0 +1,201 @@
#!/bin/sh
exec 2>&1
verbose=0
quiet=0
source=
targets=
repositories=
packages=
function show_usage() {
echo "usage: $0 [-q] [-v] <source> <target> [-repository <repo>|<packages>|]"
echo "usage: $0 [-q] -3 <source> <target1> <target2> [-repository <repo>|<packages>|]"
}
# TODO: it would be great to port it to "-n <n>" instead of -3
#
while [ $# -gt 0 ]; do
case "$1" in
-v) verbose=1 ;;
-q) quiet=1 ;;
-3) source="$2"
targets="$3 $4"
shift 3 ;;
-repository)
shift
repositories="$*"; set --
;;
*) if [ "$targets" ]; then
packages="$*"; set --
elif [ "$source" ]; then
targets="$1"
else
source="$1"
fi
esac
shift
done
#if [ $verbose -eq 1 ]; then
# echo " verbosity: $verbose"
# echo " source: $source"
# echo " targets: $targets"
# echo "repositories: $repositories"
# echo " packages: $packages"
#fi 1>&2
function diff_package() {
local source="$1"
local target="$1"
# files on source
for x in $source/*; do
if [ -d "$x" ]; then
diff_package $x $target/${x##*/}
elif [ -f $x -a -f $target/${x##*/} ]; then
echo diff -u $x $target/${x##*/}
else
echo diff -u $x /dev/null
fi
done
# TODO: files only on target
}
# grabdata confdir field
function grabdata() {
local confdir=$1
local pkg=$2
local field=$3
local output=
case "$field" in
version) output=$( grabdata_desc $confdir/$pkg.desc $field ) ;;
*) output=$( grabdata_cache $confdir/$pkg.cache $field ) ;;
esac
if [ -z "${output// /}" ]; then
echo "UNKNOWN"
else
echo "$output"
fi
}
function grabdata_desc() {
local output=
if [ -f "$1" ]; then
case "$2" in
version) output=$( grep -e "^\[V\]" $1 | cut -d' ' -f2- ) ;;
esac
fi
echo "$output"
}
function grabdata_cache() {
local output=
if [ -f "$1" ]; then
case "$2" in
status) if grep -q -e "^\[.-ERROR\]" $1; then
output=BROKEN
else
output=BUILT
fi ;;
size) output=$( grep -e "^\[SIZE\]" $1 | cut -d' ' -f2- ) ;;
esac
fi
echo "$output"
}
function compare_package() {
local pkg=${1##*/}
local source=$1
local target= x= missing=0
shift;
srcver=$( grabdata $source $pkg version )
srcstatus=$( grabdata $source $pkg status )
srcsize=$( grabdata $source $pkg size )
tgtver=
tgtstatus=
tgtsize=
for x; do
target=$( echo $x/package/*/$pkg | head -n 1 )
if [ -d "$target" ]; then
tgtver="$tgtver:$( grabdata $target $pkg version )"
tgtstatus="$tgtstatus:$( grabdata $target $pkg status )"
tgtsize="$tgtsize:$( grabdata $target $pkg size )"
else
tgtver="$tgtver:MISSING"
tgtstatus="$tgtstatus:MISSING"
tgtsize="$tgtsize:MISSING"
missing=1
fi
done
tgtver="${tgtver#:}"
tgtstatus="${tgtstatus#:}"
tgtsize="${tgtsize#:}"
equalver=1 equalstatus=1
IFS=':' ; for x in $tgtver; do
[ "$x" != "$srcver" ] && equalver=0
done
IFS=':' ; for x in $tgtstatus; do
[ "$x" != "$srcstatus" ] && equalstatus=0
done
if [ $equalver -eq 1 ]; then
version=$srcver
else
version="$srcver -> $tgtver"
fi
if [ $equalstatus -eq 1 ]; then
status="$srcstatus"
else
status="$srcstatus -> $tgtstatus"
fi
if [ $missing -eq 1 ]; then
echo "- $pkg ($version) ($status) ($srcsize -> $tgtsize)" 1>&2
elif [ $equalver -eq 1 ]; then
[ $quiet -eq 0 ] && echo "* $pkg ($version) ($status) ($srcsize -> $tgtsize)" 1>&2
else
echo "+ $pkg ($version) ($status) ($srcsize:$tgtsize)" 1>&2
[ "$verbose" -eq 1 ] && diff_package $source $target
fi
}
if [ -z "$source" -o -z "$targets" ]; then
show_usage; exit 1
fi
allexist=1
for x in $source $targets; do
[ ! -d "$x/" ] && allexist=0; break
done
if [ $allexist -eq 1 ]; then
echo -e "from: $source\nto..: $targets" 1>&2
if [ "$repositories" ]; then
for repo in $repositories; do
for x in $source/package/$repo/*; do
[ -d "$x" ] && ( compare_package $x $targets )
done
done
elif [ "$packages" ]; then
for pkg in $packages; do
x=$( echo $source/package/*/$pkg | head -n 1 )
[ -d "$x" ] && compare_package $x $targets
done
else
for repo in $source/package/*; do
echo "repository: ${repo##*/}" 1>&2
for x in $repo/*; do
[ -d "$x" ] && compare_package $x $targets
done
done
fi
else
show_usage
exit 1
fi

Loading…
Cancel
Save