summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-01-22 17:03:51 +0100
committerDan McGee <dan@archlinux.org>2011-01-22 17:03:51 +0100
commit51175f31c4aac9df6ceeffc7855a0f842c580fdb (patch)
tree4fe5405a24aa967572f407dafbbee9231a25b0dc
parente277e838d798c1463ae5df98dcf637df70e048ec (diff)
parent859bdb5b1d1b9ccb781c95026836283a005a96ce (diff)
downloadpacman-51175f31c4aac9df6ceeffc7855a0f842c580fdb.tar.gz
pacman-51175f31c4aac9df6ceeffc7855a0f842c580fdb.tar.xz
Merge branch 'epoch-work'
-rwxr-xr-xcontrib/bacman.in6
-rw-r--r--doc/.gitignore1
-rw-r--r--doc/Makefile.am4
-rw-r--r--doc/PKGBUILD.5.txt2
-rw-r--r--doc/footer.txt3
-rw-r--r--doc/index.txt1
-rw-r--r--doc/pacman.8.txt6
-rw-r--r--doc/vercmp.8.txt71
-rw-r--r--lib/libalpm/alpm.h1
-rw-r--r--lib/libalpm/be_local.c16
-rw-r--r--lib/libalpm/be_package.c7
-rw-r--r--lib/libalpm/be_sync.c9
-rw-r--r--lib/libalpm/package.c20
-rw-r--r--lib/libalpm/package.h2
-rw-r--r--lib/libalpm/version.c157
-rw-r--r--scripts/makepkg.sh.in67
-rw-r--r--scripts/repo-add.sh.in8
-rw-r--r--src/util/vercmp.c4
-rwxr-xr-xtest/pacman/pmdb.py14
-rwxr-xr-xtest/pacman/pmpkg.py6
-rwxr-xr-xtest/pacman/pmrule.py3
-rw-r--r--test/pacman/tests/epoch001.py (renamed from test/pacman/tests/sync140.py)5
-rw-r--r--test/pacman/tests/epoch002.py (renamed from test/pacman/tests/sync141.py)3
-rw-r--r--test/pacman/tests/epoch003.py (renamed from test/pacman/tests/sync142.py)8
-rw-r--r--test/pacman/tests/epoch004.py (renamed from test/pacman/tests/sync143.py)8
-rw-r--r--test/pacman/tests/epoch010.py12
-rw-r--r--test/pacman/tests/epoch011.py12
-rw-r--r--test/pacman/tests/epoch012.py13
-rw-r--r--test/pacman/tests/sync136.py5
-rw-r--r--test/pacman/tests/sync137.py3
-rwxr-xr-xtest/util/vercmptest.sh19
31 files changed, 318 insertions, 178 deletions
diff --git a/contrib/bacman.in b/contrib/bacman.in
index b4e3b4ba..bd545180 100755
--- a/contrib/bacman.in
+++ b/contrib/bacman.in
@@ -220,12 +220,6 @@ while read i; do
%REPLACES%)
echo "replaces = $i" >> .PKGINFO
;;
- %EPOCH%)
- echo "epoch = $i" >> .PKGINFO
- ;;
- %FORCE%)
- echo "force = true" >> .PKGINFO
- ;;
# files
%BACKUP%)
diff --git a/doc/.gitignore b/doc/.gitignore
index f047aaa9..a6f4df7f 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -6,6 +6,7 @@ pacman.8
pacman.conf.5
repo-add.8
repo-remove.8
+vercmp.8
*.css
*.html
*.xml
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 37dab13f..00a0e88d 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -7,6 +7,7 @@ ASCIIDOC_MANS = \
pacman.8 \
makepkg.8 \
repo-add.8 \
+ vercmp.8 \
PKGBUILD.5 \
makepkg.conf.5 \
pacman.conf.5 \
@@ -18,6 +19,7 @@ HTML_MANPAGES = \
pacman.8.html \
makepkg.8.html \
repo-add.8.html \
+ vercmp.8.html \
PKGBUILD.5.html \
makepkg.conf.5.html \
pacman.conf.5.html \
@@ -38,6 +40,7 @@ EXTRA_DIST = \
pacman.8.txt \
makepkg.8.txt \
repo-add.8.txt \
+ vercmp.8.txt \
PKGBUILD.5.txt \
PKGBUILD-example.txt \
makepkg.conf.5.txt \
@@ -129,6 +132,7 @@ $(HTML_OTHER): asciidoc.conf
pacman.8 pacman.8.html: pacman.8.txt
makepkg.8 makepkg.8.html: makepkg.8.txt
repo-add.8 repo-add.8.html: repo-add.8.txt
+vercmp.8 vercmp.8.html: vercmp.8.txt
PKGBUILD.5 PKGBUILD.5.html: PKGBUILD.5.txt PKGBUILD-example.txt
makepkg.conf.5 makepkg.conf.5.html: makepkg.conf.5.txt
pacman.conf.5 pacman.conf.5.html: pacman.conf.5.txt
diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt
index e6c4a1fb..c0fa5948 100644
--- a/doc/PKGBUILD.5.txt
+++ b/doc/PKGBUILD.5.txt
@@ -45,7 +45,7 @@ similar to `$_basekernver`.
*pkgver*::
The version of the software as released from the author (e.g. '2.7.1').
- The variable is not allowed to contain hyphens.
+ The variable is not allowed to contain colons or hyphens.
*pkgrel*::
This is the release number specific to the Arch Linux release. This
diff --git a/doc/footer.txt b/doc/footer.txt
index 8290f3c4..2ffb0092 100644
--- a/doc/footer.txt
+++ b/doc/footer.txt
@@ -18,13 +18,14 @@ Authors
Current maintainers:
+* Allan McRae <allan@archlinux.org>
* Dan McGee <dan@archlinux.org>
* Xavier Chantry <shiningxc@gmail.com>
-* Aaron Griffin <aaron@archlinux.org>
Past contributors:
* Judd Vinet <jvinet@zeroflux.org>
* Aurelien Foret <aurelien@archlinux.org>
+* Aaron Griffin <aaron@archlinux.org>
See the 'AUTHORS' file for additional contributors.
diff --git a/doc/index.txt b/doc/index.txt
index ef328415..afb2719d 100644
--- a/doc/index.txt
+++ b/doc/index.txt
@@ -43,6 +43,7 @@ configuration files dealing with pacman.
* linkman:pacman[8]
* linkman:pacman.conf[5]
* linkman:repo-add[8]
+* linkman:vercmp[8]
Changelog
~~~~~~~~~
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 2b47a88c..8f91e408 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -80,8 +80,10 @@ to determine which packages need upgrading. This behavior operates as follows:
Numeric:
1 < 1.0 < 1.1 < 1.1.1 < 1.2 < 2.0 < 3.0.0
+
-Additionally, packages can have an 'epoch' value defined that will override any
-version comparison and force an upgrade.
+Additionally, version strings can have an 'epoch' value defined that will
+overrule any version comparison (unless the epoch values are equal). This is
+specified in an `epoch:version-rel` format. For example, `2:1.0-1` is always
+greater than `1:3.6-1`.
*-T, \--deptest*::
Check dependencies; this is useful in scripts such as makepkg to check
diff --git a/doc/vercmp.8.txt b/doc/vercmp.8.txt
new file mode 100644
index 00000000..f2fc5305
--- /dev/null
+++ b/doc/vercmp.8.txt
@@ -0,0 +1,71 @@
+/////
+vim:set ts=4 sw=4 syntax=asciidoc noet:
+/////
+vercmp(8)
+=========
+
+Name
+----
+vercmp - version comparsion utility
+
+
+Synopsis
+--------
+'vercmp' <version1> <version2>
+
+
+Description
+-----------
+'vercmp' is used to determine the relationship between two given version
+numbers. It outputs values as follows:
+
+* < 0 : if ver1 < ver2
+* = 0 : if ver1 == ver2
+* > 0 : if ver1 > ver2
+
+Version comparsion operates as follows:
+
+ Alphanumeric:
+ 1.0a < 1.0alpha < 1.0b < 1.0beta < 1.0p < 1.0pre < 1.0rc < 1.0
+ Numeric:
+ 1 < 1.0 < 1.1 < 1.1.1 < 1.2 < 2.0 < 3.0.0
+
+Additionally, version strings can have an 'epoch' value defined that will
+overrule any version comparison (unless the epoch values are equal). This is
+specified in an `epoch:version-rel` format. For example, `2:1.0-1` is always
+greater than `1:3.6-1`.
+
+
+Options
+-------
+*-h, \--help*::
+ Display syntax for the given operation. If no operation was supplied
+ then the general syntax is shown.
+
+Examples
+--------
+
+ $ vercmp 1 2
+ -1
+
+ $ vercmp 2 1
+ 1
+
+ $ vercmp 2.0-1 1.7-6
+ 1
+
+ $ vercmp 2.0 2.0-13
+ 0
+
+ $ vercmp 4.34 1:001
+ -1
+
+Configuration
+-------------
+There is none.
+
+See Also
+--------
+linkman:pacman[8], linkman:makepkg[8], linkman:libalpm[3]
+
+include::footer.txt[]
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 7c4cd48b..a540bc4f 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -238,7 +238,6 @@ size_t alpm_pkg_changelog_read(void *ptr, size_t size,
/*int alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp);*/
int alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp);
int alpm_pkg_has_scriptlet(pmpkg_t *pkg);
-int alpm_pkg_get_epoch(pmpkg_t *pkg);
off_t alpm_pkg_download_size(pmpkg_t *newpkg);
alpm_list_t *alpm_pkg_unused_deltas(pmpkg_t *pkg);
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index 5471fee4..ea59ceca 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -156,12 +156,6 @@ static alpm_list_t *_cache_get_groups(pmpkg_t *pkg)
return pkg->groups;
}
-static int _cache_get_epoch(pmpkg_t *pkg)
-{
- LAZY_LOAD(INFRQ_DESC, -1);
- return pkg->epoch;
-}
-
static int _cache_has_scriptlet(pmpkg_t *pkg)
{
ALPM_LOG_FUNC;
@@ -318,7 +312,6 @@ static struct pkg_operations local_pkg_ops = {
.get_size = _cache_get_size,
.get_isize = _cache_get_isize,
.get_reason = _cache_get_reason,
- .get_epoch = _cache_get_epoch,
.has_scriptlet = _cache_has_scriptlet,
.get_licenses = _cache_get_licenses,
.get_groups = _cache_get_groups,
@@ -606,11 +599,6 @@ int _alpm_local_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
STRDUP(linedup, _alpm_strtrim(line), goto error);
info->replaces = alpm_list_add(info->replaces, linedup);
}
- } else if(strcmp(line, "%EPOCH%") == 0) {
- if(fgets(line, sizeof(line), fp) == NULL) {
- goto error;
- }
- info->epoch = atoi(_alpm_strtrim(line));
} else if(strcmp(line, "%DEPENDS%") == 0) {
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line));
@@ -767,10 +755,6 @@ int _alpm_local_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
}
fprintf(fp, "\n");
}
- if(info->epoch) {
- fprintf(fp, "%%EPOCH%%\n"
- "%d\n\n", info->epoch);
- }
if(info->url) {
fprintf(fp, "%%URL%%\n"
"%s\n\n", info->url);
diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c
index b69161b4..c272bd47 100644
--- a/lib/libalpm/be_package.c
+++ b/lib/libalpm/be_package.c
@@ -184,13 +184,6 @@ static int parse_descfile(struct archive *a, pmpkg_t *newpkg)
STRDUP(newpkg->version, ptr, RET_ERR(PM_ERR_MEMORY, -1));
} else if(strcmp(key, "pkgdesc") == 0) {
STRDUP(newpkg->desc, ptr, RET_ERR(PM_ERR_MEMORY, -1));
- } else if(strcmp(key, "force") == 0) {
- /* For backward compatibility, like in sync_db_read */
- if(!newpkg->epoch) {
- newpkg->epoch = 1;
- }
- } else if(strcmp(key, "epoch") == 0) {
- newpkg->epoch = atoi(ptr);
} else if(strcmp(key, "group") == 0) {
newpkg->groups = alpm_list_add(newpkg->groups, strdup(ptr));
} else if(strcmp(key, "url") == 0) {
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 1e4b2fde..4676e8a6 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -340,15 +340,6 @@ static int sync_db_read(pmdb_t *db, struct archive *archive,
READ_AND_STORE(pkg->md5sum);
} else if(strcmp(line, "%REPLACES%") == 0) {
READ_AND_STORE_ALL(pkg->replaces);
- } else if(strcmp(line, "%EPOCH%") == 0) {
- READ_NEXT(line);
- pkg->epoch = atoi(line);
- } else if(strcmp(line, "%FORCE%") == 0) {
- /* For backward compatibility, treat force as a non-zero epoch
- * but only if we didn't already have a known epoch value. */
- if(!pkg->epoch) {
- pkg->epoch = 1;
- }
} else if(strcmp(line, "%DEPENDS%") == 0) {
/* Different than the rest because of the _alpm_splitdep call. */
while(1) {
diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index 241c41c0..d4b3b9c0 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -110,7 +110,6 @@ static const char *_pkg_get_arch(pmpkg_t *pkg) { return pkg->arch; }
static off_t _pkg_get_size(pmpkg_t *pkg) { return pkg->size; }
static off_t _pkg_get_isize(pmpkg_t *pkg) { return pkg->isize; }
static pmpkgreason_t _pkg_get_reason(pmpkg_t *pkg) { return pkg->reason; }
-static int _pkg_get_epoch(pmpkg_t *pkg) { return pkg->epoch; }
static int _pkg_has_scriptlet(pmpkg_t *pkg) { return pkg->scriptlet; }
static alpm_list_t *_pkg_get_licenses(pmpkg_t *pkg) { return pkg->licenses; }
@@ -141,7 +140,6 @@ struct pkg_operations default_pkg_ops = {
.get_size = _pkg_get_size,
.get_isize = _pkg_get_isize,
.get_reason = _pkg_get_reason,
- .get_epoch = _pkg_get_epoch,
.has_scriptlet = _pkg_has_scriptlet,
.get_licenses = _pkg_get_licenses,
.get_groups = _pkg_get_groups,
@@ -223,11 +221,6 @@ pmpkgreason_t SYMEXPORT alpm_pkg_get_reason(pmpkg_t *pkg)
return pkg->ops->get_reason(pkg);
}
-int SYMEXPORT alpm_pkg_get_epoch(pmpkg_t *pkg)
-{
- return pkg->ops->get_epoch(pkg);
-}
-
alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(pmpkg_t *pkg)
{
return pkg->ops->get_licenses(pkg);
@@ -427,7 +420,6 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
newpkg->size = pkg->size;
newpkg->isize = pkg->isize;
newpkg->scriptlet = pkg->scriptlet;
- newpkg->epoch = pkg->epoch;
newpkg->reason = pkg->reason;
newpkg->licenses = alpm_list_strdup(pkg->licenses);
@@ -518,20 +510,8 @@ void _alpm_pkg_free_trans(pmpkg_t *pkg)
/* Is spkg an upgrade for localpkg? */
int _alpm_pkg_compare_versions(pmpkg_t *spkg, pmpkg_t *localpkg)
{
- int spkg_epoch, localpkg_epoch;
-
ALPM_LOG_FUNC;
- spkg_epoch = alpm_pkg_get_epoch(spkg);
- localpkg_epoch = alpm_pkg_get_epoch(localpkg);
-
- if(spkg_epoch > localpkg_epoch) {
- return(1);
- } else if(spkg_epoch < localpkg_epoch) {
- return(-1);
- }
-
- /* equal epoch values, move on to version comparison */
return alpm_pkg_vercmp(alpm_pkg_get_version(spkg),
alpm_pkg_get_version(localpkg));
}
diff --git a/lib/libalpm/package.h b/lib/libalpm/package.h
index 52582d9b..b161d5f1 100644
--- a/lib/libalpm/package.h
+++ b/lib/libalpm/package.h
@@ -57,7 +57,6 @@ struct pkg_operations {
off_t (*get_size) (pmpkg_t *);
off_t (*get_isize) (pmpkg_t *);
pmpkgreason_t (*get_reason) (pmpkg_t *);
- int (*get_epoch) (pmpkg_t *);
int (*has_scriptlet) (pmpkg_t *);
alpm_list_t *(*get_licenses) (pmpkg_t *);
@@ -107,7 +106,6 @@ struct __pmpkg_t {
off_t download_size;
int scriptlet;
- int epoch;
pmpkgreason_t reason;
pmpkgfrom_t origin;
diff --git a/lib/libalpm/version.c b/lib/libalpm/version.c
index 85cc2f57..eba66210 100644
--- a/lib/libalpm/version.c
+++ b/lib/libalpm/version.c
@@ -23,23 +23,66 @@
/* libalpm */
#include "util.h"
-/** 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.
+/**
+ * Some functions in this file have been adopted from the rpm source, notably
+ * 'rpmvercmp' located at lib/rpmvercmp.c and 'parseEVR' located at
+ * lib/rpmds.c. It was most recently updated against rpm version 4.8.1. Small
+ * modifications have been made to make it more consistent with the libalpm
+ * coding style.
*/
-int SYMEXPORT alpm_pkg_vercmp(const char *a, const char *b)
+
+/**
+ * Split EVR into epoch, version, and release components.
+ * @param evr [epoch:]version[-release] string
+ * @retval *ep pointer to epoch
+ * @retval *vp pointer to version
+ * @retval *rp pointer to release
+ */
+static void parseEVR(char *evr, const char **ep, const char **vp,
+ const char **rp)
+{
+ const char *epoch;
+ const char *version;
+ const char *release;
+ char *s, *se;
+
+ s = evr;
+ /* s points to epoch terminator */
+ while (*s && isdigit(*s)) s++;
+ /* se points to version terminator */
+ se = strrchr(s, '-');
+
+ if(*s == ':') {
+ epoch = evr;
+ *s++ = '\0';
+ version = s;
+ if(*epoch == '\0') {
+ epoch = "0";
+ }
+ } else {
+ /* different from RPM- always assume 0 epoch */
+ epoch = "0";
+ version = evr;
+ }
+ if(se) {
+ *se++ = '\0';
+ release = se;
+ } else {
+ release = NULL;
+ }
+
+ if(ep) *ep = epoch;
+ if(vp) *vp = version;
+ if(rp) *rp = release;
+}
+
+/**
+ * Compare alpha and numeric segments of two versions.
+ * return 1: a is newer than b
+ * 0: a and b are the same version
+ * -1: b is newer than a
+ */
+static int rpmvercmp(const char *a, const char *b)
{
char oldch1, oldch2;
char *str1, *str2;
@@ -49,13 +92,6 @@ int SYMEXPORT alpm_pkg_vercmp(const char *a, const char *b)
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);
@@ -147,22 +183,6 @@ int SYMEXPORT alpm_pkg_vercmp(const char *a, const char *b)
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 */
@@ -179,7 +199,7 @@ int SYMEXPORT alpm_pkg_vercmp(const char *a, const char *b)
* - if one is an alpha, two is newer.
* - otherwise one is newer.
* */
- if ( ( !*one && !isalpha((int)*two) )
+ if ( (!*one && !isalpha((int)*two))
|| isalpha((int)*one) ) {
ret = -1;
} else {
@@ -192,4 +212,61 @@ cleanup:
return(ret);
}
+/** 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.
+ *
+ * Different epoch values for version strings will override any further
+ * comparison. If no epoch is provided, 0 is assumed.
+ *
+ * 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.
+ */
+int SYMEXPORT alpm_pkg_vercmp(const char *a, const char *b)
+{
+ char *full1, *full2;
+ const char *epoch1, *ver1, *rel1;
+ const char *epoch2, *ver2, *rel2;
+ int ret;
+
+ /* ensure our strings are not null */
+ if(!a && !b) {
+ return(0);
+ } else if(!a) {
+ return(-1);
+ } else if(!b) {
+ return(1);
+ }
+ /* another quick shortcut- if full version specs are equal */
+ if(strcmp(a, b) == 0) {
+ return(0);
+ }
+
+ /* Parse both versions into [epoch:]version[-release] triplets. We probably
+ * don't need epoch and release to support all the same magic, but it is
+ * easier to just run it all through the same code. */
+ full1 = strdup(a);
+ full2 = strdup(b);
+
+ /* parseEVR modifies passed in version, so have to dupe it first */
+ parseEVR(full1, &epoch1, &ver1, &rel1);
+ parseEVR(full2, &epoch2, &ver2, &rel2);
+
+ ret = rpmvercmp(epoch1, epoch2);
+ if(ret == 0) {
+ ret = rpmvercmp(ver1, ver2);
+ if(ret == 0 && rel1 && rel2) {
+ ret = rpmvercmp(rel1, rel2);
+ }
+ }
+
+ free(full1);
+ free(full2);
+ return(ret);
+}
+
/* vim: set ts=2 sw=2 noet: */
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index a2d9c837..b1b1b75a 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -142,18 +142,20 @@ clean_up() {
msg "$(gettext "Cleaning up...")"
rm -rf "$pkgdir" "$srcdir"
if [[ -n $pkgbase ]]; then
+ # TODO: this wasn't properly fixed in commit 2020e629
+ local fullver=$(get_full_version $epoch $pkgver $pkgrel)
# Can't do this unless the BUILDSCRIPT has been sourced.
if (( BUILDFUNC )); then
- rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
+ rm -f "${pkgbase}-${fullver}-${CARCH}-build.log"*
fi
if (( CHECKFUNC )); then
- rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-check.log"*
+ rm -f "${pkgbase}-${fullver}-${CARCH}-check.log"*
fi
if (( PKGFUNC )); then
- rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
+ rm -f "${pkgbase}-${fullver}-${CARCH}-package.log"*
elif (( SPLITPKG )); then
for pkg in ${pkgname[@]}; do
- rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package_${pkg}.log"*
+ rm -f "${pkgbase}-${fullver}-${CARCH}-package_${pkg}.log"*
done
fi
@@ -225,6 +227,19 @@ get_url() {
}
##
+# usage : get_full_version( $epoch, $pkgver, $pkgrel )
+# return : full version spec, including epoch (if necessary), pkgver, pkgrel
+##
+get_full_version() {
+ if [[ $1 -eq 0 ]]; then
+ # zero epoch case, don't include it in version
+ echo $2-$3
+ else
+ echo $1:$2-$3
+ fi
+}
+
+##
# Checks to see if options are present in makepkg.conf or PKGBUILD;
# PKGBUILD options always take precedence.
#
@@ -762,7 +777,8 @@ run_function() {
local ret=0
local restoretrap
if (( LOGGING )); then
- local BUILDLOG="${startdir}/${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-$pkgfunc.log"
+ local fullver=$(get_full_version $epoch $pkgver $pkgrel)
+ local BUILDLOG="${startdir}/${pkgbase}-${fullver}-${CARCH}-$pkgfunc.log"
if [[ -f $BUILDLOG ]]; then
local i=1
while true; do
@@ -935,9 +951,8 @@ write_pkginfo() {
echo "# $(LC_ALL=C date -u)"
echo "pkgname = $1"
(( SPLITPKG )) && echo pkgbase = $pkgbase
- echo "pkgver = $pkgver-$pkgrel"
+ echo "pkgver = $(get_full_version $epoch $pkgver $pkgrel)"
echo "pkgdesc = $pkgdesc"
- [[ $epoch ]] && echo "epoch = $epoch"
echo "url = $url"
echo "builddate = $builddate"
echo "packager = $packager"
@@ -1049,7 +1064,8 @@ create_package() {
"$PKGEXT" ; EXT=$PKGEXT ;;
esac
- local pkg_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${PKGARCH}${PKGEXT}"
+ local fullver=$(get_full_version $epoch $pkgver $pkgrel)
+ local pkg_file="$PKGDEST/${nameofpkg}-${fullver}-${PKGARCH}${PKGEXT}"
local ret=0
# when fileglobbing, we want * in an empty directory to expand to
@@ -1144,7 +1160,8 @@ create_srcpackage() {
"$SRCEXT" ;;
esac
- local pkg_file="$SRCPKGDEST/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}"
+ local fullver=$(get_full_version $epoch $pkgver $pkgrel)
+ local pkg_file="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
# tar it up
msg2 "$(gettext "Compressing source package...")"
@@ -1176,12 +1193,14 @@ install_package() {
msg "$(gettext "Installing %s package group with %s -U...")" "$pkgbase" "$PACMAN"
fi
- local pkg pkglist
+ local fullver pkg pkglist
for pkg in ${pkgname[@]}; do
- if [[ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} ]]; then
- pkglist+=" $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
+ # TODO: this wasn't properly fixed in commit 2020e629
+ fullver=$(get_full_version $epoch $pkgver $pkgrel)
+ if [[ -f $PKGDEST/${pkg}-${fullver}-${CARCH}${PKGEXT} ]]; then
+ pkglist+=" $PKGDEST/${pkg}-${fullver}-${CARCH}${PKGEXT}"
else
- pkglist+=" $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}"
+ pkglist+=" $PKGDEST/${pkg}-${fullver}-any${PKGEXT}"
fi
done
@@ -1803,7 +1822,7 @@ if (( ! ( ASROOT || INFAKEROOT ) && ( DEP_BIN || RMDEPS || INSTALL ) )); then
fi
fi
-unset pkgname pkgbase pkgver pkgrel pkgdesc url license groups provides
+unset pkgname pkgbase pkgver pkgrel epoch pkgdesc url license groups provides
unset md5sums replaces depends conflicts backup source install changelog build
unset makedepends optdepends options noextract
@@ -1840,6 +1859,7 @@ if (( GENINTEG )); then
fi
pkgbase=${pkgbase:-${pkgname[0]}}
+epoch=${epoch:-0}
# check the PKGBUILD for some basic requirements
check_sanity || exit 1
@@ -1877,8 +1897,9 @@ if [[ -n "${PKGLIST[@]}" ]]; then
fi
if (( ! SPLITPKG )); then
- if [[ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} \
- || -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-any${PKGEXT} ]] \
+ fullver=$(get_full_version $epoch $pkgver $pkgrel)
+ if [[ -f $PKGDEST/${pkgname}-${fullver}-${CARCH}${PKGEXT} \
+ || -f $PKGDEST/${pkgname}-${fullver}-any${PKGEXT} ]] \
&& ! (( FORCE || SOURCEONLY || NOBUILD )); then
if (( INSTALL )); then
warning "$(gettext "A package has already been built, installing existing package...")"
@@ -1893,8 +1914,10 @@ else
allpkgbuilt=1
somepkgbuilt=0
for pkg in ${pkgname[@]}; do
- if [[ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} \
- || -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT} ]]; then
+ # TODO: this wasn't properly fixed in commit 2020e629
+ fullver=$(get_full_version $epoch $pkgver $pkgrel)
+ if [[ -f $PKGDEST/${pkg}-${fullver}-${CARCH}${PKGEXT} \
+ || -f $PKGDEST/${pkg}-${fullver}-any${PKGEXT} ]]; then
somepkgbuilt=1
else
allpkgbuilt=0
@@ -1946,11 +1969,12 @@ if (( INFAKEROOT )); then
exit 0 # $E_OK
fi
-msg "$(gettext "Making package: %s")" "$pkgbase $pkgver-$pkgrel ($(date))"
+fullver=$(get_full_version $epoch $pkgver $pkgrel)
+msg "$(gettext "Making package: %s")" "$pkgbase $fullver ($(date))"
# if we are creating a source-only package, go no further
if (( SOURCEONLY )); then
- if [[ -f $SRCPKGDEST/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT} ]] \
+ if [[ -f $SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT} ]] \
&& (( ! FORCE )); then
error "$(gettext "A source package has already been built. (use -f to overwrite)")"
exit 1
@@ -2082,7 +2106,8 @@ else
fi
fi
-msg "$(gettext "Finished making: %s")" "$pkgbase $pkgver-$pkgrel ($(date))"
+fullver=$(get_full_version $epoch $pkgver $pkgrel)
+msg "$(gettext "Finished making: %s")" "$pkgbase $fullver ($(date))"
install_package
diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
index c3db7d9f..9b79022a 100644
--- a/scripts/repo-add.sh.in
+++ b/scripts/repo-add.sh.in
@@ -190,7 +190,7 @@ db_write_entry()
{
# blank out all variables
local pkgfile="$1"
- local pkgname pkgver pkgdesc epoch csize size md5sum url arch builddate packager force \
+ local pkgname pkgver pkgdesc csize size md5sum url arch builddate packager \
_groups _licenses _replaces _depends _conflicts _provides _optdepends
local OLDIFS="$IFS"
@@ -274,12 +274,6 @@ db_write_entry()
[[ -n $builddate ]] && echo -e "%BUILDDATE%\n$builddate\n" >>desc
[[ -n $packager ]] && echo -e "%PACKAGER%\n$packager\n" >>desc
write_list_entry "REPLACES" "$_replaces" "desc"
- # remain backward-compatible for now; put a force entry in the database
- if [[ -n $epoch ]]; then
- echo -e "%EPOCH%\n#epoch\n" >>desc
- echo -e "%FORCE%\n" >>desc
- fi
- [[ -n $force ]] && echo -e "%FORCE%\n" >>desc
# create depends entry
msg2 "$(gettext "Creating 'depends' db entry...")"
diff --git a/src/util/vercmp.c b/src/util/vercmp.c
index a1da23cd..adb5a42a 100644
--- a/src/util/vercmp.c
+++ b/src/util/vercmp.c
@@ -24,8 +24,8 @@
#define BASENAME "vercmp"
-/* forward declaration, comes from vercmp.o in libalpm source that is linked in
- * directly so we don't have any library deps */
+/* forward declaration, comes from version.o in libalpm source that is linked
+ * in directly so we don't have any library deps */
int alpm_pkg_vercmp(const char *a, const char *b);
static void usage(void)
diff --git a/test/pacman/pmdb.py b/test/pacman/pmdb.py
index b4d0e2d5..6329f23d 100755
--- a/test/pacman/pmdb.py
+++ b/test/pacman/pmdb.py
@@ -156,11 +156,6 @@ class pmdb:
pkg.md5sum = fd.readline().strip("\n")
elif line == "%REPLACES%":
pkg.replaces = _getsection(fd)
- elif line == "%EPOCH%":
- pkg.epoch = int(fd.readline().strip("\n"))
- elif line == "%FORCE%":
- fd.readline()
- pkg.force = True
elif line == "%DEPENDS%":
pkg.depends = _getsection(fd)
elif line == "%OPTDEPENDS%":
@@ -250,19 +245,10 @@ class pmdb:
data.append(_mksection("SIZE", pkg.size))
if pkg.reason:
data.append(_mksection("REASON", pkg.reason))
- if pkg.epoch:
- data.append(_mksection("EPOCH", pkg.epoch))
else:
data.append(_mksection("FILENAME", pkg.filename()))
if pkg.replaces:
data.append(_mksection("REPLACES", pkg.replaces))
- if pkg.epoch:
- data.append(_mksection("EPOCH", pkg.epoch))
- # for backward compatibility
- if not pkg.force:
- data.append(_mksection("FORCE", ""))
- if pkg.force:
- data.append(_mksection("FORCE", ""))
if pkg.csize:
data.append(_mksection("CSIZE", pkg.csize))
if pkg.md5sum:
diff --git a/test/pacman/pmpkg.py b/test/pacman/pmpkg.py
index 3aabea49..988f4c28 100755
--- a/test/pacman/pmpkg.py
+++ b/test/pacman/pmpkg.py
@@ -49,8 +49,6 @@ class pmpkg:
self.reason = 0
self.md5sum = "" # sync only
self.replaces = []
- self.force = False
- self.epoch = 0
self.depends = []
self.optdepends = []
self.conflicts = []
@@ -132,10 +130,6 @@ class pmpkg:
data.append("builddate = %s" % self.builddate)
data.append("packager = %s" % self.packager)
data.append("size = %s" % self.size)
- if self.force:
- data.append("force = true")
- if self.epoch:
- data.append("epoch = %d" % self.epoch)
if self.arch:
data.append("arch = %s" % self.arch)
for i in self.license:
diff --git a/test/pacman/pmrule.py b/test/pacman/pmrule.py
index bea8e4a4..89ae3f49 100755
--- a/test/pacman/pmrule.py
+++ b/test/pacman/pmrule.py
@@ -78,9 +78,6 @@ class pmrule:
elif case == "VERSION":
if value != newpkg.version:
success = 0
- elif case == "EPOCH":
- if int(value) != newpkg.epoch:
- success = 0
elif case == "DESC":
if value != newpkg.desc:
success = 0
diff --git a/test/pacman/tests/sync140.py b/test/pacman/tests/epoch001.py
index b7ec9fcf..ac6c41a6 100644
--- a/test/pacman/tests/sync140.py
+++ b/test/pacman/tests/epoch001.py
@@ -1,7 +1,6 @@
self.description = "Sysupgrade with a sync package having higher epoch"
-sp = pmpkg("dummy", "1.0-1")
-sp.epoch = 1
+sp = pmpkg("dummy", "1:1.0-1")
self.addpkg2db("sync", sp)
lp = pmpkg("dummy", "1.1-1")
@@ -10,4 +9,4 @@ self.addpkg2db("local", lp)
self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
-self.addrule("PKG_VERSION=dummy|1.0-1")
+self.addrule("PKG_VERSION=dummy|1:1.0-1")
diff --git a/test/pacman/tests/sync141.py b/test/pacman/tests/epoch002.py
index dac81f76..8ca4afc6 100644
--- a/test/pacman/tests/sync141.py
+++ b/test/pacman/tests/epoch002.py
@@ -3,8 +3,7 @@ self.description = "Sysupgrade with an epoch and ignore on same package"
lp = pmpkg("dummy", "1.0-1")
self.addpkg2db("local", lp)
-sp = pmpkg("dummy", "1.0-2")
-sp.epoch = 1
+sp = pmpkg("dummy", "1:1.0-2")
self.addpkg2db("sync", sp)
self.args = "-Su --ignore %s" % lp.name
diff --git a/test/pacman/tests/sync142.py b/test/pacman/tests/epoch003.py
index 726ef304..ac395e30 100644
--- a/test/pacman/tests/sync142.py
+++ b/test/pacman/tests/epoch003.py
@@ -1,14 +1,12 @@
self.description = "Sysupgrade with an epoch package overriding a force package"
-sp = pmpkg("dummy", "1.4-1")
-sp.epoch = 2
+sp = pmpkg("dummy", "2:1.4-1")
self.addpkg2db("sync", sp)
-lp = pmpkg("dummy", "2.0-1")
-lp.force = True
+lp = pmpkg("dummy", "1:2.0-1")
self.addpkg2db("local", lp)
self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
-self.addrule("PKG_VERSION=dummy|1.4-1")
+self.addrule("PKG_VERSION=dummy|2:1.4-1")
diff --git a/test/pacman/tests/sync143.py b/test/pacman/tests/epoch004.py
index 2ee940a9..74b00c2b 100644
--- a/test/pacman/tests/sync143.py
+++ b/test/pacman/tests/epoch004.py
@@ -1,18 +1,16 @@
self.description = "Sysupgrade with same version, different epochs"
-sp = pmpkg("dummy", "2.0-1")
+sp = pmpkg("dummy", "2:2.0-1")
sp.files = ["bin/dummynew"]
-sp.epoch = 2
self.addpkg2db("sync", sp)
-lp = pmpkg("dummy", "2.0-1")
+lp = pmpkg("dummy", "1:2.0-1")
lp.files = ["bin/dummyold"]
-lp.force = True
self.addpkg2db("local", lp)
self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
-self.addrule("PKG_VERSION=dummy|2.0-1")
+self.addrule("PKG_VERSION=dummy|2:2.0-1")
self.addrule("FILE_EXIST=bin/dummynew")
self.addrule("!FILE_EXIST=bin/dummyold")
diff --git a/test/pacman/tests/epoch010.py b/test/pacman/tests/epoch010.py
new file mode 100644
index 00000000..03bba273
--- /dev/null
+++ b/test/pacman/tests/epoch010.py
@@ -0,0 +1,12 @@
+self.description = "usbutils case study: force in new package"
+
+sp = pmpkg("usbutils", "1:001-1")
+self.addpkg2db("sync", sp)
+
+lp = pmpkg("usbutils", "0.91-4")
+self.addpkg2db("local", lp)
+
+self.args = "-Su"
+
+self.addrule("PACMAN_RETCODE=0")
+self.addrule("PKG_VERSION=usbutils|1:001-1")
diff --git a/test/pacman/tests/epoch011.py b/test/pacman/tests/epoch011.py
new file mode 100644
index 00000000..bc5ee619
--- /dev/null
+++ b/test/pacman/tests/epoch011.py
@@ -0,0 +1,12 @@
+self.description = "usbutils case study: force stays, epoch now in local db"
+
+sp = pmpkg("usbutils", "1:002-1")
+self.addpkg2db("sync", sp)
+
+lp = pmpkg("usbutils", "1:001-1")
+self.addpkg2db("local", lp)
+
+self.args = "-Su"
+
+self.addrule("PACMAN_RETCODE=0")
+self.addrule("PKG_VERSION=usbutils|1:002-1")
diff --git a/test/pacman/tests/epoch012.py b/test/pacman/tests/epoch012.py
new file mode 100644
index 00000000..2a7a7ac2
--- /dev/null
+++ b/test/pacman/tests/epoch012.py
@@ -0,0 +1,13 @@
+self.description = "usbutils case study: maintainer screws up and removes force"
+
+sp = pmpkg("usbutils", "003-1")
+self.addpkg2db("sync", sp)
+
+lp = pmpkg("usbutils", "1:002-1")
+self.addpkg2db("local", lp)
+
+self.args = "-Su"
+
+self.addrule("PACMAN_RETCODE=0")
+# remember, this is how we have to handle this- 003 will not be installed
+self.addrule("PKG_VERSION=usbutils|1:002-1")
diff --git a/test/pacman/tests/sync136.py b/test/pacman/tests/sync136.py
index b3a6baf4..b31aae2c 100644
--- a/test/pacman/tests/sync136.py
+++ b/test/pacman/tests/sync136.py
@@ -1,7 +1,6 @@
self.description = "Sysupgrade with a sync package forcing a downgrade"
-sp = pmpkg("dummy", "1.0-1")
-sp.force = True
+sp = pmpkg("dummy", "1:1.0-1")
self.addpkg2db("sync", sp)
@@ -12,4 +11,4 @@ self.addpkg2db("local", lp)
self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
-self.addrule("PKG_VERSION=dummy|1.0-1")
+self.addrule("PKG_VERSION=dummy|1:1.0-1")
diff --git a/test/pacman/tests/sync137.py b/test/pacman/tests/sync137.py
index 000855c5..d76ac49d 100644
--- a/test/pacman/tests/sync137.py
+++ b/test/pacman/tests/sync137.py
@@ -4,8 +4,7 @@ lp = pmpkg("dummy", "1.0-1")
self.addpkg2db("local", lp)
-sp = pmpkg("dummy", "1.0-2")
-sp.force = True
+sp = pmpkg("dummy", "1:1.0-2")
self.addpkg2db("sync", sp)
self.args = "-Su --ignore %s" % lp.name
diff --git a/test/util/vercmptest.sh b/test/util/vercmptest.sh
index fca06578..a9ed3b2a 100755
--- a/test/util/vercmptest.sh
+++ b/test/util/vercmptest.sh
@@ -118,6 +118,25 @@ runtest 1.5.1 1.5.b 1
runtest 1.5.b-1 1.5.b 0
runtest 1.5-1 1.5.b -1
+# epoch included version comparisons
+runtest 0:1.0 0:1.0 0
+runtest 0:1.0 0:1.1 -1
+runtest 1:1.0 0:1.0 1
+runtest 1:1.0 0:1.1 1
+runtest 1:1.0 2:1.1 -1
+
+# epoch + sometimes present pkgrel
+runtest 1:1.0 0:1.0-1 1
+runtest 1:1.0-1 0:1.1-1 1
+
+# epoch included on one version
+runtest 0:1.0 1.0 0
+runtest 0:1.0 1.1 -1
+runtest 0:1.1 1.0 1
+runtest 1:1.0 1.0 1
+runtest 1:1.0 1.1 1
+runtest 1:1.1 1.1 1
+
#END TESTS
echo