mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
4.1 KiB

  1. #!/bin/sh
  2. exec 2>&1
  3. verbose=0
  4. quiet=0
  5. source=
  6. targets=
  7. repositories=
  8. packages=
  9. function show_usage() {
  10. echo "usage: $0 [-q] [-v] <source> <target> [-repository <repo>|<packages>|]"
  11. echo "usage: $0 [-q] -3 <source> <target1> <target2> [-repository <repo>|<packages>|]"
  12. }
  13. # TODO: it would be great to port it to "-n <n>" instead of -3
  14. #
  15. while [ $# -gt 0 ]; do
  16. case "$1" in
  17. -v) verbose=1 ;;
  18. -q) quiet=1 ;;
  19. -3) source="$2"
  20. targets="$3 $4"
  21. shift 3 ;;
  22. -repository)
  23. shift
  24. repositories="$*"; set --
  25. ;;
  26. *) if [ "$targets" ]; then
  27. packages="$*"; set --
  28. elif [ "$source" ]; then
  29. targets="$1"
  30. else
  31. source="$1"
  32. fi
  33. esac
  34. shift
  35. done
  36. #if [ $verbose -eq 1 ]; then
  37. # echo " verbosity: $verbose"
  38. # echo " source: $source"
  39. # echo " targets: $targets"
  40. # echo "repositories: $repositories"
  41. # echo " packages: $packages"
  42. #fi 1>&2
  43. function diff_package() {
  44. local source="$1"
  45. local target="$1"
  46. # files on source
  47. for x in $source/*; do
  48. if [ -d "$x" ]; then
  49. diff_package $x $target/${x##*/}
  50. elif [ -f $x -a -f $target/${x##*/} ]; then
  51. echo diff -u $x $target/${x##*/}
  52. else
  53. echo diff -u $x /dev/null
  54. fi
  55. done
  56. # TODO: files only on target
  57. }
  58. # grabdata confdir field
  59. function grabdata() {
  60. local confdir=$1
  61. local pkg=$2
  62. local field=$3
  63. local output=
  64. case "$field" in
  65. version) output=$( grabdata_desc $confdir/$pkg.desc $field ) ;;
  66. *) output=$( grabdata_cache $confdir/$pkg.cache $field ) ;;
  67. esac
  68. if [ -z "${output// /}" ]; then
  69. echo "UNKNOWN"
  70. else
  71. echo "$output"
  72. fi
  73. }
  74. function grabdata_desc() {
  75. local output=
  76. if [ -f "$1" ]; then
  77. case "$2" in
  78. version) output=$( grep -e "^\[V\]" $1 | cut -d' ' -f2- ) ;;
  79. esac
  80. fi
  81. echo "$output"
  82. }
  83. function grabdata_cache() {
  84. local output=
  85. if [ -f "$1" ]; then
  86. case "$2" in
  87. status) if grep -q -e "^\[.-ERROR\]" $1; then
  88. output=BROKEN
  89. else
  90. output=BUILT
  91. fi ;;
  92. size) output=$( grep -e "^\[SIZE\]" $1 | cut -d' ' -f2- ) ;;
  93. esac
  94. fi
  95. echo "$output"
  96. }
  97. function compare_package() {
  98. local pkg=${1##*/}
  99. local source=$1
  100. local target= x= missing=0
  101. shift;
  102. srcver=$( grabdata $source $pkg version )
  103. srcstatus=$( grabdata $source $pkg status )
  104. srcsize=$( grabdata $source $pkg size )
  105. tgtver=
  106. tgtstatus=
  107. tgtsize=
  108. for x; do
  109. target=$( echo $x/package/*/$pkg | head -n 1 )
  110. if [ -d "$target" ]; then
  111. tgtver="$tgtver:$( grabdata $target $pkg version )"
  112. tgtstatus="$tgtstatus:$( grabdata $target $pkg status )"
  113. tgtsize="$tgtsize:$( grabdata $target $pkg size )"
  114. else
  115. tgtver="$tgtver:MISSING"
  116. tgtstatus="$tgtstatus:MISSING"
  117. tgtsize="$tgtsize:MISSING"
  118. missing=1
  119. fi
  120. done
  121. tgtver="${tgtver#:}"
  122. tgtstatus="${tgtstatus#:}"
  123. tgtsize="${tgtsize#:}"
  124. equalver=1 equalstatus=1
  125. IFS=':' ; for x in $tgtver; do
  126. [ "$x" != "$srcver" ] && equalver=0
  127. done
  128. IFS=':' ; for x in $tgtstatus; do
  129. [ "$x" != "$srcstatus" ] && equalstatus=0
  130. done
  131. if [ $equalver -eq 1 ]; then
  132. version=$srcver
  133. else
  134. version="$srcver -> $tgtver"
  135. fi
  136. if [ $equalstatus -eq 1 ]; then
  137. status="$srcstatus"
  138. else
  139. status="$srcstatus -> $tgtstatus"
  140. fi
  141. if [ $missing -eq 1 ]; then
  142. echo "- $pkg ($version) ($status) ($srcsize -> $tgtsize)" 1>&2
  143. elif [ $equalver -eq 1 ]; then
  144. [ $quiet -eq 0 ] && echo "* $pkg ($version) ($status) ($srcsize -> $tgtsize)" 1>&2
  145. else
  146. echo "+ $pkg ($version) ($status) ($srcsize:$tgtsize)" 1>&2
  147. [ "$verbose" -eq 1 ] && diff_package $source $target
  148. fi
  149. }
  150. if [ -z "$source" -o -z "$targets" ]; then
  151. show_usage; exit 1
  152. fi
  153. allexist=1
  154. for x in $source $targets; do
  155. [ ! -d "$x/" ] && allexist=0; break
  156. done
  157. if [ $allexist -eq 1 ]; then
  158. echo -e "from: $source\nto..: $targets" 1>&2
  159. if [ "$repositories" ]; then
  160. for repo in $repositories; do
  161. for x in $source/package/$repo/*; do
  162. [ -d "$x" ] && ( compare_package $x $targets )
  163. done
  164. done
  165. elif [ "$packages" ]; then
  166. for pkg in $packages; do
  167. x=$( echo $source/package/*/$pkg | head -n 1 )
  168. [ -d "$x" ] && compare_package $x $targets
  169. done
  170. else
  171. for repo in $source/package/*; do
  172. echo "repository: ${repo##*/}" 1>&2
  173. for x in $repo/*; do
  174. [ -d "$x" ] && compare_package $x $targets
  175. done
  176. done
  177. fi
  178. else
  179. show_usage
  180. exit 1
  181. fi