This will allow for better control of what was previously the 'force' option
in a PKGBUILD and transferred into the built package.

Signed-off-by: Dan McGee <[email protected]>
---
 lib/libalpm/alpm.h       |    2 +-
 lib/libalpm/be_files.c   |   16 +++++++++++++---
 lib/libalpm/be_package.c |    2 ++
 lib/libalpm/package.c    |   24 ++++++++++++++----------
 lib/libalpm/package.h    |    2 +-
 5 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 0c01f21..3dea6be 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -235,7 +235,7 @@ 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_has_force(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_files.c b/lib/libalpm/be_files.c
index 0f055e0..7fc6051 100644
--- a/lib/libalpm/be_files.c
+++ b/lib/libalpm/be_files.c
@@ -626,8 +626,17 @@ int _alpm_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, "%FORCE%") == 0) {
-                               info->force = 1;
+                               /* For backward compatibility, treat force as a 
really big epoch
+                                * but only if we didn't already have a known 
epoch value. */
+                               if(!info->epoch) {
+                                       info->epoch = INT_MAX;
+                               }
                        }
                }
                fclose(fp);
@@ -826,8 +835,9 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t 
inforeq)
                        }
                        fprintf(fp, "\n");
                }
-               if(info->force) {
-                       fprintf(fp, "%%FORCE%%\n\n");
+               if(info->epoch) {
+                       fprintf(fp, "%%EPOCH%%\n"
+                                                       "%d\n\n", info->epoch);
                }
                if(local) {
                        if(info->url) {
diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c
index 3d8c4e3..2291a48 100644
--- a/lib/libalpm/be_package.c
+++ b/lib/libalpm/be_package.c
@@ -75,6 +75,8 @@ 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, "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/package.c b/lib/libalpm/package.c
index 717d32c..30ea3a9 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -295,7 +295,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg)
        return pkg->groups;
 }
 
-int SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg)
+int SYMEXPORT alpm_pkg_get_epoch(pmpkg_t *pkg)
 {
        ALPM_LOG_FUNC;
 
@@ -306,7 +306,7 @@ int SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg)
        if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) {
                _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC);
        }
-       return pkg->force;
+       return pkg->epoch;
 }
 
 alpm_list_t SYMEXPORT *alpm_pkg_get_depends(pmpkg_t *pkg)
@@ -649,7 +649,7 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
        newpkg->size = pkg->size;
        newpkg->isize = pkg->isize;
        newpkg->scriptlet = pkg->scriptlet;
-       newpkg->force = pkg->force;
+       newpkg->epoch = pkg->epoch;
        newpkg->reason = pkg->reason;
 
        newpkg->licenses   = alpm_list_strdup(pkg->licenses);
@@ -736,21 +736,25 @@ void _alpm_pkg_free_trans(pmpkg_t *pkg)
        pkg->removes = NULL;
 }
 
-/* Is spkg an upgrade for locapkg? */
+/* Is spkg an upgrade for localpkg? */
 int _alpm_pkg_compare_versions(pmpkg_t *spkg, pmpkg_t *localpkg)
 {
-       int cmp = 0;
+       int spkg_epoch, localpkg_epoch;
 
        ALPM_LOG_FUNC;
 
-       cmp = alpm_pkg_vercmp(alpm_pkg_get_version(spkg),
-                       alpm_pkg_get_version(localpkg));
+       spkg_epoch = alpm_pkg_get_epoch(spkg);
+       localpkg_epoch = alpm_pkg_get_epoch(localpkg);
 
-       if(cmp < 0 && alpm_pkg_has_force(spkg)) {
-               cmp = 1;
+       if(spkg_epoch > localpkg_epoch) {
+               return(1);
+       } else if(spkg_epoch < localpkg_epoch) {
+               return(-1);
        }
 
-       return(cmp);
+       /* equal epoch values, move on to version comparison */
+       return alpm_pkg_vercmp(alpm_pkg_get_version(spkg),
+                       alpm_pkg_get_version(localpkg));
 }
 
 /* Helper function for comparing packages
diff --git a/lib/libalpm/package.h b/lib/libalpm/package.h
index 14f81f9..8273760 100644
--- a/lib/libalpm/package.h
+++ b/lib/libalpm/package.h
@@ -50,7 +50,7 @@ struct __pmpkg_t {
        off_t isize;
        off_t download_size;
        int scriptlet;
-       int force;
+       int epoch;
        pmpkgreason_t reason;
        alpm_list_t *licenses;
        alpm_list_t *replaces;
-- 
1.7.3.1


Reply via email to