commit 14aad0ff9d049e1843e263993cd00a24812abd97 Author: Richard Hughes Date: Thu Oct 23 17:37:15 2008 +0100 bugfix: add a type= key to metadata.conf so we can tell if the service pack is an update or install pack. Also return the error if the service pack is invalid. diff --git a/lib/packagekit-glib/pk-service-pack.c b/lib/packagekit-glib/pk-service-pack.c index 85e284a..129d130 100644 --- a/lib/packagekit-glib/pk-service-pack.c +++ b/lib/packagekit-glib/pk-service-pack.c @@ -45,12 +45,19 @@ #define PK_SERVICE_PACK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_SERVICE_PACK, PkServicePackPrivate)) +typedef enum { + PK_SERVICE_PACK_TYPE_UPDATE, + PK_SERVICE_PACK_TYPE_INSTALL, + PK_SERVICE_PACK_TYPE_UNKNOWN +} PkServicePackType; + struct PkServicePackPrivate { PkPackageList *exclude_list; gchar *filename; gchar *directory; PkClient *client; + PkServicePackType type; }; typedef enum { @@ -105,28 +112,46 @@ pk_service_pack_error_get_type (void) * pk_service_pack_check_metadata_file: **/ static gboolean -pk_service_pack_check_metadata_file (const gchar *full_path) +pk_service_pack_check_metadata_file (const gchar *full_path, GError **error) { GKeyFile *file; gboolean ret; - GError *error = NULL; + GError *error_local = NULL; + gchar *type = NULL; gchar *distro_id = NULL; gchar *distro_id_us = NULL; /* load the file */ file = g_key_file_new (); - ret = g_key_file_load_from_file (file, full_path, G_KEY_FILE_NONE, &error); + ret = g_key_file_load_from_file (file, full_path, G_KEY_FILE_NONE, &error_local); if (!ret) { - egg_warning ("failed to load file: %s", error->message); - g_error_free (error); + *error = g_error_new (1, 0, "failed to load file: %s", error_local->message); + g_error_free (error_local); goto out; } /* read the value */ - distro_id = g_key_file_get_string (file, PK_SERVICE_PACK_GROUP_NAME, "distro_id", &error); - if (!ret) { - egg_warning ("failed to get value: %s", error->message); - g_error_free (error); + distro_id = g_key_file_get_string (file, PK_SERVICE_PACK_GROUP_NAME, "distro_id", &error_local); + if (distro_id == NULL) { + *error = g_error_new (1, 0, "failed to get value: %s", error_local->message); + g_error_free (error_local); + ret = FALSE; + goto out; + } + + /* read the value */ + type = g_key_file_get_string (file, PK_SERVICE_PACK_GROUP_NAME, "type", &error_local); + if (type == NULL) { + *error = g_error_new (1, 0, "failed to get type: %s", error_local->message); + g_error_free (error_local); + ret = FALSE; + goto out; + } + + /* check the types we support */ + if (!egg_strequal (type, "update") && !egg_strequal (type, "install")) { + *error = g_error_new (1, 0, "does not have correct type key: %s", type); + ret = FALSE; goto out; } @@ -135,9 +160,12 @@ pk_service_pack_check_metadata_file (const gchar *full_path) /* do we match? */ ret = egg_strequal (distro_id_us, distro_id); + if (!ret) + *error = g_error_new (1, 0, "distro id did not match %s == %s", distro_id_us, distro_id); out: g_key_file_free (file); + g_free (type); g_free (distro_id); g_free (distro_id_us); return ret; @@ -338,10 +366,11 @@ pk_service_pack_check_valid (PkServicePack *pack, GError **error) while ((filename_entry = g_dir_read_name (dir))) { metafile = g_build_filename (directory, filename_entry, NULL); if (egg_strequal (filename_entry, "metadata.conf")) { - ret = pk_service_pack_check_metadata_file (metafile); + ret = pk_service_pack_check_metadata_file (metafile, &error_local); if (!ret) { *error = g_error_new (PK_SERVICE_PACK_ERROR, PK_SERVICE_PACK_ERROR_NOT_COMPATIBLE, - "Service Pack %s not compatible with your distro", pack->priv->filename); + "Service Pack %s not compatible with your distro: %s", pack->priv->filename, error_local->message); + g_error_free (error_local); ret = FALSE; goto out; } @@ -481,7 +510,7 @@ pk_service_pack_exclude_packages (PkServicePack *pack, PkPackageList *list) * pk_service_pack_create_metadata_file: **/ static gboolean -pk_service_pack_create_metadata_file (const gchar *filename) +pk_service_pack_create_metadata_file (PkServicePack *pack, const gchar *filename) { gboolean ret = FALSE; gchar *distro_id = NULL; @@ -490,7 +519,9 @@ pk_service_pack_create_metadata_file (const gchar *filename) GKeyFile *file = NULL; gchar *data = NULL; + g_return_val_if_fail (PK_IS_SERVICE_PACK (pack), FALSE); g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (pack->priv->type != PK_SERVICE_PACK_TYPE_UNKNOWN, FALSE); file = g_key_file_new (); @@ -505,6 +536,11 @@ pk_service_pack_create_metadata_file (const gchar *filename) g_key_file_set_string (file, PK_SERVICE_PACK_GROUP_NAME, "distro_id", distro_id); g_key_file_set_string (file, PK_SERVICE_PACK_GROUP_NAME, "created", iso_time); + if (pack->priv->type == PK_SERVICE_PACK_TYPE_INSTALL) + g_key_file_set_string (file, PK_SERVICE_PACK_GROUP_NAME, "type", "install"); + else if (pack->priv->type == PK_SERVICE_PACK_TYPE_UPDATE) + g_key_file_set_string (file, PK_SERVICE_PACK_GROUP_NAME, "type", "update"); + /* convert to text */ data = g_key_file_to_data (file, NULL, &error); if (data == NULL) { @@ -618,7 +654,7 @@ pk_service_pack_create_from_files (PkServicePack *pack, GPtrArray *file_array, G /* create a file with metadata in it */ filename = g_build_filename (g_get_tmp_dir (), "metadata.conf", NULL); - ret = pk_service_pack_create_metadata_file (filename); + ret = pk_service_pack_create_metadata_file (pack, filename); if (!ret) { *error = g_error_new (PK_SERVICE_PACK_ERROR, PK_SERVICE_PACK_ERROR_FAILED_CREATE, "failed to generate metadata file %s", filename); @@ -751,17 +787,10 @@ pk_service_pack_setup_client (PkServicePack *pack) } /** - * pk_service_pack_create_for_package_ids: - * @pack: a valid #PkServicePack instance - * @package_ids: A list of package_ids to download - * @error: a %GError to put the error code and message in, or %NULL - * - * Adds the packages specified to a service pack. - * - * Return value: %TRUE if the service pack was created successfully + * pk_service_pack_create_for_package_ids_internal: **/ -gboolean -pk_service_pack_create_for_package_ids (PkServicePack *pack, gchar **package_ids, GError **error) +static gboolean +pk_service_pack_create_for_package_ids_internal (PkServicePack *pack, gchar **package_ids, GError **error) { gchar **package_ids_deps = NULL; PkPackageList *list = NULL; @@ -818,6 +847,7 @@ pk_service_pack_create_for_package_ids (PkServicePack *pack, gchar **package_ids /* list deps */ length = pk_package_list_get_size (list); + g_print ("Downloading %i packages for dependencies.\n", length); for (i=0; ipriv->type = PK_SERVICE_PACK_TYPE_INSTALL; + return pk_service_pack_create_for_package_ids_internal (pack, package_ids, error); +} + +/** * pk_service_pack_create_for_package_id: * @pack: a valid #PkServicePack instance * @package_id: A single package_id to download @@ -891,7 +940,8 @@ pk_service_pack_create_for_package_id (PkServicePack *pack, const gchar *package g_return_val_if_fail (pack->priv->directory != NULL, FALSE); package_ids = pk_package_ids_from_id (package_id); - ret = pk_service_pack_create_for_package_ids (pack, package_ids, error); + pack->priv->type = PK_SERVICE_PACK_TYPE_INSTALL; + ret = pk_service_pack_create_for_package_ids_internal (pack, package_ids, error); g_strfreev (package_ids); return ret; } @@ -954,7 +1004,9 @@ pk_service_pack_create_for_updates (PkServicePack *pack, GError **error) package_ids = pk_package_list_to_strv (list); g_object_unref (list); - ret = pk_service_pack_create_for_package_ids (pack, package_ids, error); + + pack->priv->type = PK_SERVICE_PACK_TYPE_UPDATE; + ret = pk_service_pack_create_for_package_ids_internal (pack, package_ids, error); out: g_strfreev (package_ids); return ret; @@ -1032,10 +1084,12 @@ pk_service_pack_init (PkServicePack *pack) pack->priv->exclude_list = NULL; pack->priv->filename = NULL; pack->priv->directory = NULL; + pack->priv->type = PK_SERVICE_PACK_TYPE_UNKNOWN; } /** * pk_service_pack_new: + * * Return value: A new service_pack class instance. **/ PkServicePack *