@ -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 |
||||
|
|