summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile16
-rw-r--r--opkg-compare-versions.c158
-rwxr-xr-xopkg-compare-versions.sh77
3 files changed, 6 insertions, 245 deletions
diff --git a/Makefile b/Makefile
index b045028..23aebbe 100644
--- a/Makefile
+++ b/Makefile
@@ -1,19 +1,15 @@
-UTILS = opkg-build opkg-unbuild opkg-compare-versions opkg-make-index opkg.py \
- opkg-list-fields arfile.py opkg-buildpackage opkg-diff opkg-extract-file opkg-show-deps \
- opkg-compare-indexes opkg-compare-versions.sh update-alternatives
+UTILS = opkg-build opkg-unbuild opkg-make-index opkg.py opkg-list-fields \
+ arfile.py opkg-buildpackage opkg-diff opkg-extract-file opkg-show-deps \
+ opkg-compare-indexes update-alternatives
DESTDIR=
PREFIX=/usr/local
bindir=$(PREFIX)/bin
-all: opkg-compare-versions
+all:
-opkg-compare-versions: opkg-compare-versions.c
- $(CC) $(CFLAGS) -o opkg-compare-versions opkg-compare-versions.c
-
-install: opkg-compare-versions
+install:
install -d $(DESTDIR)$(bindir)
install -m 755 $(UTILS) $(DESTDIR)$(bindir)
-clean:
- rm -rf opkg-compare-versions
+.PHONY: install all
diff --git a/opkg-compare-versions.c b/opkg-compare-versions.c
deleted file mode 100644
index 62851fa..0000000
--- a/opkg-compare-versions.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * libdpkg - Debian packaging suite library routines
- * vercmp.c - comparison of version numbers
- *
- * Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2,
- * or (at your option) any later version.
- *
- * This is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with dpkg; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-
-# define _(Text) Text
-
-struct versionrevision {
- unsigned long epoch;
- char *version;
- const char *revision;
-};
-
-/* assume ascii; warning: evaluates x multiple times! */
-#define order(x) ((x) == '~' ? -1 \
- : isdigit((x)) ? 0 \
- : !(x) ? 0 \
- : isalpha((x)) ? (x) \
- : (x) + 256)
-
-static int
-verrevcmp(const char *val, const char *ref) {
- if (!val) val= "";
- if (!ref) ref= "";
-
- while (*val || *ref) {
- int first_diff= 0;
-
- while ( (*val && !isdigit(*val)) || (*ref && !isdigit(*ref)) ) {
- int vc= order(*val), rc= order(*ref);
- if (vc != rc) return vc - rc;
- val++; ref++;
- }
-
- while ( *val == '0' ) val++;
- while ( *ref == '0' ) ref++;
- while (isdigit(*val) && isdigit(*ref)) {
- if (!first_diff) first_diff= *val - *ref;
- val++; ref++;
- }
- if (isdigit(*val)) return 1;
- if (isdigit(*ref)) return -1;
- if (first_diff) return first_diff;
- }
- return 0;
-}
-
-int versioncompare(const struct versionrevision *version,
- const struct versionrevision *refversion)
-{
- int r;
-
- if (version->epoch > refversion->epoch) return 1;
- if (version->epoch < refversion->epoch) return -1;
- r= verrevcmp(version->version,refversion->version); if (r) return r;
- r= verrevcmp(version->revision,refversion->revision); if (r) return r;
- return r;
-}
-
-int versionsatisfied3(const struct versionrevision *it,
- const struct versionrevision *ref,
- const char *op)
-{
- int r;
- r= versioncompare(it,ref);
- if (strcmp(op, "<=") == 0 || strcmp(op, "<") == 0)
- return r <= 0;
- if (strcmp(op, ">=") == 0 || strcmp(op, ">") == 0)
- return r >= 0;
- if (strcmp(op, "<<") == 0)
- return r < 0;
- if (strcmp(op, ">>") == 0)
- return r > 0;
- if (strcmp(op, "=") == 0)
- return r == 0;
- fprintf(stderr, "unknown operator: %s", op);
-
- exit(1);
-}
-
-const char *parseversion(struct versionrevision *rversion, const char *string)
-{
- char *hyphen, *colon, *eepochcolon;
- unsigned long epoch;
-
- if (!*string) return _("version string is empty");
-
- colon= strchr(string,':');
- if (colon) {
- epoch= strtoul(string,&eepochcolon,10);
- if (colon != eepochcolon) return _("epoch in version is not number");
- if (!*++colon) return _("nothing after colon in version number");
- string= colon;
- rversion->epoch= epoch;
- } else {
- rversion->epoch= 0;
- }
-
- rversion->revision = "";
-
- rversion->version= malloc(strlen(string)+1);
- strcpy(rversion->version, string);
-
-#if 0
- fprintf(stderr,"Parsed version: %lu, %s\n",
- rversion->epoch,
- rversion->version);
-#endif
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- const char *err;
- struct versionrevision ver, ref;
-
- if (argc < 4) {
- fprintf(stderr, "usage: %s: version op refversion\n", argv[0]);
- return 2;
- }
-
- err = parseversion(&ver, argv[1]);
- if (err) {
- fprintf(stderr, "Invalid version `%s': %s\n", argv[1], err);
- return 2;
- }
-
- err = parseversion(&ref, argv[3]);
- if (err) {
- fprintf(stderr, "Invalid version `%s': %s\n", argv[3], err);
- return 2;
- }
-
- return ! versionsatisfied3(&ver, &ref, argv[2]);
-}
-
-
diff --git a/opkg-compare-versions.sh b/opkg-compare-versions.sh
deleted file mode 100755
index 1f092d7..0000000
--- a/opkg-compare-versions.sh
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/sh
-set -e
-
-# This is a little experiment to see how expensive it would be to
-# compare versions in a shell script. This script is not done yet
-# and the nasiest part is still left undone, (the fact that in Debian
-# versions all letters compare less than all non-letters).
-#
-# It looks to me like version comprehension might be the feature that pushes
-# opkg from /bin/sh to compiled C code...
-
-if [ $# -lt 3 ]; then
- echo "
-usage: opkg-compare-versions v1 op v2
- where op in (<<, <=, =, >=, >>)
-Return value is 0 if v1 op v2 is satisfied, 1 otherwise"
- exit 2
-fi
-
-v1=$1
-op=$2
-v2=$3
-
-# Debian has a little historical problem with operators...
-may_be_equal=0
-case $op in
-'>>')
- op="-gt"
-;;
-'<<')
- op="-lt"
-;;
-'>'|'>=')
- op="-gt"
- may_be_equal=1
-;;
-'<'|'<=')
- op="-lt"
- may_be_equal=1
-;;
-'=')
- may_be_equal=1
-;;
-*)
- echo "opkg_compare_versions: Invalid operator \`$op' valid operators are (<<, <=, =, >=, >>)"
- exit 1
-;;
-esac
-
-if [ $may_be_equal == 1 -a $v1 == $v2 ]; then
- exit 0;
-elif [ $op == '=' ]; then
- exit 1;
-fi
-
-epoch1=`echo $v1 | sed -ne 's/:.*//p'`
-v1=`echo $v1 | sed -e 's/^[^:]*://'`
-epoch2=`echo $v2 | sed -ne 's/:.*//p'`
-v2=`echo $v2 | sed -e 's/^[^:]*://'`
-
-upstream1=`echo $v1 | sed -e '/-/s/\(.*\)-.*/\1/'`
-debian_rev1=`echo $v1 | sed -ne 's/.*-//p'`
-upstream2=`echo $v2 | sed -e '/-/s/\(.*\)-.*/\1/'`
-debian_rev2=`echo $v2 | sed -ne 's/.*-//p'`
-
-echo "$epoch1:$upstream1-$debian_rev1 $op $epoch2:$upstream2-$debian_rev2"
-
-exit 3
-
-[ -z $epoch1 ] && epoch1="0"
-[ -z $epoch2 ] && epoch2="0"
-
-if [ $epoch1 != $epoch2 ]; then
- exit `[ $epoch1 $op $epoch2 ]`
-fi
-
-exit 3