[arch-commits] Commit in pacman/trunk (PKGBUILD pacman.install vercmp.patch)
Pierre Schmitz
pierre at archlinux.org
Wed Apr 7 17:17:04 UTC 2010
Date: Wednesday, April 7, 2010 @ 13:17:03
Author: pierre
Revision: 76084
revert versiond deps; instead: avoid using libalpm in vercmp
Added:
pacman/trunk/vercmp.patch
Modified:
pacman/trunk/PKGBUILD
pacman/trunk/pacman.install
----------------+
PKGBUILD | 11 ++-
pacman.install | 4 -
vercmp.patch | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 198 insertions(+), 8 deletions(-)
Modified: PKGBUILD
===================================================================
--- PKGBUILD 2010-04-07 17:10:46 UTC (rev 76083)
+++ PKGBUILD 2010-04-07 17:17:03 UTC (rev 76084)
@@ -10,7 +10,7 @@
url="http://www.archlinux.org/pacman/"
license=('GPL')
groups=('base')
-depends=('bash' 'libarchive>=2.8.3-3' 'libfetch>=2.30-3' 'pacman-mirrorlist')
+depends=('bash' 'libarchive>=2.7.1' 'libfetch>=2.25' 'pacman-mirrorlist')
optdepends=('fakeroot: for makepkg usage as normal user'
'python: for rankmirrors script usage')
backup=(etc/pacman.conf etc/makepkg.conf)
@@ -18,17 +18,20 @@
options=(!libtool)
source=(ftp://ftp.archlinux.org/other/pacman/$pkgname-$pkgver.tar.gz
pacman.conf
- makepkg.conf)
+ makepkg.conf
+ vercmp.patch)
md5sums=('a8cef73d68e2a4c3a46fb46c33210719'
'abe70dabacee7036368c7afeb686eb10'
- '4d2f2f2ac74cba7bd2d336db9135ab16')
+ '4d2f2f2ac74cba7bd2d336db9135ab16'
+ '84129116c61c8a7cad03a5ae5d80aee5')
# keep an upgrade path for older installations
PKGEXT='.pkg.tar.gz'
build() {
cd $srcdir/$pkgname-$pkgver
-
+ # avoid linking vercmp against libalpm as this might be broken during a transaction
+ patch -p0 -i $srcdir/vercmp.patch || return 1
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
make || return 1
}
Modified: pacman.install
===================================================================
--- pacman.install 2010-04-07 17:10:46 UTC (rev 76083)
+++ pacman.install 2010-04-07 17:17:03 UTC (rev 76084)
@@ -6,10 +6,6 @@
if [ "$(vercmp $2 3.0.2)" -lt 0 ]; then
_resetbackups
fi
-
- if [ "$(vercmp $2 3.3.3-4)" -le 0 ]; then
- echo '>>> Make sure to run pacman -Su again after pacman has updated itself!'
- fi
}
_resetbackups() {
Added: vercmp.patch
===================================================================
--- vercmp.patch (rev 0)
+++ vercmp.patch 2010-04-07 17:17:03 UTC (rev 76084)
@@ -0,0 +1,191 @@
+--- src/util/vercmp.c 2009-09-30 03:38:22.000000000 +0200
++++ src/util/vercmp.c 2010-04-07 18:49:13.659173306 +0200
+@@ -18,17 +18,184 @@
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+-#include "config.h"
+-
+ #include <stdio.h> /* printf */
++#include <stdlib.h> /* malloc/free */
+ #include <string.h> /* strncpy */
+
+-#include <alpm.h>
+-
+ #define BASENAME "vercmp"
+
+ #define MAX_LEN 255
+
++/** Compare two version strings and determine which one is 'newer'.
++ * Returns a value comparable to the way strcmp works. Returns 1
++ * if a is newer than b, 0 if a and b are the same version, or -1
++ * if b is newer than a.
++ *
++ * This function has been adopted from the rpmvercmp function located
++ * at lib/rpmvercmp.c, and was most recently updated against rpm
++ * version 4.4.2.3. Small modifications have been made to make it more
++ * consistent with the libalpm coding style.
++ *
++ * Keep in mind that the pkgrel is only compared if it is available
++ * on both versions handed to this function. For example, comparing
++ * 1.5-1 and 1.5 will yield 0; comparing 1.5-1 and 1.5-2 will yield
++ * -1 as expected. This is mainly for supporting versioned dependencies
++ * that do not include the pkgrel.
++ */
++static int alpm_pkg_vercmp(const char *a, const char *b)
++{
++ char oldch1, oldch2;
++ char *str1, *str2;
++ char *ptr1, *ptr2;
++ char *one, *two;
++ int rc;
++ int isnum;
++ int ret = 0;
++
++ /* libalpm added code. ensure our strings are not null */
++ if(!a) {
++ if(!b) return(0);
++ return(-1);
++ }
++ if(!b) return(1);
++
++ /* easy comparison to see if versions are identical */
++ if(strcmp(a, b) == 0) return(0);
++
++ str1 = strdup(a);
++ str2 = strdup(b);
++
++ one = str1;
++ two = str2;
++
++ /* loop through each version segment of str1 and str2 and compare them */
++ while(*one && *two) {
++ while(*one && !isalnum((int)*one)) one++;
++ while(*two && !isalnum((int)*two)) two++;
++
++ /* If we ran to the end of either, we are finished with the loop */
++ if(!(*one && *two)) break;
++
++ ptr1 = one;
++ ptr2 = two;
++
++ /* grab first completely alpha or completely numeric segment */
++ /* leave one and two pointing to the start of the alpha or numeric */
++ /* segment and walk ptr1 and ptr2 to end of segment */
++ if(isdigit((int)*ptr1)) {
++ while(*ptr1 && isdigit((int)*ptr1)) ptr1++;
++ while(*ptr2 && isdigit((int)*ptr2)) ptr2++;
++ isnum = 1;
++ } else {
++ while(*ptr1 && isalpha((int)*ptr1)) ptr1++;
++ while(*ptr2 && isalpha((int)*ptr2)) ptr2++;
++ isnum = 0;
++ }
++
++ /* save character at the end of the alpha or numeric segment */
++ /* so that they can be restored after the comparison */
++ oldch1 = *ptr1;
++ *ptr1 = '\0';
++ oldch2 = *ptr2;
++ *ptr2 = '\0';
++
++ /* this cannot happen, as we previously tested to make sure that */
++ /* the first string has a non-null segment */
++ if (one == ptr1) {
++ ret = -1; /* arbitrary */
++ goto cleanup;
++ }
++
++ /* take care of the case where the two version segments are */
++ /* different types: one numeric, the other alpha (i.e. empty) */
++ /* numeric segments are always newer than alpha segments */
++ /* XXX See patch #60884 (and details) from bugzilla #50977. */
++ if (two == ptr2) {
++ ret = isnum ? 1 : -1;
++ goto cleanup;
++ }
++
++ if (isnum) {
++ /* this used to be done by converting the digit segments */
++ /* to ints using atoi() - it's changed because long */
++ /* digit segments can overflow an int - this should fix that. */
++
++ /* throw away any leading zeros - it's a number, right? */
++ while (*one == '0') one++;
++ while (*two == '0') two++;
++
++ /* whichever number has more digits wins */
++ if (strlen(one) > strlen(two)) {
++ ret = 1;
++ goto cleanup;
++ }
++ if (strlen(two) > strlen(one)) {
++ ret = -1;
++ goto cleanup;
++ }
++ }
++
++ /* strcmp will return which one is greater - even if the two */
++ /* segments are alpha or if they are numeric. don't return */
++ /* if they are equal because there might be more segments to */
++ /* compare */
++ rc = strcmp(one, two);
++ if (rc) {
++ ret = rc < 1 ? -1 : 1;
++ goto cleanup;
++ }
++
++ /* restore character that was replaced by null above */
++ *ptr1 = oldch1;
++ one = ptr1;
++ *ptr2 = oldch2;
++ two = ptr2;
++
++ /* libalpm added code. check if version strings have hit the pkgrel
++ * portion. depending on which strings have hit, take correct action.
++ * this is all based on the premise that we only have one dash in
++ * the version string, and it separates pkgver from pkgrel. */
++ if(*ptr1 == '-' && *ptr2 == '-') {
++ /* no-op, continue comparing since we are equivalent throughout */
++ } else if(*ptr1 == '-') {
++ /* ptr1 has hit the pkgrel and ptr2 has not. continue version
++ * comparison after stripping the pkgrel from ptr1. */
++ *ptr1 = '\0';
++ } else if(*ptr2 == '-') {
++ /* ptr2 has hit the pkgrel and ptr1 has not. continue version
++ * comparison after stripping the pkgrel from ptr2. */
++ *ptr2 = '\0';
++ }
++ }
++
++ /* this catches the case where all numeric and alpha segments have */
++ /* compared identically but the segment separating characters were */
++ /* different */
++ if ((!*one) && (!*two)) {
++ ret = 0;
++ goto cleanup;
++ }
++
++ /* the final showdown. we never want a remaining alpha string to
++ * beat an empty string. the logic is a bit weird, but:
++ * - if one is empty and two is not an alpha, two is newer.
++ * - if one is an alpha, two is newer.
++ * - otherwise one is newer.
++ * */
++ if ( ( !*one && !isalpha((int)*two) )
++ || isalpha((int)*one) ) {
++ ret = -1;
++ } else {
++ ret = 1;
++ }
++
++cleanup:
++ free(str1);
++ free(str2);
++ return(ret);
++}
++
++
+ static void usage()
+ {
+ fprintf(stderr, "usage: %s <ver1> <ver2>\n\n", BASENAME);
More information about the arch-commits
mailing list