summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-01-30 13:04:33 +0000
committerRichard Hughes <richard@hughsie.com>2015-01-30 13:17:04 +0000
commitdcb77b98fb5bf6eb13bf2688fd6a818634a2026a (patch)
tree3e6f4794267b71f3c9b9cc71ee787d88b17eaaad
parent14db05d4f8b0167a592733e10264a3eb5b1c6165 (diff)
downloadappstream-glib-dcb77b98fb5bf6eb13bf2688fd6a818634a2026a.tar.gz
Add the extra child deps to the main package
This means if X depends on X-libs, and X-libs depends on GTK-3, then X should have the modern toolkit kudo. This means switching around the API a bit so that we can add deps after the AsbPackage has been created.
-rw-r--r--libappstream-builder/asb-package-alpm.c7
-rw-r--r--libappstream-builder/asb-package-deb.c6
-rw-r--r--libappstream-builder/asb-package-rpm.c12
-rw-r--r--libappstream-builder/asb-package.c24
-rw-r--r--libappstream-builder/asb-package.h6
-rw-r--r--libappstream-builder/asb-self-test.c18
-rw-r--r--libappstream-builder/asb-task.c51
-rw-r--r--libappstream-builder/plugins/asb-plugin-hardcoded.c28
8 files changed, 85 insertions, 67 deletions
diff --git a/libappstream-builder/asb-package-alpm.c b/libappstream-builder/asb-package-alpm.c
index a8469a7..36e28d0 100644
--- a/libappstream-builder/asb-package-alpm.c
+++ b/libappstream-builder/asb-package-alpm.c
@@ -159,14 +159,13 @@ asb_package_alpm_ensure_depends (AsbPackage *pkg, GError **error)
{
AsbPackageAlpm *pkg_alpm = ASB_PACKAGE_ALPM (pkg);
AsbPackageAlpmPrivate *priv = GET_PRIVATE (pkg_alpm);
-
alpm_list_t *alpm_depends;
- GPtrArray _cleanup_ptrarray_unref_ *depends = NULL;
+ alpm_list_t *current;
alpm_depends = alpm_pkg_get_depends (priv->package);
- depends = asb_package_alpm_list_to_array (alpm_depends);
+ for (current = alpm_depends; current; current = alpm_list_next (current))
+ asb_package_add_dep (pkg, current->data);
- asb_package_set_deps (pkg, (gchar**)(depends->pdata));
return TRUE;
}
diff --git a/libappstream-builder/asb-package-deb.c b/libappstream-builder/asb-package-deb.c
index d663a60..3b2f516 100644
--- a/libappstream-builder/asb-package-deb.c
+++ b/libappstream-builder/asb-package-deb.c
@@ -56,7 +56,6 @@ asb_package_deb_ensure_simple (AsbPackage *pkg, GError **error)
guint i;
guint j;
_cleanup_free_ gchar *output = NULL;
- _cleanup_ptrarray_unref_ GPtrArray *deps = NULL;
_cleanup_strv_free_ gchar **lines = NULL;
/* spawn sync */
@@ -68,7 +67,6 @@ asb_package_deb_ensure_simple (AsbPackage *pkg, GError **error)
return FALSE;
/* parse output */
- deps = g_ptr_array_new_with_free_func (g_free);
lines = g_strsplit (output, "\n", -1);
for (i = 0; lines[i] != NULL; i++) {
if (g_str_has_prefix (lines[i], "Package: ")) {
@@ -100,13 +98,11 @@ asb_package_deb_ensure_simple (AsbPackage *pkg, GError **error)
tmp = g_strstr_len (vr[j], -1, " ");
if (tmp != NULL)
*tmp = '\0';
- g_ptr_array_add (deps, vr[j]);
+ asb_package_add_dep (pkg, vr[j]);
}
continue;
}
}
- g_ptr_array_add (deps, NULL);
- asb_package_set_deps (pkg, (gchar **) deps->pdata);
return TRUE;
}
diff --git a/libappstream-builder/asb-package-rpm.c b/libappstream-builder/asb-package-rpm.c
index f9a55e5..6a231cb 100644
--- a/libappstream-builder/asb-package-rpm.c
+++ b/libappstream-builder/asb-package-rpm.c
@@ -419,9 +419,7 @@ asb_package_rpm_ensure_deps (AsbPackage *pkg, GError **error)
gboolean ret = TRUE;
gchar *tmp;
gint rc;
- guint i = 0;
rpmtd td = NULL;
- _cleanup_strv_free_ gchar **deps = NULL;
/* read out the dep list */
td = rpmtdNew ();
@@ -435,21 +433,19 @@ asb_package_rpm_ensure_deps (AsbPackage *pkg, GError **error)
asb_package_get_filename (pkg));
goto out;
}
- deps = g_new0 (gchar *, rpmtdCount (td) + 1);
while (rpmtdNext (td) != -1) {
+ _cleanup_free_ gchar *dep_no_qual = NULL;
dep = rpmtdGetString (td);
if (g_str_has_prefix (dep, "rpmlib"))
continue;
if (g_strcmp0 (dep, "/bin/sh") == 0)
continue;
- deps[i] = g_strdup (dep);
- tmp = g_strstr_len (deps[i], -1, "(");
+ dep_no_qual = g_strdup (dep);
+ tmp = g_strstr_len (dep_no_qual, -1, "(");
if (tmp != NULL)
*tmp = '\0';
- /* TODO: deduplicate */
- i++;
+ asb_package_add_dep (pkg, dep_no_qual);
}
- asb_package_set_deps (pkg, deps);
out:
rpmtdFreeData (td);
rpmtdFree (td);
diff --git a/libappstream-builder/asb-package.c b/libappstream-builder/asb-package.c
index ba3b771..946bd4d 100644
--- a/libappstream-builder/asb-package.c
+++ b/libappstream-builder/asb-package.c
@@ -41,7 +41,7 @@ struct _AsbPackagePrivate
AsbPackageKind kind;
gboolean enabled;
gchar **filelist;
- gchar **deps;
+ GPtrArray *deps;
gchar *filename;
gchar *basename;
gchar *name;
@@ -82,7 +82,7 @@ asb_package_finalize (GObject *object)
g_mutex_clear (&priv->mutex_log);
g_strfreev (priv->filelist);
- g_strfreev (priv->deps);
+ g_ptr_array_unref (priv->deps);
g_free (priv->filename);
g_free (priv->basename);
g_free (priv->name);
@@ -116,6 +116,7 @@ asb_package_init (AsbPackage *pkg)
priv->enabled = TRUE;
priv->log = g_string_sized_new (1024);
priv->timer = g_timer_new ();
+ priv->deps = g_ptr_array_new_with_free_func (g_free);
priv->configs = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_free);
priv->releases = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
@@ -459,9 +460,9 @@ asb_package_get_filelist (AsbPackage *pkg)
*
* Returns: (transfer none) (element-type utf8): deplist
*
- * Since: 0.1.0
+ * Since: 0.3.5
**/
-gchar **
+GPtrArray *
asb_package_get_deps (AsbPackage *pkg)
{
AsbPackagePrivate *priv = GET_PRIVATE (pkg);
@@ -656,20 +657,19 @@ asb_package_set_source_pkgname (AsbPackage *pkg, const gchar *source_pkgname)
}
/**
- * asb_package_set_deps:
+ * asb_package_add_dep:
* @pkg: A #AsbPackage
- * @deps: package deps
+ * @dep: package dep
*
- * Sets the package dependancies.
+ * Add a package dependancy.
*
- * Since: 0.1.0
+ * Since: 0.3.5
**/
void
-asb_package_set_deps (AsbPackage *pkg, gchar **deps)
+asb_package_add_dep (AsbPackage *pkg, const gchar *dep)
{
AsbPackagePrivate *priv = GET_PRIVATE (pkg);
- g_strfreev (priv->deps);
- priv->deps = g_strdupv (deps);
+ g_ptr_array_add (priv->deps, g_strdup (dep));
}
/**
@@ -855,7 +855,7 @@ asb_package_ensure (AsbPackage *pkg,
flags &= ~ASB_PACKAGE_ENSURE_SOURCE;
if (priv->filelist != NULL)
flags &= ~ASB_PACKAGE_ENSURE_FILES;
- if (priv->deps != NULL)
+ if (priv->deps->len > 0)
flags &= ~ASB_PACKAGE_ENSURE_DEPS;
if (priv->releases->len > 0)
flags &= ~ASB_PACKAGE_ENSURE_RELEASES;
diff --git a/libappstream-builder/asb-package.h b/libappstream-builder/asb-package.h
index 98471ea..53fadf9 100644
--- a/libappstream-builder/asb-package.h
+++ b/libappstream-builder/asb-package.h
@@ -152,12 +152,12 @@ void asb_package_set_source (AsbPackage *pkg,
const gchar *source);
void asb_package_set_source_pkgname (AsbPackage *pkg,
const gchar *source_pkgname);
-void asb_package_set_deps (AsbPackage *pkg,
- gchar **deps);
+void asb_package_add_dep (AsbPackage *pkg,
+ const gchar *dep);
void asb_package_set_filelist (AsbPackage *pkg,
gchar **filelist);
gchar **asb_package_get_filelist (AsbPackage *pkg);
-gchar **asb_package_get_deps (AsbPackage *pkg);
+GPtrArray *asb_package_get_deps (AsbPackage *pkg);
GPtrArray *asb_package_get_releases (AsbPackage *pkg);
void asb_package_set_config (AsbPackage *pkg,
const gchar *key,
diff --git a/libappstream-builder/asb-self-test.c b/libappstream-builder/asb-self-test.c
index 546d257..6145e87 100644
--- a/libappstream-builder/asb-self-test.c
+++ b/libappstream-builder/asb-self-test.c
@@ -86,6 +86,7 @@ asb_test_package_rpm_func (void)
{
AsRelease *rel;
GError *error = NULL;
+ GPtrArray *deps;
GPtrArray *releases;
gboolean ret;
gchar *tmp;
@@ -129,9 +130,11 @@ asb_test_package_rpm_func (void)
g_free (tmp);
/* deps */
- tmp = g_strjoinv (";", asb_package_get_deps (pkg));
- g_assert_cmpstr (tmp, ==, "bar;baz;foo");
- g_free (tmp);
+ deps = asb_package_get_deps (pkg);
+ g_assert_cmpint (deps->len, ==, 3);
+ g_assert_cmpstr (g_ptr_array_index (deps, 0), ==, "bar");
+ g_assert_cmpstr (g_ptr_array_index (deps, 1), ==, "baz");
+ g_assert_cmpstr (g_ptr_array_index (deps, 2), ==, "foo");
/* releases */
releases = asb_package_get_releases (pkg);
@@ -403,6 +406,9 @@ asb_test_context_test_func (AsbTestContextMode mode)
"<source_pkgname>app</source_pkgname>\n"
"<name>Extra</name>\n"
"<summary>Addons for extra functionality</summary>\n"
+ "<kudos>\n"
+ "<kudo>ModernToolkit</kudo>\n"
+ "</kudos>\n"
"<project_license>GPL-2.0+</project_license>\n"
"<url type=\"homepage\">http://people.freedesktop.org/</url>\n"
"<extends>app.desktop</extends>\n"
@@ -599,6 +605,9 @@ asb_test_context_test_func (AsbTestContextMode mode)
"<categories>\n"
"<category>ConsoleOnly</category>\n"
"</categories>\n"
+ "<kudos>\n"
+ "<kudo>ModernToolkit</kudo>\n"
+ "</kudos>\n"
"<vetos>\n"
"<veto>Required AppData: ConsoleOnly</veto>\n"
"</vetos>\n"
@@ -626,6 +635,9 @@ asb_test_context_test_func (AsbTestContextMode mode)
"<categories>\n"
"<category>ConsoleOnly</category>\n"
"</categories>\n"
+ "<kudos>\n"
+ "<kudo>ModernToolkit</kudo>\n"
+ "</kudos>\n"
"<vetos>\n"
"<veto>Required AppData: ConsoleOnly</veto>\n"
"</vetos>\n"
diff --git a/libappstream-builder/asb-task.c b/libappstream-builder/asb-task.c
index 1bf26b6..4aacb99 100644
--- a/libappstream-builder/asb-task.c
+++ b/libappstream-builder/asb-task.c
@@ -99,14 +99,18 @@ asb_task_explode_extra_package (AsbTask *task,
{
AsbTaskPrivate *priv = GET_PRIVATE (task);
AsbPackage *pkg_extra;
- gboolean ret = TRUE;
+ GPtrArray *deps;
+ guint i;
+ const gchar *dep;
/* if not found, that's fine */
pkg_extra = asb_context_find_by_pkgname (priv->ctx, pkg_name);
if (pkg_extra == NULL)
return TRUE;
+
if (!asb_package_ensure (pkg_extra,
ASB_PACKAGE_ENSURE_FILES |
+ ASB_PACKAGE_ENSURE_DEPS |
ASB_PACKAGE_ENSURE_SOURCE,
error))
return FALSE;
@@ -116,7 +120,6 @@ asb_task_explode_extra_package (AsbTask *task,
(g_strcmp0 (asb_package_get_source (pkg_extra),
asb_package_get_source (priv->pkg)) != 0))
return TRUE;
-
asb_panel_set_status (priv->panel, "Decompressing extra pkg %s",
asb_package_get_name (pkg_extra));
asb_package_log (priv->pkg,
@@ -124,10 +127,19 @@ asb_task_explode_extra_package (AsbTask *task,
"Adding extra package %s for %s",
asb_package_get_name (pkg_extra),
asb_package_get_name (priv->pkg));
- ret = asb_package_explode (pkg_extra, priv->tmpdir,
- asb_context_get_file_globs (priv->ctx),
- error);
- return ret;
+ if (!asb_package_explode (pkg_extra, priv->tmpdir,
+ asb_context_get_file_globs (priv->ctx),
+ error))
+ return FALSE;
+
+ /* copy all the extra package requires into the main package too */
+ deps = asb_package_get_deps (pkg_extra);
+ for (i = 0; i < deps->len; i++) {
+ dep = g_ptr_array_index (deps, i);
+ asb_package_add_dep (priv->pkg, dep);
+ }
+
+ return TRUE;
}
/**
@@ -137,45 +149,46 @@ static gboolean
asb_task_explode_extra_packages (AsbTask *task, GError **error)
{
AsbTaskPrivate *priv = GET_PRIVATE (task);
+ GPtrArray *deps;
const gchar *ignore[] = { "rtld", NULL };
const gchar *tmp;
- gchar **deps;
guint i;
_cleanup_hashtable_unref_ GHashTable *hash = NULL;
_cleanup_ptrarray_unref_ GPtrArray *array = NULL;
_cleanup_ptrarray_unref_ GPtrArray *icon_themes = NULL;
/* anything the package requires */
- hash = g_hash_table_new (g_str_hash, g_str_equal);
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
for (i = 0; ignore[i] != NULL; i++) {
g_hash_table_insert (hash,
- (gchar *) ignore[i],
+ g_strdup (ignore[i]),
GINT_TO_POINTER (1));
}
array = g_ptr_array_new_with_free_func (g_free);
icon_themes = g_ptr_array_new_with_free_func (g_free);
deps = asb_package_get_deps (priv->pkg);
- for (i = 0; deps != NULL && deps[i] != NULL; i++) {
- if (g_strstr_len (deps[i], -1, " ") != NULL)
+ for (i = 0; i < deps->len; i++) {
+ tmp = g_ptr_array_index (deps, i);
+ if (g_strstr_len (tmp, -1, " ") != NULL)
continue;
- if (g_strstr_len (deps[i], -1, ".so") != NULL)
+ if (g_strstr_len (tmp, -1, ".so") != NULL)
continue;
- if (g_str_has_prefix (deps[i], "/"))
+ if (g_str_has_prefix (tmp, "/"))
continue;
- if (g_hash_table_lookup (hash, deps[i]) != NULL)
+ if (g_hash_table_lookup (hash, tmp) != NULL)
continue;
/* if an app depends on kde-runtime, that means the
* oxygen icon set is available to them */
- if (g_strcmp0 (deps[i], "oxygen-icon-theme") == 0 ||
- g_strcmp0 (deps[i], "kde-runtime") == 0) {
- g_hash_table_insert (hash, (gpointer) "oxygen-icon-theme",
+ if (g_strcmp0 (tmp, "oxygen-icon-theme") == 0 ||
+ g_strcmp0 (tmp, "kde-runtime") == 0) {
+ g_hash_table_insert (hash, g_strdup ("oxygen-icon-theme"),
GINT_TO_POINTER (1));
g_ptr_array_add (icon_themes,
g_strdup ("oxygen-icon-theme"));
} else {
- g_ptr_array_add (array, g_strdup (deps[i]));
+ g_ptr_array_add (array, g_strdup (tmp));
}
- g_hash_table_insert (hash, deps[i], GINT_TO_POINTER (1));
+ g_hash_table_insert (hash, g_strdup (tmp), GINT_TO_POINTER (1));
}
/* explode any potential packages */
diff --git a/libappstream-builder/plugins/asb-plugin-hardcoded.c b/libappstream-builder/plugins/asb-plugin-hardcoded.c
index 17e8f7d..5f79a67 100644
--- a/libappstream-builder/plugins/asb-plugin-hardcoded.c
+++ b/libappstream-builder/plugins/asb-plugin-hardcoded.c
@@ -149,7 +149,7 @@ asb_plugin_process_app (AsbPlugin *plugin,
{
const gchar *tmp;
AsRelease *release;
- gchar **deps;
+ GPtrArray *deps;
gchar **filelist;
GPtrArray *releases;
guint i;
@@ -232,9 +232,10 @@ asb_plugin_process_app (AsbPlugin *plugin,
/* look for a modern toolkit */
deps = asb_package_get_deps (pkg);
- for (i = 0; deps != NULL && deps[i] != NULL; i++) {
- if (g_strcmp0 (deps[i], "libgtk-3.so.0") == 0 ||
- g_strcmp0 (deps[i], "libQt5Core.so.5") == 0) {
+ for (i = 0; i < deps->len; i++) {
+ tmp = g_ptr_array_index (deps, i);
+ if (g_strcmp0 (tmp, "libgtk-3.so.0") == 0 ||
+ g_strcmp0 (tmp, "libQt5Core.so.5") == 0) {
as_app_add_kudo_kind (AS_APP (app),
AS_KUDO_KIND_MODERN_TOOLKIT);
break;
@@ -242,36 +243,37 @@ asb_plugin_process_app (AsbPlugin *plugin,
}
/* look for ancient toolkits */
- for (i = 0; deps != NULL && deps[i] != NULL; i++) {
- if (g_strcmp0 (deps[i], "libgtk-1.2.so.0") == 0) {
+ for (i = 0; i < deps->len; i++) {
+ tmp = g_ptr_array_index (deps, i);
+ if (g_strcmp0 (tmp, "libgtk-1.2.so.0") == 0) {
as_app_add_veto (AS_APP (app), "Uses obsolete GTK1 toolkit");
break;
}
- if (g_strcmp0 (deps[i], "libglib-1.2.so.0") == 0) {
+ if (g_strcmp0 (tmp, "libglib-1.2.so.0") == 0) {
as_app_add_veto (AS_APP (app), "Uses obsolete GLib library");
break;
}
- if (g_strcmp0 (deps[i], "libqt-mt.so.3") == 0) {
+ if (g_strcmp0 (tmp, "libqt-mt.so.3") == 0) {
as_app_add_veto (AS_APP (app), "Uses obsolete QT3 toolkit");
break;
}
- if (g_strcmp0 (deps[i], "liblcms.so.1") == 0) {
+ if (g_strcmp0 (tmp, "liblcms.so.1") == 0) {
as_app_add_veto (AS_APP (app), "Uses obsolete LCMS library");
break;
}
- if (g_strcmp0 (deps[i], "libelektra.so.4") == 0) {
+ if (g_strcmp0 (tmp, "libelektra.so.4") == 0) {
as_app_add_veto (AS_APP (app), "Uses obsolete Elektra library");
break;
}
- if (g_strcmp0 (deps[i], "libXt.so.6") == 0) {
+ if (g_strcmp0 (tmp, "libXt.so.6") == 0) {
asb_app_add_requires_appdata (app, "Uses obsolete X11 toolkit");
break;
}
- if (g_strcmp0 (deps[i], "Xvfb") == 0) {
+ if (g_strcmp0 (tmp, "Xvfb") == 0) {
asb_app_add_requires_appdata (app, "Uses obsolete Xvfb");
break;
}
- if (g_strcmp0 (deps[i], "wine-core") == 0) {
+ if (g_strcmp0 (tmp, "wine-core") == 0) {
asb_app_add_requires_appdata (app, "Uses wine");
break;
}