Hello, so this is what I've done to my apt-move to get openoffice (and couple of other packages it seems...) right. During apt-move run on my box cmpversion is invoked about 12000 times - fortunately 11800 of them is for matching source & target, so for them we can take shortcut of not executing dpkg. For remaining 200 we have...
Unfortunately I was not able to find apt's equivalent for dpkg --compare-versions, so probably patch is not OK for upstream, as it won't work on RPM based apt. But it might be fine for Debian/Ubuntu. I'm not awk expert, so I just hope that there is no special quoting needed around a/b arguments to dpkg. If there is, then I'm sorry, but I have no clue how it should look like. Thanks, Petr Vandrovec diff -urN apt-move-4.2.26.post-sign/apt-move apt-move-4.2.26/apt-move --- apt-move-4.2.26.post-sign/apt-move 2006-11-05 15:11:05.000000000 -0800 +++ apt-move-4.2.26/apt-move 2006-11-05 19:04:15.000000000 -0800 @@ -72,7 +72,7 @@ FETCH=/usr/lib/apt-move/fetch # crappy replacement for apt-get SCRIPTS=$APTMOVE_SCRIPTS : ${SCRIPTS:=/usr/share/apt-move} -awk="awk -f $SCRIPTS/cmpbignum.awk -f $SCRIPTS/cmpversion.awk -f" +awk="awk -f $SCRIPTS/cmpversion.awk -f" awk="$awk $SCRIPTS/getdist.awk -f" MOVE3=$SCRIPTS/move3 MOVE4="$awk $SCRIPTS/move4" diff -urN apt-move-4.2.26.post-sign/cmpbignum.awk apt-move-4.2.26/cmpbignum.awk --- apt-move-4.2.26.post-sign/cmpbignum.awk 2002-01-25 00:47:24.000000000 -0800 +++ apt-move-4.2.26/cmpbignum.awk 1969-12-31 16:00:00.000000000 -0800 @@ -1,35 +0,0 @@ -# cmpbignum --- compare two arbitrarily long integers. -# The function returns: -# < 0 if a < b -# == 0 if a == b -# > 0 if a > b -# The idea came from Anthony Towns in http://bugs.debian.org/92839. -# -# Copyright (c) 2001 Herbert Xu <[EMAIL PROTECTED]> -# $Id: cmpbignum.awk,v 1.1 2002/01/25 08:47:24 herbert Exp $ - -function cmpbignum(a, b, i, j, k, l, d) { - i = match(a, /[^0]/) - j = match(b, /[^0]/) - if (!i || !j) { - return !!i - !!j - } - - k = length(a) - l = length(b) - d = (k - i) - (l - j) - if (d) { - return d - } - - do { - d = substr(a, i, 1) - substr(b, j, 1) - if (d) { - return d - } - i++ - j++ - } while (i <= k) - - return 0 -} diff -urN apt-move-4.2.26.post-sign/cmpversion.awk apt-move-4.2.26/cmpversion.awk --- apt-move-4.2.26.post-sign/cmpversion.awk 2002-10-28 23:59:41.000000000 -0800 +++ apt-move-4.2.26/cmpversion.awk 2006-11-05 19:08:11.000000000 -0800 @@ -1,128 +1,20 @@ # cmpversion --- compare versions of Debian packages. -# The function returns: -# < 0 if a < b -# == 0 if a == b -# > 0 if a > b -# This function depends on cmpbignum. +# The function compares two versions and returns TRUE if +# a < b and operator is ne, lt, or le. +# a == b and operator is eq, le, or ge. +# a > b and operator is ne, gt, or ge. # # Copyright (c) 2001 Herbert Xu <[EMAIL PROTECTED]> # $Id: cmpversion.awk,v 1.2 2002/10/29 07:59:41 herbert Exp $ -function _cmpversion_segment(a, b, i, j, k, l, m, n, p, q, d) { - k = length(a) - l = length(b) - - while (k > 0 && l > 0) { - i = match(a, /[0-9]/) - if (!i) { - i = k + 1 - } - j = match(b, /[0-9]/) - if (!j) { - j = l + 1 - } - - m = 1 - n = 1 - while (m < i && n < j) { - p = substr(a, m, 1) - q = substr(b, n, 1) - d = (q ~ /[A-Za-z]/) - (p ~ /[A-Za-z]/) - if (d) { - return d - } - if (p != q) { - return p < q ? -1 : 1 - } - m++ - n++ - } - - d = (m < i) - (n < j) - if (d) { - return d - } - - a = substr(a, i) - b = substr(b, j) - k -= i - 1 - l -= j - 1 - if (k <= 0 || l <= 0) { - break - } - - i = match(a, /[^0-9]/) - if (!i) { - i = k + 1 - } - j = match(b, /[^0-9]/) - if (!j) { - j = l + 1 - } - - d = cmpbignum(substr(a, 1, i - 1), substr(b, 1, j - 1)) - if (d) { - return d - } - - a = substr(a, i) - b = substr(b, j) - k -= i - 1 - l -= j - 1 - } - - return (k > 0) - (l > 0) -} - -function cmpversion(a, b, i, j, k, l, d) { +function cmpversion(a, o, b) { if (a == b) { - return 0 + return o == "eq" || o == "le" || o == "ge" } else if (a == "-") { - return 1 + return o == "ne" || o == "gt" || o == "ge" } else if (b == "-") { - return -1 - } - - i = index(a, ":") - j = index(b, ":") - if (i > 1 || j > 1) { - d = (i > 1) - (j > 1) - if (d) { - return d - } - d = cmpbignum(substr(a, 1, i - 1), substr(b, 1, j - 1)) - if (d) { - return d - } - i++ - j++ - } else { - i = 1 - j = 1 - } - - a = substr(a, i) - b = substr(b, j) - k = match(a, /.*-/) - if (k) { - k = RLENGTH - 1 - i = k + 2 - } else { - k = length(a) - i = k + 1 - } - l = match(b, /.*-/) - if (l) { - l = RLENGTH - 1 - j = l + 2 + return o == "ne" || o == "lt" || o == "le" } else { - l = length(b) - j = l + 1 - } - - d = _cmpversion_segment(substr(a, 1, k), substr(b, 1, l)) - if (d) { - return d + return system("dpkg --compare-versions " a " " o " " b) == 0 } - return _cmpversion_segment(substr(a, i), substr(b, j)) } diff -urN apt-move-4.2.26.post-sign/get2 apt-move-4.2.26/get2 --- apt-move-4.2.26.post-sign/get2 2002-10-11 18:21:05.000000000 -0700 +++ apt-move-4.2.26/get2 2006-11-05 18:48:45.000000000 -0800 @@ -11,7 +11,7 @@ } { - if (cmpversion($NF, bestver) > 0) { + if (cmpversion($NF, "gt", bestver)) { bestline = $0 bestver = $NF } diff -urN apt-move-4.2.26.post-sign/move5 apt-move-4.2.26/move5 --- apt-move-4.2.26.post-sign/move5 2002-10-07 02:39:07.000000000 -0700 +++ apt-move-4.2.26/move5 2006-11-05 18:49:22.000000000 -0800 @@ -74,10 +74,10 @@ dist = sdist[i] break } - if (cmpversion(sver[i], ver) < 0) { + if (cmpversion(sver[i], "lt", ver)) { continue } - if (low == "" || cmpversion(sver[i], low) < 0) { + if (low == "" || cmpversion(sver[i], "lt", low)) { low = sver[i] dist = sdist[i] } diff -urN apt-move-4.2.26.post-sign/move6 apt-move-4.2.26/move6 --- apt-move-4.2.26.post-sign/move6 2002-10-18 21:20:33.000000000 -0700 +++ apt-move-4.2.26/move6 2006-11-05 18:49:44.000000000 -0800 @@ -49,7 +49,7 @@ } function check() { - if (((rel, arch) in best) && cmpversion(best[rel, arch], ver) > 0) { + if (((rel, arch) in best) && cmpversion(best[rel, arch], "gt", ver)) { return } best[rel, arch] = ver @@ -148,7 +148,7 @@ if (arch != "binary-all" && !((rel, arch) in relarches)) { continue } - if (cmpversion(ver, bver) > 0) { + if (cmpversion(ver, "gt", bver)) { continue } check() diff -urN apt-move-4.2.26.post-sign/move7 apt-move-4.2.26/move7 --- apt-move-4.2.26.post-sign/move7 2002-10-07 02:39:07.000000000 -0700 +++ apt-move-4.2.26/move7 2006-11-05 18:50:05.000000000 -0800 @@ -91,11 +91,11 @@ prevname = name } -!eof && curname == name && cmpversion(ver, curver) <= 0 { +!eof && curname == name && cmpversion(ver, "le", curver) { next } -best == "" || cmpversion(ver, best) > 0 { +best == "" || cmpversion(ver, "gt", best) { best = ver bestlink = link bestfile = file -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]