diff options
author | Richard Hughes <richard@hughsie.com> | 2015-02-02 12:14:30 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-02-02 12:14:30 +0000 |
commit | 5319b33c29b4704a6e6710e762e5067b71909939 (patch) | |
tree | ad88b2388ddac40bb72079f1bf52a3bcff552689 /libappstream-builder | |
parent | f2fa8848346d7f72cd46d9548ac319847f486753 (diff) | |
download | appstream-glib-5319b33c29b4704a6e6710e762e5067b71909939.tar.gz |
Guess the NEVRA from the filename if possible
This avoids opening every package at startup just to check the architecture.
Diffstat (limited to 'libappstream-builder')
-rw-r--r-- | libappstream-builder/asb-package.c | 52 | ||||
-rw-r--r-- | libappstream-builder/asb-self-test.c | 13 |
2 files changed, 65 insertions, 0 deletions
diff --git a/libappstream-builder/asb-package.c b/libappstream-builder/asb-package.c index c08c5cc..d0e9d4f 100644 --- a/libappstream-builder/asb-package.c +++ b/libappstream-builder/asb-package.c @@ -811,6 +811,51 @@ asb_package_class_init (AsbPackageClass *klass) } /** + * asb_package_guess_from_filename: + **/ +static void +asb_package_guess_from_filename (AsbPackage *pkg) +{ + AsbPackagePrivate *priv = GET_PRIVATE (pkg); + _cleanup_free_ gchar *tmp = NULL; + gchar *at; + + /* remove .rpm extension */ + tmp = g_strdup (priv->filename); + at = g_strrstr (tmp, ".rpm"); + if (at == NULL) + return; + *at = '\0'; + + /* get arch */ + at = g_strrstr (tmp, "."); + if (at == NULL) + return; + priv->arch = g_strdup (at + 1); + *at = '\0'; + + /* get release */ + at = g_strrstr (tmp, "-"); + if (at == NULL) + return; + priv->release = g_strdup (at + 1); + *at = '\0'; + + /* get version */ + at = g_strrstr (tmp, "-"); + if (at == NULL) + return; + priv->version = g_strdup (at + 1); + *at = '\0'; + + /* get name */ + at = g_strrstr (tmp, "/"); + if (at == NULL) + return; + priv->name = g_strdup (at + 1); +} + +/** * asb_package_set_filename: * @pkg: A #AsbPackage * @filename: package filename @@ -827,6 +872,9 @@ asb_package_set_filename (AsbPackage *pkg, const gchar *filename) g_free (priv->filename); priv->basename = g_path_get_basename (filename); priv->filename = g_strdup (filename); + + /* this only works for correctly formatted file names */ + asb_package_guess_from_filename (pkg); } /** @@ -854,6 +902,10 @@ asb_package_open (AsbPackage *pkg, const gchar *filename, GError **error) return TRUE; priv->is_open = TRUE; + /* save filename if not already set */ + if (priv->filename == NULL) + asb_package_set_filename (pkg, filename); + /* call distro-specific method */ if (klass->open != NULL) return klass->open (pkg, filename, error); diff --git a/libappstream-builder/asb-self-test.c b/libappstream-builder/asb-self-test.c index 6145e87..b196cba 100644 --- a/libappstream-builder/asb-self-test.c +++ b/libappstream-builder/asb-self-test.c @@ -181,6 +181,18 @@ asb_test_package_rpm_func (void) #endif static void +asb_test_package_func (void) +{ + _cleanup_object_unref_ AsbPackage *pkg = NULL; + pkg = asb_package_new (); + asb_package_set_filename (pkg, "/tmp/gambit-c-doc-4.7.3-2.fc22.noarch.rpm"); + g_assert_cmpstr (asb_package_get_nevra (pkg), ==, "gambit-c-doc-4.7.3-2.fc22.noarch"); + g_assert_cmpstr (asb_package_get_name (pkg), ==, "gambit-c-doc"); + g_assert_cmpstr (asb_package_get_version (pkg), ==, "4.7.3"); + g_assert_cmpstr (asb_package_get_arch (pkg), ==, "noarch"); +} + +static void asb_test_utils_glob_func (void) { _cleanup_ptrarray_unref_ GPtrArray *array = NULL; @@ -859,6 +871,7 @@ main (int argc, char **argv) g_setenv ("ASB_IS_SELF_TEST", "", TRUE); /* tests go here */ + g_test_add_func ("/AppStreamBuilder/package", asb_test_package_func); g_test_add_func ("/AppStreamBuilder/utils{replace}", asb_test_utils_replace_func); g_test_add_func ("/AppStreamBuilder/utils{glob}", asb_test_utils_glob_func); g_test_add_func ("/AppStreamBuilder/plugin-loader", asb_test_plugin_loader_func); |