Files
main/programming/library/appstream-glib/files/0002-pisi-Enable-comparison-by-release-field-highest-win.patch
T
2021-07-10 15:24:28 +03:00

129 lines
3.3 KiB
Diff

From 7c3980b2dc488e789b9df8d2fe376bf3c8cd2df7 Mon Sep 17 00:00:00 2001
From: Ikey Doherty <ikey@solus-project.com>
Date: Sun, 26 Jul 2015 17:01:01 +0100
Subject: [PATCH 2/2] pisi: Enable comparison by release field (highest wins)
As of 25 Jun 2021, this patch adapted for appstream-glib 0.7.18 and .pisi format by:
Berk Çakar <berkcakar@pisilinux.org>
Signed-off-by: Ikey Doherty <ikey@solus-project.com>
---
libappstream-builder/asb-package-pisi.c | 54 ++++++++++++++++++++++++++++++--
1 file changed, 51 insertions(+), 3 deletions(-)
diff --git a/libappstream-builder/asb-package-pisi.c b/libappstream-builder/asb-package-pisi.c
index cf6572c..4a5bfa6 100644
--- a/libappstream-builder/asb-package-pisi.c
+++ b/libappstream-builder/asb-package-pisi.c
@@ -38,8 +38,6 @@
#include <errno.h>
#include <string.h>
-G_DEFINE_TYPE (AsbPackagePisi, asb_package_pisi, ASB_TYPE_PACKAGE)
-
/**
* Storage for pisi metadata
*/
@@ -87,6 +85,17 @@ typedef struct pisi_t {
} pisi_t;
+
+typedef struct _AsbPackagePisiPrivate AsbPackagePisiPrivate;
+struct _AsbPackagePisiPrivate
+{
+ pisi_t *package;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (AsbPackagePisi, asb_package_pisi, ASB_TYPE_PACKAGE)
+
+#define GET_PRIVATE(o) (asb_package_pisi_get_instance_private (o))
+
/**
* Process metadata.xml node
*/
@@ -438,6 +447,19 @@ asb_package_pisi_init (AsbPackagePisi *pkg)
{
}
+/**
+ * asb_package_pisi_finalize:
+ **/
+static void
+asb_package_pisi_finalize (GObject *object)
+{
+ AsbPackagePisi *pkg = ASB_PACKAGE_PISI (object);
+ AsbPackagePisiPrivate *priv = GET_PRIVATE (pkg);
+
+ close_pisi (priv->package);
+
+ G_OBJECT_CLASS (asb_package_pisi_parent_class)->finalize (object);
+}
/**
* asb_package_pisi_open:
@@ -448,11 +470,14 @@ asb_package_pisi_open (AsbPackage *pkg, const gchar *filename, GError **error)
pisi_t *pisi = NULL;
gchar *rel = NULL;
GSList *elem = NULL;
+ AsbPackagePisiPrivate *priv = NULL;
pisi = open_pisi(filename);
if (!pisi)
return FALSE;
+ priv = GET_PRIVATE(ASB_PACKAGE_PISI(pkg));
+
asb_package_set_name (pkg, pisi->meta->name);
asb_package_set_source (pkg, pisi->meta->source);
@@ -469,7 +494,7 @@ asb_package_pisi_open (AsbPackage *pkg, const gchar *filename, GError **error)
asb_package_set_license (pkg, pisi->meta->licenses->data);
- close_pisi(pisi);
+ priv->package = pisi;
return TRUE;
}
@@ -504,14 +529,37 @@ asb_package_pisi_explode (AsbPackage *pkg,
}
/**
+ * asb_package_pisi_compare:
+ **/
+static gint
+asb_package_pisi_compare (AsbPackage *pkg1, AsbPackage *pkg2)
+{
+ AsbPackagePisi *pkg_pisi1 = ASB_PACKAGE_PISI (pkg1);
+ AsbPackagePisiPrivate *priv1 = GET_PRIVATE (pkg_pisi1);
+
+ AsbPackagePisi *pkg_pisi2 = ASB_PACKAGE_PISI (pkg2);
+ AsbPackagePisiPrivate *priv2 = GET_PRIVATE (pkg_pisi2);
+
+ gint rel1 = priv1->package->meta->release;
+ gint rel2 = priv2->package->meta->release;
+
+ return (rel1 > rel2) - (rel1 < rel2);
+}
+
+/**
* asb_package_pisi_class_init:
**/
static void
asb_package_pisi_class_init (AsbPackagePisiClass *klass)
{
AsbPackageClass *package_class = ASB_PACKAGE_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = asb_package_pisi_finalize;
+
package_class->open = asb_package_pisi_open;
package_class->explode = asb_package_pisi_explode;
+ package_class->compare = asb_package_pisi_compare;
}
/**
--
2.11.0