diff options
author | Richard Hughes <richard@hughsie.com> | 2015-01-30 13:04:33 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-01-30 13:17:04 +0000 |
commit | dcb77b98fb5bf6eb13bf2688fd6a818634a2026a (patch) | |
tree | 3e6f4794267b71f3c9b9cc71ee787d88b17eaaad | |
parent | 14db05d4f8b0167a592733e10264a3eb5b1c6165 (diff) | |
download | appstream-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.c | 7 | ||||
-rw-r--r-- | libappstream-builder/asb-package-deb.c | 6 | ||||
-rw-r--r-- | libappstream-builder/asb-package-rpm.c | 12 | ||||
-rw-r--r-- | libappstream-builder/asb-package.c | 24 | ||||
-rw-r--r-- | libappstream-builder/asb-package.h | 6 | ||||
-rw-r--r-- | libappstream-builder/asb-self-test.c | 18 | ||||
-rw-r--r-- | libappstream-builder/asb-task.c | 51 | ||||
-rw-r--r-- | libappstream-builder/plugins/asb-plugin-hardcoded.c | 28 |
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; } |