summaryrefslogtreecommitdiffstats
path: root/libopkg/pkg.c
diff options
context:
space:
mode:
authorPaul Barker <paul@paulbarker.me.uk>2014-02-10 07:46:23 (EST)
committer Paul Barker <paul@paulbarker.me.uk>2014-02-23 15:37:19 (EST)
commit410aebda158f8342d5111df8c2ef9161d611145c (patch)
tree19079d9a3e54f8ba52eb9fe34bacf68d73a784e0 /libopkg/pkg.c
parentce979d274826551044f63b51b51b847454cf1367 (diff)
pkg: Add per-package force_reinstall flag
This flag allows two package object to share the same version information but be distinguishable from each other. It is never stored on disk or reported to the user but is used when comparing package versions. A new function, pkg_compare_versions_no_reinstall(), is added to compare versions without caring about this force_reinstall flag. Signed-off-by: Paul Barker <paul@paulbarker.me.uk>
Diffstat (limited to 'libopkg/pkg.c')
-rw-r--r--libopkg/pkg.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/libopkg/pkg.c b/libopkg/pkg.c
index 9d48576..bf39b10 100644
--- a/libopkg/pkg.c
+++ b/libopkg/pkg.c
@@ -79,6 +79,7 @@ pkg_init(pkg_t *pkg)
pkg->epoch = 0;
pkg->version = NULL;
pkg->revision = NULL;
+ pkg->force_reinstall = 0;
pkg->dest = NULL;
pkg->src = NULL;
pkg->architecture = NULL;
@@ -170,6 +171,8 @@ pkg_deinit(pkg_t *pkg)
/* revision shares storage with version, so don't free */
pkg->revision = NULL;
+ pkg->force_reinstall = 0;
+
/* owned by opkg_conf_t */
pkg->dest = NULL;
/* owned by opkg_conf_t */
@@ -937,29 +940,34 @@ verrevcmp(const char *val, const char *ref) {
}
int
-pkg_compare_versions(const pkg_t *pkg, const pkg_t *ref_pkg)
+pkg_compare_versions_no_reinstall(const pkg_t *pkg, const pkg_t *ref_pkg)
{
- int r;
+ int r;
- if (pkg->epoch > ref_pkg->epoch) {
- return 1;
- }
+ r = pkg->epoch - ref_pkg->epoch;
+ if (r)
+ return r;
- if (pkg->epoch < ref_pkg->epoch) {
- return -1;
- }
+ r = verrevcmp(pkg->version, ref_pkg->version);
+ if (r)
+ return r;
- r = verrevcmp(pkg->version, ref_pkg->version);
- if (r) {
- return r;
- }
+ r = verrevcmp(pkg->revision, ref_pkg->revision);
+ return r;
+}
- r = verrevcmp(pkg->revision, ref_pkg->revision);
- if (r) {
- return r;
- }
+int
+pkg_compare_versions(const pkg_t *pkg, const pkg_t *ref_pkg)
+{
+ int r;
+
+ r = pkg_compare_versions_no_reinstall(pkg, ref_pkg);
+ if (r)
+ return r;
- return r;
+ /* Compare force_reinstall flags. */
+ r = pkg->force_reinstall - ref_pkg->force_reinstall;
+ return r;
}