summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/packagekit/files/01_d1e096c3267c1c9492041382b954e9327bc8bbec.patch2938
-rw-r--r--packages/packagekit/files/02_9ced8313fb12f0f89ad6ced7c0fdc7241ff00d77.patch13544
-rw-r--r--packages/packagekit/files/03_group_infomation.patch31
-rw-r--r--packages/packagekit/files/modify_summary_and_adding_reposi_info.patch69
-rw-r--r--packages/packagekit/files/pk-nodocs.patch10
-rw-r--r--packages/packagekit/packagekit_git.bb3
6 files changed, 71 insertions, 16524 deletions
diff --git a/packages/packagekit/files/01_d1e096c3267c1c9492041382b954e9327bc8bbec.patch b/packages/packagekit/files/01_d1e096c3267c1c9492041382b954e9327bc8bbec.patch
deleted file mode 100644
index f050a50002..0000000000
--- a/packages/packagekit/files/01_d1e096c3267c1c9492041382b954e9327bc8bbec.patch
+++ /dev/null
@@ -1,2938 +0,0 @@
-diff --git a/backends/alpm/pk-backend-alpm.c b/backends/alpm/pk-backend-alpm.c
-index 3270e42..45e7a44 100644
---- a/backends/alpm/pk-backend-alpm.c
-+++ b/backends/alpm/pk-backend-alpm.c
-@@ -895,7 +895,7 @@ backend_get_repo_list (PkBackend *backend, PkFilterEnum filters)
- static gboolean
- backend_install_files_thread (PkBackend *backend)
- {
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- gchar **full_paths = pk_backend_get_strv (backend, "full_paths");
-
-@@ -1050,7 +1050,7 @@ backend_install_packages (PkBackend *backend, gchar **package_ids)
- static gboolean
- backend_refresh_cache_thread (PkBackend *backend)
- {
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- if (alpm_trans_init (PM_TRANS_TYPE_SYNC, PM_TRANS_FLAG_NOSCRIPTLET, cb_trans_evt, cb_trans_conv, cb_trans_progress) != 0) {
- pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, alpm_strerror (pm_errno));
-diff --git a/backends/apt/pk-apt-build-db.cpp b/backends/apt/pk-apt-build-db.cpp
-index d47c348..885275d 100644
---- a/backends/apt/pk-apt-build-db.cpp
-+++ b/backends/apt/pk-apt-build-db.cpp
-@@ -40,7 +40,7 @@ void apt_build_db(PkBackend * backend, sqlite3 *db)
- sqlite3_stmt *package = NULL;
-
- pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates(backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- sdir = g_build_filename(_config->Find("Dir").c_str(),_config->Find("Dir::State").c_str(),_config->Find("Dir::State::lists").c_str(), NULL);
- dir = g_dir_open(sdir,0,&error);
-diff --git a/backends/apt/pk-sqlite-pkg-cache.cpp b/backends/apt/pk-sqlite-pkg-cache.cpp
-index 770fcdf..1bf9a50 100644
---- a/backends/apt/pk-sqlite-pkg-cache.cpp
-+++ b/backends/apt/pk-sqlite-pkg-cache.cpp
-@@ -81,7 +81,7 @@ sqlite_search_packages_thread (PkBackend *backend)
- const gchar *search;
-
- pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates(backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- type = pk_backend_get_uint (backend, "type");
- search = pk_backend_get_string (backend, "search");
-
-@@ -176,7 +176,7 @@ sqlite_get_details_thread (PkBackend *backend)
- }
-
- pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates(backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- pk_debug("finding %s", pi->name);
-
-diff --git a/backends/box/pk-backend-box.c b/backends/box/pk-backend-box.c
-index b7b8167..9263781 100644
---- a/backends/box/pk-backend-box.c
-+++ b/backends/box/pk-backend-box.c
-@@ -138,7 +138,7 @@ backend_find_packages_thread (PkBackend *backend)
- filter_box = filter_box | PKG_SEARCH_DETAILS;
- }
-
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- db = db_open();
-
-diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
-index 49d4e5a..2df445e 100644
---- a/backends/dummy/pk-backend-dummy.c
-+++ b/backends/dummy/pk-backend-dummy.c
-@@ -254,7 +254,7 @@ static void
- backend_get_updates (PkBackend *backend, PkFilterEnum filters)
- {
- pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- /* check network state */
- if (!pk_backend_is_online (backend)) {
- pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot check when offline");
-@@ -268,6 +268,8 @@ static gboolean
- backend_install_timeout (gpointer data)
- {
- PkBackend *backend = (PkBackend *) data;
-+ guint sub_percent;
-+
- if (_progress_percentage == 100) {
- pk_backend_finished (backend);
- return FALSE;
-@@ -283,9 +285,18 @@ backend_install_timeout (gpointer data)
- pk_backend_package (backend, PK_INFO_ENUM_INSTALLING,
- "gtkhtml2-devel;2.19.1-0.fc8;i386;fedora",
- "Devel files for gtkhtml");
-+ /* this duplicate package should be ignored */
-+ pk_backend_package (backend, PK_INFO_ENUM_INSTALLING,
-+ "gtkhtml2-devel;2.19.1-0.fc8;i386;fedora", NULL);
- pk_backend_set_status (backend, PK_STATUS_ENUM_INSTALL);
- }
-- _progress_percentage += 10;
-+ if (_progress_percentage > 30 && _progress_percentage < 50) {
-+ sub_percent = ((gfloat) (_progress_percentage - 30.0f) / 20.0f) * 100.0f;
-+ pk_backend_set_sub_percentage (backend, sub_percent);
-+ } else {
-+ pk_backend_set_sub_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-+ }
-+ _progress_percentage += 1;
- pk_backend_set_percentage (backend, _progress_percentage);
- return TRUE;
- }
-@@ -348,7 +359,7 @@ backend_install_packages (PkBackend *backend, gchar **package_ids)
- pk_backend_package (backend, PK_INFO_ENUM_DOWNLOADING,
- "gtkhtml2;2.19.1-4.fc8;i386;fedora",
- "An HTML widget for GTK+ 2.0");
-- _signal_timeout = g_timeout_add (1000, backend_install_timeout, backend);
-+ _signal_timeout = g_timeout_add (100, backend_install_timeout, backend);
- }
-
- /**
-@@ -526,7 +537,7 @@ backend_search_name_timeout (gpointer data)
- static void
- backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
- {
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- pk_backend_set_allow_cancel (backend, TRUE);
- pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
- _signal_timeout = g_timeout_add (2000, backend_search_name_timeout, backend);
-diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
-index ecc97be..7649bab 100644
---- a/backends/opkg/pk-backend-opkg.c
-+++ b/backends/opkg/pk-backend-opkg.c
-@@ -155,6 +155,38 @@ pk_opkg_progress_cb (opkg_t *opkg, const opkg_progress_data_t *pdata, void *data
- return;
-
- pk_backend_set_percentage (backend, pdata->percentage);
-+ if (pdata->package)
-+ {
-+ gchar *uid;
-+ opkg_package_t *pkg = pdata->package;
-+ gint status = PK_INFO_ENUM_UNKNOWN;
-+
-+ uid = g_strdup_printf ("%s;%s;%s;",
-+ pkg->name, pkg->version, pkg->architecture);
-+
-+ if (pdata->action == OPKG_DOWNLOAD)
-+ status = PK_INFO_ENUM_DOWNLOADING;
-+ else if (pdata->action == OPKG_INSTALL)
-+ status = PK_INFO_ENUM_INSTALLING;
-+ else if (pdata->action == OPKG_REMOVE)
-+ status = PK_INFO_ENUM_REMOVING;
-+
-+ pk_backend_package (backend, status, uid, pkg->description);
-+ g_free (uid);
-+ }
-+
-+ switch (pdata->action)
-+ {
-+ case OPKG_DOWNLOAD:
-+ pk_backend_set_status (backend, PK_STATUS_ENUM_DOWNLOAD);
-+ break;
-+ case OPKG_INSTALL:
-+ pk_backend_set_status (backend, PK_STATUS_ENUM_INSTALL);
-+ break;
-+ case OPKG_REMOVE:
-+ pk_backend_set_status (backend, PK_STATUS_ENUM_REMOVE);
-+ break;
-+ }
- }
-
- static gboolean
-@@ -163,8 +195,12 @@ backend_refresh_cache_thread (PkBackend *backend)
- int ret;
-
- ret = opkg_update_package_lists (opkg, pk_opkg_progress_cb, backend);
-+
- if (ret) {
-- opkg_unknown_error (backend, ret, "Refreshing cache");
-+ if (ret == OPKG_DOWNLOAD_FAILED)
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_AVAILABLE, NULL);
-+ else
-+ opkg_unknown_error (backend, ret, "Refreshing cache");
- }
- pk_backend_finished (backend);
-
-@@ -178,7 +214,7 @@ static void
- backend_refresh_cache (PkBackend *backend, gboolean force)
- {
- pk_backend_set_status (backend, PK_STATUS_ENUM_REFRESH_CACHE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
-
- pk_backend_thread_create (backend, backend_refresh_cache_thread);
-@@ -279,7 +315,7 @@ backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *sear
-
-
- pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- params = g_new0 (SearchParams, 1);
- params->filters = filters;
-@@ -301,7 +337,7 @@ backend_search_description (PkBackend *backend, PkFilterEnum filters, const gcha
-
-
- pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- params = g_new0 (SearchParams, 1);
- params->filters = filters;
-@@ -320,7 +356,7 @@ backend_search_group (PkBackend *backend, PkFilterEnum filters, const gchar *sea
-
-
- pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- params = g_new0 (SearchParams, 1);
- params->filters = filters;
-@@ -337,30 +373,52 @@ static gboolean
- backend_install_packages_thread (PkBackend *backend)
- {
- PkPackageId *pi;
-- gint err;
-- const gchar *package_id;
-+ gint err, i;
-+ gchar **package_ids;
-
-- package_id = pk_backend_get_string (backend, "pkid");
-- pk_backend_package (backend, PK_INFO_ENUM_INSTALLING, package_id, NULL);
-+ package_ids = pk_backend_get_strv (backend, "pkids");
-
-- pi = pk_package_id_new_from_string (package_id);
-+ err = 0;
-+
-+ for (i = 0; package_ids[i]; i++)
-+ {
-+ pk_backend_package (backend, PK_INFO_ENUM_INSTALLING, package_ids[0], NULL);
-
-- err = opkg_install_package (opkg, pi->name, pk_opkg_progress_cb, backend);
-- if (err != 0)
-- opkg_unknown_error (backend, err, "Install");
-+ pi = pk_package_id_new_from_string (package_ids[0]);
-+
-+ err = opkg_install_package (opkg, pi->name, pk_opkg_progress_cb, backend);
-+ switch (err)
-+ {
-+ case OPKG_NO_ERROR:
-+ break;
-+ case OPKG_DEPENDANCIES_FAILED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, NULL);
-+ break;
-+ case OPKG_PACKAGE_ALREADY_INSTALLED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, NULL);
-+ break;
-+ case OPKG_PACKAGE_NOT_AVAILABLE:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL);
-+ break;
-+ default:
-+ opkg_unknown_error (backend, err, "Install");
-+ }
-+ pk_package_id_free (pi);
-+ if (err != 0)
-+ break;
-+ }
-
-- pk_package_id_free (pi);
- pk_backend_finished (backend);
- return (err == 0);
- }
-
- static void
--backend_install_packages (PkBackend *backend, gchar **package_id)
-+backend_install_packages (PkBackend *backend, gchar **package_ids)
- {
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- pk_backend_set_status (backend, PK_STATUS_ENUM_INSTALL);
-
-- pk_backend_set_string (backend, "pkid", package_id[0]);
-+ pk_backend_set_strv (backend, "pkids", package_ids);
-
- pk_backend_thread_create (backend, backend_install_packages_thread);
- }
-@@ -369,7 +427,7 @@ static gboolean
- backend_remove_packages_thread (PkBackend *backend)
- {
- PkPackageId *pi;
-- gint err;
-+ gint err, i;
- gchar **package_ids;
- gboolean allow_deps;
- gboolean autoremove;
-@@ -382,19 +440,34 @@ backend_remove_packages_thread (PkBackend *backend)
- autoremove = GPOINTER_TO_INT (data[2]);
- g_free (data);
-
-- pi = pk_package_id_new_from_string (package_ids[0]);
-- pk_backend_package (backend, PK_INFO_ENUM_REMOVING, package_ids[0], NULL);
--
- opkg_set_option (opkg, "autoremove", &autoremove);
- opkg_set_option (opkg, "force_removal_of_dependent_packages", &allow_deps);
-
-- err = opkg_remove_package (opkg, pi->name, pk_opkg_progress_cb, backend);
-+ err = 0;
-
-- /* TODO: improve error reporting */
-- if (err != 0)
-- opkg_unknown_error (backend, err, "Remove");
-+ for (i = 0; package_ids[i]; i++)
-+ {
-+ pi = pk_package_id_new_from_string (package_ids[0]);
-+ pk_backend_package (backend, PK_INFO_ENUM_REMOVING, package_ids[0], NULL);
-+
-+ err = opkg_remove_package (opkg, pi->name, pk_opkg_progress_cb, backend);
-+
-+ switch (err)
-+ {
-+ case OPKG_NO_ERROR:
-+ break;
-+ case OPKG_PACKAGE_NOT_INSTALLED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
-+ break;
-+ default:
-+ opkg_unknown_error (backend, err, "Remove");
-+ }
-+ pk_package_id_free (pi);
-+
-+ if (err != 0)
-+ break;
-+ }
-
-- pk_package_id_free (pi);
- pk_backend_finished (backend);
- return (err == 0);
- }
-@@ -405,7 +478,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
- gpointer *params;
-
- pk_backend_set_status (backend, PK_STATUS_ENUM_REMOVE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- /* params is a small array we can pack our thread parameters into */
- params = g_new0 (gpointer, 2);
-@@ -450,7 +523,7 @@ static void
- backend_update_system (PkBackend *backend)
- {
- pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- pk_backend_thread_create (backend, backend_update_system_thread);
- }
-@@ -478,8 +551,14 @@ backend_update_package_thread (PkBackend *backend)
- }
-
- err = opkg_upgrade_package (opkg, pi->name, pk_opkg_progress_cb, backend);
--
-- if (err != 0) {
-+ switch (err)
-+ {
-+ case OPKG_NO_ERROR:
-+ break;
-+ case OPKG_PACKAGE_NOT_INSTALLED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
-+ break;
-+ default:
- opkg_unknown_error (backend, err, "Update package");
- }
-
-@@ -494,7 +573,7 @@ backend_update_packages (PkBackend *backend, gchar **package_ids)
- gint i;
-
- pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- for (i = 0; package_ids[i]; i++) {
- pk_backend_set_string (backend, "pkgid", package_ids[i]);
-@@ -536,7 +615,7 @@ static void
- backend_get_updates (PkBackend *backend, PkFilterEnum filters)
- {
- pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- pk_backend_thread_create (backend, backend_get_updates_thread);
- }
-@@ -572,19 +651,26 @@ backend_get_details_thread (PkBackend *backend)
- if (pi == NULL)
- {
- pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-- pk_package_id_free (pi);
-+ pk_backend_finished (backend);
- return FALSE;
- }
-
-
- pkg = opkg_find_package (opkg, pi->name, pi->version, pi->arch, pi->data);
-+ pk_package_id_free (pi);
-+
-+ if (!pkg)
-+ {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL);
-+ pk_backend_finished (backend);
-+ return FALSE;
-+ }
-
- newid = g_strdup_printf ("%s;%s;%s;%s", pkg->name, pkg->version, pkg->architecture, pkg->repository);
-
- pk_backend_details (backend, newid, NULL, 0, pkg->description, pkg->url, pkg->size);
-
- g_free (newid);
-- pk_package_id_free (pi);
- pk_backend_finished (backend);
- return TRUE;
- }
-@@ -592,7 +678,7 @@ backend_get_details_thread (PkBackend *backend)
- static void
- backend_get_details (PkBackend *backend, const gchar *package_id)
- {
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- pk_backend_thread_create (backend, backend_get_details_thread);
- }
-
-diff --git a/backends/test/pk-backend-test-dbus.c b/backends/test/pk-backend-test-dbus.c
-index 5dfea32..76686dc 100644
---- a/backends/test/pk-backend-test-dbus.c
-+++ b/backends/test/pk-backend-test-dbus.c
-@@ -36,7 +36,7 @@ static void
- backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
- {
- pk_backend_set_allow_cancel (backend, TRUE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- pk_backend_dbus_search_name (dbus, filters, search);
- }
-
-diff --git a/backends/test/pk-backend-test-spawn.c b/backends/test/pk-backend-test-spawn.c
-index 2958c05..584f44c 100644
---- a/backends/test/pk-backend-test-spawn.c
-+++ b/backends/test/pk-backend-test-spawn.c
-@@ -35,7 +35,7 @@ backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *sear
- {
- gchar *filters_text;
- pk_backend_set_allow_cancel (backend, TRUE);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- filters_text = pk_filter_enums_to_text (filters);
- pk_backend_spawn_helper (spawn, "search-name.sh", filters_text, search, NULL);
- g_free (filters_text);
-diff --git a/backends/test/pk-backend-test-succeed.c b/backends/test/pk-backend-test-succeed.c
-index 17cdc6e..c046c1d 100644
---- a/backends/test/pk-backend-test-succeed.c
-+++ b/backends/test/pk-backend-test-succeed.c
-@@ -236,7 +236,7 @@ backend_search_name_timeout (gpointer data)
- static void
- backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
- {
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
- g_timeout_add (200000, backend_search_name_timeout, backend);
- }
-
-diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
-index f76e27c..5b2da8f 100644
---- a/backends/yum/helpers/yumBackend.py
-+++ b/backends/yum/helpers/yumBackend.py
-@@ -801,6 +801,8 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- old_throttle = self.yumbase.conf.throttle
- self.yumbase.conf.throttle = "60%" # Set bandwidth throttle to 60%
- # to avoid taking all the system's bandwidth.
-+ old_skip_broken = self.yumbase.conf.skip_broken
-+ self.yumbase.conf.skip_broken = 1
-
- try:
- txmbr = self.yumbase.update() # Add all updates to Transaction
-@@ -812,6 +814,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- self.error(ERROR_NO_PACKAGES_TO_UPDATE,"Nothing to do")
-
- self.yumbase.conf.throttle = old_throttle
-+ self.yumbase.conf.skip_broken = old_skip_broken
-
- def refresh_cache(self):
- '''
-@@ -905,7 +908,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- if txmbrs:
- self._runYumTransaction()
- else:
-- self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"This package could not be installed as it is already installed")
-+ self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The package is already installed")
-
- def _checkForNewer(self,po):
- pkgs = self.yumbase.pkgSack.returnNewestByName(name=po.name)
-@@ -1003,7 +1006,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- return False
-
- if self._is_inst(po):
-- self.error(ERROR_PACKAGE_ALREADY_INSTALLED, "%s is already installed" % str(po))
-+ self.error(ERROR_PACKAGE_ALREADY_INSTALLED, "The package %s is already installed" % str(po))
- return False
-
- if len(self.yumbase.conf.exclude) > 0:
-diff --git a/backends/yum2/helpers/testyum2.py b/backends/yum2/helpers/testyum2.py
-index cdec507..85b47f9 100755
---- a/backends/yum2/helpers/testyum2.py
-+++ b/backends/yum2/helpers/testyum2.py
-@@ -80,7 +80,7 @@ try:
- #iface.GetPackages(FILTER_INSTALLED,'no')
- if cmd == 'get-repolist' or cmd == 'all':
- print "Testing GetRepoList()"
-- iface.GetRepoList()
-+ iface.GetRepoList("")
- if cmd == 'get-updatedetail' or cmd == 'all':
- print "Testing GetUpdateDetail(PKG_ID)"
- iface.GetUpdateDetail(PKG_ID)
-diff --git a/backends/yum2/helpers/yumDBUSBackend.py b/backends/yum2/helpers/yumDBUSBackend.py
-index 9cfed94..29f5b03 100755
---- a/backends/yum2/helpers/yumDBUSBackend.py
-+++ b/backends/yum2/helpers/yumDBUSBackend.py
-@@ -434,7 +434,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- try:
- pkgGroupDict = self._buildGroupDict()
- fltlist = filters.split(';')
-- found = {}
-+ installed_nevra = [] # yum returns packages as available even when installed
-
- if not FILTER_NOT_INSTALLED in fltlist:
- # Check installed for group
-@@ -450,21 +450,31 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- group = groupMap[cg] # use the pk group name, instead of yum 'category/group'
- if group == key:
- if self._do_extra_filtering(pkg, fltlist):
-- self._show_package(pkg, INFO_INSTALLED)
-+ package_list.append((pkg,INFO_INSTALLED))
-+ installed_nevra.append(self._get_nevra(pkg))
-+
- if not FILTER_INSTALLED in fltlist:
- # Check available for group
- for pkg in self.yumbase.pkgSack:
- if self._cancel_check("Search cancelled."):
- # _cancel_check() sets the error message, unlocks yum, and calls Finished()
- return
-- group = GROUP_OTHER
-- if pkgGroupDict.has_key(pkg.name):
-- cg = pkgGroupDict[pkg.name]
-- if groupMap.has_key(cg):
-- group = groupMap[cg]
-- if group == key:
-- if self._do_extra_filtering(pkg, fltlist):
-- self._show_package(pkg, INFO_AVAILABLE)
-+
-+ nevra = self._get_nevra(pkg)
-+ if nevra not in installed_nevra:
-+ group = GROUP_OTHER
-+ if pkgGroupDict.has_key(pkg.name):
-+ cg = pkgGroupDict[pkg.name]
-+ if groupMap.has_key(cg):
-+ group = groupMap[cg]
-+ if group == key:
-+ if self._do_extra_filtering(pkg, fltlist):
-+ package_list.append((pkg,INFO_AVAILABLE))
-+
-+ except yum.Errors.GroupsError,e:
-+ self._unlock_yum()
-+ self.ErrorCode(ERROR_GROUP_NOT_FOUND, str(e))
-+ self.Finished(EXIT_FAILED)
- except yum.Errors.RepoError,e:
- self.Message(MESSAGE_NOTICE, "The package cache is invalid and is being rebuilt.")
- self._refresh_yum_cache()
-@@ -473,6 +483,14 @@ class PackageKitYumBackend(PackageKitBaseBackend):
-
- return
-
-+ # basename filter if specified
-+ if FILTER_BASENAME in fltlist:
-+ for (pkg,status) in self._basename_filter(package_list):
-+ self._show_package(pkg,status)
-+ else:
-+ for (pkg,status) in package_list:
-+ self._show_package(pkg,status)
-+
- self._unlock_yum()
- self.Finished(EXIT_SUCCESS)
-
-@@ -724,6 +742,11 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- #we might have a rounding error
- self.PercentageChanged(100)
-
-+ except yum.Errors.RepoError,e:
-+ self._unlock_yum()
-+ self.ErrorCode(ERROR_REPO_CONFIGURATION_ERROR,str(e))
-+ self.Finished(EXIT_FAILED)
-+ self.Exit()
- except yum.Errors.YumBaseError, e:
- self._unlock_yum()
- # This should be a better-defined error, but I'm not sure
-@@ -837,6 +860,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- Needed to be implemented in a sub class
- '''
- if inst_file.endswith('.src.rpm'):
-+ self._unlock_yum()
- self.ErrorCode(ERROR_CANNOT_INSTALL_SOURCE_PACKAGE,'Backend will not install a src rpm file')
- self.Finished(EXIT_FAILED)
- return
-@@ -1385,30 +1409,30 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- res = self.yumbase.searchGenerator(searchlist, [key])
- fltlist = filters.split(';')
-
-- available = []
-- count = 1
-+ seen_nevra = [] # yum returns packages as available even when installed
-+ pkg_list = [] # only do the second iteration on not installed pkgs
-+ package_list = [] #we can't do emitting as found if we are post-processing
-+
- for (pkg,values) in res:
- if self._cancel_check("Search cancelled."):
- return False
- # are we installed?
- if pkg.repo.id == 'installed':
-- if FILTER_NOT_INSTALLED not in fltlist:
-- if self._do_extra_filtering(pkg,fltlist):
-- count+=1
-- if count > 100:
-- break
-- self._show_package(pkg, INFO_INSTALLED)
-+ if self._do_extra_filtering(pkg,fltlist):
-+ package_list.append((pkg,INFO_INSTALLED))
-+ seen_nevra.append(self._get_nevra(pkg))
- else:
-- available.append(pkg)
-+ pkg_list.append(pkg)
-
-- # Now show available packages.
-- if FILTER_INSTALLED not in fltlist:
-- for pkg in available:
-- if self._cancel_check("Search cancelled."):
-- return False
-- if self._do_extra_filtering(pkg,fltlist):
-- self._show_package(pkg, INFO_AVAILABLE)
-+ for pkg in pkg_list:
-+ if self._cancel_check("Search cancelled."):
-+ return False
-
-+ nevra = self._get_nevra(pkg)
-+ if nevra not in seen_nevra:
-+ if self._do_extra_filtering(pkg,fltlist):
-+ package_list.append((pkg,INFO_AVAILABLE))
-+ seen_nevra.append(self._get_nevra(pkg))
- except yum.Errors.RepoError,e:
- self.Message(MESSAGE_NOTICE, "The package cache is invalid and is being rebuilt.")
- self._refresh_yum_cache()
-@@ -1417,13 +1441,22 @@ class PackageKitYumBackend(PackageKitBaseBackend):
-
- return False
-
-+ # basename filter if specified
-+ if FILTER_BASENAME in fltlist:
-+ for (pkg,status) in self._basename_filter(package_list):
-+ self._show_package(pkg,status)
-+ else:
-+ for (pkg,status) in package_list:
-+ self._show_package(pkg,status)
-+
- return True
-
- def _do_extra_filtering(self,pkg,filterList):
- ''' do extra filtering (gui,devel etc) '''
- for filter in filterList:
- if filter in (FILTER_INSTALLED, FILTER_NOT_INSTALLED):
-- continue
-+ if not self._do_installed_filtering(filter,pkg):
-+ return False
- elif filter in (FILTER_GUI, FILTER_NOT_GUI):
- if not self._do_gui_filtering(filter, pkg):
- return False
-@@ -1433,11 +1466,17 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- elif filter in (FILTER_FREE, FILTER_NOT_FREE):
- if not self._do_free_filtering(filter, pkg):
- return False
-- elif filter in (FILTER_BASENAME, FILTER_NOT_BASENAME):
-- if not self._do_basename_filtering(filter, pkg):
-- return False
- return True
-
-+ def _do_installed_filtering(self,flt,pkg):
-+ isInstalled = False
-+ if flt == FILTER_INSTALLED:
-+ wantInstalled = True
-+ else:
-+ wantInstalled = False
-+ isInstalled = pkg.repo.id == 'installed'
-+ return isInstalled == wantInstalled
-+
- def _do_gui_filtering(self,flt,pkg):
- isGUI = False
- if flt == FILTER_GUI:
-@@ -1477,32 +1516,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
-
- return isFree == wantFree
-
-- def _do_basename_filtering(self,flt,pkg):
-- if flt == FILTER_BASENAME:
-- wantBase = True
-- else:
-- wantBase = False
--
-- isBase = self._check_basename(pkg)
--
-- return isBase == wantBase
-
-- def _check_basename(self, pkg):
-- '''
-- If a package does not have a source rpm (If that ever
-- happens), or it does have a source RPM, and the package's name
-- is the same as the source RPM's name, then we assume it is the
-- 'base' package.
-- '''
-- basename = pkg.name
--
-- if pkg.sourcerpm:
-- basename = rpmUtils.miscutils.splitFilename(pkg.sourcerpm)[0]
--
-- if basename == pkg.name:
-- return True
--
-- return False
-
- def _is_development_repo(self, repo):
- if repo.endswith('-debuginfo'):
-@@ -1576,28 +1590,41 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- '''
- find a package based on a package id (name;version;arch;repoid)
- '''
-- # Split up the id
-- (n,idver,a,d) = self.get_package_from_id(id)
-- # get e,v,r from package id version
-- e,v,r = self._getEVR(idver)
-+ # is this an real id or just an name
-+ if len(id.split(';')) > 1:
-+ # Split up the id
-+ (n,idver,a,d) = self.get_package_from_id(id)
-+ # get e,v,r from package id version
-+ e,v,r = self._getEVR(idver)
-+ else:
-+ n = id
-+ e = v = r = a = None
- # search the rpmdb for the nevra
- pkgs = self.yumbase.rpmdb.searchNevra(name=n,epoch=e,ver=v,rel=r,arch=a)
-- # if the package is found, then return it
-+ # if the package is found, then return it (do not have to match the repo_id)
- if len(pkgs) != 0:
- return pkgs[0],True
- # search the pkgSack for the nevra
-- pkgs = self.yumbase.pkgSack.searchNevra(name=n,epoch=e,ver=v,rel=r,arch=a)
-- # if the package is found, then return it
-- if len(pkgs) != 0:
-- return pkgs[0],False
-- else:
-+ try:
-+ pkgs = self.yumbase.pkgSack.searchNevra(name=n,epoch=e,ver=v,rel=r,arch=a)
-+ except yum.Errors.RepoError,e:
-+ self.error(ERROR_REPO_NOT_AVAILABLE,str(e))
-+ # nothing found
-+ if len(pkgs) == 0:
- return None,False
-+ # one NEVRA in a single repo
-+ if len(pkgs) == 1:
-+ return pkgs[0],False
-+ # we might have the same NEVRA in multiple repos, match by repo name
-+ for pkg in pkgs:
-+ if d == pkg.repoid:
-+ return pkg,False
-+ # repo id did not match
-+ return None,False
-
- def _is_inst(self,pkg):
- return self.yumbase.rpmdb.installed(po=pkg)
-
--
--
- def _installable(self, pkg, ematch=False):
-
- """check if the package is reasonably installable, true/false"""
-@@ -1764,6 +1791,57 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- return INFO_ENHANCEMENT
- else:
- return INFO_UNKNOWN
-+ def _is_main_package(self,repo):
-+ if repo.endswith('-debuginfo'):
-+ return False
-+ if repo.endswith('-devel'):
-+ return False
-+ if repo.endswith('-libs'):
-+ return False
-+ return True
-+
-+ def _basename_filter(self,package_list):
-+ '''
-+ Filter the list so that the number of packages are reduced.
-+ This is done by only displaying gtk2 rather than gtk2-devel, gtk2-debuginfo, etc.
-+ This imlementation is done by comparing the SRPM name, and if not falling back
-+ to the first entry.
-+ We have to fall back else we don't emit packages where the SRPM does not produce a
-+ RPM with the same name, for instance, mono produces mono-core, mono-data and mono-winforms.
-+ @package_list: a (pkg,status) list of packages
-+ A new list is returned that has been filtered
-+ '''
-+ base_list = []
-+ output_list = []
-+ base_list_already_got = []
-+
-+ #find out the srpm name and add to a new array of compound data
-+ for (pkg,status) in package_list:
-+ if pkg.sourcerpm:
-+ base = rpmUtils.miscutils.splitFilename(pkg.sourcerpm)[0]
-+ base_list.append ((pkg,status,base,pkg.version));
-+ else:
-+ base_list.append ((pkg,status,'nosrpm',pkg.version));
-+
-+ #find all the packages that match thier basename name (done seporately so we get the "best" match)
-+ for (pkg,status,base,version) in base_list:
-+ if base == pkg.name and (base,version) not in base_list_already_got:
-+ output_list.append((pkg,status))
-+ base_list_already_got.append ((base,version))
-+
-+ #for all the ones not yet got, can we match against a non devel match?
-+ for (pkg,status,base,version) in base_list:
-+ if (base,version) not in base_list_already_got:
-+ if self._is_main_package(pkg.name):
-+ output_list.append((pkg,status))
-+ base_list_already_got.append ((base,version))
-+
-+ #add the remainder of the packages, which should just be the single debuginfo's
-+ for (pkg,status,base,version) in base_list:
-+ if (base,version) not in base_list_already_got:
-+ output_list.append((pkg,status))
-+ base_list_already_got.append ((base,version))
-+ return output_list
-
- def _get_obsoleted(self,name):
- obsoletes = self.yumbase.up.getObsoletesTuples( newest=1 )
-diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
-index 746da82..15c4b4f 100644
---- a/backends/zypp/pk-backend-zypp.cpp
-+++ b/backends/zypp/pk-backend-zypp.cpp
-@@ -1170,7 +1170,7 @@ backend_find_packages_thread (PkBackend *backend)
- mode = pk_backend_get_uint (backend, "mode");
-
- pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_no_percentage_updates (backend);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-
- std::vector<zypp::sat::Solvable> *v = new std::vector<zypp::sat::Solvable>;
- std::vector<zypp::sat::Solvable> *v2 = new std::vector<zypp::sat::Solvable>;
-diff --git a/client/pk-console.c b/client/pk-console.c
-index 8f69068..5a05a8e 100644
---- a/client/pk-console.c
-+++ b/client/pk-console.c
-@@ -50,7 +50,7 @@ static gboolean awaiting_space = FALSE;
- static gboolean trusted = TRUE;
- static guint timer_id = 0;
- static guint percentage_last = 0;
--static gchar *filename = NULL;
-+static gchar **files_cache = NULL;
- static PkControl *control = NULL;
- static PkClient *client = NULL;
- static PkClient *client_task = NULL;
-@@ -494,6 +494,12 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
- return g_strdup (package);
- }
-
-+ ret = pk_client_reset (client_task, error);
-+ if (ret == FALSE) {
-+ pk_warning ("failed to reset client task");
-+ return NULL;
-+ }
-+
- /* we need to resolve it */
- ret = pk_client_resolve (client_task, filter, package, error);
- if (ret == FALSE) {
-@@ -549,20 +555,93 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
- }
-
- /**
-- * pk_console_install_package:
-+ * pk_console_install_stuff:
- **/
- static gboolean
--pk_console_install_package (PkClient *client, const gchar *package, GError **error)
-+pk_console_install_stuff (PkClient *client, gchar **packages, GError **error)
- {
-- gboolean ret;
-- gchar *package_id;
-- package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NOT_INSTALLED, package, error);
-- if (package_id == NULL) {
-- g_print ("%s\n", _("Could not find a package with that name to install, or package already installed"));
-- return FALSE;
-+ gboolean ret = TRUE;
-+ gboolean is_local;
-+ gchar *package_id = NULL;
-+ gchar **package_ids = NULL;
-+ gchar **files = NULL;
-+ guint i;
-+ guint length;
-+ GPtrArray *array_packages;
-+ GPtrArray *array_files;
-+
-+ array_packages = g_ptr_array_new ();
-+ array_files = g_ptr_array_new ();
-+ length = g_strv_length (packages);
-+ for (i=2; i<length; i++) {
-+ is_local = g_file_test (packages[i], G_FILE_TEST_EXISTS);
-+ if (is_local) {
-+ g_ptr_array_add (array_files, g_strdup (packages[i]));
-+ } else {
-+ package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NOT_INSTALLED, packages[i], error);
-+ if (package_id == NULL) {
-+ g_print ("%s\n", _("Could not find a package with that name to install, or package already installed"));
-+ ret = FALSE;
-+ break;
-+ }
-+ g_ptr_array_add (array_packages, package_id);
-+ }
- }
-- ret = pk_client_install_package (client, package_id, error);
-- g_free (package_id);
-+
-+ /* one of the resolves failed */
-+ if (!ret) {
-+ pk_warning ("resolve failed");
-+ goto out;
-+ }
-+
-+
-+ /* any to process? */
-+ if (array_packages->len > 0) {
-+ /* convert to strv */
-+ package_ids = pk_ptr_array_to_argv (array_packages);
-+
-+ /* reset */
-+ ret = pk_client_reset (client, error);
-+ if (!ret) {
-+ pk_warning ("failed to reset");
-+ goto out;
-+ }
-+
-+ ret = pk_client_install_package (client, package_id, error);
-+ if (!ret) {
-+ pk_warning ("failed to install packages");
-+ goto out;
-+ }
-+ }
-+
-+ /* any to process? */
-+ if (array_files->len > 0) {
-+ /* convert to strv */
-+ files = pk_ptr_array_to_argv (array_files);
-+
-+ /* save for untrusted callback */
-+ g_strfreev (files_cache);
-+ files_cache = g_strdupv (files);
-+
-+ /* reset */
-+ ret = pk_client_reset (client, error);
-+ if (!ret) {
-+ pk_warning ("failed to reset");
-+ goto out;
-+ }
-+
-+ ret = pk_client_install_files (client, trusted, files, error);
-+ if (!ret) {
-+ pk_warning ("failed to install files");
-+ goto out;
-+ }
-+ }
-+
-+out:
-+ g_strfreev (package_ids);
-+ g_strfreev (files);
-+ g_ptr_array_free (array_files, TRUE);
-+ g_ptr_array_free (array_packages, TRUE);
- return ret;
- }
-
-@@ -570,16 +649,16 @@ pk_console_install_package (PkClient *client, const gchar *package, GError **err
- * pk_console_remove_only:
- **/
- static gboolean
--pk_console_remove_only (PkClient *client, const gchar *package_id, gboolean force, gboolean autoremove, GError **error)
-+pk_console_remove_only (PkClient *client, gchar **package_ids, gboolean force, GError **error)
- {
- gboolean ret;
-
-- pk_debug ("remove %s", package_id);
-+ pk_debug ("remove+ %s", package_ids[0]);
- ret = pk_client_reset (client, error);
- if (!ret) {
- return ret;
- }
-- return pk_client_remove_package (client, package_id, force, autoremove, error);
-+ return pk_client_remove_packages (client, package_ids, force, FALSE, error);
- }
-
- /**
-@@ -625,64 +704,99 @@ pk_console_get_prompt (const gchar *question, gboolean defaultyes)
- }
-
- /**
-- * pk_console_remove_package:
-+ * pk_console_remove_packages:
- **/
- static gboolean
--pk_console_remove_package (PkClient *client, const gchar *package, GError **error)
-+pk_console_remove_packages (PkClient *client, gchar **packages, GError **error)
- {
- gchar *package_id;
-- gboolean ret;
-- guint length;
-+ gboolean ret = TRUE;
- PkPackageItem *item;
- PkPackageId *ident;
-- guint i;
-+ guint i, j;
-+ guint size;
-+ guint length;
- gboolean remove;
-+ GPtrArray *array;
-+ gchar **package_ids = NULL;
-+ PkPackageList *list;
-+
-+ array = g_ptr_array_new ();
-+ list = pk_package_list_new ();
-+ length = g_strv_length (packages);
-+ for (i=2; i<length; i++) {
-+ package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, packages[i], error);
-+ if (package_id == NULL) {
-+ g_print ("%s:%s\n", _("Could not find a package to remove"), packages[i]);
-+ ret = FALSE;
-+ break;
-+ }
-+ g_ptr_array_add (array, g_strdup (package_id));
-+ pk_debug ("resolved to %s", package_id);
-+ g_free (package_id);
-+ }
-
-- package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, package, error);
-- if (package_id == NULL) {
-- g_print ("%s\n", _("Could not find a package with that name to remove"));
-- return FALSE;
-+ /* one of the resolves failed */
-+ if (!ret) {
-+ goto out;
- }
-
-+ /* convert to strv */
-+ package_ids = pk_ptr_array_to_argv (array);
-+
- /* are we dumb and can't check for requires? */
- if (!pk_enums_contain (roles, PK_ROLE_ENUM_GET_REQUIRES)) {
- /* no, just try to remove it without deps */
-- ret = pk_console_remove_only (client, package_id, FALSE, FALSE, error);
-- g_free (package_id);
-- return ret;
-+ ret = pk_console_remove_only (client, package_ids, FALSE, error);
-+ goto out;
- }
-
-- /* see if any packages require this one */
-- ret = pk_client_reset (client_task, error);
-- if (!ret) {
-- pk_warning ("failed to reset");
-- return FALSE;
-+ /* get the requires packages for each package_id */
-+ length = g_strv_length (package_ids);
-+ for (i=0; i<length; i++) {
-+ ret = pk_client_reset (client_task, error);
-+ if (!ret) {
-+ pk_warning ("failed to reset");
-+ break;
-+ }
-+
-+ pk_debug ("Getting installed requires for %s", package_ids[i]);
-+ /* see if any packages require this one */
-+ ret = pk_client_get_requires (client_task, PK_FILTER_ENUM_INSTALLED, package_ids[i], TRUE, error);
-+ if (!ret) {
-+ pk_warning ("failed to get requires");
-+ break;
-+ }
-+
-+ /* see how many packages there are */
-+ size = pk_client_package_buffer_get_size (client_task);
-+ for (j=0; j<size; j++) {
-+ item = pk_client_package_buffer_get_item (client_task, j);
-+ pk_package_list_add_item (list, item);
-+ }
- }
-
-- pk_debug ("Getting installed requires for %s", package_id);
-- ret = pk_client_get_requires (client_task, PK_FILTER_ENUM_INSTALLED, package_id, TRUE, error);
-+ /* one of the get-requires failed */
- if (!ret) {
-- return FALSE;
-+ goto out;
- }
-
-- /* see how many packages there are */
-- length = pk_client_package_buffer_get_size (client_task);
--
- /* if there are no required packages, just do the remove */
-+ length = pk_package_list_get_size (list);
- if (length == 0) {
- pk_debug ("no requires");
-- ret = pk_console_remove_only (client, package_id, FALSE, FALSE, error);
-- g_free (package_id);
-- return ret;
-+ ret = pk_console_remove_only (client, package_ids, FALSE, error);
-+ goto out;
- }
-
-+
- /* present this to the user */
- if (awaiting_space) {
- g_print ("\n");
- }
- g_print ("%s:\n", _("The following packages have to be removed"));
- for (i=0; i<length; i++) {
-- item = pk_client_package_buffer_get_item (client_task, i);
-+ item = pk_package_list_get_item (list, i);
- ident = pk_package_id_new_from_string (item->package_id);
- g_print ("%i\t%s-%s\n", i, ident->name, ident->version);
- pk_package_id_free (ident);
-@@ -694,14 +808,17 @@ pk_console_remove_package (PkClient *client, const gchar *package, GError **erro
- /* we chickened out */
- if (remove == FALSE) {
- g_print ("%s\n", _("Cancelled!"));
-- g_free (package_id);
-- return FALSE;
-+ ret = FALSE;
-+ goto out;
- }
-
- /* remove all the stuff */
-- ret = pk_console_remove_only (client, package_id, TRUE, FALSE, error);
-- g_free (package_id);
-+ ret = pk_console_remove_only (client, package_ids, TRUE, error);
-
-+out:
-+ g_object_unref (list);
-+ g_strfreev (package_ids);
-+ g_ptr_array_free (array, TRUE);
- return ret;
- }
-
-@@ -840,7 +957,7 @@ pk_console_error_code_cb (PkClient *client, PkErrorCodeEnum error_code, const gc
- error_code == PK_ERROR_ENUM_MISSING_GPG_SIGNATURE && trusted) {
- pk_debug ("need to try again with trusted FALSE");
- trusted = FALSE;
-- ret = pk_client_install_file (client_install_files, trusted, filename, &error);
-+ ret = pk_client_install_files (client_install_files, trusted, files_cache, &error);
- /* we succeeded, so wait for the requeue */
- if (!ret) {
- pk_warning ("failed to install file second time: %s", error->message);
-@@ -1153,7 +1270,6 @@ main (int argc, char *argv[])
- const gchar *value = NULL;
- const gchar *details = NULL;
- const gchar *parameter = NULL;
-- PkRoleEnum roles;
- PkGroupEnum groups;
- gchar *text;
- ret = FALSE;
-@@ -1324,15 +1440,7 @@ main (int argc, char *argv[])
- g_print (_("You need to specify a package or file to install"));
- goto out;
- }
-- /* is it a local file? */
-- ret = g_file_test (value, G_FILE_TEST_EXISTS);
-- if (ret) {
-- ret = pk_client_install_file (client, trusted, value, &error);
-- /* we need this for the untrusted try */
-- filename = g_strdup (value);
-- } else {
-- ret = pk_console_install_package (client, value, &error);
-- }
-+ ret = pk_console_install_stuff (client, argv, &error);
-
- } else if (strcmp (mode, "install-sig") == 0) {
- if (value == NULL || details == NULL || parameter == NULL) {
-@@ -1346,7 +1454,7 @@ main (int argc, char *argv[])
- g_print (_("You need to specify a package to remove"));
- goto out;
- }
-- ret = pk_console_remove_package (client, value, &error);
-+ ret = pk_console_remove_packages (client, argv, &error);
-
- } else if (strcmp (mode, "accept-eula") == 0) {
- if (value == NULL) {
-@@ -1465,9 +1573,9 @@ main (int argc, char *argv[])
- ret = pk_client_get_packages (client, filters, &error);
-
- } else if (strcmp (mode, "get-actions") == 0) {
-- roles = pk_control_get_actions (control);
- text = pk_role_enums_to_text (roles);
-- g_print ("roles=%s\n", text);
-+ g_strdelimit (text, ";", '\n');
-+ g_print ("%s\n", text);
- g_free (text);
- maybe_sync = FALSE;
- /* these can never fail */
-@@ -1476,7 +1584,8 @@ main (int argc, char *argv[])
- } else if (strcmp (mode, "get-filters") == 0) {
- filters = pk_control_get_filters (control);
- text = pk_filter_enums_to_text (filters);
-- g_print ("filters=%s\n", text);
-+ g_strdelimit (text, ";", '\n');
-+ g_print ("%s\n", text);
- g_free (text);
- maybe_sync = FALSE;
- /* these can never fail */
-@@ -1485,7 +1594,8 @@ main (int argc, char *argv[])
- } else if (strcmp (mode, "get-groups") == 0) {
- groups = pk_control_get_groups (control);
- text = pk_group_enums_to_text (groups);
-- g_print ("groups=%s\n", text);
-+ g_strdelimit (text, ";", '\n');
-+ g_print ("%s\n", text);
- g_free (text);
- maybe_sync = FALSE;
- /* these can never fail */
-@@ -1525,7 +1635,7 @@ out:
- g_free (options_help);
- g_free (filter);
- g_free (summary);
-- g_free (filename);
-+ g_strfreev (files_cache);
- g_object_unref (control);
- g_object_unref (client);
- g_object_unref (client_task);
-diff --git a/configure.ac b/configure.ac
-index 9d734e1..f614d2b 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -535,7 +535,7 @@ if test x$enable_box = xyes; then
- fi
-
- if test x$enable_opkg = xyes; then
-- PKG_CHECK_MODULES(OPKG, libopkg = 0.1.3)
-+ PKG_CHECK_MODULES(OPKG, libopkg = 0.1.4)
- AC_SUBST(OPKG_CFLAGS)
- AC_SUBST(OPKG_LIBS)
- fi
-diff --git a/contrib/yum-packagekit/refresh-packagekit.py b/contrib/yum-packagekit/refresh-packagekit.py
-index 9c0bdf4..b440539 100644
---- a/contrib/yum-packagekit/refresh-packagekit.py
-+++ b/contrib/yum-packagekit/refresh-packagekit.py
-@@ -35,7 +35,7 @@ def posttrans_hook(conduit):
- '/org/freedesktop/PackageKit')
- packagekit_iface = dbus.Interface(packagekit_proxy, 'org.freedesktop.PackageKit')
- packagekit_iface.StateHasChanged('posttrans')
-- except dbus.DBusException, e:
-+ except Exception, e:
- conduit.info(2, "Unable to send message to PackageKit")
- conduit.info(6, "%s" %(e,))
-
-diff --git a/data/tests/Makefile.am b/data/tests/Makefile.am
-index d15dd6c..6935e66 100644
---- a/data/tests/Makefile.am
-+++ b/data/tests/Makefile.am
-@@ -5,6 +5,7 @@ NULL =
-
- TEST_FILES = \
- pk-spawn-test.sh \
-+ pk-spawn-proxy.sh \
- pk-spawn-test-sigquit.sh \
- pk-spawn-test-profiling.sh \
- $(NULL)
-diff --git a/data/tests/pk-spawn-proxy.sh b/data/tests/pk-spawn-proxy.sh
-new file mode 100755
-index 0000000..57774f1
---- /dev/null
-+++ b/data/tests/pk-spawn-proxy.sh
-@@ -0,0 +1,20 @@
-+#!/bin/bash
-+# Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
-+# Licensed under the GNU General Public License Version 2
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+if [ -z "${http_proxy}" ]; then
-+ echo "no http proxy"
-+ exit 1
-+fi
-+
-+if [ -z "${ftp_proxy}" ]; then
-+ echo "no ftp proxy"
-+ exit 1
-+fi
-+
-+echo -e "percentage\t100"
-+
-diff --git a/docs/html/index.html b/docs/html/index.html
-index 7270eb7..d60f825 100644
---- a/docs/html/index.html
-+++ b/docs/html/index.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">PackageKit Main Page</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-@@ -20,10 +20,10 @@
- <table align="center" cellpadding="5px" border="0">
-
- <tr>
-- <td align="center"><a href="pk-intro.html"><img src="img/large-accessories-text-editor.png" width="128" alt="[img]"/></a></td>
-- <td align="center"><a href="pk-using.html"><img src="img/large-preferences-system.png" width="128" alt="[img]"/></a></td>
-- <td align="center"><a href="pk-download.html"><img src="img/large-dialog-information.png" width="128" alt="[img]"/></a></td>
-- <td align="center"><a href="pk-screenshots.html"><img src="img/large-emblem-photos.png" width="128" alt="[img]"/></a></td>
-+ <td align="center"><a href="pk-intro.html"><img src="img/large-accessories-text-editor.png" width="128" alt=""/></a></td>
-+ <td align="center"><a href="pk-using.html"><img src="img/large-preferences-system.png" width="128" alt=""/></a></td>
-+ <td align="center"><a href="pk-download.html"><img src="img/large-dialog-information.png" width="128" alt=""/></a></td>
-+ <td align="center"><a href="pk-screenshots.html"><img src="img/large-emblem-photos.png" width="128" alt=""/></a></td>
- </tr>
- <tr>
- <td><p class="indextitle"><a href="pk-intro.html" class="indextitle">What is<br/>PackageKit?</a></p></td>
-@@ -32,10 +32,10 @@
- <td><p class="indextitle"><a href="pk-screenshots.html" class="indextitle">Screenshots</a></p></td>
- </tr>
- <tr>
-- <td align="center"><a href="pk-authors.html"><img src="img/large-authors.png" width="128" alt="[img]"/></a></td>
-- <td align="center"><a href="pk-bugs.html"><img src="img/large-applications-development.png" width="128" alt="[img]"/></a></td>
-- <td align="center"><a href="pk-help.html"><img src="img/large-system-users.png" width="128" alt="[img]"/></a></td>
-- <td align="center"><a href="pk-faq.html"><img src="img/large-help-browser.png" width="128" alt="[img]"/></a></td>
-+ <td align="center"><a href="pk-authors.html"><img src="img/large-authors.png" width="128" alt=""/></a></td>
-+ <td align="center"><a href="pk-bugs.html"><img src="img/large-applications-development.png" width="128" alt=""/></a></td>
-+ <td align="center"><a href="pk-help.html"><img src="img/large-system-users.png" width="128" alt=""/></a></td>
-+ <td align="center"><a href="pk-faq.html"><img src="img/large-help-browser.png" width="128" alt=""/></a></td>
- </tr>
- <tr>
- <td><p class="indextitle"><a href="pk-authors.html" class="indextitle">Who develops<br/>PackageKit?</a></p></td>
-diff --git a/docs/html/pk-authors.html b/docs/html/pk-authors.html
-index 08289ad..607a7a4 100644
---- a/docs/html/pk-authors.html
-+++ b/docs/html/pk-authors.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">Who develops PackageKit?</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-@@ -22,7 +22,7 @@
- <table cellpadding="10">
- <tr>
- <td>
-- <img src="img/author-hughsie.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-hughsie.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Richard Hughes</h2>
-@@ -48,7 +48,7 @@
-
- <tr>
- <td>
-- <img src="img/author-kenvandine.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-kenvandine.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Ken VanDine</h2>
-@@ -66,7 +66,7 @@
-
- <tr>
- <td>
-- <img src="img/author-btimothy.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-btimothy.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Boyd Timothy</h2>
-@@ -84,7 +84,7 @@
-
- <tr>
- <td>
-- <img src="img/author-rnorwood.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-rnorwood.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Robin Norwood</h2>
-@@ -101,7 +101,7 @@
-
- <tr>
- <td>
-- <img src="img/author-tomparker.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-tomparker.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Tom Parker</h2>
-@@ -118,7 +118,7 @@
-
- <tr>
- <td>
-- <img src="img/author-timlau.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-timlau.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Tim Lauridsen</h2>
-@@ -139,7 +139,7 @@
-
- <tr>
- <td>
-- <img src="img/author-lmacken.png" alt="[img]"/>
-+ <img src="img/author-lmacken.png" alt=""/>
- </td>
- <td>
- <h2>Luke Macken</h2>
-@@ -154,7 +154,7 @@
-
- <tr>
- <td>
-- <img src="img/author-grzegorzdabrowski.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-grzegorzdabrowski.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Grzegorz Dąbrowski</h2>
-@@ -173,7 +173,7 @@
-
- <tr>
- <td>
-- <img src="img/author-caglar.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-caglar.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>S.Çağlar Onur</h2>
-@@ -195,7 +195,7 @@
-
- <tr>
- <td>
-- <img src="img/author-elliot.png" alt="[img]"/>
-+ <img src="img/author-elliot.png" alt=""/>
- </td>
- <td>
- <h2>Elliot Peele</h2>
-@@ -210,7 +210,7 @@
-
- <tr>
- <td>
-- <img src="img/author-jbowes.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-jbowes.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>James Bowes</h2>
-@@ -227,7 +227,7 @@
-
- <tr>
- <td>
-- <img src="img/author-unknown.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-unknown.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Thomas Wood</h2>
-@@ -247,7 +247,7 @@
-
- <tr>
- <td>
-- <img src="img/author-unknown.png" alt="[img]"/><!-- image should be 120px wide -->
-+ <img src="img/author-unknown.png" alt=""/><!-- image should be 120px wide -->
- </td>
- <td>
- <h2>Scott Reeves</h2>
-diff --git a/docs/html/pk-bugs.html b/docs/html/pk-bugs.html
-index 89f7c48..2ee12ea 100644
---- a/docs/html/pk-bugs.html
-+++ b/docs/html/pk-bugs.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">Reporting Bugs</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-diff --git a/docs/html/pk-download.html b/docs/html/pk-download.html
-index 6f796b8..0cdc85c 100644
---- a/docs/html/pk-download.html
-+++ b/docs/html/pk-download.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">Where can I download it?</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-diff --git a/docs/html/pk-faq.html b/docs/html/pk-faq.html
-index a25e2b7..efa8344 100644
---- a/docs/html/pk-faq.html
-+++ b/docs/html/pk-faq.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><center><img src="img/packagekit.png" alt="[img]"/></center></td>
-+ <td><center><img src="img/packagekit.png" alt=""/></center></td>
- <td width="95%" valign="middle"><p class="title">Frequently Asked Questions</p></td>
-- <td><center><img src="img/packagekit.png" alt="[img]"/></center></td>
-+ <td><center><img src="img/packagekit.png" alt=""/></center></td>
- </tr>
- </table>
-
-@@ -22,6 +22,7 @@
- <h2>Table Of Contents</h2>
- <ul>
- <li><a href="#how-complete">How complete are the backends?</a></li>
-+<li><a href="#run-as-root">When run as root, gpk-application and pkcon do not work!</a></li>
- <li><a href="#session-system">Why is there a session service and and a system service?</a></li>
- <li><a href="#session-methods">How do I use PackageKit in my application?</a></li>
- <li><a href="#rawhide-updates">Why don't I get update details with Fedora Rawhide?</a></li>
-@@ -565,6 +566,19 @@
- </table>
-
- <hr>
-+<h3><a name="run-as-root">When run as root, <code>gpk-application</code> and <code>pkcon</code> do not work!</a></h3>
-+<p>
-+GTK+ tools should not be run as the root user, <b>PERIOD</b>.
-+Any GTK+ program run as the root user is a massive security hole -- GTK+ just isn't designed with
-+this in mind.
-+There are <b>numerous</b> attack vectors when running as root, and programs shouldn't do such
-+insane and insecure things.
-+</p>
-+<p>
-+Please see <a href="http://www.gtk.org/setuid.html">the GTK+ explanation</a> for more rationale.
-+</p>
-+
-+<hr>
- <h3><a name="session-system">Why is there a session service <b>and</b> and a system service?</a></h3>
- <p>
- PackageKit runs a process <code>packagekitd</code> that is a daemon that runs per-system.
-diff --git a/docs/html/pk-help.html b/docs/html/pk-help.html
-index 5b44d50..5bc7827 100644
---- a/docs/html/pk-help.html
-+++ b/docs/html/pk-help.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">How can I help?</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-@@ -72,9 +72,9 @@ as for instructions!
- <b>0.2.2</b> - To be released June 2008
- </p>
- <ul>
--<li>Multiple package install and remove from pkcon <i>(0%)</i></li>
-+<li>Network proxy server support <i>(70%)</i></li>
-+<li>Multiple package install and remove from pkcon <i>(80%)</i></li>
- <li>NetworkManager integration so we can detect GPRS (and modem) connections. <i>(10%)</i></li>
--<li>Filter for source packages. <i>(0%)</i></li>
- </ul>
- <p>
- <b>0.2.3</b> - To be released July 2008
-@@ -84,6 +84,12 @@ as for instructions!
- <li>Multiple package installs from gpk-application <i>(0%)</i></li>
- <li>Ignoring packages from the update viewer per-session <i>(10%)</i></li>
- </ul>
-+<p>
-+<b>0.3.0</b> - To be released December 2008
-+</p>
-+<ul>
-+<li>More composite types <code>s</code> to <code>as</code> <i>(0%)</i></li>
-+</ul>
-
- <p>Back to the <a href="index.html">main page</a></p>
-
-diff --git a/docs/html/pk-intro.html b/docs/html/pk-intro.html
-index c42be21..64f72fc 100644
---- a/docs/html/pk-intro.html
-+++ b/docs/html/pk-intro.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">What is PackageKit?</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-diff --git a/docs/html/pk-screenshots.html b/docs/html/pk-screenshots.html
-index 78bd01f..5c7d4fa 100644
---- a/docs/html/pk-screenshots.html
-+++ b/docs/html/pk-screenshots.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><center><img src="img/packagekit.png" alt="[img]"/></center></td>
-+ <td><center><img src="img/packagekit.png" alt=""/></center></td>
- <td width="95%" valign="middle"><p class="title">Screenshots</p></td>
-- <td><center><img src="img/packagekit.png" alt="[img]"/></center></td>
-+ <td><center><img src="img/packagekit.png" alt=""/></center></td>
- </tr>
- </table>
-
-@@ -26,77 +26,77 @@
-
- <h1><a name="gnome">GNOME Screenshots</a></h1>
-
--<center><img src="img/gpk-application-search.png" alt="[img]"/></center>
-+<center><img src="img/gpk-application-search.png" alt=""/></center>
- <p class="caption">Add/Remove Software search</p>
-
--<center><img src="img/gpk-application-groups.png" alt="[img]"/></center>
-+<center><img src="img/gpk-application-groups.png" alt=""/></center>
- <p class="caption">Add/Remove Software groups</p>
-
--<center><img src="img/gpk-log.png" alt="[img]"/></center>
-+<center><img src="img/gpk-log.png" alt=""/></center>
- <p class="caption">Transaction viewer</p>
-
--<center><img src="img/gpk-updates-overview.png" alt="[img]"/></center>
-+<center><img src="img/gpk-updates-overview.png" alt=""/></center>
- <p class="caption">Update viewer overview</p>
-
--<center><img src="img/gpk-updates.png" alt="[img]"/></center>
-+<center><img src="img/gpk-updates.png" alt=""/></center>
- <p class="caption">Update viewer</p>
-
--<center><img src="img/gpk-prefs.png" alt="[img]"/></center>
-+<center><img src="img/gpk-prefs.png" alt=""/></center>
- <p class="caption">Auto update preferences</p>
-
--<center><img src="img/gpk-progress.png" alt="[img]"/></center>
-+<center><img src="img/gpk-progress.png" alt=""/></center>
- <p class="caption">Progress dialog</p>
-
--<center><img src="img/gpk-added-deps.png" alt="[img]"/></center>
-+<center><img src="img/gpk-added-deps.png" alt=""/></center>
- <p class="caption">Added check warning</p>
-
--<center><img src="img/gpk-eula.png" alt="[img]"/></center>
-+<center><img src="img/gpk-eula.png" alt=""/></center>
- <p class="caption">EULA dialog</p>
-
--<center><img src="img/gpk-remove-confirm.png" alt="[img]"/></center>
-+<center><img src="img/gpk-remove-confirm.png" alt=""/></center>
- <p class="caption">Remove check warning</p>
-
--<center><img src="img/gpk-repo-auth.png" alt="[img]"/></center>
-+<center><img src="img/gpk-repo-auth.png" alt=""/></center>
- <p class="caption">Repository authentication</p>
-
--<center><img src="img/gpk-repo.png" alt="[img]"/></center>
-+<center><img src="img/gpk-repo.png" alt=""/></center>
- <p class="caption">Repository viewer</p>
-
--<center><img src="img/gpk-backend-status.png" alt="[img]"/></center>
-+<center><img src="img/gpk-backend-status.png" alt=""/></center>
- <p class="caption">PackageKit backend status</p>
-
--<center><img src="img/gpk-updates-warning.png" alt="[img]"/></center>
-+<center><img src="img/gpk-updates-warning.png" alt=""/></center>
- <p class="caption">Libnotify updates warning</p>
-
--<center><img src="img/gpk-waiting.png" alt="[img]"/></center>
-+<center><img src="img/gpk-waiting.png" alt=""/></center>
- <p class="caption">Tasks waiting</p>
-
--<center><img src="img/gpk-battery.png" alt="[img]"/></center>
-+<center><img src="img/gpk-battery.png" alt=""/></center>
- <p class="caption">Intergration with gnome-power-manager</p>
-
--<center><img src="img/gpk-inhibit.png" alt="[img]"/></center>
-+<center><img src="img/gpk-inhibit.png" alt=""/></center>
- <p class="caption">Inhibit with gnome-power-manager</p>
-
--<center><img src="img/gpk-require-restart.png" alt="[img]"/></center>
-+<center><img src="img/gpk-require-restart.png" alt=""/></center>
- <p class="caption">We sometimes need to do a restart</p>
-
--<center><img src="img/gpk-auto-update.png" alt="[img]"/></center>
-+<center><img src="img/gpk-auto-update.png" alt=""/></center>
- <p class="caption">Auto update install dialog</p>
-
- <h1><a name="kde">KDE Screenshots</a></h1>
-
--<center><img src="img/kpk-search.png" alt="[img]"/></center>
-+<center><img src="img/kpk-search.png" alt=""/></center>
- <p class="caption">KPackageKit Searching</p>
-
--<center><img src="img/kpk-information.png" alt="[img]"/></center>
-+<center><img src="img/kpk-information.png" alt=""/></center>
- <p class="caption">KPackageKit Package Information</p>
-
--<center><img src="img/pk-opensuse-updater.png" alt="[img]"/></center>
-+<center><img src="img/pk-opensuse-updater.png" alt=""/></center>
- <p class="caption">OpenSuse Updater</p>
-
- <h1><a name="moko">OpenMoko Screenshots</a></h1>
-
--<center><img src="img/assassin.png" alt="[img]"/></center>
-+<center><img src="img/assassin.png" alt=""/></center>
- <p class="caption">Assassin</p>
-
- <p>Back to the <a href="index.html">main page</a></p>
-diff --git a/docs/html/pk-using.html b/docs/html/pk-using.html
-index cc455c7..b2b028e 100644
---- a/docs/html/pk-using.html
-+++ b/docs/html/pk-using.html
-@@ -9,9 +9,9 @@
-
- <table align="center" class="title">
- <tr>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- <td width="95%" valign="middle"><p class="title">How do I use PackageKit?</p></td>
-- <td><img src="img/packagekit.png" alt="[img]"/></td>
-+ <td><img src="img/packagekit.png" alt=""/></td>
- </tr>
- </table>
-
-diff --git a/docs/spec/pk-concepts.xml b/docs/spec/pk-concepts.xml
-index 312c5a4..0b75b10 100644
---- a/docs/spec/pk-concepts.xml
-+++ b/docs/spec/pk-concepts.xml
-@@ -127,6 +127,13 @@
- This allows the used to choose non-native packages if a multi-lib policy is allowed.
- </entry>
- </row>
-+ <row>
-+ <entry><literal>source</literal> or <literal>~source</literal></entry>
-+ <entry>
-+ The source filter will only return source packages.
-+ These are typically useful when rebuilding other packages.
-+ </entry>
-+ </row>
- </tbody>
- </tgroup>
- </informaltable>
-diff --git a/etc/PackageKit.conf.in b/etc/PackageKit.conf.in
-index a6af99b..8f9bd57 100644
---- a/etc/PackageKit.conf.in
-+++ b/etc/PackageKit.conf.in
-@@ -31,3 +31,13 @@ ShutdownTimeout=300
- # default=@defaultbackend@
- DefaultBackend=@defaultbackend@
-
-+# Proxy settings, uncomment as required
-+#
-+# NOTE: PackageKit does not use these settings, they are passed to backends.
-+# Backends may ignore these values, or they may be updated from the session.
-+#
-+# They are in the format username:password@server:port
-+#
-+# ProxyHTTP=username:password@server.lan:8080
-+# ProxyFTP=username:password@server.lan:21
-+
-diff --git a/libpackagekit/Makefile.am b/libpackagekit/Makefile.am
-index 6b8c6b8..aeafe44 100644
---- a/libpackagekit/Makefile.am
-+++ b/libpackagekit/Makefile.am
-@@ -37,6 +37,7 @@ libpackagekit_include_HEADERS = \
- pk-connection.h \
- pk-package-id.h \
- pk-package-ids.h \
-+ pk-package-item.h \
- pk-package-list.h \
- pk-enum.h \
- pk-common.h \
-@@ -59,6 +60,8 @@ libpackagekit_la_SOURCES = \
- pk-package-id.h \
- pk-package-ids.c \
- pk-package-ids.h \
-+ pk-package-item.c \
-+ pk-package-item.h \
- pk-package-list.c \
- pk-package-list.h \
- pk-enum.h \
-diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
-index b5b6ac3..5743dcb 100644
---- a/libpackagekit/pk-enum.c
-+++ b/libpackagekit/pk-enum.c
-@@ -193,6 +193,8 @@ static PkEnumMatch enum_filter[] = {
- {PK_FILTER_ENUM_NOT_NEWEST, "~newest"},
- {PK_FILTER_ENUM_ARCH, "arch"},
- {PK_FILTER_ENUM_NOT_ARCH, "~arch"},
-+ {PK_FILTER_ENUM_SOURCE, "source"},
-+ {PK_FILTER_ENUM_NOT_SOURCE, "~source"},
- {0, NULL}
- };
-
-diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
-index 33e8a91..e616b64 100644
---- a/libpackagekit/pk-enum.h
-+++ b/libpackagekit/pk-enum.h
-@@ -182,7 +182,9 @@ typedef enum {
- PK_FILTER_ENUM_NOT_NEWEST = 1 << 15,
- PK_FILTER_ENUM_ARCH = 1 << 16,
- PK_FILTER_ENUM_NOT_ARCH = 1 << 17,
-- PK_FILTER_ENUM_UNKNOWN = 1 << 18
-+ PK_FILTER_ENUM_SOURCE = 1 << 18,
-+ PK_FILTER_ENUM_NOT_SOURCE = 1 << 19,
-+ PK_FILTER_ENUM_UNKNOWN = 1 << 20
- } PkFilterEnum;
-
- /**
-diff --git a/libpackagekit/pk-package-item.c b/libpackagekit/pk-package-item.c
-new file mode 100644
-index 0000000..87905dc
---- /dev/null
-+++ b/libpackagekit/pk-package-item.c
-@@ -0,0 +1,190 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007-2008 Richard Hughes <richard@hughsie.com>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+/**
-+ * SECTION:pk-package-item
-+ * @short_description: A cached Package structure
-+ *
-+ * These provide a way to query and store a single package.
-+ */
-+
-+#include "config.h"
-+
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <time.h>
-+#include <errno.h>
-+
-+#include <string.h>
-+#include <sys/time.h>
-+#include <sys/types.h>
-+#ifdef HAVE_UNISTD_H
-+#include <unistd.h>
-+#endif /* HAVE_UNISTD_H */
-+
-+#include <glib/gi18n.h>
-+
-+#include "pk-debug.h"
-+#include "pk-common.h"
-+#include "pk-package-item.h"
-+
-+/**
-+ * pk_package_item_new:
-+ **/
-+PkPackageItem *
-+pk_package_item_new (PkInfoEnum info, const gchar *package_id, const gchar *summary)
-+{
-+ PkPackageItem *item;
-+
-+ g_return_val_if_fail (package_id != NULL, FALSE);
-+
-+ pk_debug ("adding to cache item package %s, %s, %s", pk_info_enum_to_text (info), package_id, summary);
-+ item = g_new0 (PkPackageItem, 1);
-+ item->info = info;
-+ item->package_id = g_strdup (package_id);
-+ item->summary = g_strdup (summary);
-+ return item;
-+}
-+
-+/**
-+ * pk_package_item_free:
-+ **/
-+gboolean
-+pk_package_item_free (PkPackageItem *item)
-+{
-+ if (item == NULL) {
-+ return FALSE;
-+ }
-+ g_free (item->package_id);
-+ g_free (item->summary);
-+ g_free (item);
-+ return TRUE;
-+}
-+
-+/**
-+ * pk_package_item_equal:
-+ *
-+ * Only compares the package_id's and the info enum
-+ **/
-+gboolean
-+pk_package_item_equal (PkPackageItem *item1, PkPackageItem *item2)
-+{
-+ if (item1 == NULL || item2 == NULL) {
-+ return FALSE;
-+ }
-+ return (item1->info == item2->info &&
-+ pk_strequal (item1->package_id, item2->package_id));
-+}
-+
-+/**
-+ * pk_package_item_copy:
-+ *
-+ * Copy a PkPackageItem
-+ **/
-+PkPackageItem *
-+pk_package_item_copy (PkPackageItem *item)
-+{
-+ g_return_val_if_fail (item != NULL, NULL);
-+ return pk_package_item_new (item->info, item->package_id, item->summary);
-+}
-+
-+/***************************************************************************
-+ *** MAKE CHECK TESTS ***
-+ ***************************************************************************/
-+#ifdef PK_BUILD_TESTS
-+#include <libselftest.h>
-+
-+void
-+libst_package_item (LibSelfTest *test)
-+{
-+ PkPackageItem *item1;
-+ PkPackageItem *item2;
-+ PkPackageItem *item3;
-+ gboolean ret;
-+
-+ if (libst_start (test, "PkPackageItem", CLASS_AUTO) == FALSE) {
-+ return;
-+ }
-+
-+ /************************************************************/
-+ libst_title (test, "add entry");
-+ item1 = pk_package_item_new (PK_INFO_ENUM_INSTALLED, "gnome;1.23;i386;data", "GNOME!");
-+ if (item1 != NULL) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
-+ /************************************************************/
-+ libst_title (test, "add entry");
-+ item2 = pk_package_item_new (PK_INFO_ENUM_INSTALLED, "gnome;1.23;i386;data", "GNOME foo!");
-+ if (item2 != NULL) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
-+ /************************************************************/
-+ libst_title (test, "copy entry");
-+ item3 = pk_package_item_copy (item2);
-+ if (item3 != NULL) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
-+ /************************************************************/
-+ libst_title (test, "check equal");
-+ ret = pk_package_item_equal (item1, item3);
-+ if (ret) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
-+ pk_package_item_free (item2);
-+ pk_package_item_free (item3);
-+
-+ /************************************************************/
-+ libst_title (test, "add entry");
-+ item2 = pk_package_item_new (PK_INFO_ENUM_INSTALLED, "gnome-do;1.23;i386;data", "GNOME doo!");
-+ if (item2 != NULL) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
-+ /************************************************************/
-+ libst_title (test, "check !equal");
-+ ret = pk_package_item_equal (item1, item2);
-+ if (!ret) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
-+ pk_package_item_free (item1);
-+ pk_package_item_free (item2);
-+
-+ libst_end (test);
-+}
-+#endif
-+
-diff --git a/libpackagekit/pk-package-item.h b/libpackagekit/pk-package-item.h
-new file mode 100644
-index 0000000..c41a6ea
---- /dev/null
-+++ b/libpackagekit/pk-package-item.h
-@@ -0,0 +1,48 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#ifndef __PK_PACKAGE_ITEM_H
-+#define __PK_PACKAGE_ITEM_H
-+
-+#include <glib-object.h>
-+#include <pk-enum.h>
-+
-+/**
-+ * PkPackageItem:
-+ *
-+ * A cached store for the complete Package object
-+ */
-+typedef struct {
-+ PkInfoEnum info;
-+ gchar *package_id;
-+ gchar *summary;
-+} PkPackageItem;
-+
-+PkPackageItem *pk_package_item_new (PkInfoEnum info,
-+ const gchar *package_id,
-+ const gchar *summary);
-+gboolean pk_package_item_free (PkPackageItem *item);
-+PkPackageItem *pk_package_item_copy (PkPackageItem *item);
-+gboolean pk_package_item_equal (PkPackageItem *item1,
-+ PkPackageItem *item2);
-+
-+#endif /* __PK_PACKAGE_ITEM_H */
-+
-diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
-index b0a1a71..5d95e1b 100644
---- a/libpackagekit/pk-package-list.c
-+++ b/libpackagekit/pk-package-list.c
-@@ -45,6 +45,7 @@
- #include "pk-debug.h"
- #include "pk-common.h"
- #include "pk-package-id.h"
-+#include "pk-package-item.h"
- #include "pk-package-list.h"
-
- static void pk_package_list_class_init (PkPackageListClass *klass);
-@@ -77,16 +78,42 @@ pk_package_list_add (PkPackageList *plist, PkInfoEnum info, const gchar *package
- g_return_val_if_fail (package_id != NULL, FALSE);
-
- pk_debug ("adding to cache array package %s, %s, %s", pk_info_enum_to_text (info), package_id, summary);
-- item = g_new0 (PkPackageItem, 1);
-- item->info = info;
-- item->package_id = g_strdup (package_id);
-- item->summary = g_strdup (summary);
-+ item = pk_package_item_new (info, package_id, summary);
- g_ptr_array_add (plist->priv->array, item);
-
- return TRUE;
- }
-
- /**
-+ * pk_package_list_add_item:
-+ *
-+ * Makes a deep copy, and adds to the array
-+ **/
-+gboolean
-+pk_package_list_add_item (PkPackageList *plist, PkPackageItem *item)
-+{
-+ gboolean ret;
-+ PkPackageItem *item_new;
-+
-+ g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
-+ g_return_val_if_fail (item != NULL, FALSE);
-+
-+ ret = pk_package_list_contains_item (plist, item);
-+ if (ret) {
-+ pk_debug ("already added item");
-+ return FALSE;
-+ }
-+
-+ pk_debug ("adding to cache array package %s, %s, %s",
-+ pk_info_enum_to_text (item->info), item->package_id, item->summary);
-+
-+ item_new = pk_package_item_copy (item);
-+ g_ptr_array_add (plist->priv->array, item_new);
-+
-+ return TRUE;
-+}
-+
-+/**
- * pk_package_list_get_string:
- **/
- gchar *
-@@ -152,9 +179,7 @@ pk_package_list_clear (PkPackageList *plist)
-
- while (plist->priv->array->len > 0) {
- item = g_ptr_array_index (plist->priv->array, 0);
-- g_free (item->package_id);
-- g_free (item->summary);
-- g_free (item);
-+ pk_package_item_free (item);
- g_ptr_array_remove_index_fast (plist->priv->array, 0);
- }
- return TRUE;
-@@ -186,6 +211,31 @@ pk_package_list_contains (PkPackageList *plist, const gchar *package_id)
- }
-
- /**
-+ * pk_package_list_contains_item:
-+ **/
-+gboolean
-+pk_package_list_contains_item (PkPackageList *plist, PkPackageItem *item)
-+{
-+ PkPackageItem *item_temp;
-+ guint i;
-+ guint length;
-+ gboolean ret = FALSE;
-+
-+ g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
-+ g_return_val_if_fail (item != NULL, FALSE);
-+
-+ length = plist->priv->array->len;
-+ for (i=0; i<length; i++) {
-+ item_temp = g_ptr_array_index (plist->priv->array, i);
-+ ret = pk_package_item_equal (item_temp, item);
-+ if (ret) {
-+ break;
-+ }
-+ }
-+ return ret;
-+}
-+
-+/**
- * pk_package_list_class_init:
- * @klass: The PkPackageListClass
- **/
-diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
-index 9178f77..9734af4 100644
---- a/libpackagekit/pk-package-list.h
-+++ b/libpackagekit/pk-package-list.h
-@@ -25,6 +25,8 @@
- #include <glib-object.h>
- #include <pk-enum.h>
-
-+#include "pk-package-item.h"
-+
- G_BEGIN_DECLS
-
- #define PK_TYPE_PACKAGE_LIST (pk_package_list_get_type ())
-@@ -49,26 +51,18 @@ struct _PkPackageListClass
- GObjectClass parent_class;
- };
-
--/**
-- * PkPackageItem:
-- *
-- * A cached store for the complete Package object
-- */
--typedef struct
--{
-- PkInfoEnum info;
-- gchar *package_id;
-- gchar *summary;
--} PkPackageItem;
--
- GType pk_package_list_get_type (void) G_GNUC_CONST;
- PkPackageList *pk_package_list_new (void);
- gboolean pk_package_list_add (PkPackageList *plist,
- PkInfoEnum info,
- const gchar *package_id,
- const gchar *summary);
-+gboolean pk_package_list_add_item (PkPackageList *plist,
-+ PkPackageItem *item);
- gboolean pk_package_list_contains (PkPackageList *plist,
- const gchar *package_id);
-+gboolean pk_package_list_contains_item (PkPackageList *plist,
-+ PkPackageItem *item);
- gchar *pk_package_list_get_string (PkPackageList *plist)
- G_GNUC_WARN_UNUSED_RESULT;
- guint pk_package_list_get_size (PkPackageList *plist);
-diff --git a/libpackagekit/pk-self-test.c b/libpackagekit/pk-self-test.c
-index 62e225b..bf151fb 100644
---- a/libpackagekit/pk-self-test.c
-+++ b/libpackagekit/pk-self-test.c
-@@ -29,6 +29,7 @@
- /* prototypes */
- void libst_package_id (LibSelfTest *test);
- void libst_package_ids (LibSelfTest *test);
-+void libst_package_item (LibSelfTest *test);
- void libst_package_list (LibSelfTest *test);
- void libst_enum (LibSelfTest *test);
- void libst_common (LibSelfTest *test);
-@@ -51,6 +52,7 @@ main (int argc, char **argv)
- libst_common (&test);
- libst_package_id (&test);
- libst_package_ids (&test);
-+ libst_package_item (&test);
- libst_package_list (&test);
- libst_enum (&test);
- libst_extra (&test);
-diff --git a/python/packagekit/daemonBackend.py b/python/packagekit/daemonBackend.py
-index 3711f01..5253b39 100644
---- a/python/packagekit/daemonBackend.py
-+++ b/python/packagekit/daemonBackend.py
-@@ -789,6 +789,21 @@ class PackageKitBaseBackend(dbus.service.Object):
- self.Finished(EXIT_FAILED)
-
- @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-+ in_signature='ss', out_signature='')
-+ def SetProxy(self, proxy_http, proxy_ftp):
-+ '''
-+ Set the proxy
-+ '''
-+ pklog.info("SetProxy(%s, %s)" % (proxy_http, proxy_ftp))
-+ self.doSetProxy(proxy_http, proxy_ftp)
-+
-+ def doSetProxy(self, proxy_http, proxy_ftp):
-+ '''
-+ Should be replaced in the corresponding backend sub class
-+ '''
-+ # do not use Finished() in this method
-+
-+ @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
- in_signature='s', out_signature='')
- def InstallPublicKey(self, keyurl):
- '''
-diff --git a/src/pk-backend-dbus.c b/src/pk-backend-dbus.c
-index b06e584..4c6837a 100644
---- a/src/pk-backend-dbus.c
-+++ b/src/pk-backend-dbus.c
-@@ -123,16 +123,6 @@ pk_backend_dbus_sub_percentage_changed_cb (DBusGProxy *proxy, guint sub_percenta
- }
-
- /**
-- * pk_backend_dbus_no_percentage_updates_cb:
-- **/
--static void
--pk_backend_dbus_no_percentage_updates_cb (DBusGProxy *proxy, PkBackendDbus *backend_dbus)
--{
-- pk_debug ("got signal");
-- pk_backend_no_percentage_updates (backend_dbus->priv->backend);
--}
--
--/**
- * pk_backend_dbus_package_cb:
- **/
- static void
-@@ -325,8 +315,6 @@ pk_backend_dbus_remove_callbacks (PkBackendDbus *backend_dbus)
- G_CALLBACK (pk_backend_dbus_percentage_changed_cb), backend_dbus);
- dbus_g_proxy_disconnect_signal (proxy, "SubPercentageChanged",
- G_CALLBACK (pk_backend_dbus_sub_percentage_changed_cb), backend_dbus);
-- dbus_g_proxy_disconnect_signal (proxy, "NoPercentageChanged",
-- G_CALLBACK (pk_backend_dbus_no_percentage_updates_cb), backend_dbus);
- dbus_g_proxy_disconnect_signal (proxy, "Package",
- G_CALLBACK (pk_backend_dbus_package_cb), backend_dbus);
- dbus_g_proxy_disconnect_signal (proxy, "Details",
-@@ -353,6 +341,31 @@ pk_backend_dbus_remove_callbacks (PkBackendDbus *backend_dbus)
- }
-
- /**
-+ * pk_backend_dbus_set_proxy:
-+ **/
-+static gboolean
-+pk_backend_dbus_set_proxy (PkBackendDbus *backend_dbus, const gchar *proxy_http, const gchar *proxy_ftp)
-+{
-+ gboolean ret;
-+ GError *error = NULL;
-+
-+ g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
-+ g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-+
-+ /* new sync method call */
-+ pk_backend_dbus_time_reset (backend_dbus);
-+ ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "SetProxy", &error,
-+ G_TYPE_STRING, proxy_http,
-+ G_TYPE_STRING, proxy_ftp,
-+ G_TYPE_INVALID, G_TYPE_INVALID);
-+ if (error != NULL) {
-+ pk_warning ("%s", error->message);
-+ g_error_free (error);
-+ }
-+ return ret;
-+}
-+
-+/**
- * pk_backend_dbus_set_name:
- **/
- gboolean
-@@ -385,7 +398,6 @@ pk_backend_dbus_set_name (PkBackendDbus *backend_dbus, const gchar *service)
- G_TYPE_UINT, G_TYPE_INVALID);
- dbus_g_proxy_add_signal (proxy, "SubPercentageChanged",
- G_TYPE_UINT, G_TYPE_INVALID);
-- dbus_g_proxy_add_signal (proxy, "NoPercentageChanged", G_TYPE_INVALID);
- dbus_g_proxy_add_signal (proxy, "Package",
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
- dbus_g_proxy_add_signal (proxy, "Details",
-@@ -424,8 +436,6 @@ pk_backend_dbus_set_name (PkBackendDbus *backend_dbus, const gchar *service)
- G_CALLBACK (pk_backend_dbus_percentage_changed_cb), backend_dbus, NULL);
- dbus_g_proxy_connect_signal (proxy, "SubPercentageChanged",
- G_CALLBACK (pk_backend_dbus_sub_percentage_changed_cb), backend_dbus, NULL);
-- dbus_g_proxy_connect_signal (proxy, "NoPercentageChanged",
-- G_CALLBACK (pk_backend_dbus_no_percentage_updates_cb), backend_dbus, NULL);
- dbus_g_proxy_connect_signal (proxy, "Package",
- G_CALLBACK (pk_backend_dbus_package_cb), backend_dbus, NULL);
- dbus_g_proxy_connect_signal (proxy, "Details",
-@@ -465,6 +475,18 @@ pk_backend_dbus_set_name (PkBackendDbus *backend_dbus, const gchar *service)
- pk_backend_finished (backend_dbus->priv->backend);
- g_error_free (error);
- }
-+
-+ /* set the proxy */
-+ if (ret) {
-+ gchar *proxy_http;
-+ gchar *proxy_ftp;
-+ proxy_http = pk_backend_get_proxy_http (backend_dbus->priv->backend);
-+ proxy_ftp = pk_backend_get_proxy_http (backend_dbus->priv->backend);
-+ pk_backend_dbus_set_proxy (backend_dbus, proxy_http, proxy_ftp);
-+ g_free (proxy_http);
-+ g_free (proxy_ftp);
-+ }
-+
- if (ret) {
- pk_backend_dbus_time_check (backend_dbus);
- }
-diff --git a/src/pk-backend-internal.h b/src/pk-backend-internal.h
-index 2213fed..2bffaff 100644
---- a/src/pk-backend-internal.h
-+++ b/src/pk-backend-internal.h
-@@ -59,6 +59,9 @@ gboolean pk_backend_reset (PkBackend *backend);
- gboolean pk_backend_set_name (PkBackend *backend,
- const gchar *name)
- G_GNUC_WARN_UNUSED_RESULT;
-+gboolean pk_backend_set_proxy (PkBackend *backend,
-+ const gchar *proxy_http,
-+ const gchar *proxy_ftp);
- gchar *pk_backend_get_name (PkBackend *backend)
- G_GNUC_WARN_UNUSED_RESULT;
- gboolean pk_backend_get_backend_detail (PkBackend *backend,
-diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
-index f9e8b68..f9c9f12 100644
---- a/src/pk-backend-spawn.c
-+++ b/src/pk-backend-spawn.c
-@@ -313,7 +313,7 @@ pk_backend_spawn_parse_stdout (PkBackendSpawn *backend_spawn, const gchar *line)
- ret = FALSE;
- goto out;
- }
-- pk_backend_no_percentage_updates (backend_spawn->priv->backend);
-+ pk_backend_set_percentage (backend_spawn->priv->backend, PK_BACKEND_PERCENTAGE_INVALID);
- } else if (pk_strequal (command, "repo-signature-required")) {
-
- if (size != 9+99) {
-@@ -440,6 +440,44 @@ pk_backend_spawn_helper_new (PkBackendSpawn *backend_spawn)
- }
-
- /**
-+ * pk_backend_spawn_get_envp:
-+ *
-+ * Return all the environment variables the script will need
-+ **/
-+static gchar **
-+pk_backend_spawn_get_envp (PkBackendSpawn *backend_spawn)
-+{
-+ gchar **envp;
-+ gchar *value;
-+ gchar *line;
-+ GPtrArray *array;
-+
-+ array = g_ptr_array_new ();
-+
-+ /* http_proxy */
-+ value = pk_backend_get_proxy_http (backend_spawn->priv->backend);
-+ if (!pk_strzero (value)) {
-+ line = g_strdup_printf ("%s=%s", "http_proxy", value);
-+ pk_debug ("setting evp '%s'", line);
-+ g_ptr_array_add (array, line);
-+ }
-+ g_free (value);
-+
-+ /* ftp_proxy */
-+ value = pk_backend_get_proxy_ftp (backend_spawn->priv->backend);
-+ if (!pk_strzero (value)) {
-+ line = g_strdup_printf ("%s=%s", "ftp_proxy", value);
-+ pk_debug ("setting evp '%s'", line);
-+ g_ptr_array_add (array, line);
-+ }
-+ g_free (value);
-+
-+ envp = pk_ptr_array_to_argv (array);
-+ g_ptr_array_free (array, TRUE);
-+ return envp;
-+}
-+
-+/**
- * pk_backend_spawn_helper_va_list:
- **/
- static gboolean
-@@ -448,6 +486,7 @@ pk_backend_spawn_helper_va_list (PkBackendSpawn *backend_spawn, const gchar *exe
- gboolean ret;
- gchar *filename;
- gchar **argv;
-+ gchar **envp;
-
- g_return_val_if_fail (PK_IS_BACKEND_SPAWN (backend_spawn), FALSE);
-
-@@ -476,7 +515,8 @@ pk_backend_spawn_helper_va_list (PkBackendSpawn *backend_spawn, const gchar *exe
- argv[0] = g_strdup (filename);
-
- pk_backend_spawn_helper_new (backend_spawn);
-- ret = pk_spawn_argv (backend_spawn->priv->spawn, argv);
-+ envp = pk_backend_spawn_get_envp (backend_spawn);
-+ ret = pk_spawn_argv (backend_spawn->priv->spawn, argv, envp);
- if (!ret) {
- pk_backend_spawn_helper_delete (backend_spawn);
- pk_backend_error_code (backend_spawn->priv->backend, PK_ERROR_ENUM_INTERNAL_ERROR,
-diff --git a/src/pk-backend.c b/src/pk-backend.c
-index 225c488..37ed024 100644
---- a/src/pk-backend.c
-+++ b/src/pk-backend.c
-@@ -33,6 +33,7 @@
- #include <glib/gprintf.h>
- #include <pk-network.h>
-
-+#include "pk-package-item.h"
- #include "pk-debug.h"
- #include "pk-common.h"
- #include "pk-marshal.h"
-@@ -44,13 +45,6 @@
- #define PK_BACKEND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_BACKEND, PkBackendPrivate))
-
- /**
-- * PK_BACKEND_PERCENTAGE_INVALID:
-- *
-- * The unknown percentage value
-- */
--#define PK_BACKEND_PERCENTAGE_INVALID 101
--
--/**
- * PK_BACKEND_PERCENTAGE_DEFAULT:
- *
- * The default percentage value, should never be emitted, but should be
-@@ -84,12 +78,15 @@ struct _PkBackendPrivate
- GHashTable *eulas;
- gchar *name;
- gchar *c_tid;
-+ gchar *proxy_http;
-+ gchar *proxy_ftp;
- gboolean locked;
- gboolean set_error;
- gboolean set_signature;
- gboolean set_eula;
- gboolean has_sent_package;
- PkNetwork *network;
-+ PkPackageItem *last_package;
- PkRoleEnum role; /* this never changes for the lifetime of a transaction */
- PkStatusEnum status; /* this changes */
- PkExitEnum exit;
-@@ -592,6 +589,44 @@ out:
- }
-
- /**
-+ * pk_backend_set_proxy:
-+ **/
-+gboolean
-+pk_backend_set_proxy (PkBackend *backend, const gchar *proxy_http, const gchar *proxy_ftp)
-+{
-+ g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
-+ g_free (backend->priv->proxy_http);
-+ g_free (backend->priv->proxy_ftp);
-+ backend->priv->proxy_http = g_strdup (proxy_http);
-+ backend->priv->proxy_ftp = g_strdup (proxy_ftp);
-+ return TRUE;
-+}
-+
-+/**
-+ * pk_backend_get_proxy_http:
-+ *
-+ * Return value: proxy string in the form username:password@server:port
-+ **/
-+gchar *
-+pk_backend_get_proxy_http (PkBackend *backend)
-+{
-+ g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
-+ return g_strdup (backend->priv->proxy_http);
-+}
-+
-+/**
-+ * pk_backend_get_proxy_ftp:
-+ *
-+ * Return value: proxy string in the form username:password@server:port
-+ **/
-+gchar *
-+pk_backend_get_proxy_ftp (PkBackend *backend)
-+{
-+ g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
-+ return g_strdup (backend->priv->proxy_ftp);
-+}
-+
-+/**
- * pk_backend_lock:
- *
- * Responsible for initialising the external backend object.
-@@ -803,35 +838,6 @@ pk_backend_set_sub_percentage (PkBackend *backend, guint percentage)
- }
-
- /**
-- * pk_backend_no_percentage_updates:
-- **/
--gboolean
--pk_backend_no_percentage_updates (PkBackend *backend)
--{
-- g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
-- g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
--
-- /* have we already set an error? */
-- if (backend->priv->set_error) {
-- pk_warning ("already set error, cannot process");
-- return FALSE;
-- }
--
-- /* set the same twice? */
-- if (backend->priv->last_percentage == PK_BACKEND_PERCENTAGE_INVALID) {
-- pk_debug ("duplicate set of %i", PK_BACKEND_PERCENTAGE_INVALID);
-- return FALSE;
-- }
--
-- /* invalidate previous percentage */
-- backend->priv->last_percentage = PK_BACKEND_PERCENTAGE_INVALID;
--
-- /* emit the progress changed signal */
-- pk_backend_emit_progress_changed (backend);
-- return TRUE;
--}
--
--/**
- * pk_backend_set_status:
- **/
- gboolean
-@@ -901,11 +907,26 @@ gboolean
- pk_backend_package (PkBackend *backend, PkInfoEnum info, const gchar *package_id, const gchar *summary)
- {
- gchar *summary_safe;
-+ PkPackageItem *item;
-+ gboolean ret;
-
- g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
- g_return_val_if_fail (package_id != NULL, FALSE);
- g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
-
-+ /* check against the old one */
-+ item = pk_package_item_new (info, package_id, summary);
-+ ret = pk_package_item_equal (item, backend->priv->last_package);
-+ if (ret) {
-+ pk_package_item_free (item);
-+ pk_debug ("skipping duplicate %s", package_id);
-+ return FALSE;
-+ }
-+ /* update the 'last' package */
-+ pk_package_item_free (backend->priv->last_package);
-+ backend->priv->last_package = pk_package_item_copy (item);
-+ pk_package_item_free (item);
-+
- /* have we already set an error? */
- if (backend->priv->set_error) {
- pk_warning ("already set error, cannot process");
-@@ -1689,6 +1710,8 @@ pk_backend_finalize (GObject *object)
- pk_debug ("backend finalise");
-
- pk_backend_reset (backend);
-+ g_free (backend->priv->proxy_http);
-+ g_free (backend->priv->proxy_ftp);
- g_free (backend->priv->name);
- g_free (backend->priv->c_tid);
- g_object_unref (backend->priv->time);
-@@ -1818,6 +1841,7 @@ pk_backend_reset (PkBackend *backend)
-
- /* TODO: need to wait for Finished() if running */
-
-+ pk_package_item_free (backend->priv->last_package);
- backend->priv->set_error = FALSE;
- backend->priv->set_signature = FALSE;
- backend->priv->set_eula = FALSE;
-@@ -1825,6 +1849,7 @@ pk_backend_reset (PkBackend *backend)
- backend->priv->finished = FALSE;
- backend->priv->has_sent_package = FALSE;
- backend->priv->thread = NULL;
-+ backend->priv->last_package = NULL;
- backend->priv->status = PK_STATUS_ENUM_UNKNOWN;
- backend->priv->exit = PK_EXIT_ENUM_UNKNOWN;
- backend->priv->role = PK_ROLE_ENUM_UNKNOWN;
-@@ -1855,8 +1880,11 @@ pk_backend_init (PkBackend *backend)
- backend->priv->handle = NULL;
- backend->priv->name = NULL;
- backend->priv->c_tid = NULL;
-+ backend->priv->proxy_http = NULL;
-+ backend->priv->proxy_ftp = NULL;
- backend->priv->file_changed_func = NULL;
- backend->priv->file_changed_data = NULL;
-+ backend->priv->last_package = NULL;
- backend->priv->locked = FALSE;
- backend->priv->signal_finished = 0;
- backend->priv->signal_error_timeout = 0;
-diff --git a/src/pk-backend.h b/src/pk-backend.h
-index 95b7fa8..fb17e3c 100644
---- a/src/pk-backend.h
-+++ b/src/pk-backend.h
-@@ -30,6 +30,13 @@
-
- G_BEGIN_DECLS
-
-+/**
-+ * PK_BACKEND_PERCENTAGE_INVALID:
-+ *
-+ * The unknown percentage value
-+ */
-+#define PK_BACKEND_PERCENTAGE_INVALID 101
-+
- typedef struct _PkBackend PkBackend;
-
- /* set the state */
-@@ -51,7 +58,6 @@ gboolean pk_backend_set_sub_percentage (PkBackend *backend,
- guint percentage);
- gboolean pk_backend_set_exit_code (PkBackend *backend,
- PkExitEnum exit);
--gboolean pk_backend_no_percentage_updates (PkBackend *backend);
- gboolean pk_backend_set_transaction_data (PkBackend *backend,
- const gchar *data);
-
-@@ -66,6 +72,8 @@ gboolean pk_backend_get_progress (PkBackend *backend,
- guint *elapsed,
- guint *remaining);
- guint pk_backend_get_runtime (PkBackend *backend);
-+gchar *pk_backend_get_proxy_ftp (PkBackend *backend);
-+gchar *pk_backend_get_proxy_http (PkBackend *backend);
-
- /* signal helpers */
- gboolean pk_backend_finished (PkBackend *backend);
-diff --git a/src/pk-engine.c b/src/pk-engine.c
-index db81d36..028a0d0 100644
---- a/src/pk-engine.c
-+++ b/src/pk-engine.c
-@@ -101,6 +101,7 @@ struct PkEnginePrivate
- PkNetwork *network;
- PkSecurity *security;
- PkNotify *notify;
-+ PkConf *conf;
- PkFileMonitor *file_monitor;
- PkRoleEnum actions;
- PkGroupEnum groups;
-@@ -579,10 +580,15 @@ pk_engine_init (PkEngine *engine)
- DBusGConnection *connection;
- gboolean ret;
- gchar *filename;
-+ gchar *proxy_http;
-+ gchar *proxy_ftp;
-
- engine->priv = PK_ENGINE_GET_PRIVATE (engine);
- engine->priv->restart_schedule = FALSE;
-
-+ /* use the config file */
-+ engine->priv->conf = pk_conf_new ();
-+
- /* setup the backend backend */
- engine->priv->backend = pk_backend_new ();
- g_signal_connect (engine->priv->backend, "finished",
-@@ -639,6 +645,13 @@ pk_engine_init (PkEngine *engine)
- G_CALLBACK (pk_engine_file_monitor_changed_cb), engine);
- g_free (filename);
-
-+ /* set the proxy */
-+ proxy_http = pk_conf_get_string (engine->priv->conf, "ProxyHTTP");
-+ proxy_ftp = pk_conf_get_string (engine->priv->conf, "ProxyFTP");
-+ pk_backend_set_proxy (engine->priv->backend, proxy_http, proxy_ftp);
-+ g_free (proxy_http);
-+ g_free (proxy_ftp);
-+
- engine->priv->transaction_list = pk_transaction_list_new ();
- g_signal_connect (engine->priv->transaction_list, "changed",
- G_CALLBACK (pk_engine_transaction_list_changed_cb), engine);
-@@ -696,6 +709,7 @@ pk_engine_finalize (GObject *object)
- g_object_unref (engine->priv->notify);
- g_object_unref (engine->priv->backend);
- g_object_unref (engine->priv->cache);
-+ g_object_unref (engine->priv->conf);
-
- G_OBJECT_CLASS (pk_engine_parent_class)->finalize (object);
- }
-diff --git a/src/pk-network-unix.c b/src/pk-network-unix.c
-index 11c23a2..74b266c 100644
---- a/src/pk-network-unix.c
-+++ b/src/pk-network-unix.c
-@@ -138,6 +138,11 @@ pk_network_unix_get_network_state (PkNetworkUnix *network_unix)
- continue;
- }
-
-+ /* is loopback? */
-+ if (pk_strequal (sections[0], "lo")) {
-+ continue;
-+ }
-+
- /* is correct parameters? */
- number_sections = g_strv_length (sections);
- if (number_sections != 11) {
-@@ -145,9 +150,8 @@ pk_network_unix_get_network_state (PkNetworkUnix *network_unix)
- continue;
- }
-
-- /* is MTU and gateway nonzero? */
-- if (!pk_strequal (sections[8], "0") &&
-- !pk_strequal (sections[2], "00000000")) {
-+ /* is gateway nonzero? */
-+ if (!pk_strequal (sections[2], "00000000")) {
- pk_debug ("interface %s is valid", sections[0]);
- online = TRUE;
- }
-diff --git a/src/pk-network.c b/src/pk-network.c
-index 9656958..0ad839e 100644
---- a/src/pk-network.c
-+++ b/src/pk-network.c
-@@ -39,6 +39,7 @@
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif /* HAVE_UNISTD_H */
-+#include <libgbus.h>
-
- #include <glib/gi18n.h>
-
-@@ -67,6 +68,7 @@ struct _PkNetworkPrivate
- PkNetworkNm *net_nm;
- PkNetworkUnix *net_unix;
- PkConf *conf;
-+ LibGBus *nm_bus;
- };
-
- enum {
-@@ -154,6 +156,7 @@ pk_network_class_init (PkNetworkClass *klass)
- static void
- pk_network_init (PkNetwork *network)
- {
-+ gboolean nm_alive;
- network->priv = PK_NETWORK_GET_PRIVATE (network);
- network->priv->conf = pk_conf_new ();
- network->priv->net_nm = pk_network_nm_new ();
-@@ -167,6 +170,17 @@ pk_network_init (PkNetwork *network)
- network->priv->use_nm = pk_conf_get_bool (network->priv->conf, "UseNetworkManager");
- network->priv->use_unix = pk_conf_get_bool (network->priv->conf, "UseNetworkHeuristic");
-
-+ /* check if NM is on the bus */
-+ network->priv->nm_bus = libgbus_new ();
-+ libgbus_assign (network->priv->nm_bus, LIBGBUS_SYSTEM, "org.freedesktop.NetworkManager");
-+ nm_alive = libgbus_is_connected (network->priv->nm_bus);
-+
-+ /* NetworkManager isn't up, so we can't use it */
-+ if (network->priv->use_nm && !nm_alive) {
-+ pk_warning ("UseNetworkManager true, but org.freedesktop.NetworkManager not up");
-+ network->priv->use_nm = FALSE;
-+ }
-+
- #if !PK_BUILD_NETWORKMANAGER
- /* check we can actually use the default */
- if (network->priv->use_nm) {
-@@ -190,6 +204,7 @@ pk_network_finalize (GObject *object)
-
- g_return_if_fail (network->priv != NULL);
- g_object_unref (network->priv->conf);
-+ g_object_unref (network->priv->nm_bus);
- g_object_unref (network->priv->net_nm);
- g_object_unref (network->priv->net_unix);
- G_OBJECT_CLASS (pk_network_parent_class)->finalize (object);
-diff --git a/src/pk-spawn.c b/src/pk-spawn.c
-index 9b415b1..c4622f9 100644
---- a/src/pk-spawn.c
-+++ b/src/pk-spawn.c
-@@ -273,7 +273,7 @@ pk_spawn_kill (PkSpawn *spawn)
- *
- **/
- gboolean
--pk_spawn_argv (PkSpawn *spawn, gchar **argv)
-+pk_spawn_argv (PkSpawn *spawn, gchar **argv, gchar **envp)
- {
- gboolean ret;
-
-@@ -284,7 +284,7 @@ pk_spawn_argv (PkSpawn *spawn, gchar **argv)
- spawn->priv->finished = FALSE;
-
- /* create spawned object for tracking */
-- ret = g_spawn_async_with_pipes (NULL, argv, NULL,
-+ ret = g_spawn_async_with_pipes (NULL, argv, envp,
- G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
- NULL, NULL, &spawn->priv->child_pid,
- NULL, /* stdin */
-@@ -484,6 +484,7 @@ libst_spawn (LibSelfTest *test)
- gboolean ret;
- gchar *path;
- gchar **argv;
-+ gchar **envp;
-
- if (libst_start (test, "PkSpawn", CLASS_AUTO) == FALSE) {
- return;
-@@ -496,7 +497,7 @@ libst_spawn (LibSelfTest *test)
- libst_title (test, "make sure return error for missing file");
- mexit = BAD_EXIT;
- argv = g_strsplit ("pk-spawn-test-xxx.sh", " ", 0);
-- ret = pk_spawn_argv (spawn, argv);
-+ ret = pk_spawn_argv (spawn, argv, NULL);
- g_strfreev (argv);
- if (ret == FALSE) {
- libst_success (test, "failed to run invalid file");
-@@ -517,7 +518,7 @@ libst_spawn (LibSelfTest *test)
- mexit = -1;
- path = pk_test_get_data ("pk-spawn-test.sh");
- argv = g_strsplit (path, " ", 0);
-- ret = pk_spawn_argv (spawn, argv);
-+ ret = pk_spawn_argv (spawn, argv, NULL);
- g_free (path);
- g_strfreev (argv);
- if (ret) {
-@@ -558,11 +559,34 @@ libst_spawn (LibSelfTest *test)
- new_spawn_object (test, &spawn);
-
- /************************************************************/
-+ libst_title (test, "make sure we set the proxy");
-+ mexit = -1;
-+ path = pk_test_get_data ("pk-spawn-proxy.sh");
-+ argv = g_strsplit (path, " ", 0);
-+ envp = g_strsplit ("http_proxy=username:password@server:port "
-+ "ftp_proxy=username:password@server:port", " ", 0);
-+ ret = pk_spawn_argv (spawn, argv, envp);
-+ g_free (path);
-+ g_strfreev (argv);
-+ if (ret) {
-+ libst_success (test, "ran correct file");
-+ } else {
-+ libst_failed (test, "did not run helper");
-+ }
-+
-+ /* wait for finished */
-+ libst_loopwait (test, 10000);
-+ libst_loopcheck (test);
-+
-+ /* get new object */
-+ new_spawn_object (test, &spawn);
-+
-+ /************************************************************/
- libst_title (test, "make sure run correct helper, and kill it");
- mexit = BAD_EXIT;
- path = pk_test_get_data ("pk-spawn-test.sh");
- argv = g_strsplit (path, " ", 0);
-- ret = pk_spawn_argv (spawn, argv);
-+ ret = pk_spawn_argv (spawn, argv, NULL);
- g_free (path);
- g_strfreev (argv);
- if (ret) {
-@@ -592,7 +616,7 @@ libst_spawn (LibSelfTest *test)
- mexit = BAD_EXIT;
- path = pk_test_get_data ("pk-spawn-test-sigquit.sh");
- argv = g_strsplit (path, " ", 0);
-- ret = pk_spawn_argv (spawn, argv);
-+ ret = pk_spawn_argv (spawn, argv, NULL);
- g_free (path);
- g_strfreev (argv);
- if (ret) {
-@@ -618,7 +642,7 @@ libst_spawn (LibSelfTest *test)
- libst_title (test, "run lots of data for profiling");
- path = pk_test_get_data ("pk-spawn-test-profiling.sh");
- argv = g_strsplit (path, " ", 0);
-- ret = pk_spawn_argv (spawn, argv);
-+ ret = pk_spawn_argv (spawn, argv, NULL);
- g_free (path);
- g_strfreev (argv);
- if (ret) {
-diff --git a/src/pk-spawn.h b/src/pk-spawn.h
-index 1b20fef..0e58859 100644
---- a/src/pk-spawn.h
-+++ b/src/pk-spawn.h
-@@ -52,7 +52,8 @@ GType pk_spawn_get_type (void) G_GNUC_CONST;
- PkSpawn *pk_spawn_new (void);
-
- gboolean pk_spawn_argv (PkSpawn *spawn,
-- gchar **argv)
-+ gchar **argv,
-+ gchar **envp)
- G_GNUC_WARN_UNUSED_RESULT;
- gboolean pk_spawn_kill (PkSpawn *spawn);
-
diff --git a/packages/packagekit/files/02_9ced8313fb12f0f89ad6ced7c0fdc7241ff00d77.patch b/packages/packagekit/files/02_9ced8313fb12f0f89ad6ced7c0fdc7241ff00d77.patch
deleted file mode 100644
index fb617c5eda..0000000000
--- a/packages/packagekit/files/02_9ced8313fb12f0f89ad6ced7c0fdc7241ff00d77.patch
+++ /dev/null
@@ -1,13544 +0,0 @@
-:000000 100644 0000000... bd0cc2e... A RELEASE
-:100644 100644 fcc8347... 20279b3... M backends/Makefile.am
-:000000 100644 0000000... c851833... A backends/apt.deprecated/.gitignore
-:000000 100644 0000000... 07b4131... A backends/apt.deprecated/Makefile.am
-:000000 100644 0000000... 0d20b64... A backends/apt.deprecated/helpers/.gitignore
-:000000 100644 0000000... 0299df2... A backends/apt.deprecated/helpers/Makefile.am
-:000000 100644 0000000... e5f78ca... A backends/apt.deprecated/helpers/aptBackend.py
-:000000 100755 0000000... 94dca4a... A backends/apt.deprecated/helpers/get-depends.py
-:000000 100755 0000000... a813640... A backends/apt.deprecated/helpers/get-details.py
-:000000 100755 0000000... 5529f72... A backends/apt.deprecated/helpers/get-repo-list.py
-:000000 100755 0000000... e581010... A backends/apt.deprecated/helpers/get-requires.py
-:000000 100755 0000000... 5524d9a... A backends/apt.deprecated/helpers/get-update-detail.py
-:000000 100755 0000000... 4f45fbf... A backends/apt.deprecated/helpers/get-updates.py
-:000000 100755 0000000... dfa024c... A backends/apt.deprecated/helpers/install-files.py
-:000000 120000 0000000... 8d22531... A backends/apt.deprecated/helpers/packagekit
-:000000 100755 0000000... 881479d... A backends/apt.deprecated/helpers/refresh-cache.py
-:000000 100755 0000000... 3cc36ae... A backends/apt.deprecated/helpers/repo-enable.py
-:000000 100755 0000000... aac34df... A backends/apt.deprecated/helpers/resolve.py
-:000000 100755 0000000... d02f1b0... A backends/apt.deprecated/helpers/search-details.py
-:000000 100755 0000000... ec60319... A backends/apt.deprecated/helpers/search-file.py
-:000000 100755 0000000... f63ee80... A backends/apt.deprecated/helpers/search-group.py
-:000000 100755 0000000... 9f73c89... A backends/apt.deprecated/helpers/search-name.py
-:000000 100644 0000000... 885275d... A backends/apt.deprecated/pk-apt-build-db.cpp
-:000000 100644 0000000... bb786a9... A backends/apt.deprecated/pk-apt-build-db.h
-:000000 100644 0000000... 5e5b4e5... A backends/apt.deprecated/pk-apt-search-plain.c
-:000000 100644 0000000... 98bdc7f... A backends/apt.deprecated/pk-apt-search-sqlite.cpp
-:000000 100644 0000000... e36e89f... A backends/apt.deprecated/pk-apt-search.h
-:000000 100644 0000000... f59cd88... A backends/apt.deprecated/pk-backend-apt.c
-:000000 100644 0000000... 1bf9a50... A backends/apt.deprecated/pk-sqlite-pkg-cache.cpp
-:000000 100644 0000000... 68fad42... A backends/apt.deprecated/pk-sqlite-pkg-cache.h
-:000000 100644 0000000... 2b99c5d... A backends/apt/HACKING
-:100644 100644 07b4131... e315ba9... M backends/apt/Makefile.am
-:000000 100644 0000000... 0a3da6e... A backends/apt/README
-:000000 100644 0000000... bee2f3d... A backends/apt/TODO
-:000000 100755 0000000... 22eb714... A backends/apt/aptDBUSBackend.py
-:100644 000000 0d20b64... 0000000... D backends/apt/helpers/.gitignore
-:100644 000000 0299df2... 0000000... D backends/apt/helpers/Makefile.am
-:100644 000000 e5f78ca... 0000000... D backends/apt/helpers/aptBackend.py
-:100755 000000 94dca4a... 0000000... D backends/apt/helpers/get-depends.py
-:100755 000000 a813640... 0000000... D backends/apt/helpers/get-details.py
-:100755 000000 5529f72... 0000000... D backends/apt/helpers/get-repo-list.py
-:100755 000000 e581010... 0000000... D backends/apt/helpers/get-requires.py
-:100755 000000 5524d9a... 0000000... D backends/apt/helpers/get-update-detail.py
-:100755 000000 4f45fbf... 0000000... D backends/apt/helpers/get-updates.py
-:100755 000000 dfa024c... 0000000... D backends/apt/helpers/install-files.py
-:100755 000000 881479d... 0000000... D backends/apt/helpers/refresh-cache.py
-:100755 000000 3cc36ae... 0000000... D backends/apt/helpers/repo-enable.py
-:100755 000000 aac34df... 0000000... D backends/apt/helpers/resolve.py
-:100755 000000 d02f1b0... 0000000... D backends/apt/helpers/search-details.py
-:100755 000000 ec60319... 0000000... D backends/apt/helpers/search-file.py
-:100755 000000 f63ee80... 0000000... D backends/apt/helpers/search-group.py
-:100755 000000 9f73c89... 0000000... D backends/apt/helpers/search-name.py
-:000000 120000 0000000... 0b64032... A backends/apt/packagekit
-:100644 000000 885275d... 0000000... D backends/apt/pk-apt-build-db.cpp
-:100644 000000 bb786a9... 0000000... D backends/apt/pk-apt-build-db.h
-:100644 000000 5e5b4e5... 0000000... D backends/apt/pk-apt-search-plain.c
-:100644 000000 98bdc7f... 0000000... D backends/apt/pk-apt-search-sqlite.cpp
-:100644 000000 e36e89f... 0000000... D backends/apt/pk-apt-search.h
-:100644 100644 f59cd88... 70836b2... M backends/apt/pk-backend-apt.c
-:100644 000000 1bf9a50... 0000000... D backends/apt/pk-sqlite-pkg-cache.cpp
-:100644 000000 68fad42... 0000000... D backends/apt/pk-sqlite-pkg-cache.h
-:000000 100644 0000000... 1b5d30f... A backends/apt/profiler.py
-:000000 100755 0000000... a1d5ffb... A backends/apt/test.py
-:100644 000000 c851833... 0000000... D backends/apt2/.gitignore
-:100644 000000 2b99c5d... 0000000... D backends/apt2/HACKING
-:100644 000000 91c0c46... 0000000... D backends/apt2/Makefile.am
-:100644 000000 0a3da6e... 0000000... D backends/apt2/README
-:100644 000000 bee2f3d... 0000000... D backends/apt2/TODO
-:100755 000000 b7fc500... 0000000... D backends/apt2/aptDBUSBackend.py
-:120000 000000 0b64032... 0000000... D backends/apt2/packagekit
-:100644 000000 4f78ec4... 0000000... D backends/apt2/pk-backend-apt2.c
-:100644 000000 1b5d30f... 0000000... D backends/apt2/profiler.py
-:100755 000000 a1d5ffb... 0000000... D backends/apt2/test.py
-:100644 100644 2df445e... 5714e9f... M backends/dummy/pk-backend-dummy.c
-:100644 100644 7649bab... 2d70108... M backends/opkg/pk-backend-opkg.c
-:100644 100644 fdc99d3... 2691414... M backends/poldek/pk-backend-poldek.c
-:000000 100644 0000000... 996fb0d... A backends/urpmi/.gitignore
-:000000 100644 0000000... 56743a1... A backends/urpmi/Makefile.am
-:000000 100644 0000000... 2f78cf5... A backends/urpmi/helpers/.gitignore
-:000000 100644 0000000... 88f144e... A backends/urpmi/helpers/Makefile.am
-:000000 100755 0000000... bf936c5... A backends/urpmi/helpers/get-depends.pl
-:000000 100755 0000000... 3207e9b... A backends/urpmi/helpers/get-details.pl
-:000000 100755 0000000... 74ae157... A backends/urpmi/helpers/get-files.pl
-:000000 100755 0000000... 9e3e525... A backends/urpmi/helpers/get-packages.pl
-:000000 100755 0000000... 0012b2a... A backends/urpmi/helpers/get-requires.pl
-:000000 100755 0000000... 69ea452... A backends/urpmi/helpers/get-update-detail.pl
-:000000 100755 0000000... 02d574c... A backends/urpmi/helpers/get-updates.pl
-:000000 100755 0000000... c9cf6c8... A backends/urpmi/helpers/install-packages.pl
-:000000 100644 0000000... 6ed63b5... A backends/urpmi/helpers/perl_packagekit/Makefile.am
-:000000 100644 0000000... 8dbb4b0... A backends/urpmi/helpers/perl_packagekit/enums.pm
-:000000 100644 0000000... 7411ca9... A backends/urpmi/helpers/perl_packagekit/prints.pm
-:000000 100755 0000000... 555a8b8... A backends/urpmi/helpers/refresh-cache.pl
-:000000 100755 0000000... 3be38ea... A backends/urpmi/helpers/remove-packages.pl
-:000000 100755 0000000... 32e0866... A backends/urpmi/helpers/resolve.pl
-:000000 100755 0000000... 3081abe... A backends/urpmi/helpers/search-details.pl
-:000000 100755 0000000... 03d348e... A backends/urpmi/helpers/search-file.pl
-:000000 100755 0000000... e5b7b92... A backends/urpmi/helpers/search-group.pl
-:000000 100755 0000000... 383921f... A backends/urpmi/helpers/search-name.pl
-:000000 100755 0000000... 88274bc... A backends/urpmi/helpers/update-packages.pl
-:000000 100644 0000000... 3eb8280... A backends/urpmi/helpers/urpmi_backend/Makefile.am
-:000000 100644 0000000... a01b893... A backends/urpmi/helpers/urpmi_backend/actions.pm
-:000000 100644 0000000... 2c2f13a... A backends/urpmi/helpers/urpmi_backend/filters.pm
-:000000 100644 0000000... d377ab2... A backends/urpmi/helpers/urpmi_backend/groups.pm
-:000000 100644 0000000... 795edc6... A backends/urpmi/helpers/urpmi_backend/open_db.pm
-:000000 100644 0000000... e078134... A backends/urpmi/helpers/urpmi_backend/tools.pm
-:000000 100644 0000000... e7b56a7... A backends/urpmi/pk-backend-urpmi.c
-:100644 100644 5b2da8f... d70d8dc... M backends/yum/helpers/yumBackend.py
-:100755 100755 29f5b03... a708a0c... M backends/yum2/helpers/yumDBUSBackend.py
-:100644 100644 15c4b4f... a971707... M backends/zypp/pk-backend-zypp.cpp
-:100644 100644 2b848f0... d81d0dd... M backends/zypp/zypp-utils.cpp
-:100644 100644 9e3bad1... 4f785cf... M backends/zypp/zypp-utils.h
-:100644 100644 5a05a8e... ec93978... M client/pk-console.c
-:100644 100644 f5be0a5... bfe364f... M client/pk-import-desktop.c
-:100644 100644 cf14cc2... bffd45b... M client/pk-import-specspo.c
-:100644 100644 f614d2b... 7510b03... M configure.ac
-:100644 100644 4d4a7e3... 61a67d1... M contrib/PackageKit.spec.in
-:100644 100644 a97fc3b... ded7799... M contrib/gnome-packagekit.spec.in
-:100644 100644 607a7a4... 7aa298b... M docs/html/pk-authors.html
-:100644 100644 0cdc85c... d276a05... M docs/html/pk-download.html
-:100644 100644 efa8344... 3e37cc1... M docs/html/pk-faq.html
-:100644 100644 0b75b10... 51a165a... M docs/spec/pk-concepts.xml
-:100644 100644 a79e647... 2970dda... M docs/spec/pk-signals.xml
-:100644 100644 8f9bd57... 7a48320... M etc/PackageKit.conf.in
-:100644 100644 dd2387b... 8fb82f1... M libpackagekit/pk-client.c
-:100644 100644 2b1d1a2... 6617159... M libpackagekit/pk-client.h
-:100644 100644 9d3cff7... 0be0e6e... M libpackagekit/pk-common.c
-:100644 100644 9908ec2... 9e5a05e... M libpackagekit/pk-common.h
-:100644 100644 f2de5ae... 5a54ccc... M libpackagekit/pk-control.c
-:100644 100644 63b30d3... c1b1be8... M libpackagekit/pk-control.h
-:100644 100644 5743dcb... 9dccdd0... M libpackagekit/pk-enum.c
-:100644 100644 e616b64... 4cc317e... M libpackagekit/pk-enum.h
-:100644 100644 7f01a4c... d0f0776... M libpackagekit/pk-extra.c
-:100644 100644 87905dc... ff4bd4e... M libpackagekit/pk-package-item.c
-:100644 100644 5d95e1b... 6bdb0d4... M libpackagekit/pk-package-list.c
-:100644 100644 9734af4... 83901ab... M libpackagekit/pk-package-list.h
-:100644 100644 dceb656... 7308a29... M libpackagekit/pk-polkit-client.c
-:100644 100644 76ab022... 3dc1db0... M libpackagekit/pk-task-list.c
-:100644 100644 6dbee0e... f87e6b3... M po/LINGUAS
-:100644 100644 33d30c1... 6e8013e... M po/de.po
-:000000 100644 0000000... ea732d0... A po/hu.po
-:100644 100644 32efce7... 4c4607d... M policy/org.freedesktop.packagekit.policy.in
-:100644 100644 5253b39... 9fd627a... M python/packagekit/daemonBackend.py
-:100644 100644 f9c9f12... 2bd416d... M src/pk-backend-spawn.c
-:100644 100644 37ed024... f0f245f... M src/pk-backend.c
-:100644 100644 fb17e3c... a7ba754... M src/pk-backend.h
-:100644 100644 028a0d0... 14ecf41... M src/pk-engine.c
-:100644 100644 c59b1f3... 668451f... M src/pk-engine.h
-:100644 100644 e9e74e1... 7290bbe... M src/pk-interface.xml
-:100644 100644 9abf992... 81332d0... M src/pk-security-polkit.c
-:100644 100644 3432095... eb55932... M src/pk-security.h
-:100644 100644 7aa183f... d42bc7a... M src/pk-transaction-db.c
-:100644 100644 0921c7c... f325f94... M src/pk-transaction-list.c
-:100644 100644 07ffdee... 15faed3... M src/pk-transaction.c
-:100755 100755 f78c891... 6521e69... M tools/add-error-enum.sh
-:100755 000000 ebbd8f7... 0000000... D tools/rpmbuild.sh
-
-diff --git a/RELEASE b/RELEASE
-new file mode 100644
-index 0000000..bd0cc2e
---- /dev/null
-+++ b/RELEASE
-@@ -0,0 +1,50 @@
-+PackageKit Release Notes
-+
-+1. Write NEWS entries for PackageKit and gnome-packagekit in the same
-+ format as usual. Ignore any trivial commits.
-+
-+$git-shortlog GNOME_PACKAGEKIT_0_2_1.. | grep -v trivial > NEWS.new
-+
-+2. Add download date to docs/html/pk-download.html, save file.
-+
-+3. Update library version if new ABI in configure.ac and change DEVELOPMENT_RELEASE if needed
-+
-+4. Commit changes in PackageKit git:
-+
-+$git commit -a -m "Release version 0.2.2"
-+$git tag -a -f -m "Release 0.2.2" PACKAGEKIT_0_2_2
-+$git push --tags
-+$git push
-+
-+5. Commit changes in gnome-packagekit git:
-+
-+$git commit -a -m "Release version 0.2.2"
-+$git-tag GNOME_PACKAGEKIT_0_2_2
-+$git push --tags
-+$git push
-+
-+6. Upload both tarballs to:
-+
-+$scp *.tar.gz packagekit.org/srv/www/html/releases/
-+
-+7. Do post release version bump in configure.ac
-+
-+8. Commit changes in both projects:
-+
-+$git commit -a -m "post release version bump"
-+$git push
-+
-+9. Send an email to packagekit@lists.freedesktop.org
-+
-+=================================================
-+Subject: PackageKit and gnome-packagekit 0.2.2 released!
-+
-+Today I released PackageKit and gnome-packagekit 0.2.2.
-+
-+PackageKit release notes: http://gitweb.freedesktop.org/?p=packagekit.git;a=blob;f=NEWS
-+gnome-packagekit release notes: http://gitweb.freedesktop.org/?p=users/hughsient/gnome-packagekit.git;a=blob;f=NEWS
-+
-+Tarballs available here: http://people.freedesktop.org/~hughsient/releases/
-+Thanks to all those who made this possible.
-+=================================================
-+
-diff --git a/backends/Makefile.am b/backends/Makefile.am
-index fcc8347..20279b3 100644
---- a/backends/Makefile.am
-+++ b/backends/Makefile.am
-@@ -8,10 +8,6 @@ if BACKEND_TYPE_APT
- SUBDIRS += apt
- endif
-
--if BACKEND_TYPE_APT_DBUS
--SUBDIRS += apt2
--endif
--
- if BACKEND_TYPE_BOX
- SUBDIRS += box
- endif
-@@ -32,6 +28,10 @@ if BACKEND_TYPE_SMART
- SUBDIRS += smart
- endif
-
-+if BACKEND_TYPE_URPMI
-+SUBDIRS += urpmi
-+endif
-+
- if BACKEND_TYPE_YUM
- SUBDIRS += yum
- endif
-diff --git a/backends/apt.deprecated/.gitignore b/backends/apt.deprecated/.gitignore
-new file mode 100644
-index 0000000..c851833
---- /dev/null
-+++ b/backends/apt.deprecated/.gitignore
-@@ -0,0 +1,10 @@
-+.deps
-+.libs
-+Makefile
-+Makefile.in
-+*.la
-+*.lo
-+*.loT
-+*.o
-+*~
-+
-diff --git a/backends/apt.deprecated/Makefile.am b/backends/apt.deprecated/Makefile.am
-new file mode 100644
-index 0000000..07b4131
---- /dev/null
-+++ b/backends/apt.deprecated/Makefile.am
-@@ -0,0 +1,30 @@
-+NULL =
-+
-+SUBDIRS = helpers
-+plugindir = $(PK_PLUGIN_DIR)
-+plugin_LTLIBRARIES = libpk_backend_apt.la
-+
-+libpk_backend_apt_la_LIBADD = $(PK_PLUGIN_LIBS)
-+libpk_backend_apt_la_LDFLAGS = -module -avoid-version $(APT_LIBS)
-+libpk_backend_apt_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(APT_CFLAGS)
-+libpk_backend_apt_la_CXXFLAGS = $(PK_PLUGIN_CFLAGS) $(APT_CFLAGS) -DPK_DB_DIR=\""$(PK_DB_DIR)"\"
-+
-+libpk_backend_apt_la_SOURCES = \
-+ pk-backend-apt.c \
-+ pk-apt-search.h \
-+ $(NULL)
-+
-+if APT_SEARCH_PLAIN
-+libpk_backend_apt_la_SOURCES += \
-+ pk-apt-search-plain.c \
-+ $(NULL)
-+endif
-+
-+if APT_SEARCH_SQLITE
-+libpk_backend_apt_la_SOURCES += \
-+ pk-sqlite-pkg-cache.h \
-+ pk-sqlite-pkg-cache.cpp \
-+ pk-apt-build-db.cpp \
-+ pk-apt-search-sqlite.cpp \
-+ $(NULL)
-+endif
-diff --git a/backends/apt.deprecated/helpers/.gitignore b/backends/apt.deprecated/helpers/.gitignore
-new file mode 100644
-index 0000000..0d20b64
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/.gitignore
-@@ -0,0 +1 @@
-+*.pyc
-diff --git a/backends/apt.deprecated/helpers/Makefile.am b/backends/apt.deprecated/helpers/Makefile.am
-new file mode 100644
-index 0000000..0299df2
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/Makefile.am
-@@ -0,0 +1,29 @@
-+
-+helperdir = $(datadir)/PackageKit/helpers/apt
-+
-+NULL =
-+
-+dist_helper_DATA = \
-+ install-files.py \
-+ search-name.py \
-+ search-details.py \
-+ search-group.py \
-+ search-file.py \
-+ get-depends.py \
-+ get-details.py \
-+ get-repo-list.py \
-+ get-requires.py \
-+ get-update-detail.py \
-+ get-updates.py \
-+ refresh-cache.py \
-+ repo-enable.py \
-+ resolve.py \
-+ aptBackend.py \
-+ $(NULL)
-+
-+install-data-hook:
-+ chmod a+rx $(DESTDIR)$(helperdir)/*.py
-+
-+clean-local :
-+ rm -f *~
-+
-diff --git a/backends/apt.deprecated/helpers/aptBackend.py b/backends/apt.deprecated/helpers/aptBackend.py
-new file mode 100644
-index 0000000..e5f78ca
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/aptBackend.py
-@@ -0,0 +1,536 @@
-+#
-+# vim: ts=4 et sts=4
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+# Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+import os
-+import re
-+
-+from packagekit.backend import *
-+import apt_pkg,apt_inst
-+
-+import warnings
-+warnings.filterwarnings(action='ignore', category=FutureWarning)
-+import apt
-+from aptsources.distro import get_distro
-+from aptsources.sourceslist import SourcesList
-+from sets import Set
-+from os.path import join,exists
-+from urlparse import urlparse
-+from apt.debfile import DebPackage
-+from os import system
-+
-+class Package(apt.Package):
-+ def __str__(self):
-+ return "Package %s, version %s"%(self.name,self._version)
-+
-+ def _cmp_deps(self,deps, version):
-+ for (v,c) in deps:
-+ if not apt_pkg.CheckDep(version,c,v):
-+ return False
-+ return True
-+
-+ def __init__(self, backend, pkg, data="",version=[]):
-+ apt.package.Package.__init__(self, pkg._cache, pkg._depcache,
-+ pkg._records, pkg._list, pkg._pcache,
-+ pkg._pkg)
-+ self._version = version
-+ self._data = data
-+ self._backend = backend
-+ wanted_ver = None
-+ if self.installedVersion!=None and self._cmp_deps(version,self.installedVersion):
-+ wanted_ver = self.installedVersion
-+ elif self.installedVersion == None and version == []:
-+ #self.markInstall(False,False)
-+ wanted_ver = self.candidateVersion
-+
-+ for ver in pkg._pkg.VersionList:
-+ #print "vers",dir(ver),version,ver
-+ #print data
-+ if (wanted_ver == None or wanted_ver == ver.VerStr) and self._cmp_deps(version,ver.VerStr):
-+ f, index = ver.FileList.pop(0)
-+ if self._data == "":
-+ if f.Origin=="" and f.Archive=="now":
-+ self._data = "local_install"
-+ elif f.Origin!="" or f.Archive!="":
-+ self._data = "%s/%s"%(f.Origin.replace("/","_"),f.Archive.replace("/","_"))
-+ else:
-+ self._data = "%s/unknown"%f.Site
-+ self._version = ver.VerStr
-+ break
-+ else:
-+ print "wanted",wanted_ver
-+ for ver in pkg._pkg.VersionList:
-+ print "vers",version,ver.VerStr
-+ backend.error(ERROR_PACKAGE_NOT_FOUND, "Can't find version %s for %s"%(version,self.name))
-+
-+ def setVersion(self,version,compare="="):
-+ if version!=None and (self.installedVersion == None or not apt_pkg.CheckDep(version,compare,self.installedVersion)):
-+ self.markInstall(False,False)
-+ if self.candidateVersion != version:
-+ if self._data == "":
-+ for ver in pkg._pkg.VersionList:
-+ f, index = ver.FileList.pop(0)
-+ self._data = "%s/%s"%(f.Origin,f.Archive)
-+ if ver.VerStr == version:
-+ break
-+
-+ # FIXME: this is a nasty hack, assuming that the best way to resolve
-+ # deps for non-default repos is by switching the default release.
-+ # We really need a better resolver (but that's hard)
-+ assert self._data!=""
-+ origin = self._data[self._data.find("/")+1:]
-+ print "origin",origin
-+ name = self.name
-+ apt_pkg.Config.Set("APT::Default-Release",origin)
-+ if not self._backend._caches.has_key(origin):
-+ self._backend._caches[origin] = apt.Cache(PackageKitProgress(self))
-+ print "new cache for %s"%origin
-+ self.__setParent(self._backend._caches[origin][name])
-+ self.markInstall(False,False)
-+ if not apt_pkg.CheckDep(self.candidateVersion,compare,version):
-+ self._backend.error(ERROR_PACKAGE_NOT_FOUND,
-+ "Unable to locate package version %s (only got %s) for %s"%(version,self.candidateVersion,name))
-+ return
-+ self.markKeep()
-+
-+ @property
-+ def group(self):
-+ section = self.section.split('/')[-1].lower()
-+ #if section in ():
-+ # return GROUP_ACCESSIBILITY
-+ if section in ('utils',):
-+ return "accessories"
-+ #if section in ():
-+ # return GROUP_EDUCATION
-+ if section in ('games',):
-+ return "games"
-+ if section in ('graphics',):
-+ return "graphics"
-+ if section in ('net', 'news', 'web', 'comm'):
-+ return "internet"
-+ if section in ('editors', 'tex'):
-+ return "office"
-+ if section in ('misc',):
-+ return "other"
-+ if section in ('devel', 'libdevel', 'interpreters', 'perl', 'python'):
-+ return "programming"
-+ if section in ('sound',):
-+ return "multimedia"
-+ if section in ('base', 'admin'):
-+ return "system"
-+ return "unknown"
-+
-+ @property
-+ def isInstalled(self):
-+ return super(self.__class__,self).isInstalled and self.installedVersion == self._version
-+
-+ @property
-+ def isDevelopment(self):
-+ name = self.name.lower()
-+ section = self.section.split('/')[-1].lower()
-+ return name.endswith('-dev') or name.endswith('-dbg') or \
-+ section in ('devel', 'libdevel')
-+
-+ @property
-+ def isGui(self):
-+ section = self.section.split('/')[-1].lower()
-+ return section in ('x11', 'gnome', 'kde')
-+
-+ _HYPHEN_PATTERN = re.compile(r'(\s|_)+')
-+
-+ def matchName(self, name):
-+ needle = name.strip().lower()
-+ haystack = self.name.lower()
-+ needle = Package._HYPHEN_PATTERN.sub('-', needle)
-+ haystack = Package._HYPHEN_PATTERN.sub('-', haystack)
-+ if haystack.find(needle) >= 0:
-+ return True
-+ return False
-+
-+ def matchDetails(self, details):
-+ if self.matchName(details):
-+ return True
-+ needle = details.strip().lower()
-+ haystack = self.description.lower()
-+ if haystack.find(needle) >= 0:
-+ return True
-+ return False
-+
-+ def matchGroup(self, name):
-+ needle = name.strip().lower()
-+ haystack = self.group
-+ if haystack.startswith(needle):
-+ return True
-+ return False
-+
-+class PackageKitProgress(apt.progress.OpProgress, apt.progress.FetchProgress):
-+ def __init__(self, backend):
-+ self._backend = backend
-+ apt.progress.OpProgress.__init__(self)
-+ apt.progress.FetchProgress.__init__(self)
-+
-+ # OpProgress callbacks
-+ def update(self, percent):
-+ pass
-+
-+ def done(self):
-+ pass
-+
-+ # FetchProgress callbacks
-+ def pulse(self):
-+ apt.progress.FetchProgress.pulse(self)
-+ self._backend.percentage(self.percent)
-+ return True
-+
-+ def stop(self):
-+ self._backend.percentage(100)
-+
-+ def mediaChange(self, medium, drive):
-+ # This probably should not be an error, but a Message.
-+ self._backend.error(ERROR_UNKNOWN,
-+ "Medium change needed")
-+
-+class PackageKitAptBackend(PackageKitBaseBackend):
-+ def __init__(self, args):
-+ PackageKitBaseBackend.__init__(self, args)
-+ self.status(STATUS_SETUP)
-+ self._caches = {}
-+ self._apt_cache = apt.Cache(PackageKitProgress(self))
-+ default = apt_pkg.Config.Find("APT::Default-Release")
-+ if default=="":
-+ d = get_distro()
-+ if d.id == "Debian":
-+ default = "stable"
-+ elif d.id == "Ubuntu":
-+ default = "main"
-+ else:
-+ raise Exception,d.id
-+
-+ self._caches[default] = self._apt_cache
-+
-+
-+ def search_name(self, filters, key):
-+ '''
-+ Implement the {backend}-search-name functionality
-+ '''
-+ self.status(STATUS_INFO)
-+ self.allow_cancel(True)
-+ for package in self._do_search(filters,
-+ lambda pkg: pkg.matchName(key)):
-+ self._emit_package(package)
-+
-+ def search_details(self, filters, key):
-+ '''
-+ Implement the {backend}-search-details functionality
-+ '''
-+ self.status(STATUS_INFO)
-+ self.allow_cancel(True)
-+ for package in self._do_search(filters,
-+ lambda pkg: pkg.matchDetails(key)):
-+ self._emit_package(package)
-+
-+ def search_group(self, filters, key):
-+ '''
-+ Implement the {backend}-search-group functionality
-+ '''
-+ self.status(STATUS_INFO)
-+ self.allow_cancel(True)
-+ for package in self._do_search(filters,
-+ lambda pkg: pkg.matchGroup(key)):
-+ self._emit_package(package)
-+
-+ def search_file(self, filters, key):
-+ '''
-+ Implement the {backend}-search-file functionality
-+ '''
-+ self.allow_cancel(True)
-+ self.percentage(None)
-+
-+ self.error(ERROR_NOT_SUPPORTED,
-+ "This function is not implemented in this backend")
-+
-+ def refresh_cache(self):
-+ '''
-+ Implement the {backend}-refresh_cache functionality
-+ '''
-+ self.status(STATUS_REFRESH_CACHE)
-+ try:
-+ res = self._apt_cache.update(PackageKitProgress(self))
-+ except Exception, error_message:
-+ self.error(ERROR_UNKNOWN,
-+ "Failed to fetch the following items:\n%s" % error_message)
-+ return res
-+
-+ def get_details(self, package):
-+ '''
-+ Implement the {backend}-get-details functionality
-+ '''
-+ self.status(STATUS_INFO)
-+ name, version, arch, data = self.get_package_from_id(package)
-+ pkg = Package(self, self._apt_cache[name])
-+ description = re.sub('\s+', ' ', pkg.description).strip()
-+ self.description(package, 'unknown', pkg.group, description,
-+ pkg.architecture, pkg.packageSize)
-+
-+ def resolve(self, name):
-+ '''
-+ Implement the {backend}-resolve functionality
-+ '''
-+ self.status(STATUS_INFO)
-+ try:
-+ pkg = Package(self,self._apt_cache[name])
-+ self._emit_package(pkg)
-+ except KeyError:
-+ self.error(ERROR_PACKAGE_NOT_FOUND,"Can't find a package called '%s'"%name)
-+
-+ def _do_deps(self,inp,deps,recursive):
-+ inp.markInstall()
-+ newkeys = []
-+ for x in inp.candidateDependencies:
-+ n = x.or_dependencies[0].name
-+ if not deps.has_key(n):
-+ deps[n] = []
-+ newkeys.append(n)
-+ deps[n].append((x.or_dependencies[0].version,x.or_dependencies[0].relation))
-+ if recursive:
-+ for n in newkeys:
-+ try:
-+ deps = self._do_deps(Package(self,self._apt_cache[n],version=deps[n]),deps,recursive)
-+ except KeyError: # FIXME: we're assuming this is a virtual package, which we can't cope with yet
-+ del deps[n]
-+ continue
-+ return deps
-+
-+ def get_depends(self,filters,package, recursive):
-+ '''
-+ Implement the {backend}-get-depends functionality
-+ '''
-+ self.allow_cancel(True)
-+ self.status(STATUS_INFO)
-+ recursive = (recursive == "True")
-+ name, version, arch, data = self.get_package_from_id(package)
-+ pkg = Package(self,self._apt_cache[name],version=[(version,"=")],data=data)
-+ pkg.setVersion(version)
-+ deps = self._do_deps(pkg, {}, recursive)
-+ for n in deps.keys():
-+ self._emit_package(Package(self,self._apt_cache[n],version=deps[n]))
-+
-+ def _do_reqs(self,inp,pkgs,recursive):
-+ extra = []
-+ fails = []
-+ for r in inp._pkg.RevDependsList:
-+ ch = apt_pkg.CheckDep(inp._version,r.CompType,r.TargetVer)
-+ v = (r.ParentPkg.Name,r.ParentVer.VerStr)
-+ if not ch or v in fails:
-+ #print "skip",r.TargetVer,r.CompType,r.ParentPkg.Name,r.ParentVer.VerStr
-+ fails.append(v)
-+ continue
-+ p = Package(self,self._apt_cache[r.ParentPkg.Name],r.ParentVer.VerStr)
-+ if v not in pkgs:
-+ extra.append(p)
-+ #print "new pkg",p
-+ self._emit_package(p)
-+ pkgs.add(v)
-+ if recursive:
-+ for e in extra:
-+ pkgs = self._do_reqs(p, pkgs,recursive)
-+ return pkgs
-+
-+ def get_requires(self,package,recursive):
-+ '''
-+ Implement the {backend}-get-requires functionality
-+ '''
-+ self.allow_cancel(True)
-+ self.status(STATUS_INFO)
-+ recursive = (recursive == "True")
-+ name, version, arch, data = self.get_package_from_id(package)
-+ pkg = Package(self,self._apt_cache[name], version=[(version,"=")], data=data)
-+
-+ pkgs = Set()
-+ self._do_reqs(pkg,pkgs, recursive)
-+
-+ def _build_repo_list(self):
-+ repo = {}
-+
-+ sources = SourcesList()
-+ repo["__sources"] = sources
-+
-+ root = apt_pkg.Config.FindDir("Dir::State::Lists")
-+ #print root
-+ for entry in sources:
-+ if entry.type!="":
-+ url = entry.uri
-+ #if entry.template!=None:
-+ url +="/dists/"
-+ url += entry.dist
-+ url = url.replace("//dists","/dists")
-+ #print url
-+ path = join(root,"%s_Release"%(apt_pkg.URItoFileName(url)))
-+ if not exists(path):
-+ #print path
-+ name = "%s/unknown"%urlparse(entry.uri)[1]
-+ else:
-+ lines = file(path).readlines()
-+ origin = ""
-+ suite = ""
-+ for l in lines:
-+ if l.find("Origin: ")==0:
-+ origin = l.split(" ",1)[1].strip()
-+ elif l.find("Suite: ")==0:
-+ suite = l.split(" ",1)[1].strip()
-+ assert origin!="" and suite!=""
-+ name = "%s/%s"%(origin,suite)
-+ if entry.type == "deb-src":
-+ name += "-src"
-+
-+ repo[name] = {"entry":entry}
-+ return repo
-+
-+ def get_repo_list(self, filters):
-+ '''
-+ Implement the {backend}-get-repo-list functionality
-+ '''
-+ self.allow_interrupt(True)
-+ self.status(STATUS_INFO)
-+ repo = self._build_repo_list()
-+ for e in repo.keys():
-+ if e == "__sources":
-+ continue
-+ self.repo_detail(repo[e]["entry"].line.strip(),e,not repo[e]["entry"].disabled)
-+
-+ def repo_enable(self, repoid, enable):
-+ '''
-+ Implement the {backend}-repo-enable functionality
-+ '''
-+ enable = (enable == "True")
-+ repo = self._build_repo_list()
-+ if not repo.has_key(repoid):
-+ self.error(ERROR_REPO_NOT_FOUND,"Couldn't find repo '%s'"%repoid)
-+ return
-+ r = repo[repoid]
-+ if not r["entry"].disabled == enable: # already there
-+ return
-+ r["entry"].set_enabled(enable)
-+ try:
-+ repo["__sources"].save()
-+ except IOError,e:
-+ self.error(ERROR_UNKNOWN, "Problem while trying to save repo settings to %s: %s"%(e.filename,e.strerror))
-+
-+ def get_updates(self, filter):
-+ self._apt_cache.upgrade(False)
-+ for pkg in self._apt_cache.getChanges():
-+ self._emit_package(Package(self, pkg))
-+
-+ def get_update_detail(self, package):
-+ self.allow_cancel(True)
-+ self.percentage(None)
-+ self.status(STATUS_INFO)
-+ name, version, arch, data = self.get_package_from_id(package)
-+ update = ""
-+ obsolete = ""
-+ cve_url = ""
-+ bz_url = ""
-+ vendor_url = ""
-+ reboot = "none"
-+ desc = self._apt_cache[name].description
-+ self.update_detail(package,update,obsolete,vendor_url,bz_url,cve_url,reboot,desc)
-+
-+
-+ def install_files (self, inst_files):
-+ '''
-+ Implement the {backend}-install_files functionality
-+ Install the package containing the inst_file file
-+ '''
-+ if not exists(inst_file):
-+ self.error(ERROR_PACKAGE_NOT_FOUND,"Can't find %s"%inst_file)
-+ return
-+ deb = DebPackage(inst_file)
-+ deps = {}
-+ for k in ["Depends","Recommends"]:
-+ if not deb._sections.has_key(k):
-+ continue
-+ for items in apt_pkg.ParseDepends(deb[k]):
-+ assert len(items) == 1,"Can't handle or deps properly yet"
-+ (pkg,ver,comp) = items[0]
-+ if not deps.has_key(pkg):
-+ deps[pkg] = []
-+ deps[pkg].append((ver,comp))
-+ for n in deps.keys():
-+ p = Package(self,self._apt_cache[n],version=deps[n])
-+ if not p.isInstalled:
-+ p.markInstall()
-+ assert self._apt_cache.getChanges()==[],"Don't handle install changes yet"
-+ # FIXME: nasty hack. Need a better way in
-+ ret = system("dpkg -i %s"%inst_file)
-+ if ret!=0:
-+ self.error(ERROR_UNKNOWN,"Can't install package")
-+
-+ ### Helpers ###
-+ def _emit_package(self, package):
-+ id = self.get_package_id(package.name,
-+ package._version,
-+ package.architecture,
-+ package._data)
-+ if package.isInstalled:
-+ status = INFO_INSTALLED
-+ else:
-+ status = INFO_AVAILABLE
-+ summary = package.summary
-+ self.package(id, status, summary)
-+
-+ def _do_search(self, filters, condition):
-+ filters = filters.split(';')
-+ size = len(self._apt_cache)
-+ percentage = 0
-+ for i, pkg in enumerate(self._apt_cache):
-+ new_percentage = i / float(size) * 100
-+ if new_percentage - percentage >= 5:
-+ percentage = new_percentage
-+ self.percentage(percentage)
-+ package = Package(self, pkg)
-+ if package.installedVersion is None and \
-+ package.candidateVersion is None:
-+ continue
-+ if not condition(package):
-+ continue
-+ continue
-+ vers = [x.VerStr for x in package._pkg.VersionList]
-+ if package.installedVersion!=None:
-+ i = package.installedVersion
-+ if i in vers and vers[0]!=i:
-+ del vers[vers.index(i)]
-+ vers.insert(0,i)
-+
-+ for ver in vers:
-+ p = Package(self, package, version=[[ver,"="]])
-+ if self._do_filtering(p, filters):
-+ yield p
-+ self.percentage(100)
-+
-+ def _do_filtering(self, package, filters):
-+ if len(filters) == 0 or filters == ['none']:
-+ return True
-+ if (FILTER_INSTALLED in filters) and (not package.isInstalled):
-+ return False
-+ if (FILTER_NOT_INSTALLED in filters) and package.isInstalled:
-+ return False
-+ if (FILTER_GUI in filters) and (not package.isGui):
-+ return False
-+ if (FILTER_NOT_GUI in filters) and package.isGui:
-+ return False
-+ if (FILTER_DEVELOPMENT in filters) and (not package.isDevelopment):
-+ return False
-+ if (FILTER_NOT_DEVELOPMENT in filters) and package.isDevelopment:
-+ return False
-+ return True
-+
-diff --git a/backends/apt.deprecated/helpers/get-depends.py b/backends/apt.deprecated/helpers/get-depends.py
-new file mode 100755
-index 0000000..94dca4a
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/get-depends.py
-@@ -0,0 +1,20 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+filters=sys.argv[1]
-+package=sys.argv[2]
-+recursive = sys.argv[3]
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.get_depends(filters, package, recursive)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/get-details.py b/backends/apt.deprecated/helpers/get-details.py
-new file mode 100755
-index 0000000..a813640
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/get-details.py
-@@ -0,0 +1,18 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+from aptBackend import PackageKitAptBackend
-+
-+package = sys.argv[1]
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.get_details(package)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/get-repo-list.py b/backends/apt.deprecated/helpers/get-repo-list.py
-new file mode 100755
-index 0000000..5529f72
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/get-repo-list.py
-@@ -0,0 +1,20 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+filters = sys.argv[1]
-+
-+backend = PackageKitAptBackend(sys.argv[2:])
-+backend.get_repo_list(filters)
-+backend.unLock()
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/get-requires.py b/backends/apt.deprecated/helpers/get-requires.py
-new file mode 100755
-index 0000000..e581010
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/get-requires.py
-@@ -0,0 +1,20 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+package = sys.argv[1]
-+recursive = sys.argv[2]
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.get_requires(package, recursive)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/get-update-detail.py b/backends/apt.deprecated/helpers/get-update-detail.py
-new file mode 100755
-index 0000000..5524d9a
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/get-update-detail.py
-@@ -0,0 +1,18 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2008 Michael Vogt <mvo@ubuntu.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+package=sys.argv[1]
-+backend = PackageKitAptBackend(sys.argv[2:])
-+backend.get_update_detail(package)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/get-updates.py b/backends/apt.deprecated/helpers/get-updates.py
-new file mode 100755
-index 0000000..4f45fbf
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/get-updates.py
-@@ -0,0 +1,19 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2008 Michael Vogt <mvo@ubuntu.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+from aptBackend import PackageKitAptBackend
-+
-+filter = sys.argv[1]
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.get_updates(filter)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/install-files.py b/backends/apt.deprecated/helpers/install-files.py
-new file mode 100755
-index 0000000..dfa024c
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/install-files.py
-@@ -0,0 +1,21 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
-+# Copyright (C) 2007 Red Hat Inc, Seth Vidal <skvidal@fedoraproject.org>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+
-+trusted = sys.argv[1]
-+files_to_inst = sys.argv[2:]
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.install_files(trusted, files_to_inst)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/packagekit b/backends/apt.deprecated/helpers/packagekit
-new file mode 120000
-index 0000000..8d22531
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/packagekit
-@@ -0,0 +1 @@
-+../../../python/packagekit
-\ No newline at end of file
-diff --git a/backends/apt.deprecated/helpers/refresh-cache.py b/backends/apt.deprecated/helpers/refresh-cache.py
-new file mode 100755
-index 0000000..881479d
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/refresh-cache.py
-@@ -0,0 +1,17 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+from aptBackend import PackageKitAptBackend
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.refresh_cache()
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/repo-enable.py b/backends/apt.deprecated/helpers/repo-enable.py
-new file mode 100755
-index 0000000..3cc36ae
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/repo-enable.py
-@@ -0,0 +1,20 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+repoid = sys.argv[1]
-+state=sys.argv[2]
-+backend = PackageKitAptBackend(sys.argv[2:])
-+backend.repo_enable(repoid,state)
-+backend.unLock()
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/resolve.py b/backends/apt.deprecated/helpers/resolve.py
-new file mode 100755
-index 0000000..aac34df
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/resolve.py
-@@ -0,0 +1,20 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+from aptBackend import PackageKitAptBackend
-+filters = sys.argv[1]
-+name=sys.argv[2]
-+backend = PackageKitAptBackend(sys.argv[2:])
-+backend.resolve(name)
-+backend.unLock()
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/search-details.py b/backends/apt.deprecated/helpers/search-details.py
-new file mode 100755
-index 0000000..d02f1b0
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/search-details.py
-@@ -0,0 +1,21 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+options = sys.argv[1]
-+searchlist = sys.argv[2]
-+
-+from aptBackend import PackageKitAptBackend
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.search_details(options,searchlist)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/search-file.py b/backends/apt.deprecated/helpers/search-file.py
-new file mode 100755
-index 0000000..ec60319
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/search-file.py
-@@ -0,0 +1,21 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+options = sys.argv[1]
-+searchlist = sys.argv[2]
-+
-+from aptBackend import PackageKitAptBackend
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.search_file(options,searchlist)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/search-group.py b/backends/apt.deprecated/helpers/search-group.py
-new file mode 100755
-index 0000000..f63ee80
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/search-group.py
-@@ -0,0 +1,21 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+options = sys.argv[1]
-+searchlist = sys.argv[2]
-+
-+from aptBackend import PackageKitAptBackend
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.search_group(options,searchlist)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/helpers/search-name.py b/backends/apt.deprecated/helpers/search-name.py
-new file mode 100755
-index 0000000..9f73c89
---- /dev/null
-+++ b/backends/apt.deprecated/helpers/search-name.py
-@@ -0,0 +1,21 @@
-+#!/usr/bin/python
-+#
-+# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+#
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+
-+import sys
-+
-+options = sys.argv[1]
-+searchlist = sys.argv[2]
-+
-+from aptBackend import PackageKitAptBackend
-+
-+backend = PackageKitAptBackend(sys.argv[1:])
-+backend.search_name(options,searchlist)
-+sys.exit(0)
-diff --git a/backends/apt.deprecated/pk-apt-build-db.cpp b/backends/apt.deprecated/pk-apt-build-db.cpp
-new file mode 100644
-index 0000000..885275d
---- /dev/null
-+++ b/backends/apt.deprecated/pk-apt-build-db.cpp
-@@ -0,0 +1,284 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+//#include "pk-backend-apt.h"
-+#include <pk-backend.h>
-+#include <apt-pkg/configuration.h>
-+#include <sqlite3.h>
-+
-+typedef enum {FIELD_PKG=1,FIELD_VER,FIELD_DEPS,FIELD_ARCH,FIELD_SHORT,FIELD_LONG,FIELD_REPO} Fields;
-+
-+void apt_build_db(PkBackend * backend, sqlite3 *db)
-+{
-+ GMatchInfo *match_info;
-+ GError *error = NULL;
-+ gchar *contents = NULL;
-+ gchar *sdir;
-+ const gchar *fname;
-+ GRegex *origin, *suite;
-+ GDir *dir;
-+ GHashTable *releases;
-+ int res;
-+ sqlite3_stmt *package = NULL;
-+
-+ pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-+
-+ sdir = g_build_filename(_config->Find("Dir").c_str(),_config->Find("Dir::State").c_str(),_config->Find("Dir::State::lists").c_str(), NULL);
-+ dir = g_dir_open(sdir,0,&error);
-+ if (error!=NULL)
-+ {
-+ pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "can't open %s",dir);
-+ g_error_free(error);
-+ goto search_task_cleanup;
-+ }
-+
-+ origin = g_regex_new("^Origin: (\\S+)",(GRegexCompileFlags)(G_REGEX_CASELESS|G_REGEX_OPTIMIZE|G_REGEX_MULTILINE),(GRegexMatchFlags)0,NULL);
-+ suite = g_regex_new("^Suite: (\\S+)",(GRegexCompileFlags)(G_REGEX_CASELESS|G_REGEX_OPTIMIZE|G_REGEX_MULTILINE),(GRegexMatchFlags)0,NULL);
-+
-+ releases = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
-+ while ((fname = g_dir_read_name(dir))!=NULL)
-+ {
-+ gchar *temp, *parsed_name;
-+ gchar** items = g_strsplit(fname,"_",-1);
-+ guint len = g_strv_length(items);
-+ if(len<=3) // minimum is <source>_<type>_<group>
-+ {
-+ g_strfreev(items);
-+ continue;
-+ }
-+
-+ /* warning: nasty hack with g_strjoinv */
-+ temp = items[len-2];
-+ items[len-2] = NULL;
-+ parsed_name = g_strjoinv("_",items);
-+ items[len-2] = temp;
-+
-+ if (g_ascii_strcasecmp(items[len-1],"Release")==0 && g_ascii_strcasecmp(items[len-2],"source")!=0)
-+ {
-+ gchar * repo = NULL, *fullname;
-+ fullname = g_build_filename(sdir,fname,NULL);
-+ if (g_file_get_contents(fullname,&contents,NULL,NULL) == FALSE)
-+ {
-+ pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "error loading %s",fullname);
-+ goto search_task_cleanup;
-+ }
-+ g_free(fullname);
-+
-+ g_regex_match (origin, contents, (GRegexMatchFlags)0, &match_info);
-+ if (!g_match_info_matches(match_info))
-+ {
-+ pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "origin regex failure in %s",fname);
-+ goto search_task_cleanup;
-+ }
-+ repo = g_match_info_fetch (match_info, 1);
-+
-+ g_regex_match (suite, contents, (GRegexMatchFlags)0, &match_info);
-+ if (g_match_info_matches(match_info))
-+ {
-+ temp = g_strconcat(repo,"/",g_match_info_fetch (match_info, 1),NULL);
-+ g_free(repo);
-+ repo = temp;
-+ }
-+
-+ temp = parsed_name;
-+ parsed_name = g_strconcat(temp,"_",items[len-2],NULL);
-+ g_free(temp);
-+
-+ pk_debug("type is %s, group is %s, parsed_name is %s",items[len-2],items[len-1],parsed_name);
-+
-+ g_hash_table_insert(releases, parsed_name, repo);
-+ g_free(contents);
-+ contents = NULL;
-+ }
-+ else
-+ g_free(parsed_name);
-+ g_strfreev(items);
-+ }
-+ g_dir_close(dir);
-+
-+ /* and then we need to do this again, but this time we're looking for the packages */
-+ dir = g_dir_open(sdir,0,&error);
-+ res = sqlite3_prepare_v2(db, "insert or replace into packages values (?,?,?,?,?,?,?)", -1, &package, NULL);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during insert prepare: %s", sqlite3_errmsg(db));
-+ else
-+ pk_debug("insert prepare ok for %p",package);
-+ while ((fname = g_dir_read_name(dir))!=NULL)
-+ {
-+ gchar** items = g_strsplit(fname,"_",-1);
-+ guint len = g_strv_length(items);
-+ if(len<=3) // minimum is <source>_<type>_<group>
-+ {
-+ g_strfreev(items);
-+ continue;
-+ }
-+
-+ if (g_ascii_strcasecmp(items[len-1],"Packages")==0)
-+ {
-+ const gchar *repo;
-+ gchar *temp=NULL, *parsed_name=NULL;
-+ gchar *fullname= NULL;
-+ gchar *begin=NULL, *next=NULL, *description = NULL;
-+ glong count = 0;
-+ gboolean haspk = FALSE;
-+
-+ /* warning: nasty hack with g_strjoinv */
-+ if (g_str_has_prefix(items[len-2],"binary-"))
-+ {
-+ temp = items[len-3];
-+ items[len-3] = NULL;
-+ parsed_name = g_strjoinv("_",items);
-+ items[len-3] = temp;
-+ }
-+ else
-+ {
-+ temp = items[len-1];
-+ items[len-1] = NULL;
-+ parsed_name = g_strjoinv("_",items);
-+ items[len-1] = temp;
-+ }
-+
-+ pk_debug("type is %s, group is %s, parsed_name is %s",items[len-2],items[len-1],parsed_name);
-+
-+ repo = (const gchar *)g_hash_table_lookup(releases,parsed_name);
-+ if (repo == NULL)
-+ {
-+ pk_debug("Can't find repo for %s, marking as \"unknown\"",parsed_name);
-+ repo = g_strdup("unknown");
-+ //g_assert(0);
-+ }
-+ else
-+ pk_debug("repo for %s is %s",parsed_name,repo);
-+ g_free(parsed_name);
-+
-+ fullname = g_build_filename(sdir,fname,NULL);
-+ pk_debug("loading %s",fullname);
-+ if (g_file_get_contents(fullname,&contents,NULL,NULL) == FALSE)
-+ {
-+ pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "error loading %s",fullname);
-+ goto search_task_cleanup;
-+ }
-+ /*else
-+ pk_debug("loaded");*/
-+
-+ res = sqlite3_bind_text(package,FIELD_REPO,repo,-1,SQLITE_TRANSIENT);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during repo bind: %s", sqlite3_errmsg(db));
-+ /*else
-+ pk_debug("repo bind ok");*/
-+
-+ res = sqlite3_exec(db,"begin",NULL,NULL,NULL);
-+ g_assert(res == SQLITE_OK);
-+
-+ begin = contents;
-+
-+ while (true)
-+ {
-+ next = strstr(begin,"\n");
-+ if (next!=NULL)
-+ {
-+ next[0] = '\0';
-+ next++;
-+ }
-+
-+ if (begin[0]=='\0')
-+ {
-+ if (haspk)
-+ {
-+ if (description!=NULL)
-+ {
-+ res=sqlite3_bind_text(package,FIELD_LONG,description,-1,SQLITE_TRANSIENT);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during description bind: %s", sqlite3_errmsg(db));
-+ g_free(description);
-+ description = NULL;
-+ }
-+ res = sqlite3_step(package);
-+ if (res!=SQLITE_DONE)
-+ pk_error("sqlite error during step: %s", sqlite3_errmsg(db));
-+ sqlite3_reset(package);
-+ //pk_debug("added package");
-+ haspk = FALSE;
-+ }
-+ //g_assert(0);
-+ }
-+ else if (begin[0]==' ')
-+ {
-+ if (description == NULL)
-+ description = g_strdup(&begin[1]);
-+ else
-+ {
-+ gchar *oldval = description;
-+ description = g_strconcat(oldval, "\n",&begin[1],NULL);
-+ g_free(oldval);
-+ }
-+ }
-+ else
-+ {
-+ gchar *colon = strchr(begin,':');
-+ g_assert(colon!=NULL);
-+ colon[0] = '\0';
-+ colon+=2;
-+ /*if (strlen(colon)>3000)
-+ pk_error("strlen(colon) = %d\ncolon = %s",strlen(colon),colon);*/
-+ //pk_debug("entry = '%s','%s'",begin,colon);
-+ if (begin[0] == 'P' && g_strcasecmp("Package",begin)==0)
-+ {
-+ res=sqlite3_bind_text(package,FIELD_PKG,colon,-1,SQLITE_STATIC);
-+ haspk = TRUE;
-+ count++;
-+ if (count%1000==0)
-+ pk_debug("Package %ld (%s)",count,colon);
-+ }
-+ else if (begin[0] == 'V' && g_strcasecmp("Version",begin)==0)
-+ res=sqlite3_bind_text(package,FIELD_VER,colon,-1,SQLITE_STATIC);
-+ else if (begin[0] == 'D' && g_strcasecmp("Depends",begin)==0)
-+ res=sqlite3_bind_text(package,FIELD_DEPS,colon,-1,SQLITE_STATIC);
-+ else if (begin[0] == 'A' && g_strcasecmp("Architecture",begin)==0)
-+ res=sqlite3_bind_text(package,FIELD_ARCH,colon,-1,SQLITE_STATIC);
-+ else if (begin[0] == 'D' && g_strcasecmp("Description",begin)==0)
-+ res=sqlite3_bind_text(package,FIELD_SHORT,colon,-1,SQLITE_STATIC);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during %s bind: %s", begin, sqlite3_errmsg(db));
-+ }
-+ if (next == NULL)
-+ break;
-+ begin = next;
-+ }
-+ res = sqlite3_exec(db,"commit",NULL,NULL,NULL);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during commit: %s", sqlite3_errmsg(db));
-+ res = sqlite3_clear_bindings(package);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during clear: %s", sqlite3_errmsg(db));
-+ g_free(contents);
-+ contents = NULL;
-+ }
-+ }
-+ sqlite3_finalize(package);
-+
-+search_task_cleanup:
-+ g_dir_close(dir);
-+ g_free(sdir);
-+ g_free(contents);
-+}
-+
-diff --git a/backends/apt.deprecated/pk-apt-build-db.h b/backends/apt.deprecated/pk-apt-build-db.h
-new file mode 100644
-index 0000000..bb786a9
---- /dev/null
-+++ b/backends/apt.deprecated/pk-apt-build-db.h
-@@ -0,0 +1,30 @@
-+#ifndef PK_APT_BUILD_DB
-+#define PK_APT_BUILD_DB
-+
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <sqlite3.h>
-+#include <pk-backend.h>
-+
-+void apt_build_db(PkBackend * backend, sqlite3 *db);
-+
-+#endif
-diff --git a/backends/apt.deprecated/pk-apt-search-plain.c b/backends/apt.deprecated/pk-apt-search-plain.c
-new file mode 100644
-index 0000000..5e5b4e5
---- /dev/null
-+++ b/backends/apt.deprecated/pk-apt-search-plain.c
-@@ -0,0 +1,106 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <gmodule.h>
-+#include <glib.h>
-+#include <string.h>
-+#include <pk-backend.h>
-+#include <pk-backend-spawn.h>
-+
-+extern PkBackendSpawn *spawn;
-+
-+/**
-+ * backend_get_groups:
-+ */
-+static PkGroupEnum
-+backend_get_groups (PkBackend *backend)
-+{
-+ return (PK_GROUP_ENUM_ACCESSORIES |
-+ PK_GROUP_ENUM_GAMES |
-+ PK_GROUP_ENUM_GRAPHICS |
-+ PK_GROUP_ENUM_INTERNET |
-+ PK_GROUP_ENUM_OFFICE |
-+ PK_GROUP_ENUM_OTHER |
-+ PK_GROUP_ENUM_PROGRAMMING |
-+ PK_GROUP_ENUM_MULTIMEDIA |
-+ PK_GROUP_ENUM_SYSTEM);
-+}
-+
-+/**
-+ * backend_get_filters:
-+ */
-+static PkFilterEnum
-+backend_get_filters (PkBackend *backend)
-+{
-+ return (PK_FILTER_ENUM_GUI |
-+ PK_FILTER_ENUM_INSTALLED |
-+ PK_FILTER_ENUM_DEVELOPMENT);
-+}
-+
-+/**
-+ * backend_get_details:
-+ */
-+
-+void
-+backend_get_details (PkBackend *backend, const gchar *package_id)
-+{
-+ pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
-+}
-+
-+/**
-+ * backend_search_details:
-+ */
-+
-+void
-+backend_search_details (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "search-details.py", filters_texts_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_search_name:
-+ */
-+void
-+backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "search-name.py", filters_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_search_group:
-+ */
-+void
-+backend_search_group (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ pk_backend_spawn_helper (spawn, "search-group.py", filters_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/* don't need to do any setup/finalize in the plain search mode */
-+void backend_init_search(PkBackend *backend) {}
-+void backend_finish_search(PkBackend *backend) {}
-diff --git a/backends/apt.deprecated/pk-apt-search-sqlite.cpp b/backends/apt.deprecated/pk-apt-search-sqlite.cpp
-new file mode 100644
-index 0000000..98bdc7f
---- /dev/null
-+++ b/backends/apt.deprecated/pk-apt-search-sqlite.cpp
-@@ -0,0 +1,135 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <gmodule.h>
-+#include <glib.h>
-+#include <string.h>
-+#include <pk-backend.h>
-+#include <pk-backend-spawn.h>
-+#include "pk-sqlite-pkg-cache.h"
-+#include <apt-pkg/configuration.h>
-+#include <apt-pkg/init.h>
-+#include "pk-apt-build-db.h"
-+
-+static PkBackendSpawn *spawn;
-+
-+/**
-+ * backend_get_groups:
-+ */
-+extern "C" PkGroupEnum
-+backend_get_groups (PkBackend *backend)
-+{
-+ return (PK_GROUP_ENUM_ACCESSORIES |
-+ PK_GROUP_ENUM_GAMES |
-+ PK_GROUP_ENUM_GRAPHICS |
-+ PK_GROUP_ENUM_INTERNET |
-+ PK_GROUP_ENUM_OFFICE |
-+ PK_GROUP_ENUM_OTHER |
-+ PK_GROUP_ENUM_PROGRAMMING |
-+ PK_GROUP_ENUM_MULTIMEDIA |
-+ PK_GROUP_ENUM_SYSTEM);
-+}
-+
-+/**
-+ * backend_get_filters:
-+ */
-+extern "C" PkFilterEnum
-+backend_get_filters (PkBackend *backend)
-+{
-+ return (PK_FILTER_ENUM_GUI |
-+ PK_FILTER_ENUM_INSTALLED |
-+ PK_FILTER_ENUM_DEVELOPMENT);
-+}
-+
-+/**
-+ * backend_get_details:
-+ */
-+
-+extern "C" void
-+backend_get_details (PkBackend *backend, const gchar *package_id)
-+{
-+ sqlite_get_details(backend,package_id);
-+}
-+
-+/**
-+ * backend_search_details:
-+ */
-+
-+extern "C" void
-+backend_search_details (PkBackend *backend, const gchar *filter, const gchar *search)
-+{
-+ sqlite_search_details(backend,filter,search);
-+}
-+
-+/**
-+ * backend_search_name:
-+ */
-+extern "C" void
-+backend_search_name (PkBackend *backend, const gchar *filter, const gchar *search)
-+{
-+ sqlite_search_name(backend,filter,search);
-+}
-+
-+/**
-+ * backend_search_group:
-+ */
-+extern "C" void
-+backend_search_group (PkBackend *backend, const gchar *filter, const gchar *search)
-+{
-+ pk_backend_set_allow_cancel (backend, TRUE);
-+ pk_backend_spawn_helper (spawn, "search-group.py", filter, search, NULL);
-+}
-+
-+static gboolean inited = FALSE;
-+
-+#define APT_DB PK_DB_DIR "/apt.db"
-+
-+extern "C" void backend_init_search(PkBackend *backend)
-+{
-+ if (!inited)
-+ {
-+ gchar *apt_fname = NULL;
-+ if (pkgInitConfig(*_config) == false)
-+ pk_debug("pkginitconfig was false");
-+ if (pkgInitSystem(*_config, _system) == false)
-+ pk_debug("pkginitsystem was false");
-+
-+ apt_fname = g_strconcat(
-+ _config->Find("Dir").c_str(),
-+ _config->Find("Dir::Cache").c_str(),
-+ _config->Find("Dir::Cache::pkgcache").c_str(),
-+ NULL);
-+
-+ //sqlite_set_installed_check(is_installed);
-+ sqlite_init_cache(backend, APT_DB, apt_fname, apt_build_db);
-+ g_free(apt_fname);
-+
-+ spawn = pk_backend_spawn_new ();
-+ pk_backend_spawn_set_name (spawn, "apt-sqlite");
-+
-+ inited = TRUE;
-+ }
-+}
-+
-+extern "C" void backend_finish_search(PkBackend *backend)
-+{
-+ sqlite_finish_cache(backend);
-+}
-diff --git a/backends/apt.deprecated/pk-apt-search.h b/backends/apt.deprecated/pk-apt-search.h
-new file mode 100644
-index 0000000..e36e89f
---- /dev/null
-+++ b/backends/apt.deprecated/pk-apt-search.h
-@@ -0,0 +1,36 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#ifndef __PK_APT_SEARCH_H
-+#define __PK_APT_SEARCH_H
-+
-+#include <glib.h>
-+#include <pk-backend.h>
-+
-+void backend_init_search(PkBackend *backend);
-+void backend_finish_search(PkBackend *backend);
-+
-+void backend_get_details (PkBackend *backend, const gchar *package_id);
-+void backend_search_details (PkBackend *backend, const gchar *filter, const gchar *search);
-+void backend_search_name (PkBackend *backend, const gchar *filter, const gchar *search);
-+void backend_search_group (PkBackend *backend, const gchar *filter, const gchar *search);
-+
-+#endif
-diff --git a/backends/apt.deprecated/pk-backend-apt.c b/backends/apt.deprecated/pk-backend-apt.c
-new file mode 100644
-index 0000000..f59cd88
---- /dev/null
-+++ b/backends/apt.deprecated/pk-backend-apt.c
-@@ -0,0 +1,268 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+ * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <gmodule.h>
-+#include <glib.h>
-+#include <string.h>
-+#include <pk-backend.h>
-+#include <pk-backend-spawn.h>
-+#include <pk-package-ids.h>
-+#include "pk-apt-search.h"
-+#include "config.h"
-+
-+PkBackendSpawn *spawn;
-+
-+/**
-+ * backend_initialize:
-+ * This should only be run once per backend load, i.e. not every transaction
-+ */
-+static void
-+backend_initialize (PkBackend *backend)
-+{
-+ pk_debug ("FILTER: initialize");
-+ spawn = pk_backend_spawn_new ();
-+ pk_backend_spawn_set_name (spawn, "apt");
-+ backend_init_search (backend);
-+}
-+
-+/**
-+ * backend_destroy:
-+ * This should only be run once per backend load, i.e. not every transaction
-+ */
-+static void
-+backend_destroy (PkBackend *backend)
-+{
-+ pk_debug ("FILTER: destroy");
-+ backend_finish_search (backend);
-+ g_object_unref (spawn);
-+}
-+
-+/**
-+ * backend_get_groups:
-+ */
-+static PkGroupEnum
-+backend_get_groups (PkBackend *backend)
-+{
-+ return (PK_GROUP_ENUM_ACCESSORIES |
-+ PK_GROUP_ENUM_GAMES |
-+ PK_GROUP_ENUM_GRAPHICS |
-+ PK_GROUP_ENUM_INTERNET |
-+ PK_GROUP_ENUM_OFFICE |
-+ PK_GROUP_ENUM_OTHER |
-+ PK_GROUP_ENUM_PROGRAMMING |
-+ PK_GROUP_ENUM_MULTIMEDIA |
-+ PK_GROUP_ENUM_SYSTEM);
-+}
-+
-+/**
-+ * backend_get_filters:
-+ */
-+static PkFilterEnum
-+backend_get_filters (PkBackend *backend)
-+{
-+ return (PK_FILTER_ENUM_GUI |
-+ PK_FILTER_ENUM_INSTALLED |
-+ PK_FILTER_ENUM_DEVELOPMENT);
-+}
-+
-+/**
-+ * pk_backend_bool_to_text:
-+ */
-+static const gchar *
-+pk_backend_bool_to_text (gboolean value)
-+{
-+ if (value == TRUE) {
-+ return "yes";
-+ }
-+ return "no";
-+}
-+
-+/**
-+ * backend_get_depends:
-+ */
-+static void
-+backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-depends.py", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_updates:
-+ */
-+static void
-+backend_get_updates (PkBackend *backend, PkFilterEnum filters)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-updates.py", filters_text, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_update_detail:
-+ */
-+static void
-+backend_get_update_detail (PkBackend *backend, const gchar *package_id)
-+{
-+ pk_backend_spawn_helper (spawn, "get-update-detail.py", package_id, NULL);
-+}
-+
-+/**
-+ * backend_install_packages:
-+ */
-+static void
-+backend_install_packages (PkBackend *backend, gchar **package_ids)
-+{
-+ gchar *package_ids_temp;
-+
-+ /* check network state */
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ /* send the complete list as stdin */
-+ package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-+ pk_backend_spawn_helper (spawn, "install-packages.py", package_ids_temp, NULL);
-+ g_free (package_ids_temp);
-+}
-+
-+/**
-+ * backend_refresh_cache:
-+ */
-+static void
-+backend_refresh_cache (PkBackend *backend, gboolean force)
-+{
-+ /* check network state */
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache whilst offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ pk_backend_spawn_helper (spawn, "refresh-cache.py", NULL);
-+}
-+
-+/**
-+ * pk_backend_remove_packages:
-+ *
-+static void
-+backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
-+{
-+ gchar *package_ids_temp;
-+ package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-+ pk_backend_spawn_helper (spawn, "remove-packages.py", pk_backend_bool_to_text (allow_deps), package_ids_temp, NULL);
-+ g_free (package_ids_temp);
-+} */
-+
-+/**
-+ * pk_backend_update_packages:
-+ */
-+static void
-+backend_update_packages (PkBackend *backend, gchar **package_ids)
-+{
-+ gchar *package_ids_temp;
-+
-+ /* check network state */
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ /* send the complete list as stdin */
-+ package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-+ pk_backend_spawn_helper (spawn, "update-packages.py", package_ids_temp, NULL);
-+ g_free (package_ids_temp);
-+}
-+
-+/**
-+ * pk_backend_update_system:
-+ */
-+static void
-+backend_update_system (PkBackend *backend)
-+{
-+ pk_backend_spawn_helper (spawn, "update-system.py", NULL);
-+}
-+
-+/**
-+ * pk_backend_resolve:
-+ */
-+static void
-+backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "resolve.py", filters_text, package_id, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * pk_backend_get_repo_list:
-+ */
-+static void
-+backend_get_repo_list (PkBackend *backend, PkFilterEnum filters)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-repo-list.py", filters_text, NULL);
-+ g_free (filters_text);
-+}
-+
-+PK_BACKEND_OPTIONS (
-+ "Apt (with " APT_SEARCH " searching)", /* description */
-+ "Ali Sabil <ali.sabil@gmail.com>; Tom Parker <palfrey@tevp.net>", /* author */
-+ backend_initialize, /* initalize */
-+ backend_destroy, /* destroy */
-+ backend_get_groups, /* get_groups */
-+ backend_get_filters, /* get_filters */
-+ NULL, /* cancel */
-+ backend_get_depends, /* get_depends */
-+ backend_get_details, /* get_details */
-+ NULL, /* get_files */
-+ NULL, /* get_packages */
-+ backend_get_repo_list, /* get_repo_list */
-+ NULL, /* get_requires */
-+ backend_get_update_detail, /* get_update_detail */
-+ backend_get_updates, /* get_updates */
-+ NULL, /* install_files */
-+ backend_install_packages, /* install_packages */
-+ NULL, /* install_signature */
-+ backend_refresh_cache, /* refresh_cache */
-+ NULL, /* remove_packages */
-+ NULL, /* repo_enable */
-+ NULL, /* repo_set_data */
-+ backend_resolve, /* resolve */
-+ NULL, /* rollback */
-+ backend_search_details, /* search_details */
-+ NULL, /* search_file */
-+ backend_search_group, /* search_group */
-+ backend_search_name, /* search_name */
-+ NULL, /* service_pack */
-+ backend_update_package, /* update_package */
-+ backend_update_system, /* update_system */
-+ NULL /* what_provides */
-+);
-diff --git a/backends/apt.deprecated/pk-sqlite-pkg-cache.cpp b/backends/apt.deprecated/pk-sqlite-pkg-cache.cpp
-new file mode 100644
-index 0000000..1bf9a50
---- /dev/null
-+++ b/backends/apt.deprecated/pk-sqlite-pkg-cache.cpp
-@@ -0,0 +1,215 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <glib.h>
-+#include <glib/gstdio.h>
-+#include "pk-sqlite-pkg-cache.h"
-+
-+static sqlite3 *db = NULL;
-+static PkBackend *backend;
-+static gboolean(*is_installed) (const PkPackageId *) = NULL;
-+
-+void sqlite_set_installed_check(gboolean(*func) (const PkPackageId *))
-+{
-+ is_installed = func;
-+}
-+
-+void
-+sqlite_init_cache(PkBackend *backend, const char* dbname, const char *compare_fname, void (*build_db)(PkBackend *, sqlite3 *))
-+{
-+ int ret;
-+ struct stat st;
-+ time_t db_age;
-+
-+ ret = sqlite3_open (dbname, &db);
-+ g_assert(ret == SQLITE_OK);
-+ g_assert(db!=NULL);
-+ ret = sqlite3_exec(db,"PRAGMA synchronous = OFF",NULL,NULL,NULL);
-+ g_assert(ret == SQLITE_OK);
-+
-+ g_stat(dbname, &st);
-+ db_age = st.st_mtime;
-+ g_stat(compare_fname, &st);
-+ if (db_age>=st.st_mtime)
-+ {
-+ ret = sqlite3_exec(db, "select value from params where name = 'build_complete'", NULL, NULL, NULL);
-+ if (ret != SQLITE_ERROR)
-+ return;
-+ pk_debug("ages are %lu for db, and %lu for comparism",db_age,st.st_mtime);
-+ }
-+ ret = sqlite3_exec(db,"drop table packages",NULL,NULL,NULL); // wipe it!
-+ //g_assert(ret == SQLITE_OK);
-+ pk_debug("wiped db");
-+ ret = sqlite3_exec(db,"create table packages (name text, version text, deps text, arch text, short_desc text, long_desc text, repo string, primary key(name,version,arch,repo))",NULL,NULL,NULL);
-+ g_assert(ret == SQLITE_OK);
-+
-+ build_db(backend,db);
-+
-+ sqlite3_exec(db,"create table params (name text primary key, value integer)", NULL, NULL, NULL);
-+ sqlite3_exec(db,"insert into params values ('build_complete',1)", NULL, NULL, NULL);
-+}
-+
-+void sqlite_finish_cache(PkBackend *backend)
-+{
-+ sqlite3_close(db);
-+}
-+
-+// sqlite_search_packages_thread
-+static gboolean
-+sqlite_search_packages_thread (PkBackend *backend)
-+{
-+ int res;
-+ gchar *sel;
-+ const gchar *search;
-+
-+ pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-+ type = pk_backend_get_uint (backend, "type");
-+ search = pk_backend_get_string (backend, "search");
-+
-+ pk_debug("finding %s", search);
-+
-+ sqlite3_stmt *package = NULL;
-+ g_strdelimit(search," ",'%');
-+
-+ if (type == SEARCH_NAME)
-+ sel = g_strdup_printf("select name,version,arch,repo,short_desc from packages where name like '%%%s%%'",search);
-+ else if (type == SEARCH_DETAILS)
-+ sel = g_strdup_printf("select name,version,arch,repo,short_desc from packages where name like '%%%s%%' or short_desc like '%%%s%%' or long_desc like '%%%s%%'",search, search, search);
-+ else
-+ {
-+ pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Unknown search task type");
-+ goto end_search_packages;
-+ }
-+
-+ pk_debug("statement is '%s'",sel);
-+ res = sqlite3_prepare_v2(db,sel, -1, &package, NULL);
-+ g_free(sel);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during select prepare: %s", sqlite3_errmsg(db));
-+ res = sqlite3_step(package);
-+ while (res == SQLITE_ROW)
-+ {
-+ PkPackageId *pid = pk_package_id_new_from_list((const gchar*)sqlite3_column_text(package,0),
-+ (const gchar*)sqlite3_column_text(package,1),
-+ (const gchar*)sqlite3_column_text(package,2),
-+ (const gchar*)sqlite3_column_text(package,3));
-+
-+ gchar *cpid = pk_package_id_to_string(pid);
-+ PkInfoEnum pie = PK_INFO_ENUM_UNKNOWN;
-+
-+ if (is_installed != NULL)
-+ pie = is_installed(pid)?PK_INFO_ENUM_INSTALLED:PK_INFO_ENUM_AVAILABLE;
-+
-+ pk_backend_package(backend, pie, cpid, (const gchar*)sqlite3_column_text(package,4));
-+
-+ g_free(cpid);
-+ pk_package_id_free(pid);
-+
-+ if (res==SQLITE_ROW)
-+ res = sqlite3_step(package);
-+ }
-+ if (res!=SQLITE_DONE)
-+ {
-+ pk_debug("sqlite error during step (%d): %s", res, sqlite3_errmsg(db));
-+ g_assert(0);
-+ }
-+
-+end_search_packages:
-+ pk_backend_finished (backend);
-+ return TRUE;
-+}
-+
-+/**
-+ * sqlite_search_details:
-+ */
-+void
-+sqlite_search_details (PkBackend *backend, const gchar *filter, const gchar *search)
-+{
-+ pk_backend_set_uint (backend, "type", SEARCH_DETAILS);
-+ pk_backend_thread_create (backend, sqlite_search_packages_thread);
-+}
-+
-+/**
-+ * sqlite_search_name:
-+ */
-+void
-+sqlite_search_name (PkBackend *backend, const gchar *filter, const gchar *search)
-+{
-+ pk_backend_set_uint (backend, "type", SEARCH_NAME);
-+ pk_backend_thread_create (backend, sqlite_search_packages_thread);
-+}
-+
-+// sqlite_get_details_thread
-+static gboolean
-+sqlite_get_details_thread (PkBackend *backend)
-+{
-+ PkPackageId *pi;
-+ const gchar *package_id;
-+ int res;
-+
-+ package_id = pk_backend_get_string (backend, "package_id");
-+ pi = pk_package_id_new_from_string(package_id);
-+ if (pi == NULL)
-+ {
-+ pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-+ pk_backend_finished(backend);
-+ return;
-+ }
-+
-+ pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-+ pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-+
-+ pk_debug("finding %s", pi->name);
-+
-+ sqlite3_stmt *package = NULL;
-+ gchar *sel = g_strdup_printf("select long_desc from packages where name = '%s' and version = '%s' and repo = '%s'",pi->name,pi->version,pi->data);
-+ pk_debug("statement is '%s'",sel);
-+ res = sqlite3_prepare_v2(db,sel, -1, &package, NULL);
-+ g_free(sel);
-+ if (res!=SQLITE_OK)
-+ pk_error("sqlite error during select prepare: %s", sqlite3_errmsg(db));
-+ res = sqlite3_step(package);
-+ pk_backend_details(backend,pi->name, "unknown", PK_GROUP_ENUM_OTHER,(const gchar*)sqlite3_column_text(package,0),"",0);
-+ res = sqlite3_step(package);
-+ if (res==SQLITE_ROW)
-+ pk_error("multiple matches for that package!");
-+ if (res!=SQLITE_DONE)
-+ {
-+ pk_debug("sqlite error during step (%d): %s", res, sqlite3_errmsg(db));
-+ g_assert(0);
-+ }
-+
-+ g_free(dt);
-+
-+ return TRUE;
-+}
-+
-+/**
-+ * sqlite_get_details:
-+ */
-+extern "C++" void
-+sqlite_get_details (PkBackend *backend, const gchar *package_id)
-+{
-+ pk_backend_thread_create (backend, sqlite_get_details_thread);
-+ return;
-+}
-+
-diff --git a/backends/apt.deprecated/pk-sqlite-pkg-cache.h b/backends/apt.deprecated/pk-sqlite-pkg-cache.h
-new file mode 100644
-index 0000000..68fad42
---- /dev/null
-+++ b/backends/apt.deprecated/pk-sqlite-pkg-cache.h
-@@ -0,0 +1,42 @@
-+#ifndef SQLITE_PKT_CACHE
-+#define SQLITE_PKT_CACHE
-+
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+typedef enum {
-+ SEARCH_NAME = 1,
-+ SEARCH_DETAILS,
-+ SEARCH_FILE
-+} SearchDepth;
-+
-+#include <pk-backend.h>
-+#include <sqlite3.h>
-+
-+void sqlite_init_cache(PkBackend *backend, const char* dbname, const char* compare_fname, void (*build_db)(PkBackend *, sqlite3 *db));
-+void sqlite_finish_cache(PkBackend *backend);
-+
-+void sqlite_search_details (PkBackend *backend, const gchar *filter, const gchar *search);
-+void sqlite_search_name (PkBackend *backend, const gchar *filter, const gchar *search);
-+void backend_search_common(PkBackend * backend, const gchar * filter, const gchar * search, SearchDepth which, PkBackendThreadFunc func);
-+void sqlite_get_details (PkBackend *backend, const gchar *package_id);
-+
-+#endif
-diff --git a/backends/apt/HACKING b/backends/apt/HACKING
-new file mode 100644
-index 0000000..2b99c5d
---- /dev/null
-+++ b/backends/apt/HACKING
-@@ -0,0 +1,5 @@
-+The backend can be tested by running it as root from the source code
-+repository. Make sure to kill packagekitd before to force a reintializing
-+of the cache:
-+
-+ killall packagekitd; python aptDBUSBackend.py
-diff --git a/backends/apt/Makefile.am b/backends/apt/Makefile.am
-index 07b4131..e315ba9 100644
---- a/backends/apt/Makefile.am
-+++ b/backends/apt/Makefile.am
-@@ -1,30 +1,25 @@
--NULL =
-+NULL =
-
--SUBDIRS = helpers
- plugindir = $(PK_PLUGIN_DIR)
- plugin_LTLIBRARIES = libpk_backend_apt.la
--
-+libpk_backend_apt_la_SOURCES = pk-backend-apt.c
- libpk_backend_apt_la_LIBADD = $(PK_PLUGIN_LIBS)
--libpk_backend_apt_la_LDFLAGS = -module -avoid-version $(APT_LIBS)
--libpk_backend_apt_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(APT_CFLAGS)
--libpk_backend_apt_la_CXXFLAGS = $(PK_PLUGIN_CFLAGS) $(APT_CFLAGS) -DPK_DB_DIR=\""$(PK_DB_DIR)"\"
-+libpk_backend_apt_la_LDFLAGS = -module -avoid-version
-+libpk_backend_apt_la_CFLAGS = $(PK_PLUGIN_CFLAGS)
-+
-+dbusinstancedir = $(LIBEXECDIR)
-+dbusinstance_DATA = \
-+ aptDBUSBackend.py \
-+ $(NULL)
-+
-+EXTRA_DIST = \
-+ $(dbusinstance_DATA) \
-+ $(NULL)
-
--libpk_backend_apt_la_SOURCES = \
-- pk-backend-apt.c \
-- pk-apt-search.h \
-- $(NULL)
-+install-data-hook:
-+ chmod a+rx $(DESTDIR)$(libexecdir)/*.py
-
--if APT_SEARCH_PLAIN
--libpk_backend_apt_la_SOURCES += \
-- pk-apt-search-plain.c \
-- $(NULL)
--endif
-+clean-local :
-+ rm -f *~
-+ rm -f *.pyc
-
--if APT_SEARCH_SQLITE
--libpk_backend_apt_la_SOURCES += \
-- pk-sqlite-pkg-cache.h \
-- pk-sqlite-pkg-cache.cpp \
-- pk-apt-build-db.cpp \
-- pk-apt-search-sqlite.cpp \
-- $(NULL)
--endif
-diff --git a/backends/apt/README b/backends/apt/README
-new file mode 100644
-index 0000000..0a3da6e
---- /dev/null
-+++ b/backends/apt/README
-@@ -0,0 +1,23 @@
-+The name of this backend is apt2.
-+
-+It supports apt which is mainly used by Debian and its derivates. In contrast to
-+the backend called apt this one uses DBus for the communication with the
-+packagekit daemon. This allows to perform actions without having to reopen
-+the cache for each one.
-+
-+To provide a tremendously fast search function a Xapian database is used.
-+It is provided by Enrico Zini's apt-xapian-index. Debtags will be used to
-+enhance the quality of the search results further.
-+
-+A list of implemented functions are listed in the PackageKit FAQ:
-+
-+http://www.packagekit.org/pk-faq.html
-+
-+You can find packages for Ubuntu here:
-+
-+https://www.launchpad.net/~packagekit/+ppa
-+
-+Packages for Debian Unstable will be provided soon.
-+
-+Feel free to send comments or bug reports to the PackageKit mailing list
-+or to the author.
-diff --git a/backends/apt/TODO b/backends/apt/TODO
-new file mode 100644
-index 0000000..bee2f3d
---- /dev/null
-+++ b/backends/apt/TODO
-@@ -0,0 +1,70 @@
-+ISSUES:
-+
-+ * Support delayed or hidden debconf questions
-+
-+Unresolved issues can be discussed at the following wiki page:
-+http://wiki.debian.org/PackageKit
-+
-+
-+TODO:
-+
-+ * Implement all open backend methods. A list of implemented backend methods
-+ can be found in PackageKit FAQ or in pk-backend-apt2.c.
-+
-+ * Blacklist packages requiring input on the terminal and try to change
-+ the Debian policy in the long run. Way of automation?
-+
-+ * Allow to inject alternative apt.package.Package classes into the
-+ cache to support PackageKit and distribution specific needs
-+ (e.g. when is a package called free or supported)
-+
-+ * Allow to reinject debtags into the search results to get
-+ similar software which not matches on the search terms
-+
-+ * Index file list and add properties for package name and section to
-+ the xapian database to also make use of it in search group and
-+ search name (do we want this?)
-+
-+ * Map Debian/Ubuntu sections to PackageKit groups:
-+ - admin : System Administration => admin-tools
-+ - base : Base System => system
-+ - comm : Communication => communication
-+ - devel : Development => programming
-+ - doc : Documentation => ???
-+ - editors : Editors => accessoires
-+ - electronics : Electronics => other
-+ - embedded : Embedded Devices => system
-+ - games : Games and Amusement => games
-+ - gnome : GNOME Desktop Environment => desktop-gnome
-+ - graphics : Graphics => graphics
-+ - hamradio : Amateur Radio => communication
-+ - interpreters : Interpreted Computer L. => programming
-+ - kde : KDE Desktop Environment => desktop-kde
-+ - libdevel : Libraries - Development => programming
-+ - libs : Libraries => system
-+ - mail : Email => internet
-+ - math : Mathematics => ??? science/education
-+ - misc : Miscellaneous - Text Based => other
-+ - net : Networkinga => network
-+ - news : Newsgroup => internet
-+ - oldlibs : Libraries - Old => legacy
-+ - otherosfs : Cross Platform => system
-+ - perl : Perl Programming Language => programming
-+ - python : Python Programming Language => programming
-+ - science : Science => ??? science/education
-+ - shells : Shells => system
-+ - sound : Multimedia => multimedia
-+ - tex : TeX Authoring => publishing
-+ - text : Word Processing => publishing
-+ - utils : Utilities => accessoires
-+ - web : World Wide Web => internet
-+ - x11 : Miscellaneous - Graphical => desktop-other
-+ - unknown : Unknown => unknown
-+ - alien : Converted From RPM by Alien" => unknown
-+ - translations => localization
-+ The following could not be maped: science, documentation, electronics
-+ Are there any derivates with additional sections?
-+
-+ * Fix the dbus policy. Should we require at_console for searching?
-+
-+DONE:
-diff --git a/backends/apt/aptDBUSBackend.py b/backends/apt/aptDBUSBackend.py
-new file mode 100755
-index 0000000..22eb714
---- /dev/null
-+++ b/backends/apt/aptDBUSBackend.py
-@@ -0,0 +1,679 @@
-+#!/usr/bin/env python
-+# -*- coding: utf-8 -*-
-+"""
-+Provides an apt backend to PackageKit
-+
-+Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-+Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-+Copyright (C) 2008 Sebastian Heinlein <glatzor@ubuntu.com>
-+
-+Licensed under the GNU General Public License Version 2
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2 of the License, or
-+(at your option) any later version.
-+"""
-+
-+__author__ = "Sebastian Heinlein <devel@glatzor.de>"
-+__state__ = "experimental"
-+
-+import os
-+import pty
-+import re
-+import signal
-+import time
-+import threading
-+import warnings
-+
-+import apt
-+import apt_pkg
-+import dbus
-+import dbus.glib
-+import dbus.service
-+import dbus.mainloop.glib
-+import gobject
-+
-+from packagekit.daemonBackend import PACKAGEKIT_DBUS_INTERFACE, PACKAGEKIT_DBUS_PATH, PackageKitBaseBackend, PackagekitProgress, pklog, threaded, async
-+from packagekit.enums import *
-+
-+warnings.filterwarnings(action='ignore', category=FutureWarning)
-+
-+PACKAGEKIT_DBUS_SERVICE = 'org.freedesktop.PackageKitAptBackend'
-+
-+XAPIANDBPATH = os.environ.get("AXI_DB_PATH", "/var/lib/apt-xapian-index")
-+XAPIANDB = XAPIANDBPATH + "/index"
-+XAPIANDBVALUES = XAPIANDBPATH + "/values"
-+
-+# Required for daemon mode
-+os.putenv("PATH",
-+ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")
-+# Avoid questions from the maintainer scripts as far as possible
-+os.putenv("DEBIAN_FRONTEND", "noninteractive")
-+os.putenv("APT_LISTCHANGES_FRONTEND", "none")
-+
-+# Setup threading support
-+gobject.threads_init()
-+dbus.glib.threads_init()
-+
-+class PackageKitOpProgress(apt.progress.OpProgress):
-+ '''
-+ Handle the cache opening process
-+ '''
-+ def __init__(self, backend, prange=(0,100), progress=True):
-+ self._backend = backend
-+ apt.progress.OpProgress.__init__(self)
-+ self.steps = []
-+ for v in [0.12, 0.25, 0.50, 0.75, 1.00]:
-+ s = prange[0] + (prange[1] - prange[0]) * v
-+ self.steps.append(s)
-+ self.pstart = float(prange[0])
-+ self.pend = self.steps.pop(0)
-+ self.pprev = None
-+ self.show_progress = progress
-+
-+ # OpProgress callbacks
-+ def update(self, percent):
-+ progress = int(self.pstart + percent / 100 * (self.pend - self.pstart))
-+ if self.show_progress == True and self.pprev < progress:
-+ self._backend.PercentageChanged(progress)
-+ self.pprev = progress
-+
-+ def done(self):
-+ self.pstart = self.pend
-+ try:
-+ self.pend = self.steps.pop(0)
-+ except:
-+ pklog.warning("An additional step to open the cache is required")
-+
-+class PackageKitFetchProgress(apt.progress.FetchProgress):
-+ '''
-+ Handle the package download process
-+ '''
-+ def __init__(self, backend, prange=(0,100)):
-+ self._backend = backend
-+ apt.progress.FetchProgress.__init__(self)
-+ self.pstart = prange[0]
-+ self.pend = prange[1]
-+ self.pprev = None
-+
-+ # FetchProgress callbacks
-+ def pulse(self):
-+ if self._backend._canceled.isSet():
-+ return False
-+ percent = ((self.currentBytes + self.currentItems)*100.0)/float(self.totalBytes+self.totalItems)
-+ progress = int(self.pstart + percent/100 * (self.pend - self.pstart))
-+ if self.pprev < progress:
-+ self._backend.PercentageChanged(progress)
-+ self.pprev = progress
-+ apt.progress.FetchProgress.pulse(self)
-+ return True
-+
-+ def start(self):
-+ self._backend.StatusChanged(STATUS_DOWNLOAD)
-+ self._backend.AllowCancel(True)
-+
-+ def stop(self):
-+ self._backend.PercentageChanged(self.pend)
-+ self._backend.AllowCancel(False)
-+
-+ def mediaChange(self, medium, drive):
-+ #FIXME: use the Message method to notify the user
-+ self._backend.error(ERROR_UNKNOWN,
-+ "Medium change needed")
-+
-+class PackageKitInstallProgress(apt.progress.InstallProgress):
-+ '''
-+ Handle the installation and removal process. Bits taken from
-+ DistUpgradeViewNonInteractive.
-+ '''
-+ def __init__(self, backend, prange=(0,100)):
-+ apt.progress.InstallProgress.__init__(self)
-+ self._backend = backend
-+ self.timeout = 900
-+ self.pstart = prange[0]
-+ self.pend = prange[1]
-+ self.pprev = None
-+
-+ def statusChange(self, pkg, percent, status):
-+ progress = self.pstart + percent/100 * (self.pend - self.pstart)
-+ if self.pprev < progress:
-+ self._backend.PercentageChanged(int(progress))
-+ self.pprev = progress
-+ pklog.debug("PM status: %s" % status)
-+
-+ def startUpdate(self):
-+ self._backend.StatusChanged(STATUS_INSTALL)
-+ self.last_activity = time.time()
-+
-+ def updateInterface(self):
-+ pklog.debug("Updating interface")
-+ apt.progress.InstallProgress.updateInterface(self)
-+
-+ def conffile(self, current, new):
-+ pklog.critical("Config file prompt: '%s'" % current)
-+
-+def sigquit(signum, frame):
-+ pklog.error("Was killed")
-+ sys.exit(1)
-+
-+class PackageKitAptBackend(PackageKitBaseBackend):
-+ '''
-+ PackageKit backend for apt
-+ '''
-+ def __init__(self, bus_name, dbus_path):
-+ pklog.info("Initializing APT backend")
-+ signal.signal(signal.SIGQUIT, sigquit)
-+ self._cache = None
-+ self._canceled = threading.Event()
-+ self._canceled.clear()
-+ self._lock = threading.Lock()
-+ # Check for xapian support
-+ self._use_xapian = False
-+ try:
-+ import xapian
-+ except ImportError:
-+ pass
-+ else:
-+ if os.access(XAPIANDB, os.R_OK):
-+ self._use_xapian = True
-+ PackageKitBaseBackend.__init__(self, bus_name, dbus_path)
-+
-+ # Methods ( client -> engine -> backend )
-+
-+ def doInit(self):
-+ pklog.info("Initializing cache")
-+ self.StatusChanged(STATUS_SETUP)
-+ self.AllowCancel(False)
-+ self.NoPercentageUpdates()
-+ self._open_cache(progress=False)
-+
-+ def doExit(self):
-+ pass
-+
-+ @threaded
-+ def doCancel(self):
-+ pklog.info("Canceling current action")
-+ self.StatusChanged(STATUS_CANCEL)
-+ self._canceled.set()
-+ self._canceled.wait()
-+
-+ @threaded
-+ def doSearchName(self, filters, search):
-+ '''
-+ Implement the apt2-search-name functionality
-+ '''
-+ pklog.info("Searching for package name: %s" % search)
-+ self.StatusChanged(STATUS_QUERY)
-+ self.NoPercentageUpdates()
-+ self._check_init(progress=False)
-+ self.AllowCancel(True)
-+
-+ for pkg in self._cache:
-+ if self._canceled.isSet():
-+ self.ErrorCode(ERROR_TRANSACTION_CANCELLED,
-+ "The search was canceled")
-+ self.Finished(EXIT_KILL)
-+ self._canceled.clear()
-+ return
-+ elif search in pkg.name and self._is_package_visible(pkg, filters):
-+ self._emit_package(pkg)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ def doSearchDetails(self, filters, search):
-+ '''
-+ Implement the apt2-search-details functionality
-+ '''
-+ pklog.info("Searching for package name: %s" % search)
-+ self.StatusChanged(STATUS_QUERY)
-+ self.NoPercentageUpdates()
-+ self._check_init(progress=False)
-+ self.AllowCancel(True)
-+ results = []
-+
-+ if self._use_xapian == True:
-+ search_flags = (xapian.QueryParser.FLAG_BOOLEAN |
-+ xapian.QueryParser.FLAG_PHRASE |
-+ xapian.QueryParser.FLAG_LOVEHATE |
-+ xapian.QueryParser.FLAG_BOOLEAN_ANY_CASE)
-+ pklog.debug("Performing xapian db based search")
-+ db = xapian.Database(XAPIANDB)
-+ parser = xapian.QueryParser()
-+ query = parser.parse_query(unicode(search),
-+ search_flags)
-+ enquire = xapian.Enquire(db)
-+ enquire.set_query(query)
-+ matches = enquire.get_mset(0, 1000)
-+ for r in map(lambda m: m[xapian.MSET_DOCUMENT].get_data(),
-+ enquire.get_mset(0,1000)):
-+ if self._cache.has_key(r):
-+ results.append(self._cache[r])
-+ else:
-+ pklog.debug("Performing apt cache based search")
-+ for p in self._cache._dict.values():
-+ if self._check_canceled("Search was canceled"): return
-+ needle = search.strip().lower()
-+ haystack = p.description.lower()
-+ if p.name.find(needle) >= 0 or haystack.find(needle) >= 0:
-+ results.append(p)
-+
-+ for r in results:
-+ if self._check_canceled("Search was canceled"): return
-+ if self._is_package_visible(r, filters) == True:
-+ self._emit_package(r)
-+
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ @async
-+ def doGetUpdates(self, filters):
-+ '''
-+ Implement the {backend}-get-update functionality
-+ '''
-+ #FIXME: Implment the basename filter
-+ pklog.info("Get updates")
-+ self.StatusChanged(STATUS_INFO)
-+ self.AllowCancel(True)
-+ self.NoPercentageUpdates()
-+ self._check_init(progress=False)
-+ self._cache.upgrade(False)
-+ for pkg in self._cache.getChanges():
-+ if self._canceled.isSet():
-+ self.ErrorCode(ERROR_TRANSACTION_CANCELLED,
-+ "Calculating updates was canceled")
-+ self.Finished(EXIT_KILL)
-+ self._canceled.clear()
-+ return
-+ else:
-+ self._emit_package(pkg)
-+ self._open_cache(progress=False)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ def GetDetails(self, pkg_id):
-+ '''
-+ Implement the {backend}-get-details functionality
-+ '''
-+ pklog.info("Get details of %s" % pkg_id)
-+ self.StatusChanged(STATUS_INFO)
-+ self.NoPercentageUpdates()
-+ self.AllowCancel(False)
-+ self._check_init(progress=False)
-+ name, version, arch, data = self.get_package_from_id(pkg_id)
-+ if not self._cache.has_key(name):
-+ self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-+ "Package %s isn't available" % name)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ pkg = self._cache[name]
-+ #FIXME: should perhaps go to python-apt since we need this in
-+ # several applications
-+ desc = pkg.description
-+ # Skip the first line - it's a duplicate of the summary
-+ i = desc.find('\n')
-+ desc = desc[i+1:]
-+ # do some regular expression magic on the description
-+ # Add a newline before each bullet
-+ p = re.compile(r'^(\s|\t)*(\*|0|-)',re.MULTILINE)
-+ desc = p.sub(ur'\n\u2022', desc)
-+ # replace all newlines by spaces
-+ p = re.compile(r'\n', re.MULTILINE)
-+ desc = p.sub(" ", desc)
-+ # replace all multiple spaces by newlines
-+ p = re.compile(r'\s\s+', re.MULTILINE)
-+ desc = p.sub('\n', desc)
-+ #FIXME: group and licence information missing
-+ self.Details(pkg_id, 'unknown', 'unknown', desc,
-+ pkg.homepage, pkg.packageSize)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ @async
-+ def doUpdateSystem(self):
-+ '''
-+ Implement the {backend}-update-system functionality
-+ '''
-+ pklog.info("Upgrading system")
-+ self.StatusChanged(STATUS_UPDATE)
-+ self.AllowCancel(False)
-+ self.PercentageChanged(0)
-+ self._check_init(prange=(0,5))
-+ try:
-+ self._cache.upgrade(distUpgrade=False)
-+ self._cache.commit(PackageKitFetchProgress(self, prange=(5,50)),
-+ PackageKitInstallProgress(self, prange=(50,95)))
-+ except apt.cache.FetchFailedException:
-+ self._open_cache()
-+ self.ErrorCode(ERROR_PACKAGE_DOWNLOAD_FAILED, "Download failed")
-+ self.Finished(EXIT_FAILED)
-+ return
-+ except apt.cache.FetchCancelledException:
-+ self._open_cache(prange=(95,100))
-+ self.ErrorCode(ERROR_TRANSACTION_CANCELLED, "Download was canceled")
-+ self.Finished(EXIT_KILL)
-+ self._canceled.clear()
-+ return
-+ except:
-+ self._open_cache(prange=(95,100))
-+ self.ErrorCode(ERROR_UNKNOWN, "System update failed")
-+ self.Finished(EXIT_FAILED)
-+ return
-+ self.PercentageChanged(100)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ @async
-+ def doRemovePackages(self, ids, deps=True, auto=False):
-+ '''
-+ Implement the {backend}-remove functionality
-+ '''
-+ pklog.info("Removing package(s): id %s" % ids)
-+ self.StatusChanged(STATUS_REMOVE)
-+ self.AllowCancel(False)
-+ self.PercentageChanged(0)
-+ self._check_init(prange=(0,10))
-+ pkgs=[]
-+ for id in ids:
-+ pkg = self._find_package_by_id(id)
-+ if pkg == None:
-+ self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-+ "Package %s isn't available" % id)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ if not pkg.isInstalled:
-+ self.ErrorCode(ERROR_PACKAGE_NOT_INSTALLED,
-+ "Package %s isn't installed" % pkg.name)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ pkgs.append(pkg.name[:])
-+ try:
-+ pkg.markDelete()
-+ except:
-+ self._open_cache(prange=(90,99))
-+ self.ErrorCode(ERROR_UNKNOWN, "Removal of %s failed" % pkg.name)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ try:
-+ self._cache.commit(PackageKitFetchProgress(self, prange=(10,10)),
-+ PackageKitInstallProgress(self, prange=(10,90)))
-+ except:
-+ self._open_cache(prange=(90,99))
-+ self.ErrorCode(ERROR_UNKNOWN, "Removal failed")
-+ self.Finished(EXIT_FAILED)
-+ return
-+ self._open_cache(prange=(90,99))
-+ for p in pkgs:
-+ if self._cache.has_key(p) and self._cache[p].isInstalled:
-+ self.ErrorCode(ERROR_UNKNOWN, "%s is still installed" % p)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ self.PercentageChanged(100)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ @async
-+ def doInstallPackages(self, ids):
-+ '''
-+ Implement the {backend}-install functionality
-+ '''
-+ pklog.info("Installing package with id %s" % ids)
-+ self.StatusChanged(STATUS_INSTALL)
-+ self.AllowCancel(False)
-+ self.PercentageChanged(0)
-+ self._check_init(prange=(0,10))
-+ pkgs=[]
-+ for id in ids:
-+ pkg = self._find_package_by_id(id)
-+ if pkg == None:
-+ self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-+ "Package %s isn't available" % id)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ if pkg.isInstalled:
-+ self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,
-+ "Package %s is already installed" % pkg.name)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ pkgs.append(pkg.name[:])
-+ try:
-+ pkg.markInstall()
-+ except:
-+ self._open_cache(prange=(90,100))
-+ self.ErrorCode(ERROR_UNKNOWN, "%s could not be queued for "
-+ "installation" % pkg.name)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ try:
-+ self._cache.commit(PackageKitFetchProgress(self, prange=(10,50)),
-+ PackageKitInstallProgress(self, prange=(50,90)))
-+ except:
-+ self._open_cache(prange=(90,100))
-+ self.ErrorCode(ERROR_UNKNOWN, "Installation failed")
-+ self.Finished(EXIT_FAILED)
-+ return
-+ self._open_cache(prange=(90,100))
-+ self.PercentageChanged(100)
-+ pklog.debug("Checking success of operation")
-+ for p in pkgs:
-+ if not self._cache.has_key(p) or not self._cache[p].isInstalled:
-+ self.ErrorCode(ERROR_UNKNOWN, "%s was not installed" % p)
-+ self.Finished(EXIT_FAILED)
-+ return
-+ pklog.debug("Sending success signal")
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ @async
-+ def doRefreshCache(self, force):
-+ '''
-+ Implement the {backend}-refresh_cache functionality
-+ '''
-+ pklog.info("Refresh cache")
-+ self.StatusChanged(STATUS_REFRESH_CACHE)
-+ self.last_action_time = time.time()
-+ self.AllowCancel(False);
-+ self.PercentageChanged(0)
-+ self._check_init((0,10))
-+ try:
-+ self._cache.update(PackageKitFetchProgress(self, prange=(10,95)))
-+ except apt.cache.FetchFailedException:
-+ self.ErrorCode(ERROR_NO_NETWORK, "Download failed")
-+ self.Finished(EXIT_FAILED)
-+ return
-+ except apt.cache.FetchCancelledException:
-+ self._canceled.clear()
-+ self.ErrorCode(ERROR_TRANSACTION_CANCELLED, "Download was canceled")
-+ self.Finished(EXIT_KILL)
-+ return
-+ except:
-+ self._open_cache(prange=(95,100))
-+ self.ErrorCode(ERROR_UNKNOWN, "Refreshing cache failed")
-+ self.Finished(EXIT_FAILED)
-+ return
-+ self.PercentageChanged(100)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ def doGetPackages(self, filters):
-+ '''
-+ Implement the apt2-get-packages functionality
-+ '''
-+ pklog.info("Get all packages")
-+ self.StatusChanged(STATUS_QUERY)
-+ self.NoPercentageUpdates()
-+ self._check_init(progress=False)
-+ self.AllowCancel(True)
-+
-+ for pkg in self._cache:
-+ if self._canceled.isSet():
-+ self.ErrorCode(ERROR_TRANSACTION_CANCELLED,
-+ "The search was canceled")
-+ self.Finished(EXIT_KILL)
-+ self._canceled.clear()
-+ return
-+ elif self._is_package_visible(pkg, filters):
-+ self._emit_package(pkg)
-+ self.Finished(EXIT_SUCCESS)
-+
-+ @threaded
-+ def doResolve(self, filters, name):
-+ '''
-+ Implement the apt2-resolve functionality
-+ '''
-+ pklog.info("Resolve")
-+ self.StatusChanged(STATUS_QUERY)
-+ self.NoPercentageUpdates()
-+ self._check_init(progress=False)
-+ self.AllowCancel(False)
-+
-+ #FIXME: Support candidates
-+ if self._cache.has_key(name) and self.is_package_visible(pkg, filters):
-+ self._emit_package(name)
-+ self.Finished(EXIT_SUCCESS)
-+ else:
-+ self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-+ "Package name %s could not be resolved" % name)
-+ self.Finished(EXIT_FAILED)
-+
-+ # Helpers
-+
-+ def _open_cache(self, prange=(0,100), progress=True):
-+ '''
-+ (Re)Open the APT cache
-+ '''
-+ pklog.debug("Open APT cache")
-+ self.StatusChanged(STATUS_REFRESH_CACHE)
-+ try:
-+ self._cache = apt.Cache(PackageKitOpProgress(self, prange,
-+ progress))
-+ except:
-+ self.ErrorCode(ERROR_NO_CACHE, "Package cache could not be opened")
-+ self.Finished(EXIT_FAILED)
-+ self.Exit()
-+ return
-+ if self._cache._depcache.BrokenCount > 0:
-+ self.ErrorCode(ERROR_DEP_RESOLUTION_FAILED,
-+ "Not all dependecies can be satisfied")
-+ self.Finished(EXIT_FAILED)
-+ self.Exit()
-+ return
-+
-+ def _lock_cache(self):
-+ '''
-+ Lock the cache
-+ '''
-+ pklog.debug("Locking cache")
-+ self._locked.acquire()
-+
-+ def _unlock_cache(self):
-+ '''
-+ Unlock the cache
-+ '''
-+ pklog.debug("Releasing cache")
-+ self._locked.release()
-+
-+ def _check_init(self, prange=(0,10), progress=True):
-+ '''
-+ Check if the backend was initialized well and try to recover from
-+ a broken setup
-+ '''
-+ pklog.debug("Check apt cache and xapian database")
-+ if not isinstance(self._cache, apt.cache.Cache) or \
-+ self._cache._depcache.BrokenCount > 0:
-+ self._open_cache(prange, progress)
-+
-+ def _check_canceled(self, msg):
-+ '''
-+ Check if the current transaction was canceled. If so send the
-+ corresponding error message and return True
-+ '''
-+ if self._canceled.isSet():
-+ self.ErrorCode(ERROR_TRANSACTION_CANCELLED, msg)
-+ self.Finished(EXIT_KILL)
-+ self._canceled.clear()
-+ return True
-+ return False
-+
-+ def get_id_from_package(self, pkg, installed=False):
-+ '''
-+ Return the id of the installation candidate of a core
-+ apt package. If installed is set to True the id of the currently
-+ installed package will be returned.
-+ '''
-+ origin = ''
-+ if installed == False and pkg.isInstalled:
-+ pkgver = pkg.installedVersion
-+ else:
-+ pkgver = pkg.candidateVersion
-+ if pkg.candidateOrigin:
-+ origin = pkg.candidateOrigin[0].label
-+ id = self._get_package_id(pkg.name, pkgver, pkg.architecture, origin)
-+ return id
-+
-+ def _emit_package(self, pkg):
-+ '''
-+ Send the Package signal for a given apt package
-+ '''
-+ id = self.get_id_from_package(pkg)
-+ if pkg.isInstalled:
-+ status = INFO_INSTALLED
-+ else:
-+ status = INFO_AVAILABLE
-+ summary = pkg.summary
-+ self.Package(status, id, summary)
-+
-+ def _is_package_visible(self, pkg, filters):
-+ '''
-+ Return True if the package should be shown in the user interface
-+ '''
-+ #FIXME: Needs to be optmized
-+ if filters == 'none':
-+ return True
-+ if FILTER_INSTALLED in filters and not pkg.isInstalled:
-+ return False
-+ if FILTER_NOT_INSTALLED in filters and pkg.isInstalled:
-+ return False
-+ if FILTER_GUI in filters and not self._package_has_gui(pkg):
-+ return False
-+ if FILTER_NOT_GUI in filters and self._package_has_gui(pkg):
-+ return False
-+ if FILTER_DEVELOPMENT in filters and not self._package_is_devel(pkg):
-+ return False
-+ if FILTER_NOT_DEVELOPMENT in filters and self._package_is_devel(pkg):
-+ return False
-+ return True
-+
-+ def _package_has_gui(self, pkg):
-+ #FIXME: should go to a modified Package class
-+ #FIXME: take application data into account. perhaps checking for
-+ # property in the xapian database
-+ return pkg.section.split('/')[-1].lower() in ['x11', 'gnome', 'kde']
-+
-+ def _package_is_devel(self, pkg):
-+ #FIXME: should go to a modified Package class
-+ return pkg.name.endswith("-dev") or pkg.name.endswith("-dbg") or \
-+ pkg.section.split('/')[-1].lower() in ['devel', 'libdevel']
-+
-+ def _find_package_by_id(self, id):
-+ '''
-+ Return a package matching to the given package id
-+ '''
-+ # FIXME: Perform more checks
-+ name, version, arch, data = self.get_package_from_id(id)
-+ if self._cache.has_key(name):
-+ return self._cache[name]
-+ else:
-+ return None
-+
-+
-+def main():
-+ loop = dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-+ bus = dbus.SystemBus(mainloop=loop)
-+ bus_name = dbus.service.BusName(PACKAGEKIT_DBUS_SERVICE, bus=bus)
-+ manager = PackageKitAptBackend(bus_name, PACKAGEKIT_DBUS_PATH)
-+
-+if __name__ == '__main__':
-+ main()
-+
-+# vim: ts=4 et sts=4
-diff --git a/backends/apt/helpers/.gitignore b/backends/apt/helpers/.gitignore
-deleted file mode 100644
-index 0d20b64..0000000
---- a/backends/apt/helpers/.gitignore
-+++ /dev/null
-@@ -1 +0,0 @@
--*.pyc
-diff --git a/backends/apt/helpers/Makefile.am b/backends/apt/helpers/Makefile.am
-deleted file mode 100644
-index 0299df2..0000000
---- a/backends/apt/helpers/Makefile.am
-+++ /dev/null
-@@ -1,29 +0,0 @@
--
--helperdir = $(datadir)/PackageKit/helpers/apt
--
--NULL =
--
--dist_helper_DATA = \
-- install-files.py \
-- search-name.py \
-- search-details.py \
-- search-group.py \
-- search-file.py \
-- get-depends.py \
-- get-details.py \
-- get-repo-list.py \
-- get-requires.py \
-- get-update-detail.py \
-- get-updates.py \
-- refresh-cache.py \
-- repo-enable.py \
-- resolve.py \
-- aptBackend.py \
-- $(NULL)
--
--install-data-hook:
-- chmod a+rx $(DESTDIR)$(helperdir)/*.py
--
--clean-local :
-- rm -f *~
--
-diff --git a/backends/apt/helpers/aptBackend.py b/backends/apt/helpers/aptBackend.py
-deleted file mode 100644
-index e5f78ca..0000000
---- a/backends/apt/helpers/aptBackend.py
-+++ /dev/null
-@@ -1,536 +0,0 @@
--#
--# vim: ts=4 et sts=4
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--# Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--import os
--import re
--
--from packagekit.backend import *
--import apt_pkg,apt_inst
--
--import warnings
--warnings.filterwarnings(action='ignore', category=FutureWarning)
--import apt
--from aptsources.distro import get_distro
--from aptsources.sourceslist import SourcesList
--from sets import Set
--from os.path import join,exists
--from urlparse import urlparse
--from apt.debfile import DebPackage
--from os import system
--
--class Package(apt.Package):
-- def __str__(self):
-- return "Package %s, version %s"%(self.name,self._version)
--
-- def _cmp_deps(self,deps, version):
-- for (v,c) in deps:
-- if not apt_pkg.CheckDep(version,c,v):
-- return False
-- return True
--
-- def __init__(self, backend, pkg, data="",version=[]):
-- apt.package.Package.__init__(self, pkg._cache, pkg._depcache,
-- pkg._records, pkg._list, pkg._pcache,
-- pkg._pkg)
-- self._version = version
-- self._data = data
-- self._backend = backend
-- wanted_ver = None
-- if self.installedVersion!=None and self._cmp_deps(version,self.installedVersion):
-- wanted_ver = self.installedVersion
-- elif self.installedVersion == None and version == []:
-- #self.markInstall(False,False)
-- wanted_ver = self.candidateVersion
--
-- for ver in pkg._pkg.VersionList:
-- #print "vers",dir(ver),version,ver
-- #print data
-- if (wanted_ver == None or wanted_ver == ver.VerStr) and self._cmp_deps(version,ver.VerStr):
-- f, index = ver.FileList.pop(0)
-- if self._data == "":
-- if f.Origin=="" and f.Archive=="now":
-- self._data = "local_install"
-- elif f.Origin!="" or f.Archive!="":
-- self._data = "%s/%s"%(f.Origin.replace("/","_"),f.Archive.replace("/","_"))
-- else:
-- self._data = "%s/unknown"%f.Site
-- self._version = ver.VerStr
-- break
-- else:
-- print "wanted",wanted_ver
-- for ver in pkg._pkg.VersionList:
-- print "vers",version,ver.VerStr
-- backend.error(ERROR_PACKAGE_NOT_FOUND, "Can't find version %s for %s"%(version,self.name))
--
-- def setVersion(self,version,compare="="):
-- if version!=None and (self.installedVersion == None or not apt_pkg.CheckDep(version,compare,self.installedVersion)):
-- self.markInstall(False,False)
-- if self.candidateVersion != version:
-- if self._data == "":
-- for ver in pkg._pkg.VersionList:
-- f, index = ver.FileList.pop(0)
-- self._data = "%s/%s"%(f.Origin,f.Archive)
-- if ver.VerStr == version:
-- break
--
-- # FIXME: this is a nasty hack, assuming that the best way to resolve
-- # deps for non-default repos is by switching the default release.
-- # We really need a better resolver (but that's hard)
-- assert self._data!=""
-- origin = self._data[self._data.find("/")+1:]
-- print "origin",origin
-- name = self.name
-- apt_pkg.Config.Set("APT::Default-Release",origin)
-- if not self._backend._caches.has_key(origin):
-- self._backend._caches[origin] = apt.Cache(PackageKitProgress(self))
-- print "new cache for %s"%origin
-- self.__setParent(self._backend._caches[origin][name])
-- self.markInstall(False,False)
-- if not apt_pkg.CheckDep(self.candidateVersion,compare,version):
-- self._backend.error(ERROR_PACKAGE_NOT_FOUND,
-- "Unable to locate package version %s (only got %s) for %s"%(version,self.candidateVersion,name))
-- return
-- self.markKeep()
--
-- @property
-- def group(self):
-- section = self.section.split('/')[-1].lower()
-- #if section in ():
-- # return GROUP_ACCESSIBILITY
-- if section in ('utils',):
-- return "accessories"
-- #if section in ():
-- # return GROUP_EDUCATION
-- if section in ('games',):
-- return "games"
-- if section in ('graphics',):
-- return "graphics"
-- if section in ('net', 'news', 'web', 'comm'):
-- return "internet"
-- if section in ('editors', 'tex'):
-- return "office"
-- if section in ('misc',):
-- return "other"
-- if section in ('devel', 'libdevel', 'interpreters', 'perl', 'python'):
-- return "programming"
-- if section in ('sound',):
-- return "multimedia"
-- if section in ('base', 'admin'):
-- return "system"
-- return "unknown"
--
-- @property
-- def isInstalled(self):
-- return super(self.__class__,self).isInstalled and self.installedVersion == self._version
--
-- @property
-- def isDevelopment(self):
-- name = self.name.lower()
-- section = self.section.split('/')[-1].lower()
-- return name.endswith('-dev') or name.endswith('-dbg') or \
-- section in ('devel', 'libdevel')
--
-- @property
-- def isGui(self):
-- section = self.section.split('/')[-1].lower()
-- return section in ('x11', 'gnome', 'kde')
--
-- _HYPHEN_PATTERN = re.compile(r'(\s|_)+')
--
-- def matchName(self, name):
-- needle = name.strip().lower()
-- haystack = self.name.lower()
-- needle = Package._HYPHEN_PATTERN.sub('-', needle)
-- haystack = Package._HYPHEN_PATTERN.sub('-', haystack)
-- if haystack.find(needle) >= 0:
-- return True
-- return False
--
-- def matchDetails(self, details):
-- if self.matchName(details):
-- return True
-- needle = details.strip().lower()
-- haystack = self.description.lower()
-- if haystack.find(needle) >= 0:
-- return True
-- return False
--
-- def matchGroup(self, name):
-- needle = name.strip().lower()
-- haystack = self.group
-- if haystack.startswith(needle):
-- return True
-- return False
--
--class PackageKitProgress(apt.progress.OpProgress, apt.progress.FetchProgress):
-- def __init__(self, backend):
-- self._backend = backend
-- apt.progress.OpProgress.__init__(self)
-- apt.progress.FetchProgress.__init__(self)
--
-- # OpProgress callbacks
-- def update(self, percent):
-- pass
--
-- def done(self):
-- pass
--
-- # FetchProgress callbacks
-- def pulse(self):
-- apt.progress.FetchProgress.pulse(self)
-- self._backend.percentage(self.percent)
-- return True
--
-- def stop(self):
-- self._backend.percentage(100)
--
-- def mediaChange(self, medium, drive):
-- # This probably should not be an error, but a Message.
-- self._backend.error(ERROR_UNKNOWN,
-- "Medium change needed")
--
--class PackageKitAptBackend(PackageKitBaseBackend):
-- def __init__(self, args):
-- PackageKitBaseBackend.__init__(self, args)
-- self.status(STATUS_SETUP)
-- self._caches = {}
-- self._apt_cache = apt.Cache(PackageKitProgress(self))
-- default = apt_pkg.Config.Find("APT::Default-Release")
-- if default=="":
-- d = get_distro()
-- if d.id == "Debian":
-- default = "stable"
-- elif d.id == "Ubuntu":
-- default = "main"
-- else:
-- raise Exception,d.id
--
-- self._caches[default] = self._apt_cache
--
--
-- def search_name(self, filters, key):
-- '''
-- Implement the {backend}-search-name functionality
-- '''
-- self.status(STATUS_INFO)
-- self.allow_cancel(True)
-- for package in self._do_search(filters,
-- lambda pkg: pkg.matchName(key)):
-- self._emit_package(package)
--
-- def search_details(self, filters, key):
-- '''
-- Implement the {backend}-search-details functionality
-- '''
-- self.status(STATUS_INFO)
-- self.allow_cancel(True)
-- for package in self._do_search(filters,
-- lambda pkg: pkg.matchDetails(key)):
-- self._emit_package(package)
--
-- def search_group(self, filters, key):
-- '''
-- Implement the {backend}-search-group functionality
-- '''
-- self.status(STATUS_INFO)
-- self.allow_cancel(True)
-- for package in self._do_search(filters,
-- lambda pkg: pkg.matchGroup(key)):
-- self._emit_package(package)
--
-- def search_file(self, filters, key):
-- '''
-- Implement the {backend}-search-file functionality
-- '''
-- self.allow_cancel(True)
-- self.percentage(None)
--
-- self.error(ERROR_NOT_SUPPORTED,
-- "This function is not implemented in this backend")
--
-- def refresh_cache(self):
-- '''
-- Implement the {backend}-refresh_cache functionality
-- '''
-- self.status(STATUS_REFRESH_CACHE)
-- try:
-- res = self._apt_cache.update(PackageKitProgress(self))
-- except Exception, error_message:
-- self.error(ERROR_UNKNOWN,
-- "Failed to fetch the following items:\n%s" % error_message)
-- return res
--
-- def get_details(self, package):
-- '''
-- Implement the {backend}-get-details functionality
-- '''
-- self.status(STATUS_INFO)
-- name, version, arch, data = self.get_package_from_id(package)
-- pkg = Package(self, self._apt_cache[name])
-- description = re.sub('\s+', ' ', pkg.description).strip()
-- self.description(package, 'unknown', pkg.group, description,
-- pkg.architecture, pkg.packageSize)
--
-- def resolve(self, name):
-- '''
-- Implement the {backend}-resolve functionality
-- '''
-- self.status(STATUS_INFO)
-- try:
-- pkg = Package(self,self._apt_cache[name])
-- self._emit_package(pkg)
-- except KeyError:
-- self.error(ERROR_PACKAGE_NOT_FOUND,"Can't find a package called '%s'"%name)
--
-- def _do_deps(self,inp,deps,recursive):
-- inp.markInstall()
-- newkeys = []
-- for x in inp.candidateDependencies:
-- n = x.or_dependencies[0].name
-- if not deps.has_key(n):
-- deps[n] = []
-- newkeys.append(n)
-- deps[n].append((x.or_dependencies[0].version,x.or_dependencies[0].relation))
-- if recursive:
-- for n in newkeys:
-- try:
-- deps = self._do_deps(Package(self,self._apt_cache[n],version=deps[n]),deps,recursive)
-- except KeyError: # FIXME: we're assuming this is a virtual package, which we can't cope with yet
-- del deps[n]
-- continue
-- return deps
--
-- def get_depends(self,filters,package, recursive):
-- '''
-- Implement the {backend}-get-depends functionality
-- '''
-- self.allow_cancel(True)
-- self.status(STATUS_INFO)
-- recursive = (recursive == "True")
-- name, version, arch, data = self.get_package_from_id(package)
-- pkg = Package(self,self._apt_cache[name],version=[(version,"=")],data=data)
-- pkg.setVersion(version)
-- deps = self._do_deps(pkg, {}, recursive)
-- for n in deps.keys():
-- self._emit_package(Package(self,self._apt_cache[n],version=deps[n]))
--
-- def _do_reqs(self,inp,pkgs,recursive):
-- extra = []
-- fails = []
-- for r in inp._pkg.RevDependsList:
-- ch = apt_pkg.CheckDep(inp._version,r.CompType,r.TargetVer)
-- v = (r.ParentPkg.Name,r.ParentVer.VerStr)
-- if not ch or v in fails:
-- #print "skip",r.TargetVer,r.CompType,r.ParentPkg.Name,r.ParentVer.VerStr
-- fails.append(v)
-- continue
-- p = Package(self,self._apt_cache[r.ParentPkg.Name],r.ParentVer.VerStr)
-- if v not in pkgs:
-- extra.append(p)
-- #print "new pkg",p
-- self._emit_package(p)
-- pkgs.add(v)
-- if recursive:
-- for e in extra:
-- pkgs = self._do_reqs(p, pkgs,recursive)
-- return pkgs
--
-- def get_requires(self,package,recursive):
-- '''
-- Implement the {backend}-get-requires functionality
-- '''
-- self.allow_cancel(True)
-- self.status(STATUS_INFO)
-- recursive = (recursive == "True")
-- name, version, arch, data = self.get_package_from_id(package)
-- pkg = Package(self,self._apt_cache[name], version=[(version,"=")], data=data)
--
-- pkgs = Set()
-- self._do_reqs(pkg,pkgs, recursive)
--
-- def _build_repo_list(self):
-- repo = {}
--
-- sources = SourcesList()
-- repo["__sources"] = sources
--
-- root = apt_pkg.Config.FindDir("Dir::State::Lists")
-- #print root
-- for entry in sources:
-- if entry.type!="":
-- url = entry.uri
-- #if entry.template!=None:
-- url +="/dists/"
-- url += entry.dist
-- url = url.replace("//dists","/dists")
-- #print url
-- path = join(root,"%s_Release"%(apt_pkg.URItoFileName(url)))
-- if not exists(path):
-- #print path
-- name = "%s/unknown"%urlparse(entry.uri)[1]
-- else:
-- lines = file(path).readlines()
-- origin = ""
-- suite = ""
-- for l in lines:
-- if l.find("Origin: ")==0:
-- origin = l.split(" ",1)[1].strip()
-- elif l.find("Suite: ")==0:
-- suite = l.split(" ",1)[1].strip()
-- assert origin!="" and suite!=""
-- name = "%s/%s"%(origin,suite)
-- if entry.type == "deb-src":
-- name += "-src"
--
-- repo[name] = {"entry":entry}
-- return repo
--
-- def get_repo_list(self, filters):
-- '''
-- Implement the {backend}-get-repo-list functionality
-- '''
-- self.allow_interrupt(True)
-- self.status(STATUS_INFO)
-- repo = self._build_repo_list()
-- for e in repo.keys():
-- if e == "__sources":
-- continue
-- self.repo_detail(repo[e]["entry"].line.strip(),e,not repo[e]["entry"].disabled)
--
-- def repo_enable(self, repoid, enable):
-- '''
-- Implement the {backend}-repo-enable functionality
-- '''
-- enable = (enable == "True")
-- repo = self._build_repo_list()
-- if not repo.has_key(repoid):
-- self.error(ERROR_REPO_NOT_FOUND,"Couldn't find repo '%s'"%repoid)
-- return
-- r = repo[repoid]
-- if not r["entry"].disabled == enable: # already there
-- return
-- r["entry"].set_enabled(enable)
-- try:
-- repo["__sources"].save()
-- except IOError,e:
-- self.error(ERROR_UNKNOWN, "Problem while trying to save repo settings to %s: %s"%(e.filename,e.strerror))
--
-- def get_updates(self, filter):
-- self._apt_cache.upgrade(False)
-- for pkg in self._apt_cache.getChanges():
-- self._emit_package(Package(self, pkg))
--
-- def get_update_detail(self, package):
-- self.allow_cancel(True)
-- self.percentage(None)
-- self.status(STATUS_INFO)
-- name, version, arch, data = self.get_package_from_id(package)
-- update = ""
-- obsolete = ""
-- cve_url = ""
-- bz_url = ""
-- vendor_url = ""
-- reboot = "none"
-- desc = self._apt_cache[name].description
-- self.update_detail(package,update,obsolete,vendor_url,bz_url,cve_url,reboot,desc)
--
--
-- def install_files (self, inst_files):
-- '''
-- Implement the {backend}-install_files functionality
-- Install the package containing the inst_file file
-- '''
-- if not exists(inst_file):
-- self.error(ERROR_PACKAGE_NOT_FOUND,"Can't find %s"%inst_file)
-- return
-- deb = DebPackage(inst_file)
-- deps = {}
-- for k in ["Depends","Recommends"]:
-- if not deb._sections.has_key(k):
-- continue
-- for items in apt_pkg.ParseDepends(deb[k]):
-- assert len(items) == 1,"Can't handle or deps properly yet"
-- (pkg,ver,comp) = items[0]
-- if not deps.has_key(pkg):
-- deps[pkg] = []
-- deps[pkg].append((ver,comp))
-- for n in deps.keys():
-- p = Package(self,self._apt_cache[n],version=deps[n])
-- if not p.isInstalled:
-- p.markInstall()
-- assert self._apt_cache.getChanges()==[],"Don't handle install changes yet"
-- # FIXME: nasty hack. Need a better way in
-- ret = system("dpkg -i %s"%inst_file)
-- if ret!=0:
-- self.error(ERROR_UNKNOWN,"Can't install package")
--
-- ### Helpers ###
-- def _emit_package(self, package):
-- id = self.get_package_id(package.name,
-- package._version,
-- package.architecture,
-- package._data)
-- if package.isInstalled:
-- status = INFO_INSTALLED
-- else:
-- status = INFO_AVAILABLE
-- summary = package.summary
-- self.package(id, status, summary)
--
-- def _do_search(self, filters, condition):
-- filters = filters.split(';')
-- size = len(self._apt_cache)
-- percentage = 0
-- for i, pkg in enumerate(self._apt_cache):
-- new_percentage = i / float(size) * 100
-- if new_percentage - percentage >= 5:
-- percentage = new_percentage
-- self.percentage(percentage)
-- package = Package(self, pkg)
-- if package.installedVersion is None and \
-- package.candidateVersion is None:
-- continue
-- if not condition(package):
-- continue
-- continue
-- vers = [x.VerStr for x in package._pkg.VersionList]
-- if package.installedVersion!=None:
-- i = package.installedVersion
-- if i in vers and vers[0]!=i:
-- del vers[vers.index(i)]
-- vers.insert(0,i)
--
-- for ver in vers:
-- p = Package(self, package, version=[[ver,"="]])
-- if self._do_filtering(p, filters):
-- yield p
-- self.percentage(100)
--
-- def _do_filtering(self, package, filters):
-- if len(filters) == 0 or filters == ['none']:
-- return True
-- if (FILTER_INSTALLED in filters) and (not package.isInstalled):
-- return False
-- if (FILTER_NOT_INSTALLED in filters) and package.isInstalled:
-- return False
-- if (FILTER_GUI in filters) and (not package.isGui):
-- return False
-- if (FILTER_NOT_GUI in filters) and package.isGui:
-- return False
-- if (FILTER_DEVELOPMENT in filters) and (not package.isDevelopment):
-- return False
-- if (FILTER_NOT_DEVELOPMENT in filters) and package.isDevelopment:
-- return False
-- return True
--
-diff --git a/backends/apt/helpers/get-depends.py b/backends/apt/helpers/get-depends.py
-deleted file mode 100755
-index 94dca4a..0000000
---- a/backends/apt/helpers/get-depends.py
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--filters=sys.argv[1]
--package=sys.argv[2]
--recursive = sys.argv[3]
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.get_depends(filters, package, recursive)
--sys.exit(0)
-diff --git a/backends/apt/helpers/get-details.py b/backends/apt/helpers/get-details.py
-deleted file mode 100755
-index a813640..0000000
---- a/backends/apt/helpers/get-details.py
-+++ /dev/null
-@@ -1,18 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--from aptBackend import PackageKitAptBackend
--
--package = sys.argv[1]
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.get_details(package)
--sys.exit(0)
-diff --git a/backends/apt/helpers/get-repo-list.py b/backends/apt/helpers/get-repo-list.py
-deleted file mode 100755
-index 5529f72..0000000
---- a/backends/apt/helpers/get-repo-list.py
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--filters = sys.argv[1]
--
--backend = PackageKitAptBackend(sys.argv[2:])
--backend.get_repo_list(filters)
--backend.unLock()
--sys.exit(0)
-diff --git a/backends/apt/helpers/get-requires.py b/backends/apt/helpers/get-requires.py
-deleted file mode 100755
-index e581010..0000000
---- a/backends/apt/helpers/get-requires.py
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--package = sys.argv[1]
--recursive = sys.argv[2]
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.get_requires(package, recursive)
--sys.exit(0)
-diff --git a/backends/apt/helpers/get-update-detail.py b/backends/apt/helpers/get-update-detail.py
-deleted file mode 100755
-index 5524d9a..0000000
---- a/backends/apt/helpers/get-update-detail.py
-+++ /dev/null
-@@ -1,18 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2008 Michael Vogt <mvo@ubuntu.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--package=sys.argv[1]
--backend = PackageKitAptBackend(sys.argv[2:])
--backend.get_update_detail(package)
--sys.exit(0)
-diff --git a/backends/apt/helpers/get-updates.py b/backends/apt/helpers/get-updates.py
-deleted file mode 100755
-index 4f45fbf..0000000
---- a/backends/apt/helpers/get-updates.py
-+++ /dev/null
-@@ -1,19 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2008 Michael Vogt <mvo@ubuntu.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--from aptBackend import PackageKitAptBackend
--
--filter = sys.argv[1]
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.get_updates(filter)
--sys.exit(0)
-diff --git a/backends/apt/helpers/install-files.py b/backends/apt/helpers/install-files.py
-deleted file mode 100755
-index dfa024c..0000000
---- a/backends/apt/helpers/install-files.py
-+++ /dev/null
-@@ -1,21 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
--# Copyright (C) 2007 Red Hat Inc, Seth Vidal <skvidal@fedoraproject.org>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--
--trusted = sys.argv[1]
--files_to_inst = sys.argv[2:]
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.install_files(trusted, files_to_inst)
--sys.exit(0)
-diff --git a/backends/apt/helpers/refresh-cache.py b/backends/apt/helpers/refresh-cache.py
-deleted file mode 100755
-index 881479d..0000000
---- a/backends/apt/helpers/refresh-cache.py
-+++ /dev/null
-@@ -1,17 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--from aptBackend import PackageKitAptBackend
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.refresh_cache()
--sys.exit(0)
-diff --git a/backends/apt/helpers/repo-enable.py b/backends/apt/helpers/repo-enable.py
-deleted file mode 100755
-index 3cc36ae..0000000
---- a/backends/apt/helpers/repo-enable.py
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--repoid = sys.argv[1]
--state=sys.argv[2]
--backend = PackageKitAptBackend(sys.argv[2:])
--backend.repo_enable(repoid,state)
--backend.unLock()
--sys.exit(0)
-diff --git a/backends/apt/helpers/resolve.py b/backends/apt/helpers/resolve.py
-deleted file mode 100755
-index aac34df..0000000
---- a/backends/apt/helpers/resolve.py
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--from aptBackend import PackageKitAptBackend
--filters = sys.argv[1]
--name=sys.argv[2]
--backend = PackageKitAptBackend(sys.argv[2:])
--backend.resolve(name)
--backend.unLock()
--sys.exit(0)
-diff --git a/backends/apt/helpers/search-details.py b/backends/apt/helpers/search-details.py
-deleted file mode 100755
-index d02f1b0..0000000
---- a/backends/apt/helpers/search-details.py
-+++ /dev/null
-@@ -1,21 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--options = sys.argv[1]
--searchlist = sys.argv[2]
--
--from aptBackend import PackageKitAptBackend
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.search_details(options,searchlist)
--sys.exit(0)
-diff --git a/backends/apt/helpers/search-file.py b/backends/apt/helpers/search-file.py
-deleted file mode 100755
-index ec60319..0000000
---- a/backends/apt/helpers/search-file.py
-+++ /dev/null
-@@ -1,21 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--options = sys.argv[1]
--searchlist = sys.argv[2]
--
--from aptBackend import PackageKitAptBackend
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.search_file(options,searchlist)
--sys.exit(0)
-diff --git a/backends/apt/helpers/search-group.py b/backends/apt/helpers/search-group.py
-deleted file mode 100755
-index f63ee80..0000000
---- a/backends/apt/helpers/search-group.py
-+++ /dev/null
-@@ -1,21 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--options = sys.argv[1]
--searchlist = sys.argv[2]
--
--from aptBackend import PackageKitAptBackend
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.search_group(options,searchlist)
--sys.exit(0)
-diff --git a/backends/apt/helpers/search-name.py b/backends/apt/helpers/search-name.py
-deleted file mode 100755
-index 9f73c89..0000000
---- a/backends/apt/helpers/search-name.py
-+++ /dev/null
-@@ -1,21 +0,0 @@
--#!/usr/bin/python
--#
--# Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--#
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--import sys
--
--options = sys.argv[1]
--searchlist = sys.argv[2]
--
--from aptBackend import PackageKitAptBackend
--
--backend = PackageKitAptBackend(sys.argv[1:])
--backend.search_name(options,searchlist)
--sys.exit(0)
-diff --git a/backends/apt/packagekit b/backends/apt/packagekit
-new file mode 120000
-index 0000000..0b64032
---- /dev/null
-+++ b/backends/apt/packagekit
-@@ -0,0 +1 @@
-+../../python/packagekit/
-\ No newline at end of file
-diff --git a/backends/apt/pk-apt-build-db.cpp b/backends/apt/pk-apt-build-db.cpp
-deleted file mode 100644
-index 885275d..0000000
---- a/backends/apt/pk-apt-build-db.cpp
-+++ /dev/null
-@@ -1,284 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--//#include "pk-backend-apt.h"
--#include <pk-backend.h>
--#include <apt-pkg/configuration.h>
--#include <sqlite3.h>
--
--typedef enum {FIELD_PKG=1,FIELD_VER,FIELD_DEPS,FIELD_ARCH,FIELD_SHORT,FIELD_LONG,FIELD_REPO} Fields;
--
--void apt_build_db(PkBackend * backend, sqlite3 *db)
--{
-- GMatchInfo *match_info;
-- GError *error = NULL;
-- gchar *contents = NULL;
-- gchar *sdir;
-- const gchar *fname;
-- GRegex *origin, *suite;
-- GDir *dir;
-- GHashTable *releases;
-- int res;
-- sqlite3_stmt *package = NULL;
--
-- pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
--
-- sdir = g_build_filename(_config->Find("Dir").c_str(),_config->Find("Dir::State").c_str(),_config->Find("Dir::State::lists").c_str(), NULL);
-- dir = g_dir_open(sdir,0,&error);
-- if (error!=NULL)
-- {
-- pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "can't open %s",dir);
-- g_error_free(error);
-- goto search_task_cleanup;
-- }
--
-- origin = g_regex_new("^Origin: (\\S+)",(GRegexCompileFlags)(G_REGEX_CASELESS|G_REGEX_OPTIMIZE|G_REGEX_MULTILINE),(GRegexMatchFlags)0,NULL);
-- suite = g_regex_new("^Suite: (\\S+)",(GRegexCompileFlags)(G_REGEX_CASELESS|G_REGEX_OPTIMIZE|G_REGEX_MULTILINE),(GRegexMatchFlags)0,NULL);
--
-- releases = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
-- while ((fname = g_dir_read_name(dir))!=NULL)
-- {
-- gchar *temp, *parsed_name;
-- gchar** items = g_strsplit(fname,"_",-1);
-- guint len = g_strv_length(items);
-- if(len<=3) // minimum is <source>_<type>_<group>
-- {
-- g_strfreev(items);
-- continue;
-- }
--
-- /* warning: nasty hack with g_strjoinv */
-- temp = items[len-2];
-- items[len-2] = NULL;
-- parsed_name = g_strjoinv("_",items);
-- items[len-2] = temp;
--
-- if (g_ascii_strcasecmp(items[len-1],"Release")==0 && g_ascii_strcasecmp(items[len-2],"source")!=0)
-- {
-- gchar * repo = NULL, *fullname;
-- fullname = g_build_filename(sdir,fname,NULL);
-- if (g_file_get_contents(fullname,&contents,NULL,NULL) == FALSE)
-- {
-- pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "error loading %s",fullname);
-- goto search_task_cleanup;
-- }
-- g_free(fullname);
--
-- g_regex_match (origin, contents, (GRegexMatchFlags)0, &match_info);
-- if (!g_match_info_matches(match_info))
-- {
-- pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "origin regex failure in %s",fname);
-- goto search_task_cleanup;
-- }
-- repo = g_match_info_fetch (match_info, 1);
--
-- g_regex_match (suite, contents, (GRegexMatchFlags)0, &match_info);
-- if (g_match_info_matches(match_info))
-- {
-- temp = g_strconcat(repo,"/",g_match_info_fetch (match_info, 1),NULL);
-- g_free(repo);
-- repo = temp;
-- }
--
-- temp = parsed_name;
-- parsed_name = g_strconcat(temp,"_",items[len-2],NULL);
-- g_free(temp);
--
-- pk_debug("type is %s, group is %s, parsed_name is %s",items[len-2],items[len-1],parsed_name);
--
-- g_hash_table_insert(releases, parsed_name, repo);
-- g_free(contents);
-- contents = NULL;
-- }
-- else
-- g_free(parsed_name);
-- g_strfreev(items);
-- }
-- g_dir_close(dir);
--
-- /* and then we need to do this again, but this time we're looking for the packages */
-- dir = g_dir_open(sdir,0,&error);
-- res = sqlite3_prepare_v2(db, "insert or replace into packages values (?,?,?,?,?,?,?)", -1, &package, NULL);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during insert prepare: %s", sqlite3_errmsg(db));
-- else
-- pk_debug("insert prepare ok for %p",package);
-- while ((fname = g_dir_read_name(dir))!=NULL)
-- {
-- gchar** items = g_strsplit(fname,"_",-1);
-- guint len = g_strv_length(items);
-- if(len<=3) // minimum is <source>_<type>_<group>
-- {
-- g_strfreev(items);
-- continue;
-- }
--
-- if (g_ascii_strcasecmp(items[len-1],"Packages")==0)
-- {
-- const gchar *repo;
-- gchar *temp=NULL, *parsed_name=NULL;
-- gchar *fullname= NULL;
-- gchar *begin=NULL, *next=NULL, *description = NULL;
-- glong count = 0;
-- gboolean haspk = FALSE;
--
-- /* warning: nasty hack with g_strjoinv */
-- if (g_str_has_prefix(items[len-2],"binary-"))
-- {
-- temp = items[len-3];
-- items[len-3] = NULL;
-- parsed_name = g_strjoinv("_",items);
-- items[len-3] = temp;
-- }
-- else
-- {
-- temp = items[len-1];
-- items[len-1] = NULL;
-- parsed_name = g_strjoinv("_",items);
-- items[len-1] = temp;
-- }
--
-- pk_debug("type is %s, group is %s, parsed_name is %s",items[len-2],items[len-1],parsed_name);
--
-- repo = (const gchar *)g_hash_table_lookup(releases,parsed_name);
-- if (repo == NULL)
-- {
-- pk_debug("Can't find repo for %s, marking as \"unknown\"",parsed_name);
-- repo = g_strdup("unknown");
-- //g_assert(0);
-- }
-- else
-- pk_debug("repo for %s is %s",parsed_name,repo);
-- g_free(parsed_name);
--
-- fullname = g_build_filename(sdir,fname,NULL);
-- pk_debug("loading %s",fullname);
-- if (g_file_get_contents(fullname,&contents,NULL,NULL) == FALSE)
-- {
-- pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "error loading %s",fullname);
-- goto search_task_cleanup;
-- }
-- /*else
-- pk_debug("loaded");*/
--
-- res = sqlite3_bind_text(package,FIELD_REPO,repo,-1,SQLITE_TRANSIENT);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during repo bind: %s", sqlite3_errmsg(db));
-- /*else
-- pk_debug("repo bind ok");*/
--
-- res = sqlite3_exec(db,"begin",NULL,NULL,NULL);
-- g_assert(res == SQLITE_OK);
--
-- begin = contents;
--
-- while (true)
-- {
-- next = strstr(begin,"\n");
-- if (next!=NULL)
-- {
-- next[0] = '\0';
-- next++;
-- }
--
-- if (begin[0]=='\0')
-- {
-- if (haspk)
-- {
-- if (description!=NULL)
-- {
-- res=sqlite3_bind_text(package,FIELD_LONG,description,-1,SQLITE_TRANSIENT);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during description bind: %s", sqlite3_errmsg(db));
-- g_free(description);
-- description = NULL;
-- }
-- res = sqlite3_step(package);
-- if (res!=SQLITE_DONE)
-- pk_error("sqlite error during step: %s", sqlite3_errmsg(db));
-- sqlite3_reset(package);
-- //pk_debug("added package");
-- haspk = FALSE;
-- }
-- //g_assert(0);
-- }
-- else if (begin[0]==' ')
-- {
-- if (description == NULL)
-- description = g_strdup(&begin[1]);
-- else
-- {
-- gchar *oldval = description;
-- description = g_strconcat(oldval, "\n",&begin[1],NULL);
-- g_free(oldval);
-- }
-- }
-- else
-- {
-- gchar *colon = strchr(begin,':');
-- g_assert(colon!=NULL);
-- colon[0] = '\0';
-- colon+=2;
-- /*if (strlen(colon)>3000)
-- pk_error("strlen(colon) = %d\ncolon = %s",strlen(colon),colon);*/
-- //pk_debug("entry = '%s','%s'",begin,colon);
-- if (begin[0] == 'P' && g_strcasecmp("Package",begin)==0)
-- {
-- res=sqlite3_bind_text(package,FIELD_PKG,colon,-1,SQLITE_STATIC);
-- haspk = TRUE;
-- count++;
-- if (count%1000==0)
-- pk_debug("Package %ld (%s)",count,colon);
-- }
-- else if (begin[0] == 'V' && g_strcasecmp("Version",begin)==0)
-- res=sqlite3_bind_text(package,FIELD_VER,colon,-1,SQLITE_STATIC);
-- else if (begin[0] == 'D' && g_strcasecmp("Depends",begin)==0)
-- res=sqlite3_bind_text(package,FIELD_DEPS,colon,-1,SQLITE_STATIC);
-- else if (begin[0] == 'A' && g_strcasecmp("Architecture",begin)==0)
-- res=sqlite3_bind_text(package,FIELD_ARCH,colon,-1,SQLITE_STATIC);
-- else if (begin[0] == 'D' && g_strcasecmp("Description",begin)==0)
-- res=sqlite3_bind_text(package,FIELD_SHORT,colon,-1,SQLITE_STATIC);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during %s bind: %s", begin, sqlite3_errmsg(db));
-- }
-- if (next == NULL)
-- break;
-- begin = next;
-- }
-- res = sqlite3_exec(db,"commit",NULL,NULL,NULL);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during commit: %s", sqlite3_errmsg(db));
-- res = sqlite3_clear_bindings(package);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during clear: %s", sqlite3_errmsg(db));
-- g_free(contents);
-- contents = NULL;
-- }
-- }
-- sqlite3_finalize(package);
--
--search_task_cleanup:
-- g_dir_close(dir);
-- g_free(sdir);
-- g_free(contents);
--}
--
-diff --git a/backends/apt/pk-apt-build-db.h b/backends/apt/pk-apt-build-db.h
-deleted file mode 100644
-index bb786a9..0000000
---- a/backends/apt/pk-apt-build-db.h
-+++ /dev/null
-@@ -1,30 +0,0 @@
--#ifndef PK_APT_BUILD_DB
--#define PK_APT_BUILD_DB
--
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#include <sqlite3.h>
--#include <pk-backend.h>
--
--void apt_build_db(PkBackend * backend, sqlite3 *db);
--
--#endif
-diff --git a/backends/apt/pk-apt-search-plain.c b/backends/apt/pk-apt-search-plain.c
-deleted file mode 100644
-index 5e5b4e5..0000000
---- a/backends/apt/pk-apt-search-plain.c
-+++ /dev/null
-@@ -1,106 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#include <gmodule.h>
--#include <glib.h>
--#include <string.h>
--#include <pk-backend.h>
--#include <pk-backend-spawn.h>
--
--extern PkBackendSpawn *spawn;
--
--/**
-- * backend_get_groups:
-- */
--static PkGroupEnum
--backend_get_groups (PkBackend *backend)
--{
-- return (PK_GROUP_ENUM_ACCESSORIES |
-- PK_GROUP_ENUM_GAMES |
-- PK_GROUP_ENUM_GRAPHICS |
-- PK_GROUP_ENUM_INTERNET |
-- PK_GROUP_ENUM_OFFICE |
-- PK_GROUP_ENUM_OTHER |
-- PK_GROUP_ENUM_PROGRAMMING |
-- PK_GROUP_ENUM_MULTIMEDIA |
-- PK_GROUP_ENUM_SYSTEM);
--}
--
--/**
-- * backend_get_filters:
-- */
--static PkFilterEnum
--backend_get_filters (PkBackend *backend)
--{
-- return (PK_FILTER_ENUM_GUI |
-- PK_FILTER_ENUM_INSTALLED |
-- PK_FILTER_ENUM_DEVELOPMENT);
--}
--
--/**
-- * backend_get_details:
-- */
--
--void
--backend_get_details (PkBackend *backend, const gchar *package_id)
--{
-- pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
--}
--
--/**
-- * backend_search_details:
-- */
--
--void
--backend_search_details (PkBackend *backend, PkFilterEnum filters, const gchar *search)
--{
-- gchar *filters_text;
-- filters_text = pk_filter_enums_to_text (filters);
-- pk_backend_spawn_helper (spawn, "search-details.py", filters_texts_text, search, NULL);
-- g_free (filters_text);
--}
--
--/**
-- * backend_search_name:
-- */
--void
--backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
--{
-- gchar *filters_text;
-- filters_text = pk_filter_enums_to_text (filters);
-- pk_backend_spawn_helper (spawn, "search-name.py", filters_text, search, NULL);
-- g_free (filters_text);
--}
--
--/**
-- * backend_search_group:
-- */
--void
--backend_search_group (PkBackend *backend, PkFilterEnum filters, const gchar *search)
--{
-- gchar *filters_text;
-- pk_backend_spawn_helper (spawn, "search-group.py", filters_text, search, NULL);
-- g_free (filters_text);
--}
--
--/* don't need to do any setup/finalize in the plain search mode */
--void backend_init_search(PkBackend *backend) {}
--void backend_finish_search(PkBackend *backend) {}
-diff --git a/backends/apt/pk-apt-search-sqlite.cpp b/backends/apt/pk-apt-search-sqlite.cpp
-deleted file mode 100644
-index 98bdc7f..0000000
---- a/backends/apt/pk-apt-search-sqlite.cpp
-+++ /dev/null
-@@ -1,135 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#include <gmodule.h>
--#include <glib.h>
--#include <string.h>
--#include <pk-backend.h>
--#include <pk-backend-spawn.h>
--#include "pk-sqlite-pkg-cache.h"
--#include <apt-pkg/configuration.h>
--#include <apt-pkg/init.h>
--#include "pk-apt-build-db.h"
--
--static PkBackendSpawn *spawn;
--
--/**
-- * backend_get_groups:
-- */
--extern "C" PkGroupEnum
--backend_get_groups (PkBackend *backend)
--{
-- return (PK_GROUP_ENUM_ACCESSORIES |
-- PK_GROUP_ENUM_GAMES |
-- PK_GROUP_ENUM_GRAPHICS |
-- PK_GROUP_ENUM_INTERNET |
-- PK_GROUP_ENUM_OFFICE |
-- PK_GROUP_ENUM_OTHER |
-- PK_GROUP_ENUM_PROGRAMMING |
-- PK_GROUP_ENUM_MULTIMEDIA |
-- PK_GROUP_ENUM_SYSTEM);
--}
--
--/**
-- * backend_get_filters:
-- */
--extern "C" PkFilterEnum
--backend_get_filters (PkBackend *backend)
--{
-- return (PK_FILTER_ENUM_GUI |
-- PK_FILTER_ENUM_INSTALLED |
-- PK_FILTER_ENUM_DEVELOPMENT);
--}
--
--/**
-- * backend_get_details:
-- */
--
--extern "C" void
--backend_get_details (PkBackend *backend, const gchar *package_id)
--{
-- sqlite_get_details(backend,package_id);
--}
--
--/**
-- * backend_search_details:
-- */
--
--extern "C" void
--backend_search_details (PkBackend *backend, const gchar *filter, const gchar *search)
--{
-- sqlite_search_details(backend,filter,search);
--}
--
--/**
-- * backend_search_name:
-- */
--extern "C" void
--backend_search_name (PkBackend *backend, const gchar *filter, const gchar *search)
--{
-- sqlite_search_name(backend,filter,search);
--}
--
--/**
-- * backend_search_group:
-- */
--extern "C" void
--backend_search_group (PkBackend *backend, const gchar *filter, const gchar *search)
--{
-- pk_backend_set_allow_cancel (backend, TRUE);
-- pk_backend_spawn_helper (spawn, "search-group.py", filter, search, NULL);
--}
--
--static gboolean inited = FALSE;
--
--#define APT_DB PK_DB_DIR "/apt.db"
--
--extern "C" void backend_init_search(PkBackend *backend)
--{
-- if (!inited)
-- {
-- gchar *apt_fname = NULL;
-- if (pkgInitConfig(*_config) == false)
-- pk_debug("pkginitconfig was false");
-- if (pkgInitSystem(*_config, _system) == false)
-- pk_debug("pkginitsystem was false");
--
-- apt_fname = g_strconcat(
-- _config->Find("Dir").c_str(),
-- _config->Find("Dir::Cache").c_str(),
-- _config->Find("Dir::Cache::pkgcache").c_str(),
-- NULL);
--
-- //sqlite_set_installed_check(is_installed);
-- sqlite_init_cache(backend, APT_DB, apt_fname, apt_build_db);
-- g_free(apt_fname);
--
-- spawn = pk_backend_spawn_new ();
-- pk_backend_spawn_set_name (spawn, "apt-sqlite");
--
-- inited = TRUE;
-- }
--}
--
--extern "C" void backend_finish_search(PkBackend *backend)
--{
-- sqlite_finish_cache(backend);
--}
-diff --git a/backends/apt/pk-apt-search.h b/backends/apt/pk-apt-search.h
-deleted file mode 100644
-index e36e89f..0000000
---- a/backends/apt/pk-apt-search.h
-+++ /dev/null
-@@ -1,36 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#ifndef __PK_APT_SEARCH_H
--#define __PK_APT_SEARCH_H
--
--#include <glib.h>
--#include <pk-backend.h>
--
--void backend_init_search(PkBackend *backend);
--void backend_finish_search(PkBackend *backend);
--
--void backend_get_details (PkBackend *backend, const gchar *package_id);
--void backend_search_details (PkBackend *backend, const gchar *filter, const gchar *search);
--void backend_search_name (PkBackend *backend, const gchar *filter, const gchar *search);
--void backend_search_group (PkBackend *backend, const gchar *filter, const gchar *search);
--
--#endif
-diff --git a/backends/apt/pk-backend-apt.c b/backends/apt/pk-backend-apt.c
-index f59cd88..70836b2 100644
---- a/backends/apt/pk-backend-apt.c
-+++ b/backends/apt/pk-backend-apt.c
-@@ -20,16 +20,12 @@
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
--#include <gmodule.h>
--#include <glib.h>
--#include <string.h>
- #include <pk-backend.h>
--#include <pk-backend-spawn.h>
--#include <pk-package-ids.h>
--#include "pk-apt-search.h"
--#include "config.h"
-+#include <pk-backend-dbus.h>
-
--PkBackendSpawn *spawn;
-+static PkBackendDbus *dbus;
-+
-+#define PK_DBUS_BACKEND_SERVICE_APT "org.freedesktop.PackageKitAptBackend"
-
- /**
- * backend_initialize:
-@@ -39,9 +35,8 @@ static void
- backend_initialize (PkBackend *backend)
- {
- pk_debug ("FILTER: initialize");
-- spawn = pk_backend_spawn_new ();
-- pk_backend_spawn_set_name (spawn, "apt");
-- backend_init_search (backend);
-+ dbus = pk_backend_dbus_new ();
-+ pk_backend_dbus_set_name (dbus, PK_DBUS_BACKEND_SERVICE_APT);
- }
-
- /**
-@@ -52,8 +47,8 @@ static void
- backend_destroy (PkBackend *backend)
- {
- pk_debug ("FILTER: destroy");
-- backend_finish_search (backend);
-- g_object_unref (spawn);
-+ pk_backend_dbus_kill (dbus);
-+ g_object_unref (dbus);
- }
-
- /**
-@@ -85,184 +80,144 @@ backend_get_filters (PkBackend *backend)
- }
-
- /**
-- * pk_backend_bool_to_text:
-+ * backend_get_updates:
- */
--static const gchar *
--pk_backend_bool_to_text (gboolean value)
-+static void
-+backend_get_updates (PkBackend *backend, PkFilterEnum filters)
- {
-- if (value == TRUE) {
-- return "yes";
-- }
-- return "no";
-+ pk_backend_dbus_get_updates (dbus, filters);
- }
-
- /**
-- * backend_get_depends:
-- */
-+ * backend_refresh_cache:
-+ * */
- static void
--backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
-+backend_refresh_cache (PkBackend *backend, gboolean force)
- {
-- gchar *filters_text;
-- filters_text = pk_filter_enums_to_text (filters);
-- pk_backend_spawn_helper (spawn, "get-depends.py", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
-- g_free (filters_text);
-+ // check network state
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache whilst offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ pk_backend_dbus_refresh_cache(dbus, force);
- }
-
- /**
-- * backend_get_updates:
-- */
-+ * pk_backend_update_system:
-+ * */
- static void
--backend_get_updates (PkBackend *backend, PkFilterEnum filters)
-+backend_update_system (PkBackend *backend)
- {
-- gchar *filters_text;
-- filters_text = pk_filter_enums_to_text (filters);
-- pk_backend_spawn_helper (spawn, "get-updates.py", filters_text, NULL);
-- g_free (filters_text);
-+ pk_backend_dbus_update_system (dbus);
- }
-
- /**
-- * backend_get_update_detail:
-- */
-+ * backend_install_packages
-+ * */
- static void
--backend_get_update_detail (PkBackend *backend, const gchar *package_id)
-+backend_install_packages (PkBackend *backend, gchar **package_ids)
- {
-- pk_backend_spawn_helper (spawn, "get-update-detail.py", package_id, NULL);
-+ pk_backend_dbus_install_packages (dbus, package_ids);
- }
-
- /**
-- * backend_install_packages:
-- */
-+ * backend_remove_packages
-+ * */
- static void
--backend_install_packages (PkBackend *backend, gchar **package_ids)
-+backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
- {
-- gchar *package_ids_temp;
--
-- /* check network state */
-- if (!pk_backend_is_online (backend)) {
-- pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
-- pk_backend_finished (backend);
-- return;
-- }
--
-- /* send the complete list as stdin */
-- package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-- pk_backend_spawn_helper (spawn, "install-packages.py", package_ids_temp, NULL);
-- g_free (package_ids_temp);
-+ pk_backend_dbus_remove_packages (dbus, package_ids, allow_deps, autoremove);
- }
-
- /**
-- * backend_refresh_cache:
-- */
-+ * backend_get_details:
-+ * */
- static void
--backend_refresh_cache (PkBackend *backend, gboolean force)
-+backend_get_details (PkBackend *backend, const gchar *package_id)
- {
-- /* check network state */
-- if (!pk_backend_is_online (backend)) {
-- pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache whilst offline");
-- pk_backend_finished (backend);
-- return;
-- }
--
-- pk_backend_spawn_helper (spawn, "refresh-cache.py", NULL);
-+ pk_backend_dbus_get_details (dbus, package_id);
- }
-
- /**
-- * pk_backend_remove_packages:
-- *
-+ * * pk_backend_search_details:
-+ * */
- static void
--backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
-+backend_search_details (PkBackend *backend, PkFilterEnum filters, const gchar *search)
- {
-- gchar *package_ids_temp;
-- package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-- pk_backend_spawn_helper (spawn, "remove-packages.py", pk_backend_bool_to_text (allow_deps), package_ids_temp, NULL);
-- g_free (package_ids_temp);
--} */
-+ pk_backend_dbus_search_details (dbus, filters, search);
-+}
-
- /**
-- * pk_backend_update_packages:
-- */
-+ * * pk_backend_search_name:
-+ * */
- static void
--backend_update_packages (PkBackend *backend, gchar **package_ids)
-+backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
- {
-- gchar *package_ids_temp;
--
-- /* check network state */
-- if (!pk_backend_is_online (backend)) {
-- pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
-- pk_backend_finished (backend);
-- return;
-- }
--
-- /* send the complete list as stdin */
-- package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-- pk_backend_spawn_helper (spawn, "update-packages.py", package_ids_temp, NULL);
-- g_free (package_ids_temp);
-+ pk_backend_dbus_search_name (dbus, filters, search);
- }
-
- /**
-- * pk_backend_update_system:
-- */
-+ * * pk_backend_cancel:
-+ * */
- static void
--backend_update_system (PkBackend *backend)
-+backend_cancel (PkBackend *backend)
- {
-- pk_backend_spawn_helper (spawn, "update-system.py", NULL);
-+ pk_backend_dbus_cancel (dbus);
- }
-
- /**
-- * pk_backend_resolve:
-- */
-+ * * pk_backend_resolve:
-+ * */
- static void
- backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
- {
-- gchar *filters_text;
-- filters_text = pk_filter_enums_to_text (filters);
-- pk_backend_spawn_helper (spawn, "resolve.py", filters_text, package_id, NULL);
-- g_free (filters_text);
-+ pk_backend_dbus_resolve (dbus, filters, package_id);
- }
-
- /**
-- * pk_backend_get_repo_list:
-- */
-+ * * pk_backend_get_packages:
-+ * */
- static void
--backend_get_repo_list (PkBackend *backend, PkFilterEnum filters)
-+backend_get_packages (PkBackend *backend, PkFilterEnum filters)
- {
-- gchar *filters_text;
-- filters_text = pk_filter_enums_to_text (filters);
-- pk_backend_spawn_helper (spawn, "get-repo-list.py", filters_text, NULL);
-- g_free (filters_text);
-+ pk_backend_dbus_get_packages (dbus, filters);
- }
-
-+
-+
- PK_BACKEND_OPTIONS (
-- "Apt (with " APT_SEARCH " searching)", /* description */
-- "Ali Sabil <ali.sabil@gmail.com>; Tom Parker <palfrey@tevp.net>", /* author */
-+ "Apt", /* description */
-+ "Ali Sabil <ali.sabil@gmail.com>; Tom Parker <palfrey@tevp.net>; Sebastian Heinlein <glatzor@ubuntu.com>", /* author */
- backend_initialize, /* initalize */
- backend_destroy, /* destroy */
- backend_get_groups, /* get_groups */
- backend_get_filters, /* get_filters */
-- NULL, /* cancel */
-- backend_get_depends, /* get_depends */
-+ backend_cancel, /* cancel */
-+ NULL, /* get_depends */
- backend_get_details, /* get_details */
- NULL, /* get_files */
-- NULL, /* get_packages */
-- backend_get_repo_list, /* get_repo_list */
-+ backend_get_packages, /* get_packages */
-+ NULL, /* get_repo_list */
- NULL, /* get_requires */
-- backend_get_update_detail, /* get_update_detail */
-+ NULL, /* get_update_detail */
- backend_get_updates, /* get_updates */
- NULL, /* install_files */
- backend_install_packages, /* install_packages */
- NULL, /* install_signature */
- backend_refresh_cache, /* refresh_cache */
-- NULL, /* remove_packages */
-+ backend_remove_packages, /* remove_packages */
- NULL, /* repo_enable */
- NULL, /* repo_set_data */
- backend_resolve, /* resolve */
- NULL, /* rollback */
- backend_search_details, /* search_details */
- NULL, /* search_file */
-- backend_search_group, /* search_group */
-+ NULL, /* search_group */
- backend_search_name, /* search_name */
- NULL, /* service_pack */
-- backend_update_package, /* update_package */
-+ NULL, /* update_packages */
- backend_update_system, /* update_system */
- NULL /* what_provides */
- );
-diff --git a/backends/apt/pk-sqlite-pkg-cache.cpp b/backends/apt/pk-sqlite-pkg-cache.cpp
-deleted file mode 100644
-index 1bf9a50..0000000
---- a/backends/apt/pk-sqlite-pkg-cache.cpp
-+++ /dev/null
-@@ -1,215 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#include <glib.h>
--#include <glib/gstdio.h>
--#include "pk-sqlite-pkg-cache.h"
--
--static sqlite3 *db = NULL;
--static PkBackend *backend;
--static gboolean(*is_installed) (const PkPackageId *) = NULL;
--
--void sqlite_set_installed_check(gboolean(*func) (const PkPackageId *))
--{
-- is_installed = func;
--}
--
--void
--sqlite_init_cache(PkBackend *backend, const char* dbname, const char *compare_fname, void (*build_db)(PkBackend *, sqlite3 *))
--{
-- int ret;
-- struct stat st;
-- time_t db_age;
--
-- ret = sqlite3_open (dbname, &db);
-- g_assert(ret == SQLITE_OK);
-- g_assert(db!=NULL);
-- ret = sqlite3_exec(db,"PRAGMA synchronous = OFF",NULL,NULL,NULL);
-- g_assert(ret == SQLITE_OK);
--
-- g_stat(dbname, &st);
-- db_age = st.st_mtime;
-- g_stat(compare_fname, &st);
-- if (db_age>=st.st_mtime)
-- {
-- ret = sqlite3_exec(db, "select value from params where name = 'build_complete'", NULL, NULL, NULL);
-- if (ret != SQLITE_ERROR)
-- return;
-- pk_debug("ages are %lu for db, and %lu for comparism",db_age,st.st_mtime);
-- }
-- ret = sqlite3_exec(db,"drop table packages",NULL,NULL,NULL); // wipe it!
-- //g_assert(ret == SQLITE_OK);
-- pk_debug("wiped db");
-- ret = sqlite3_exec(db,"create table packages (name text, version text, deps text, arch text, short_desc text, long_desc text, repo string, primary key(name,version,arch,repo))",NULL,NULL,NULL);
-- g_assert(ret == SQLITE_OK);
--
-- build_db(backend,db);
--
-- sqlite3_exec(db,"create table params (name text primary key, value integer)", NULL, NULL, NULL);
-- sqlite3_exec(db,"insert into params values ('build_complete',1)", NULL, NULL, NULL);
--}
--
--void sqlite_finish_cache(PkBackend *backend)
--{
-- sqlite3_close(db);
--}
--
--// sqlite_search_packages_thread
--static gboolean
--sqlite_search_packages_thread (PkBackend *backend)
--{
-- int res;
-- gchar *sel;
-- const gchar *search;
--
-- pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
-- type = pk_backend_get_uint (backend, "type");
-- search = pk_backend_get_string (backend, "search");
--
-- pk_debug("finding %s", search);
--
-- sqlite3_stmt *package = NULL;
-- g_strdelimit(search," ",'%');
--
-- if (type == SEARCH_NAME)
-- sel = g_strdup_printf("select name,version,arch,repo,short_desc from packages where name like '%%%s%%'",search);
-- else if (type == SEARCH_DETAILS)
-- sel = g_strdup_printf("select name,version,arch,repo,short_desc from packages where name like '%%%s%%' or short_desc like '%%%s%%' or long_desc like '%%%s%%'",search, search, search);
-- else
-- {
-- pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Unknown search task type");
-- goto end_search_packages;
-- }
--
-- pk_debug("statement is '%s'",sel);
-- res = sqlite3_prepare_v2(db,sel, -1, &package, NULL);
-- g_free(sel);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during select prepare: %s", sqlite3_errmsg(db));
-- res = sqlite3_step(package);
-- while (res == SQLITE_ROW)
-- {
-- PkPackageId *pid = pk_package_id_new_from_list((const gchar*)sqlite3_column_text(package,0),
-- (const gchar*)sqlite3_column_text(package,1),
-- (const gchar*)sqlite3_column_text(package,2),
-- (const gchar*)sqlite3_column_text(package,3));
--
-- gchar *cpid = pk_package_id_to_string(pid);
-- PkInfoEnum pie = PK_INFO_ENUM_UNKNOWN;
--
-- if (is_installed != NULL)
-- pie = is_installed(pid)?PK_INFO_ENUM_INSTALLED:PK_INFO_ENUM_AVAILABLE;
--
-- pk_backend_package(backend, pie, cpid, (const gchar*)sqlite3_column_text(package,4));
--
-- g_free(cpid);
-- pk_package_id_free(pid);
--
-- if (res==SQLITE_ROW)
-- res = sqlite3_step(package);
-- }
-- if (res!=SQLITE_DONE)
-- {
-- pk_debug("sqlite error during step (%d): %s", res, sqlite3_errmsg(db));
-- g_assert(0);
-- }
--
--end_search_packages:
-- pk_backend_finished (backend);
-- return TRUE;
--}
--
--/**
-- * sqlite_search_details:
-- */
--void
--sqlite_search_details (PkBackend *backend, const gchar *filter, const gchar *search)
--{
-- pk_backend_set_uint (backend, "type", SEARCH_DETAILS);
-- pk_backend_thread_create (backend, sqlite_search_packages_thread);
--}
--
--/**
-- * sqlite_search_name:
-- */
--void
--sqlite_search_name (PkBackend *backend, const gchar *filter, const gchar *search)
--{
-- pk_backend_set_uint (backend, "type", SEARCH_NAME);
-- pk_backend_thread_create (backend, sqlite_search_packages_thread);
--}
--
--// sqlite_get_details_thread
--static gboolean
--sqlite_get_details_thread (PkBackend *backend)
--{
-- PkPackageId *pi;
-- const gchar *package_id;
-- int res;
--
-- package_id = pk_backend_get_string (backend, "package_id");
-- pi = pk_package_id_new_from_string(package_id);
-- if (pi == NULL)
-- {
-- pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-- pk_backend_finished(backend);
-- return;
-- }
--
-- pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
-- pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
--
-- pk_debug("finding %s", pi->name);
--
-- sqlite3_stmt *package = NULL;
-- gchar *sel = g_strdup_printf("select long_desc from packages where name = '%s' and version = '%s' and repo = '%s'",pi->name,pi->version,pi->data);
-- pk_debug("statement is '%s'",sel);
-- res = sqlite3_prepare_v2(db,sel, -1, &package, NULL);
-- g_free(sel);
-- if (res!=SQLITE_OK)
-- pk_error("sqlite error during select prepare: %s", sqlite3_errmsg(db));
-- res = sqlite3_step(package);
-- pk_backend_details(backend,pi->name, "unknown", PK_GROUP_ENUM_OTHER,(const gchar*)sqlite3_column_text(package,0),"",0);
-- res = sqlite3_step(package);
-- if (res==SQLITE_ROW)
-- pk_error("multiple matches for that package!");
-- if (res!=SQLITE_DONE)
-- {
-- pk_debug("sqlite error during step (%d): %s", res, sqlite3_errmsg(db));
-- g_assert(0);
-- }
--
-- g_free(dt);
--
-- return TRUE;
--}
--
--/**
-- * sqlite_get_details:
-- */
--extern "C++" void
--sqlite_get_details (PkBackend *backend, const gchar *package_id)
--{
-- pk_backend_thread_create (backend, sqlite_get_details_thread);
-- return;
--}
--
-diff --git a/backends/apt/pk-sqlite-pkg-cache.h b/backends/apt/pk-sqlite-pkg-cache.h
-deleted file mode 100644
-index 68fad42..0000000
---- a/backends/apt/pk-sqlite-pkg-cache.h
-+++ /dev/null
-@@ -1,42 +0,0 @@
--#ifndef SQLITE_PKT_CACHE
--#define SQLITE_PKT_CACHE
--
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--typedef enum {
-- SEARCH_NAME = 1,
-- SEARCH_DETAILS,
-- SEARCH_FILE
--} SearchDepth;
--
--#include <pk-backend.h>
--#include <sqlite3.h>
--
--void sqlite_init_cache(PkBackend *backend, const char* dbname, const char* compare_fname, void (*build_db)(PkBackend *, sqlite3 *db));
--void sqlite_finish_cache(PkBackend *backend);
--
--void sqlite_search_details (PkBackend *backend, const gchar *filter, const gchar *search);
--void sqlite_search_name (PkBackend *backend, const gchar *filter, const gchar *search);
--void backend_search_common(PkBackend * backend, const gchar * filter, const gchar * search, SearchDepth which, PkBackendThreadFunc func);
--void sqlite_get_details (PkBackend *backend, const gchar *package_id);
--
--#endif
-diff --git a/backends/apt/profiler.py b/backends/apt/profiler.py
-new file mode 100644
-index 0000000..1b5d30f
---- /dev/null
-+++ b/backends/apt/profiler.py
-@@ -0,0 +1,40 @@
-+#!/usr/bin/env python
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+
-+# Copyright (C) 2008
-+# Sebastian Heinlein <sebi@glatzor.de>
-+
-+"""
-+Allows to start the apt2 backend in a profling mode
-+"""
-+
-+__author__ = "Sebastian Heinlein <devel@glatzor.de>"
-+
-+
-+import hotshot
-+import sys
-+
-+from aptDBUSBackend import main
-+
-+if len(sys.argv) == 2:
-+ profile = sys.argv[1]
-+else:
-+ profile = "profile"
-+
-+prof = hotshot.Profile(profile)
-+print prof.runcall(main)
-+prof.close()
-diff --git a/backends/apt/test.py b/backends/apt/test.py
-new file mode 100755
-index 0000000..a1d5ffb
---- /dev/null
-+++ b/backends/apt/test.py
-@@ -0,0 +1,98 @@
-+#!/usr/bin/python
-+# Licensed under the GNU General Public License Version 2
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+
-+# Copyright (C) 2007
-+# Tim Lauridsen <timlau@fedoraproject.org>
-+
-+import sys
-+import dbus
-+from packagekit.enums import *
-+
-+PACKAGEKIT_DBUS_SERVICE = 'org.freedesktop.PackageKitAptBackend'
-+PACKAGEKIT_DBUS_INTERFACE = 'org.freedesktop.PackageKitBackend'
-+PACKAGEKIT_DBUS_PATH = '/org/freedesktop/PackageKitBackend'
-+PKG_ID = 'xterm;232-1;i386;Debian'
-+
-+try:
-+ bus = dbus.SystemBus()
-+except dbus.DBusException, e:
-+ print "Unable to connect to dbus"
-+ print "%s" %(e,)
-+ sys.exit(1)
-+
-+try:
-+ proxy = bus.get_object(PACKAGEKIT_DBUS_SERVICE, PACKAGEKIT_DBUS_PATH)
-+ iface = dbus.Interface(proxy, PACKAGEKIT_DBUS_INTERFACE)
-+ cmd = sys.argv[1]
-+ if cmd == 'init' or cmd == 'all':
-+ print "Testing Init()"
-+ iface.Init()
-+ if cmd == 'cancel':
-+ print "Canceling"
-+ iface.Cancel()
-+ if cmd == 'get-updates' or cmd == 'all':
-+ print "Testing GetUpdate()"
-+ iface.GetUpdates()
-+ if cmd == 'search-name' or cmd == 'all':
-+ print "Testing SearchName(FILTER_NONE,'apt')"
-+ iface.SearchName(FILTER_NONE,'apt')
-+ if cmd == 'search-details' or cmd == 'all':
-+ print "SearchDetails(FILTER_NONE,'dbus')"
-+ iface.SearchDetails(FILTER_NONE,'dbus')
-+ if cmd == 'search-group' or cmd == 'all':
-+ print "Testing SearchGroup(FILTER_NONE,GROUP_GAMES)"
-+ iface.SearchGroup(FILTER_NONE,GROUP_GAMES)
-+ if cmd == 'search-file' or cmd == 'all':
-+ print "Testing SearchFile(FILTER_NONE,'/usr/bin/yum')"
-+ iface.SearchFile(FILTER_NONE,'/usr/bin/yum')
-+ if cmd == 'get-requires' or cmd == 'all':
-+ print "Testing GetRequires(PKG_ID,False)"
-+ iface.GetRequires(PKG_ID,False)
-+ if cmd == 'get-depends' or cmd == 'all':
-+ print "Testing GetDepends(PKG_ID,False)"
-+ iface.GetDepends(PKG_ID,False)
-+ if cmd == 'refresh-cache' or cmd == 'all':
-+ print "Testing RefreshCache()"
-+ iface.RefreshCache()
-+ if cmd == 'resolve' or cmd == 'all':
-+ print "Testing Resolve(FILTER_NONE,'yum')"
-+ iface.Resolve(FILTER_NONE,'yum')
-+ if cmd == 'get-details' or cmd == 'all':
-+ print "Testing GetDetails(PKG_ID)"
-+ iface.GetDetails(PKG_ID)
-+ if cmd == 'get-files' or cmd == 'all':
-+ print "Testing GetFiles(PKG_ID)"
-+ iface.GetFiles(PKG_ID)
-+ if cmd == 'get-packages' or cmd == 'all':
-+ print "Testing GetPackages(FILTER_INSTALLED,'no')"
-+ iface.GetPackages(FILTER_INSTALLED,'no')
-+ if cmd == 'get-repolist' or cmd == 'all':
-+ print "Testing GetRepoList()"
-+ iface.GetRepoList()
-+ if cmd == 'get-updatedetail' or cmd == 'all':
-+ print "Testing GetUpdateDetail(PKG_ID)"
-+ iface.GetUpdateDetail(PKG_ID)
-+ #print "Testing "
-+ #iface.
-+ if cmd == 'exit' or cmd == 'all':
-+ print "Testing Exit()"
-+ iface.Exit()
-+
-+except dbus.DBusException, e:
-+ print "Unable to send message on dbus"
-+ print "%s" %(e,)
-+ sys.exit(1)
-diff --git a/backends/apt2/.gitignore b/backends/apt2/.gitignore
-deleted file mode 100644
-index c851833..0000000
---- a/backends/apt2/.gitignore
-+++ /dev/null
-@@ -1,10 +0,0 @@
--.deps
--.libs
--Makefile
--Makefile.in
--*.la
--*.lo
--*.loT
--*.o
--*~
--
-diff --git a/backends/apt2/HACKING b/backends/apt2/HACKING
-deleted file mode 100644
-index 2b99c5d..0000000
---- a/backends/apt2/HACKING
-+++ /dev/null
-@@ -1,5 +0,0 @@
--The backend can be tested by running it as root from the source code
--repository. Make sure to kill packagekitd before to force a reintializing
--of the cache:
--
-- killall packagekitd; python aptDBUSBackend.py
-diff --git a/backends/apt2/Makefile.am b/backends/apt2/Makefile.am
-deleted file mode 100644
-index 91c0c46..0000000
---- a/backends/apt2/Makefile.am
-+++ /dev/null
-@@ -1,25 +0,0 @@
--NULL =
--
--plugindir = $(PK_PLUGIN_DIR)
--plugin_LTLIBRARIES = libpk_backend_apt2.la
--libpk_backend_apt2_la_SOURCES = pk-backend-apt2.c
--libpk_backend_apt2_la_LIBADD = $(PK_PLUGIN_LIBS)
--libpk_backend_apt2_la_LDFLAGS = -module -avoid-version
--libpk_backend_apt2_la_CFLAGS = $(PK_PLUGIN_CFLAGS)
--
--dbusinstancedir = $(LIBEXECDIR)
--dbusinstance_DATA = \
-- aptDBUSBackend.py \
-- $(NULL)
--
--EXTRA_DIST = \
-- $(dbusinstance_DATA) \
-- $(NULL)
--
--install-data-hook:
-- chmod a+rx $(DESTDIR)$(libexecdir)/*.py
--
--clean-local :
-- rm -f *~
-- rm -f *.pyc
--
-diff --git a/backends/apt2/README b/backends/apt2/README
-deleted file mode 100644
-index 0a3da6e..0000000
---- a/backends/apt2/README
-+++ /dev/null
-@@ -1,23 +0,0 @@
--The name of this backend is apt2.
--
--It supports apt which is mainly used by Debian and its derivates. In contrast to
--the backend called apt this one uses DBus for the communication with the
--packagekit daemon. This allows to perform actions without having to reopen
--the cache for each one.
--
--To provide a tremendously fast search function a Xapian database is used.
--It is provided by Enrico Zini's apt-xapian-index. Debtags will be used to
--enhance the quality of the search results further.
--
--A list of implemented functions are listed in the PackageKit FAQ:
--
--http://www.packagekit.org/pk-faq.html
--
--You can find packages for Ubuntu here:
--
--https://www.launchpad.net/~packagekit/+ppa
--
--Packages for Debian Unstable will be provided soon.
--
--Feel free to send comments or bug reports to the PackageKit mailing list
--or to the author.
-diff --git a/backends/apt2/TODO b/backends/apt2/TODO
-deleted file mode 100644
-index bee2f3d..0000000
---- a/backends/apt2/TODO
-+++ /dev/null
-@@ -1,70 +0,0 @@
--ISSUES:
--
-- * Support delayed or hidden debconf questions
--
--Unresolved issues can be discussed at the following wiki page:
--http://wiki.debian.org/PackageKit
--
--
--TODO:
--
-- * Implement all open backend methods. A list of implemented backend methods
-- can be found in PackageKit FAQ or in pk-backend-apt2.c.
--
-- * Blacklist packages requiring input on the terminal and try to change
-- the Debian policy in the long run. Way of automation?
--
-- * Allow to inject alternative apt.package.Package classes into the
-- cache to support PackageKit and distribution specific needs
-- (e.g. when is a package called free or supported)
--
-- * Allow to reinject debtags into the search results to get
-- similar software which not matches on the search terms
--
-- * Index file list and add properties for package name and section to
-- the xapian database to also make use of it in search group and
-- search name (do we want this?)
--
-- * Map Debian/Ubuntu sections to PackageKit groups:
-- - admin : System Administration => admin-tools
-- - base : Base System => system
-- - comm : Communication => communication
-- - devel : Development => programming
-- - doc : Documentation => ???
-- - editors : Editors => accessoires
-- - electronics : Electronics => other
-- - embedded : Embedded Devices => system
-- - games : Games and Amusement => games
-- - gnome : GNOME Desktop Environment => desktop-gnome
-- - graphics : Graphics => graphics
-- - hamradio : Amateur Radio => communication
-- - interpreters : Interpreted Computer L. => programming
-- - kde : KDE Desktop Environment => desktop-kde
-- - libdevel : Libraries - Development => programming
-- - libs : Libraries => system
-- - mail : Email => internet
-- - math : Mathematics => ??? science/education
-- - misc : Miscellaneous - Text Based => other
-- - net : Networkinga => network
-- - news : Newsgroup => internet
-- - oldlibs : Libraries - Old => legacy
-- - otherosfs : Cross Platform => system
-- - perl : Perl Programming Language => programming
-- - python : Python Programming Language => programming
-- - science : Science => ??? science/education
-- - shells : Shells => system
-- - sound : Multimedia => multimedia
-- - tex : TeX Authoring => publishing
-- - text : Word Processing => publishing
-- - utils : Utilities => accessoires
-- - web : World Wide Web => internet
-- - x11 : Miscellaneous - Graphical => desktop-other
-- - unknown : Unknown => unknown
-- - alien : Converted From RPM by Alien" => unknown
-- - translations => localization
-- The following could not be maped: science, documentation, electronics
-- Are there any derivates with additional sections?
--
-- * Fix the dbus policy. Should we require at_console for searching?
--
--DONE:
-diff --git a/backends/apt2/aptDBUSBackend.py b/backends/apt2/aptDBUSBackend.py
-deleted file mode 100755
-index b7fc500..0000000
---- a/backends/apt2/aptDBUSBackend.py
-+++ /dev/null
-@@ -1,628 +0,0 @@
--#!/usr/bin/env python
--# -*- coding: utf-8 -*-
--"""
--Provides an apt backend to PackageKit
--
--Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
--Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
--Copyright (C) 2008 Sebastian Heinlein <glatzor@ubuntu.com>
--
--Licensed under the GNU General Public License Version 2
--
--This program is free software; you can redistribute it and/or modify
--it under the terms of the GNU General Public License as published by
--the Free Software Foundation; either version 2 of the License, or
--(at your option) any later version.
--"""
--
--__author__ = "Sebastian Heinlein <devel@glatzor.de>"
--__state__ = "experimental"
--
--import os
--import pty
--import re
--import signal
--import time
--import threading
--import warnings
--
--import apt
--import apt_pkg
--import dbus
--import dbus.glib
--import dbus.service
--import dbus.mainloop.glib
--import gobject
--import xapian
--
--from packagekit.daemonBackend import PACKAGEKIT_DBUS_INTERFACE, PACKAGEKIT_DBUS_PATH, PackageKitBaseBackend, PackagekitProgress, pklog, threaded
--from packagekit.enums import *
--
--warnings.filterwarnings(action='ignore', category=FutureWarning)
--
--PACKAGEKIT_DBUS_SERVICE = 'org.freedesktop.PackageKitAptBackend'
--
--XAPIANDBPATH = os.environ.get("AXI_DB_PATH", "/var/lib/apt-xapian-index")
--XAPIANDB = XAPIANDBPATH + "/index"
--XAPIANDBVALUES = XAPIANDBPATH + "/values"
--DEFAULT_SEARCH_FLAGS = (xapian.QueryParser.FLAG_BOOLEAN |
-- xapian.QueryParser.FLAG_PHRASE |
-- xapian.QueryParser.FLAG_LOVEHATE |
-- xapian.QueryParser.FLAG_BOOLEAN_ANY_CASE)
--
--# Required for daemon mode
--os.putenv("PATH",
-- "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")
--# Avoid questions from the maintainer scripts as far as possible
--os.putenv("DEBIAN_FRONTEND", "noninteractive")
--os.putenv("APT_LISTCHANGES_FRONTEND", "none")
--
--# Setup threading support
--gobject.threads_init()
--dbus.glib.threads_init()
--
--class PackageKitOpProgress(apt.progress.OpProgress):
-- '''
-- Handle the cache opening process
-- '''
-- def __init__(self, backend, prange=(0,100), progress=True):
-- self._backend = backend
-- apt.progress.OpProgress.__init__(self)
-- self.steps = []
-- for v in [0.12, 0.25, 0.50, 0.75, 1.00]:
-- s = prange[0] + (prange[1] - prange[0]) * v
-- self.steps.append(s)
-- self.pstart = float(prange[0])
-- self.pend = self.steps.pop(0)
-- self.pprev = None
-- self.show_progress = progress
--
-- # OpProgress callbacks
-- def update(self, percent):
-- progress = int(self.pstart + percent / 100 * (self.pend - self.pstart))
-- if self.show_progress == True and self.pprev < progress:
-- self._backend.PercentageChanged(progress)
-- self.pprev = progress
--
-- def done(self):
-- self.pstart = self.pend
-- try:
-- self.pend = self.steps.pop(0)
-- except:
-- pklog.warning("An additional step to open the cache is required")
--
--class PackageKitFetchProgress(apt.progress.FetchProgress):
-- '''
-- Handle the package download process
-- '''
-- def __init__(self, backend, prange=(0,100)):
-- self._backend = backend
-- apt.progress.FetchProgress.__init__(self)
-- self.pstart = prange[0]
-- self.pend = prange[1]
-- self.pprev = None
--
-- # FetchProgress callbacks
-- def pulse(self):
-- if self._backend._canceled.isSet():
-- return False
-- percent = ((self.currentBytes + self.currentItems)*100.0)/float(self.totalBytes+self.totalItems)
-- progress = int(self.pstart + percent/100 * (self.pend - self.pstart))
-- if self.pprev < progress:
-- self._backend.PercentageChanged(progress)
-- self.pprev = progress
-- apt.progress.FetchProgress.pulse(self)
-- return True
--
-- def start(self):
-- self._backend.StatusChanged(STATUS_DOWNLOAD)
-- self._backend.AllowCancel(True)
--
-- def stop(self):
-- self._backend.PercentageChanged(self.pend)
-- self._backend.AllowCancel(False)
--
-- def mediaChange(self, medium, drive):
-- #FIXME: use the Message method to notify the user
-- self._backend.error(ERROR_UNKNOWN,
-- "Medium change needed")
--
--class PackageKitInstallProgress(apt.progress.InstallProgress):
-- '''
-- Handle the installation and removal process. Bits taken from
-- DistUpgradeViewNonInteractive.
-- '''
-- def __init__(self, backend, prange=(0,100)):
-- apt.progress.InstallProgress.__init__(self)
-- self._backend = backend
-- self.timeout = 900
-- self.pstart = prange[0]
-- self.pend = prange[1]
-- self.pprev = None
--
-- def statusChange(self, pkg, percent, status):
-- progress = self.pstart + percent/100 * (self.pend - self.pstart)
-- if self.pprev < progress:
-- self._backend.PercentageChanged(int(progress))
-- self.pprev = progress
-- pklog.debug("PM status: %s" % status)
--
-- def startUpdate(self):
-- self._backend.StatusChanged(STATUS_INSTALL)
-- self.last_activity = time.time()
--
-- def updateInterface(self):
-- pklog.debug("Updating interface")
-- apt.progress.InstallProgress.updateInterface(self)
--
-- def conffile(self, current, new):
-- pklog.critical("Config file prompt: '%s'" % current)
--
--def sigquit(signum, frame):
-- pklog.error("Was killed")
-- sys.exit(1)
--
--class PackageKitAptBackend(PackageKitBaseBackend):
-- '''
-- PackageKit backend for apt
-- '''
--
-- def locked(func):
-- '''
-- Decorator to run a method with a lock
-- '''
-- def wrapper(*args, **kwargs):
-- backend = args[0]
-- backend._lock_cache()
-- ret = func(*args, **kwargs)
-- backend._unlock_cache()
-- return ret
-- wrapper.__name__ = func.__name__
-- return wrapper
--
-- def __init__(self, bus_name, dbus_path):
-- pklog.info("Initializing APT backend")
-- signal.signal(signal.SIGQUIT, sigquit)
-- self._cache = None
-- self._xapian = None
-- self._canceled = threading.Event()
-- self._canceled.clear()
-- self._locked = threading.Lock()
-- PackageKitBaseBackend.__init__(self, bus_name, dbus_path)
--
-- # Methods ( client -> engine -> backend )
--
-- def doInit(self):
-- pklog.info("Initializing cache")
-- self.StatusChanged(STATUS_SETUP)
-- self.AllowCancel(False)
-- self.NoPercentageUpdates()
-- self._open_cache(progress=False)
--
-- def doExit(self):
-- pass
--
-- @threaded
-- def doCancel(self):
-- pklog.info("Canceling current action")
-- self.StatusChanged(STATUS_CANCEL)
-- self._canceled.set()
-- self._canceled.wait()
--
-- @threaded
-- def doSearchName(self, filters, search):
-- '''
-- Implement the apt2-search-name functionality
-- '''
-- pklog.info("Searching for package name: %s" % search)
-- self.StatusChanged(STATUS_QUERY)
-- self.NoPercentageUpdates()
-- self._check_init(progress=False)
-- self.AllowCancel(True)
--
-- for pkg in self._cache:
-- if self._canceled.isSet():
-- self.ErrorCode(ERROR_TRANSACTION_CANCELLED,
-- "The search was canceled")
-- self.Finished(EXIT_KILL)
-- self._canceled.clear()
-- return
-- elif search in pkg.name and self._is_package_visible(pkg, filters):
-- self._emit_package(pkg)
-- self.Finished(EXIT_SUCCESS)
--
-- @threaded
-- def doSearchDetails(self, filters, search):
-- '''
-- Implement the apt2-search-details functionality
-- '''
-- pklog.info("Searching for package name: %s" % search)
-- self.StatusChanged(STATUS_QUERY)
-- self.NoPercentageUpdates()
-- self._check_init(progress=False)
-- self.AllowCancel(True)
-- results = []
--
-- if os.access(XAPIANDB, os.R_OK):
-- pklog.debug("Performing xapian db based search")
-- db = xapian.Database(XAPIANDB)
-- parser = xapian.QueryParser()
-- query = parser.parse_query(unicode(search),
-- DEFAULT_SEARCH_FLAGS)
-- enquire = xapian.Enquire(db)
-- enquire.set_query(query)
-- matches = enquire.get_mset(0, 1000)
-- for r in map(lambda m: m[xapian.MSET_DOCUMENT].get_data(),
-- enquire.get_mset(0,1000)):
-- if self._cache.has_key(r):
-- results.append(self._cache[r])
-- else:
-- pklog.debug("Performing apt cache based search")
-- for p in self._cache._dict.values():
-- if self._check_canceled("Search was canceled"): return
-- needle = search.strip().lower()
-- haystack = p.description.lower()
-- if p.name.find(needle) >= 0 or haystack.find(needle) >= 0:
-- results.append(p)
--
-- for r in results:
-- if self._check_canceled("Search was canceled"): return
-- if self._is_package_visible(r, filters) == True:
-- self._emit_package(r)
--
-- self.Finished(EXIT_SUCCESS)
--
-- @threaded
-- @locked
-- def doGetUpdates(self, filters):
-- '''
-- Implement the {backend}-get-update functionality
-- '''
-- #FIXME: Implment the basename filter
-- pklog.info("Get updates")
-- self.StatusChanged(STATUS_INFO)
-- self.AllowCancel(True)
-- self.NoPercentageUpdates()
-- self._check_init(progress=False)
-- self._cache.upgrade(False)
-- for pkg in self._cache.getChanges():
-- if self._canceled.isSet():
-- self.ErrorCode(ERROR_TRANSACTION_CANCELLED,
-- "Calculating updates was canceled")
-- self.Finished(EXIT_KILL)
-- self._canceled.clear()
-- return
-- else:
-- self._emit_package(pkg)
-- self._open_cache(progress=False)
-- self.Finished(EXIT_SUCCESS)
--
-- @threaded
-- def GetDetails(self, pkg_id):
-- '''
-- Implement the {backend}-get-details functionality
-- '''
-- pklog.info("Get details of %s" % pkg_id)
-- self.StatusChanged(STATUS_INFO)
-- self.NoPercentageUpdates()
-- self.AllowCancel(False)
-- self._check_init(progress=False)
-- name, version, arch, data = self.get_package_from_id(pkg_id)
-- if not self._cache.has_key(name):
-- self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-- "Package %s isn't available" % name)
-- self.Finished(EXIT_FAILED)
-- return
-- pkg = self._cache[name]
-- #FIXME: should perhaps go to python-apt since we need this in
-- # several applications
-- desc = pkg.description
-- # Skip the first line - it's a duplicate of the summary
-- i = desc.find('\n')
-- desc = desc[i+1:]
-- # do some regular expression magic on the description
-- # Add a newline before each bullet
-- p = re.compile(r'^(\s|\t)*(\*|0|-)',re.MULTILINE)
-- desc = p.sub(ur'\n\u2022', desc)
-- # replace all newlines by spaces
-- p = re.compile(r'\n', re.MULTILINE)
-- desc = p.sub(" ", desc)
-- # replace all multiple spaces by newlines
-- p = re.compile(r'\s\s+', re.MULTILINE)
-- desc = p.sub('\n', desc)
-- #FIXME: group and licence information missing
-- self.Details(pkg_id, 'unknown', 'unknown', desc,
-- pkg.homepage, pkg.packageSize)
-- self.Finished(EXIT_SUCCESS)
--
-- @threaded
-- @locked
-- def doUpdateSystem(self):
-- '''
-- Implement the {backend}-update-system functionality
-- '''
-- #FIXME: Better exception and error handling
-- #FIXME: Distupgrade or Upgrade?
-- #FIXME: Handle progress in a more sane way
-- pklog.info("Upgrading system")
-- self.StatusChanged(STATUS_UPDATE)
-- self.AllowCancel(False)
-- self.PercentageChanged(0)
-- self._check_init(prange=(0,5))
-- try:
-- self._cache.upgrade(distUpgrade=True)
-- self._cache.commit(PackageKitFetchProgress(self, prange=(5,50)),
-- PackageKitInstallProgress(self, prange=(50,95)))
-- except apt.cache.FetchFailedException:
-- self._open_cache()
-- self.ErrorCode(ERROR_PACKAGE_DOWNLOAD_FAILED, "Download failed")
-- self.Finished(EXIT_FAILED)
-- return
-- except apt.cache.FetchCancelledException:
-- self._open_cache(prange=(95,100))
-- self.ErrorCode(ERROR_TRANSACTION_CANCELLED, "Download was canceled")
-- self.Finished(EXIT_KILL)
-- self._canceled.clear()
-- return
-- except:
-- self._open_cache(prange=(95,100))
-- self.ErrorCode(ERROR_UNKNOWN, "System update failed")
-- self.Finished(EXIT_FAILED)
-- return
-- self.PercentageChanged(100)
-- self.Finished(EXIT_SUCCESS)
--
-- @threaded
-- @locked
-- def doRemovePackages(self, ids, deps=True, auto=False):
-- '''
-- Implement the {backend}-remove functionality
-- '''
-- #FIXME: Handle progress in a more sane way
-- pklog.info("Removing package with id %s" % id)
-- self.StatusChanged(STATUS_REMOVE)
-- self.AllowCancel(False)
-- self.PercentageChanged(0)
-- self._check_init(prange=(0,10))
-- pkg = self._find_package_by_id(id)
-- if pkg == None:
-- self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-- "Package %s isn't available" % pkg.name)
-- self.Finished(EXIT_FAILED)
-- return
-- if not pkg.isInstalled:
-- self.ErrorCode(ERROR_PACKAGE_NOT_INSTALLED,
-- "Package %s isn't installed" % pkg.name)
-- self.Finished(EXIT_FAILED)
-- return
-- name = pkg.name[:]
-- try:
-- pkg.markDelete()
-- self._cache.commit(PackageKitFetchProgress(self, prange=(10,10)),
-- PackageKitInstallProgress(self, prange=(10,90)))
-- except:
-- self._open_cache(prange=(90,100))
-- self.ErrorCode(ERROR_UNKNOWN, "Removal failed")
-- self.Finished(EXIT_FAILED)
-- return
-- self._open_cache(prange=(90,100))
-- self.PercentageChanged(100)
-- if not self._cache.has_key(name) or not self._cache[name].isInstalled:
-- self.Finished(EXIT_SUCCESS)
-- else:
-- self.ErrorCode(ERROR_UNKNOWN, "Package is still installed")
-- self.Finished(EXIT_FAILED)
--
-- @threaded
-- @locked
-- def doInstallPackages(self, ids):
-- '''
-- Implement the {backend}-install functionality
-- '''
-- #FIXME: Handle progress in a more sane way
-- pklog.info("Installing package with id %s" % id)
-- self.StatusChanged(STATUS_INSTALL)
-- self.AllowCancel(False)
-- self.PercentageChanged(0)
-- self._check_init(prange=(0,10))
-- pkg = self._find_package_by_id(id)
-- if pkg == None:
-- self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,
-- "Package %s isn't available" % pkg.name)
-- self.Finished(EXIT_FAILED)
-- return
-- if pkg.isInstalled:
-- self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,
-- "Package %s is already installed" % pkg.name)
-- self.Finished(EXIT_FAILED)
-- return
-- name = pkg.name[:]
-- try:
-- pkg.markInstall()
-- self._cache.commit(PackageKitFetchProgress(self, prange=(10,50)),
-- PackageKitInstallProgress(self, prange=(50,90)))
-- except:
-- self._open_cache(prange=(90,100))
-- self.ErrorCode(ERROR_UNKNOWN, "Installation failed")
-- self.Finished(EXIT_FAILED)
-- return
-- self._open_cache(prange=(90,100))
-- self.PercentageChanged(100)
-- if self._cache.has_key(name) and self._cache[name].isInstalled:
-- self.Finished(EXIT_SUCCESS)
-- else:
-- self.ErrorCode(ERROR_UNKNOWN, "Installation failed")
-- self.Finished(EXIT_FAILED)
--
-- @threaded
-- @locked
-- def doRefreshCache(self, force):
-- '''
-- Implement the {backend}-refresh_cache functionality
-- '''
-- pklog.info("Refresh cache")
-- self.StatusChanged(STATUS_REFRESH_CACHE)
-- self.last_action_time = time.time()
-- self.AllowCancel(False);
-- self.PercentageChanged(0)
-- self._check_init((0,10))
-- try:
-- self._cache.update(PackageKitFetchProgress(self, prange=(10,95)))
-- except apt.cache.FetchFailedException:
-- self.ErrorCode(ERROR_NO_NETWORK, "Download failed")
-- self.Finished(EXIT_FAILED)
-- return
-- except apt.cache.FetchCancelledException:
-- self._canceled.clear()
-- self.ErrorCode(ERROR_TRANSACTION_CANCELLED, "Download was canceled")
-- self.Finished(EXIT_KILL)
-- return
-- except:
-- self._open_cache(prange=(95,100))
-- self.ErrorCode(ERROR_UNKNOWN, "Refreshing cache failed")
-- self.Finished(EXIT_FAILED)
-- return
-- self.PercentageChanged(100)
-- self.Finished(EXIT_SUCCESS)
--
-- # Helpers
--
-- def _open_cache(self, prange=(0,100), progress=True):
-- '''
-- (Re)Open the APT cache
-- '''
-- pklog.debug("Open APT cache")
-- self.StatusChanged(STATUS_REFRESH_CACHE)
-- try:
-- self._cache = apt.Cache(PackageKitOpProgress(self, prange,
-- progress))
-- except:
-- self.ErrorCode(ERROR_NO_CACHE, "Package cache could not be opened")
-- self.Finished(EXIT_FAILED)
-- self.Exit()
-- return
-- if self._cache._depcache.BrokenCount > 0:
-- self.ErrorCode(ERROR_DEP_RESOLUTION_FAILED,
-- "Not all dependecies can be satisfied")
-- self.Finished(EXIT_FAILED)
-- self.Exit()
-- return
--
-- def _lock_cache(self):
-- '''
-- Lock the cache
-- '''
-- pklog.debug("Locking cache")
-- self._locked.acquire()
--
-- def _unlock_cache(self):
-- '''
-- Unlock the cache
-- '''
-- pklog.debug("Releasing cache")
-- self._locked.release()
--
-- def _check_init(self, prange=(0,10), progress=True):
-- '''
-- Check if the backend was initialized well and try to recover from
-- a broken setup
-- '''
-- pklog.debug("Check apt cache and xapian database")
-- if not isinstance(self._cache, apt.cache.Cache) or \
-- self._cache._depcache.BrokenCount > 0:
-- self._open_cache(prange, progress)
--
-- def _check_canceled(self, msg):
-- '''
-- Check if the current transaction was canceled. If so send the
-- corresponding error message and return True
-- '''
-- if self._canceled.isSet():
-- self.ErrorCode(ERROR_TRANSACTION_CANCELLED, msg)
-- self.Finished(EXIT_KILL)
-- self._canceled.clear()
-- return True
-- return False
--
-- def get_id_from_package(self, pkg, installed=False):
-- '''
-- Return the id of the installation candidate of a core
-- apt package. If installed is set to True the id of the currently
-- installed package will be returned.
-- '''
-- origin = ''
-- if installed == False and pkg.isInstalled:
-- pkgver = pkg.installedVersion
-- else:
-- pkgver = pkg.candidateVersion
-- if pkg.candidateOrigin:
-- origin = pkg.candidateOrigin[0].label
-- id = self._get_package_id(pkg.name, pkgver, pkg.architecture, origin)
-- return id
--
-- def _emit_package(self, pkg):
-- '''
-- Send the Package signal for a given apt package
-- '''
-- id = self.get_id_from_package(pkg)
-- if pkg.isInstalled:
-- status = INFO_INSTALLED
-- else:
-- status = INFO_AVAILABLE
-- summary = pkg.summary
-- self.Package(status, id, summary)
--
-- def _is_package_visible(self, pkg, filters):
-- '''
-- Return True if the package should be shown in the user interface
-- '''
-- #FIXME: Needs to be optmized
-- if filters == 'none':
-- return True
-- if FILTER_INSTALLED in filters and not pkg.isInstalled:
-- return False
-- if FILTER_NOT_INSTALLED in filters and pkg.isInstalled:
-- return False
-- if FILTER_GUI in filters and not self._package_has_gui(pkg):
-- return False
-- if FILTER_NOT_GUI in filters and self._package_has_gui(pkg):
-- return False
-- if FILTER_DEVELOPMENT in filters and not self._package_is_devel(pkg):
-- return False
-- if FILTER_NOT_DEVELOPMENT in filters and self._package_is_devel(pkg):
-- return False
-- return True
--
-- def _package_has_gui(self, pkg):
-- #FIXME: should go to a modified Package class
-- #FIXME: take application data into account. perhaps checking for
-- # property in the xapian database
-- return pkg.section.split('/')[-1].lower() in ['x11', 'gnome', 'kde']
--
-- def _package_is_devel(self, pkg):
-- #FIXME: should go to a modified Package class
-- return pkg.name.endswith("-dev") or pkg.name.endswith("-dbg") or \
-- pkg.section.split('/')[-1].lower() in ['devel', 'libdevel']
--
-- def _find_package_by_id(self, id):
-- '''
-- Return a package matching to the given package id
-- '''
-- # FIXME: Perform more checks
-- name, version, arch, data = self.get_package_from_id(id)
-- if self._cache.has_key(name):
-- return self._cache[name]
-- else:
-- return None
--
--
--def main():
-- loop = dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-- bus = dbus.SystemBus(mainloop=loop)
-- bus_name = dbus.service.BusName(PACKAGEKIT_DBUS_SERVICE, bus=bus)
-- manager = PackageKitAptBackend(bus_name, PACKAGEKIT_DBUS_PATH)
--
--if __name__ == '__main__':
-- main()
--
--# vim: ts=4 et sts=4
-diff --git a/backends/apt2/pk-backend-apt2.c b/backends/apt2/pk-backend-apt2.c
-deleted file mode 100644
-index 4f78ec4..0000000
---- a/backends/apt2/pk-backend-apt2.c
-+++ /dev/null
-@@ -1,204 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com>
-- * Copyright (C) 2007 Tom Parker <palfrey@tevp.net>
-- *
-- * Licensed under the GNU General Public License Version 2
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#include <pk-backend.h>
--#include <pk-backend-dbus.h>
--
--static PkBackendDbus *dbus;
--
--#define PK_DBUS_BACKEND_SERVICE_APT "org.freedesktop.PackageKitAptBackend"
--
--/**
-- * backend_initialize:
-- * This should only be run once per backend load, i.e. not every transaction
-- */
--static void
--backend_initialize (PkBackend *backend)
--{
-- pk_debug ("FILTER: initialize");
-- dbus = pk_backend_dbus_new ();
-- pk_backend_dbus_set_name (dbus, PK_DBUS_BACKEND_SERVICE_APT);
--}
--
--/**
-- * backend_destroy:
-- * This should only be run once per backend load, i.e. not every transaction
-- */
--static void
--backend_destroy (PkBackend *backend)
--{
-- pk_debug ("FILTER: destroy");
-- pk_backend_dbus_kill (dbus);
-- g_object_unref (dbus);
--}
--
--/**
-- * backend_get_groups:
-- */
--static PkGroupEnum
--backend_get_groups (PkBackend *backend)
--{
-- return (PK_GROUP_ENUM_ACCESSORIES |
-- PK_GROUP_ENUM_GAMES |
-- PK_GROUP_ENUM_GRAPHICS |
-- PK_GROUP_ENUM_INTERNET |
-- PK_GROUP_ENUM_OFFICE |
-- PK_GROUP_ENUM_OTHER |
-- PK_GROUP_ENUM_PROGRAMMING |
-- PK_GROUP_ENUM_MULTIMEDIA |
-- PK_GROUP_ENUM_SYSTEM);
--}
--
--/**
-- * backend_get_filters:
-- */
--static PkFilterEnum
--backend_get_filters (PkBackend *backend)
--{
-- return (PK_FILTER_ENUM_GUI |
-- PK_FILTER_ENUM_INSTALLED |
-- PK_FILTER_ENUM_DEVELOPMENT);
--}
--
--/**
-- * backend_get_updates:
-- */
--static void
--backend_get_updates (PkBackend *backend, PkFilterEnum filters)
--{
-- pk_backend_dbus_get_updates (dbus, filters);
--}
--
--/**
-- * backend_refresh_cache:
-- * */
--static void
--backend_refresh_cache (PkBackend *backend, gboolean force)
--{
-- // check network state
-- if (!pk_backend_is_online (backend)) {
-- pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache whilst offline");
-- pk_backend_finished (backend);
-- return;
-- }
--
-- pk_backend_dbus_refresh_cache(dbus, force);
--}
--
--/**
-- * pk_backend_update_system:
-- * */
--static void
--backend_update_system (PkBackend *backend)
--{
-- pk_backend_dbus_update_system (dbus);
--}
--
--/**
-- * backend_install_packages
-- * */
--static void
--backend_install_packages (PkBackend *backend, gchar **package_ids)
--{
-- pk_backend_dbus_install_packages (dbus, package_ids);
--}
--
--/**
-- * backend_remove_packages
-- * */
--static void
--backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
--{
-- pk_backend_dbus_remove_packages (dbus, package_ids, allow_deps, autoremove);
--}
--
--/**
-- * backend_get_details:
-- * */
--static void
--backend_get_details (PkBackend *backend, const gchar *package_id)
--{
-- pk_backend_dbus_get_details (dbus, package_id);
--}
--
--/**
-- * * pk_backend_search_details:
-- * */
--static void
--backend_search_details (PkBackend *backend, PkFilterEnum filters, const gchar *search)
--{
-- pk_backend_dbus_search_details (dbus, filters, search);
--}
--
--/**
-- * * pk_backend_search_name:
-- * */
--static void
--backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
--{
-- pk_backend_dbus_search_name (dbus, filters, search);
--}
--
--/**
-- * * pk_backend_cancel:
-- * */
--static void
--backend_cancel (PkBackend *backend)
--{
-- pk_backend_dbus_cancel (dbus);
--}
--
--
--PK_BACKEND_OPTIONS (
-- "Apt", /* description */
-- "Ali Sabil <ali.sabil@gmail.com>; Tom Parker <palfrey@tevp.net>; Sebastian Heinlein <glatzor@ubuntu.com>", /* author */
-- backend_initialize, /* initalize */
-- backend_destroy, /* destroy */
-- backend_get_groups, /* get_groups */
-- backend_get_filters, /* get_filters */
-- backend_cancel, /* cancel */
-- NULL, /* get_depends */
-- backend_get_details, /* get_details */
-- NULL, /* get_files */
-- NULL, /* get_packages */
-- NULL, /* get_repo_list */
-- NULL, /* get_requires */
-- NULL, /* get_update_detail */
-- backend_get_updates, /* get_updates */
-- NULL, /* install_files */
-- backend_install_packages, /* install_packages */
-- NULL, /* install_signature */
-- backend_refresh_cache, /* refresh_cache */
-- backend_remove_packages, /* remove_packages */
-- NULL, /* repo_enable */
-- NULL, /* repo_set_data */
-- NULL, /* resolve */
-- NULL, /* rollback */
-- backend_search_details, /* search_details */
-- NULL, /* search_file */
-- NULL, /* search_group */
-- backend_search_name, /* search_name */
-- NULL, /* service_pack */
-- NULL, /* update_packages */
-- backend_update_system, /* update_system */
-- NULL /* what_provides */
--);
-diff --git a/backends/apt2/profiler.py b/backends/apt2/profiler.py
-deleted file mode 100644
-index 1b5d30f..0000000
---- a/backends/apt2/profiler.py
-+++ /dev/null
-@@ -1,40 +0,0 @@
--#!/usr/bin/env python
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software
--# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
--# Copyright (C) 2008
--# Sebastian Heinlein <sebi@glatzor.de>
--
--"""
--Allows to start the apt2 backend in a profling mode
--"""
--
--__author__ = "Sebastian Heinlein <devel@glatzor.de>"
--
--
--import hotshot
--import sys
--
--from aptDBUSBackend import main
--
--if len(sys.argv) == 2:
-- profile = sys.argv[1]
--else:
-- profile = "profile"
--
--prof = hotshot.Profile(profile)
--print prof.runcall(main)
--prof.close()
-diff --git a/backends/apt2/test.py b/backends/apt2/test.py
-deleted file mode 100755
-index a1d5ffb..0000000
---- a/backends/apt2/test.py
-+++ /dev/null
-@@ -1,98 +0,0 @@
--#!/usr/bin/python
--# Licensed under the GNU General Public License Version 2
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software
--# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
--# Copyright (C) 2007
--# Tim Lauridsen <timlau@fedoraproject.org>
--
--import sys
--import dbus
--from packagekit.enums import *
--
--PACKAGEKIT_DBUS_SERVICE = 'org.freedesktop.PackageKitAptBackend'
--PACKAGEKIT_DBUS_INTERFACE = 'org.freedesktop.PackageKitBackend'
--PACKAGEKIT_DBUS_PATH = '/org/freedesktop/PackageKitBackend'
--PKG_ID = 'xterm;232-1;i386;Debian'
--
--try:
-- bus = dbus.SystemBus()
--except dbus.DBusException, e:
-- print "Unable to connect to dbus"
-- print "%s" %(e,)
-- sys.exit(1)
--
--try:
-- proxy = bus.get_object(PACKAGEKIT_DBUS_SERVICE, PACKAGEKIT_DBUS_PATH)
-- iface = dbus.Interface(proxy, PACKAGEKIT_DBUS_INTERFACE)
-- cmd = sys.argv[1]
-- if cmd == 'init' or cmd == 'all':
-- print "Testing Init()"
-- iface.Init()
-- if cmd == 'cancel':
-- print "Canceling"
-- iface.Cancel()
-- if cmd == 'get-updates' or cmd == 'all':
-- print "Testing GetUpdate()"
-- iface.GetUpdates()
-- if cmd == 'search-name' or cmd == 'all':
-- print "Testing SearchName(FILTER_NONE,'apt')"
-- iface.SearchName(FILTER_NONE,'apt')
-- if cmd == 'search-details' or cmd == 'all':
-- print "SearchDetails(FILTER_NONE,'dbus')"
-- iface.SearchDetails(FILTER_NONE,'dbus')
-- if cmd == 'search-group' or cmd == 'all':
-- print "Testing SearchGroup(FILTER_NONE,GROUP_GAMES)"
-- iface.SearchGroup(FILTER_NONE,GROUP_GAMES)
-- if cmd == 'search-file' or cmd == 'all':
-- print "Testing SearchFile(FILTER_NONE,'/usr/bin/yum')"
-- iface.SearchFile(FILTER_NONE,'/usr/bin/yum')
-- if cmd == 'get-requires' or cmd == 'all':
-- print "Testing GetRequires(PKG_ID,False)"
-- iface.GetRequires(PKG_ID,False)
-- if cmd == 'get-depends' or cmd == 'all':
-- print "Testing GetDepends(PKG_ID,False)"
-- iface.GetDepends(PKG_ID,False)
-- if cmd == 'refresh-cache' or cmd == 'all':
-- print "Testing RefreshCache()"
-- iface.RefreshCache()
-- if cmd == 'resolve' or cmd == 'all':
-- print "Testing Resolve(FILTER_NONE,'yum')"
-- iface.Resolve(FILTER_NONE,'yum')
-- if cmd == 'get-details' or cmd == 'all':
-- print "Testing GetDetails(PKG_ID)"
-- iface.GetDetails(PKG_ID)
-- if cmd == 'get-files' or cmd == 'all':
-- print "Testing GetFiles(PKG_ID)"
-- iface.GetFiles(PKG_ID)
-- if cmd == 'get-packages' or cmd == 'all':
-- print "Testing GetPackages(FILTER_INSTALLED,'no')"
-- iface.GetPackages(FILTER_INSTALLED,'no')
-- if cmd == 'get-repolist' or cmd == 'all':
-- print "Testing GetRepoList()"
-- iface.GetRepoList()
-- if cmd == 'get-updatedetail' or cmd == 'all':
-- print "Testing GetUpdateDetail(PKG_ID)"
-- iface.GetUpdateDetail(PKG_ID)
-- #print "Testing "
-- #iface.
-- if cmd == 'exit' or cmd == 'all':
-- print "Testing Exit()"
-- iface.Exit()
--
--except dbus.DBusException, e:
-- print "Unable to send message on dbus"
-- print "%s" %(e,)
-- sys.exit(1)
-diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
-index 2df445e..5714e9f 100644
---- a/backends/dummy/pk-backend-dummy.c
-+++ b/backends/dummy/pk-backend-dummy.c
-@@ -187,6 +187,7 @@ backend_get_update_detail_timeout (gpointer data)
- "", PK_RESTART_ENUM_NONE, "Update to newest upstream source");
- } else if (pk_strequal (_package_id, "kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed")) {
- pk_backend_update_detail (backend, "kernel;2.6.23-0.115.rc3.git1.fc8;i386;available",
-+ "kernel;2.6.22-0.104.rc3.git6.fc8;i386;installed^"
- "kernel;2.6.22-0.105.rc3.git7.fc8;i386;installed", "",
- "http://www.distro-update.org/page?moo;Bugfix release for kernel",
- "http://bgzilla.fd.org/result.php?#12344;Freedesktop Bugzilla #12344;"
-@@ -199,7 +200,11 @@ backend_get_update_detail_timeout (gpointer data)
- "http://www.distro-update.org/page?moo;Bugfix release for gtkhtml",
- "http://bgzilla.gnome.org/result.php?#9876;GNOME Bugzilla #9876",
- NULL,
-- PK_RESTART_ENUM_SESSION, "Update to latest whizz bang version");
-+ PK_RESTART_ENUM_SESSION,
-+ "Update to latest whizz bang version\n"
-+ "* support this new thing\n"
-+ "* something else\n"
-+ "- and that new thing");
- } else {
- pk_backend_message (backend, PK_MESSAGE_ENUM_DAEMON, "Got unexpected package_id '%s'", _package_id);
- }
-diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
-index 7649bab..2d70108 100644
---- a/backends/opkg/pk-backend-opkg.c
-+++ b/backends/opkg/pk-backend-opkg.c
-@@ -115,6 +115,39 @@ opkg_check_tag (opkg_package_t *pkg, gchar *tag)
- return FALSE;
- }
-
-+static void
-+handle_install_error (PkBackend *backend, int err)
-+{
-+ switch (err)
-+ {
-+ case OPKG_NO_ERROR:
-+ break;
-+ case OPKG_PACKAGE_NOT_INSTALLED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
-+ break;
-+ case OPKG_PACKAGE_ALREADY_INSTALLED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, NULL);
-+ break;
-+ case OPKG_GPG_ERROR:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, NULL);
-+ break;
-+ case OPKG_DOWNLOAD_FAILED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED, NULL);
-+ break;
-+ case OPKG_DEPENDENCIES_FAILED:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, NULL);
-+ break;
-+ case OPKG_MD5_ERROR:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_CORRUPT, NULL);
-+ break;
-+ case OPKG_PACKAGE_NOT_AVAILABLE:
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL);
-+ break;
-+ default:
-+ opkg_unknown_error (backend, err, "Update package");
-+ }
-+}
-+
- /**
- * backend_initialize:
- */
-@@ -387,22 +420,9 @@ backend_install_packages_thread (PkBackend *backend)
- pi = pk_package_id_new_from_string (package_ids[0]);
-
- err = opkg_install_package (opkg, pi->name, pk_opkg_progress_cb, backend);
-- switch (err)
-- {
-- case OPKG_NO_ERROR:
-- break;
-- case OPKG_DEPENDANCIES_FAILED:
-- pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, NULL);
-- break;
-- case OPKG_PACKAGE_ALREADY_INSTALLED:
-- pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, NULL);
-- break;
-- case OPKG_PACKAGE_NOT_AVAILABLE:
-- pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL);
-- break;
-- default:
-- opkg_unknown_error (backend, err, "Install");
-- }
-+ if (err)
-+ handle_install_error (backend, err);
-+
- pk_package_id_free (pi);
- if (err != 0)
- break;
-@@ -551,16 +571,9 @@ backend_update_package_thread (PkBackend *backend)
- }
-
- err = opkg_upgrade_package (opkg, pi->name, pk_opkg_progress_cb, backend);
-- switch (err)
-- {
-- case OPKG_NO_ERROR:
-- break;
-- case OPKG_PACKAGE_NOT_INSTALLED:
-- pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
-- break;
-- default:
-- opkg_unknown_error (backend, err, "Update package");
-- }
-+ if (err)
-+ handle_install_error (backend, err);
-+
-
- pk_package_id_free (pi);
- pk_backend_finished (backend);
-diff --git a/backends/poldek/pk-backend-poldek.c b/backends/poldek/pk-backend-poldek.c
-index fdc99d3..2691414 100644
---- a/backends/poldek/pk-backend-poldek.c
-+++ b/backends/poldek/pk-backend-poldek.c
-@@ -53,7 +53,33 @@ enum {
- SEARCH_ENUM_NAME,
- SEARCH_ENUM_GROUP,
- SEARCH_ENUM_DETAILS,
-- SEARCH_ENUM_FILE
-+ SEARCH_ENUM_FILE,
-+ SEARCH_ENUM_PROVIDES
-+};
-+
-+typedef struct {
-+ PkGroupEnum group;
-+ const gchar *regex;
-+} PLDGroupRegex;
-+
-+static PLDGroupRegex group_perlre[] = {
-+ {PK_GROUP_ENUM_ACCESSORIES, "/.*Archiving\\|.*Dictionaries/"},
-+ {PK_GROUP_ENUM_ADMIN_TOOLS, "/.*Databases.*\\|.*Admin/"},
-+ {PK_GROUP_ENUM_COMMUNICATION, "/.*Communications/"},
-+ {PK_GROUP_ENUM_EDUCATION, "/.*Engineering\\|.*Math\\|.*Science/"},
-+ {PK_GROUP_ENUM_FONTS, "/Fonts/"},
-+ {PK_GROUP_ENUM_GAMES, "/.*Games.*/"},
-+ {PK_GROUP_ENUM_GRAPHICS, "/.*Graphics/"},
-+ {PK_GROUP_ENUM_LOCALIZATION, "/I18n/"},
-+ {PK_GROUP_ENUM_MULTIMEDIA, "/.*Multimedia\\|.*Sound/"},
-+ {PK_GROUP_ENUM_NETWORK, "/.*Networking.*\\|/.*Mail\\|.*News\\|.*WWW/"},
-+ {PK_GROUP_ENUM_OFFICE, "/.*Editors.*\\|.*Spreadsheets/"},
-+ {PK_GROUP_ENUM_OTHER, "/^Applications$\\|.*Console\\|.*Emulators\\|.*File\\|.*Printing\\|.*Terminal\\|.*Text\\|Documentation\\|^Libraries.*\\|^Themes.*\\|^X11$\\|.*Amusements\\|^X11\\/Applications$\\|^X11\\/Libraries$\\|.*Window\\ Managers.*/"},
-+ {PK_GROUP_ENUM_PROGRAMMING, "/.*Development.*/"},
-+ {PK_GROUP_ENUM_PUBLISHING, "/.*Publishing.*/"},
-+ {PK_GROUP_ENUM_SERVERS, "/Daemons\\|.*Servers/"},
-+ {PK_GROUP_ENUM_SYSTEM, "/.*Shells\\|.*System\\|Base.*/"},
-+ {0, NULL}
- };
-
- typedef struct {
-@@ -501,6 +527,79 @@ poldek_pkg_set_installed (struct pkg *pkg, gboolean installed) {
- }
-
- /**
-+ * pld_group_to_enum:
-+ *
-+ * Converts PLD RPM group to PkGroupEnum.
-+ **/
-+static PkGroupEnum
-+pld_group_to_enum (const gchar *group)
-+{
-+ g_return_val_if_fail (group != NULL, PK_GROUP_ENUM_OTHER);
-+
-+ if (strstr (group, "Archiving") != NULL ||
-+ strstr (group, "Dictionaries") != NULL)
-+ return PK_GROUP_ENUM_ACCESSORIES;
-+ else if (strstr (group, "Databases") != NULL ||
-+ strstr (group, "Admin") != NULL)
-+ return PK_GROUP_ENUM_ADMIN_TOOLS;
-+ else if (strstr (group, "Communications") != NULL)
-+ return PK_GROUP_ENUM_COMMUNICATION;
-+ else if (strstr (group, "Engineering") != NULL ||
-+ strstr (group, "Math") != NULL ||
-+ strstr (group, "Science") != NULL)
-+ return PK_GROUP_ENUM_EDUCATION;
-+ else if (strcmp (group, "Fonts") == 0)
-+ return PK_GROUP_ENUM_FONTS;
-+ else if (strstr (group, "Games") != NULL)
-+ return PK_GROUP_ENUM_GAMES;
-+ else if (strstr (group, "Graphics") != NULL)
-+ return PK_GROUP_ENUM_GRAPHICS;
-+ else if (strcmp (group, "I18n") == 0)
-+ return PK_GROUP_ENUM_LOCALIZATION;
-+ else if (strstr (group, "Multimedia") != NULL ||
-+ strstr (group, "Sound") != NULL)
-+ return PK_GROUP_ENUM_MULTIMEDIA;
-+ else if (strstr (group, "Networking") != NULL ||
-+ strstr (group, "Mail") != NULL ||
-+ strstr (group, "News") != NULL ||
-+ strstr (group, "WWW") != NULL)
-+ return PK_GROUP_ENUM_NETWORK;
-+ else if (strstr (group, "Editors") != NULL ||
-+ strstr (group, "Spreadsheets") != NULL)
-+ return PK_GROUP_ENUM_OFFICE;
-+ else if (strstr (group, "Development") != NULL)
-+ return PK_GROUP_ENUM_PROGRAMMING;
-+ else if (strstr (group, "Publishing") != NULL)
-+ return PK_GROUP_ENUM_PUBLISHING;
-+ else if (strstr (group, "Daemons") != NULL ||
-+ strstr (group, "Servers") != NULL)
-+ return PK_GROUP_ENUM_SERVERS;
-+ else if (strstr (group, "Shells") != NULL ||
-+ strstr (group, "System") != NULL ||
-+ strstr (group, "Base") != NULL)
-+ return PK_GROUP_ENUM_SYSTEM;
-+ else
-+ return PK_GROUP_ENUM_OTHER;
-+}
-+
-+/**
-+ * pld_group_get_regex_from_enum:
-+ **/
-+static const gchar*
-+pld_group_get_regex_from_enum (PkGroupEnum value)
-+{
-+ gint i;
-+
-+ for (i = 0;; i++) {
-+ if (group_perlre[i].regex == NULL)
-+ return NULL;
-+
-+ if (group_perlre[i].group == value)
-+ return group_perlre[i].regex;
-+ }
-+}
-+
-+/**
- * poldek_pkg_evr:
- */
- static gchar*
-@@ -916,7 +1015,8 @@ poldek_pkg_is_gui (struct pkg *pkg)
- static gboolean
- search_package_thread (PkBackend *backend)
- {
-- PkFilterEnum filters;
-+ PkFilterEnum filters;
-+ PkProvidesEnum provides;
- gchar *search_cmd = NULL;
- struct poclidek_rcmd *cmd = NULL;
- const gchar *search;
-@@ -930,30 +1030,38 @@ search_package_thread (PkBackend *backend)
- search = pk_backend_get_string (backend, "search");
- filters = pk_backend_get_uint (backend, "filters");
-
-- switch (mode) {
-- /* GetPackages */
-- case SEARCH_ENUM_NONE:
-- search_cmd = g_strdup ("ls -q");
-- break;
-- /* SearchName */
-- case SEARCH_ENUM_NAME:
-- search_cmd = g_strdup_printf ("ls -q *%s*", search);
-- break;
-- /* SearchGroup */
-- case SEARCH_ENUM_GROUP:
-- search_cmd = g_strdup_printf ("search -qg *%s*", search);
-- break;
-- /* SearchDetails */
-- case SEARCH_ENUM_DETAILS:
-- search_cmd = g_strdup_printf ("search -dsq *%s*", search);
-- break;
-- /* SearchFile */
-- case SEARCH_ENUM_FILE:
-- search_cmd = g_strdup_printf ("search -qlf *%s*", search);
-- break;
-- default:
-- /* Error */
-- break;
-+ /* GetPackages*/
-+ if (mode == SEARCH_ENUM_NONE) {
-+ search_cmd = g_strdup ("ls -q");
-+ /* SearchName */
-+ } else if (mode == SEARCH_ENUM_NAME) {
-+ search_cmd = g_strdup_printf ("ls -q *%s*", search);
-+ /* SearchGroup */
-+ } else if (mode == SEARCH_ENUM_GROUP) {
-+ PkGroupEnum group;
-+ const gchar *regex;
-+
-+ group = pk_group_enum_from_text (search);
-+ regex = pld_group_get_regex_from_enum (group);
-+
-+ search_cmd = g_strdup_printf ("search -qg --perlre %s", regex);
-+ /* SearchDetails */
-+ } else if (mode == SEARCH_ENUM_DETAILS) {
-+ search_cmd = g_strdup_printf ("search -dsq *%s*", search);
-+ /* SearchFile */
-+ } else if (mode == SEARCH_ENUM_FILE) {
-+ search_cmd = g_strdup_printf ("search -qlf *%s*", search);
-+ /* WhatProvides */
-+ } else if (mode == SEARCH_ENUM_PROVIDES) {
-+ provides = pk_backend_get_uint (backend, "provides");
-+
-+ if (provides == PK_PROVIDES_ENUM_ANY) {
-+ search_cmd = g_strdup_printf ("search -qp %s", search);
-+ } else if (provides == PK_PROVIDES_ENUM_MODALIAS) {
-+ } else if (provides == PK_PROVIDES_ENUM_CODEC) {
-+ } else if (provides == PK_PROVIDES_ENUM_MIMETYPE) {
-+ search_cmd = g_strdup_printf ("search -qp mimetype(%s)", search);
-+ }
- }
-
- if (cmd != NULL && search_cmd)
-@@ -1307,6 +1415,30 @@ backend_destroy (PkBackend *backend)
- }
-
- /**
-+ * backend_get_groups:
-+ **/
-+static PkGroupEnum
-+backend_get_groups (PkBackend *backend)
-+{
-+ return (PK_GROUP_ENUM_ACCESSORIES |
-+ PK_GROUP_ENUM_ADMIN_TOOLS |
-+ PK_GROUP_ENUM_COMMUNICATION |
-+ PK_GROUP_ENUM_EDUCATION |
-+ PK_GROUP_ENUM_FONTS |
-+ PK_GROUP_ENUM_GAMES |
-+ PK_GROUP_ENUM_GRAPHICS |
-+ PK_GROUP_ENUM_LOCALIZATION |
-+ PK_GROUP_ENUM_MULTIMEDIA |
-+ PK_GROUP_ENUM_NETWORK |
-+ PK_GROUP_ENUM_OFFICE |
-+ PK_GROUP_ENUM_OTHER |
-+ PK_GROUP_ENUM_PROGRAMMING |
-+ PK_GROUP_ENUM_PUBLISHING |
-+ PK_GROUP_ENUM_SERVERS |
-+ PK_GROUP_ENUM_SYSTEM);
-+}
-+
-+/**
- * backend_get_filters:
- */
- static PkFilterEnum
-@@ -1398,14 +1530,17 @@ backend_get_details_thread (PkBackend *backend)
- if (pkg)
- {
- struct pkguinf *pkgu = NULL;
-+ PkGroupEnum group;
-
- pkgu = pkg_uinf (pkg);
-
-+ group = pld_group_to_enum (pkg_group (pkg));
-+
- if (pkgu) {
- pk_backend_details (backend,
- package_id,
- pkguinf_get (pkgu, PKGUINF_LICENSE),
-- PK_GROUP_ENUM_OTHER,
-+ group,
- pkguinf_get (pkgu, PKGUINF_DESCRIPTION),
- pkguinf_get (pkgu, PKGUINF_URL),
- pkg->size);
-@@ -1414,7 +1549,7 @@ backend_get_details_thread (PkBackend *backend)
- pk_backend_details (backend,
- package_id,
- "",
-- PK_GROUP_ENUM_OTHER,
-+ group,
- "",
- "",
- pkg->size);
-@@ -2213,12 +2348,26 @@ backend_get_repo_list (PkBackend *backend, PkFilterEnum filters)
- pk_backend_finished (backend);
- }
-
-+/**
-+ * backend_what_provides:
-+ **/
-+static void
-+backend_what_provides (PkBackend *backend, PkFilterEnum filters, PkProvidesEnum provides, const gchar *search)
-+{
-+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-+ poldek_backend_set_allow_cancel (backend, TRUE, TRUE);
-+ pb_error_clean ();
-+
-+ pk_backend_set_uint (backend, "mode", SEARCH_ENUM_PROVIDES);
-+ pk_backend_thread_create (backend, search_package_thread);
-+}
-+
- PK_BACKEND_OPTIONS (
- "poldek", /* description */
- "Marcin Banasiak <megabajt@pld-linux.org>", /* author */
- backend_initalize, /* initalize */
- backend_destroy, /* destroy */
-- NULL, /* get_groups */
-+ backend_get_groups, /* get_groups */
- backend_get_filters, /* get_filters */
- backend_get_cancel, /* cancel */
- backend_get_depends, /* get_depends */
-@@ -2245,6 +2394,6 @@ PK_BACKEND_OPTIONS (
- NULL, /* service pack */
- backend_update_packages, /* update_packages */
- backend_update_system, /* update_system */
-- NULL /* what_provides */
-+ backend_what_provides /* what_provides */
- );
-
-diff --git a/backends/urpmi/.gitignore b/backends/urpmi/.gitignore
-new file mode 100644
-index 0000000..996fb0d
---- /dev/null
-+++ b/backends/urpmi/.gitignore
-@@ -0,0 +1,14 @@
-+.deps
-+.libs
-+Makefile
-+Makefile.in
-+*.la
-+*.lo
-+*.loT
-+*.o
-+*~
-+*.gcov
-+*.gcda
-+*.gcno
-+*.out
-+
-diff --git a/backends/urpmi/Makefile.am b/backends/urpmi/Makefile.am
-new file mode 100644
-index 0000000..56743a1
---- /dev/null
-+++ b/backends/urpmi/Makefile.am
-@@ -0,0 +1,11 @@
-+SUBDIRS = helpers
-+plugindir = $(PK_PLUGIN_DIR)
-+plugin_LTLIBRARIES = libpk_backend_urpmi.la
-+libpk_backend_urpmi_la_SOURCES = pk-backend-urpmi.c
-+libpk_backend_urpmi_la_LIBADD = $(PK_PLUGIN_LIBS)
-+libpk_backend_urpmi_la_LDFLAGS = -module -avoid-version
-+libpk_backend_urpmi_la_CFLAGS = $(PK_PLUGIN_CFLAGS)
-+
-+clean-local:
-+ rm -f *.gcno
-+
-diff --git a/backends/urpmi/helpers/.gitignore b/backends/urpmi/helpers/.gitignore
-new file mode 100644
-index 0000000..2f78cf5
---- /dev/null
-+++ b/backends/urpmi/helpers/.gitignore
-@@ -0,0 +1,2 @@
-+*.pyc
-+
-diff --git a/backends/urpmi/helpers/Makefile.am b/backends/urpmi/helpers/Makefile.am
-new file mode 100644
-index 0000000..88f144e
---- /dev/null
-+++ b/backends/urpmi/helpers/Makefile.am
-@@ -0,0 +1,31 @@
-+SUBDIRS = perl_packagekit urpmi_backend
-+
-+helperdir = $(datadir)/PackageKit/helpers/urpmi
-+
-+NULL =
-+
-+dist_helper_DATA = \
-+ search-name.pl \
-+ get-details.pl \
-+ get-depends.pl \
-+ get-files.pl \
-+ get-updates.pl \
-+ get-update-detail.pl \
-+ refresh-cache.pl \
-+ install-packages.pl \
-+ remove-packages.pl \
-+ search-group.pl \
-+ get-packages.pl \
-+ get-requires.pl \
-+ search-details.pl \
-+ search-file.pl \
-+ resolve.pl \
-+ update-packages.pl \
-+ $(NULL)
-+
-+install-data-hook:
-+ chmod a+rx $(DESTDIR)$(helperdir)/*.pl
-+
-+clean-local :
-+ rm -f *~
-+
-diff --git a/backends/urpmi/helpers/get-depends.pl b/backends/urpmi/helpers/get-depends.pl
-new file mode 100755
-index 0000000..bf936c5
---- /dev/null
-+++ b/backends/urpmi/helpers/get-depends.pl
-@@ -0,0 +1,85 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use URPM;
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpm::select;
-+
-+use urpmi_backend::open_db;
-+use urpmi_backend::tools;
-+
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# Two arguments (filter, package id)
-+exit if($#ARGV != 2);
-+
-+my @filters = split(/;/, $ARGV[0]);
-+my @pkgid = split(/;/, $ARGV[1]);
-+my $recursive_option = 0;
-+$recursive_option = 1 if($ARGV[2] eq "yes");
-+
-+# Only recursive option is supported
-+# So, if user set no tu recursive option,
-+# backend will return error
-+if(!$recursive_option) {
-+ printf("error\tnot-supported\tOnly recursive option to yes is supported\n");
-+ exit;
-+}
-+
-+pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my %requested;
-+my @names = (@pkgid[0]);
-+my $results = urpm::select::search_packages($urpm, \%requested, \@names,
-+ fuzzy => 0,
-+ caseinsensitive => 0,
-+ all => 0
-+);
-+
-+exit if !$results;
-+my @requested_keys = keys %requested;
-+my $package_id = pop @requested_keys;
-+
-+my %resolv_request = ();
-+%resolv_request->{$package_id} = 1;
-+
-+my $empty_db = new URPM;
-+my $state = {};
-+$urpm->resolve_requested($empty_db,
-+ $state,
-+ \%resolv_request,
-+);
-+
-+my $db = open_rpm_db();
-+$urpm->compute_installed_flags($db);
-+
-+my %selected = %{$state->{selected}};
-+my @selected_keys = keys %selected;
-+my @depslist = @{$urpm->{depslist}};
-+
-+foreach(sort {@depslist[$b]->flag_installed <=> @depslist[$a]->flag_installed} @selected_keys) {
-+ my $pkg = @depslist[$_];
-+ if($pkg->flag_installed) {
-+ next if(grep(/^${\FILTER_NOT_INSTALLED}$/, @filters));
-+ pk_print_package(INFO_INSTALLED, get_package_id($pkg), $pkg->summary);
-+ }
-+ else {
-+ next if(grep(/^${\FILTER_INSTALLED}$/, @filters));
-+ pk_print_package(INFO_AVAILABLE, get_package_id($pkg), $pkg->summary);
-+ }
-+}
-+
-diff --git a/backends/urpmi/helpers/get-details.pl b/backends/urpmi/helpers/get-details.pl
-new file mode 100755
-index 0000000..3207e9b
---- /dev/null
-+++ b/backends/urpmi/helpers/get-details.pl
-@@ -0,0 +1,48 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpmi_backend::tools;
-+use MDK::Common;
-+
-+use perl_packagekit::prints;
-+
-+# One argument (package id)
-+exit if($#ARGV != 0);
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $pkg = get_package_by_package_id($urpm, $ARGV[0]);
-+
-+my $medium = pkg2medium($pkg, $urpm);
-+my $xml_info = 'info';
-+my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
-+
-+if(!$xml_info_file) {
-+ pk_print_details(get_package_id($pkg), "N/A", $pkg->group, "N/A", "N/A", 0);
-+ exit 0;
-+}
-+
-+require urpm::xml_info;
-+require urpm::xml_info_pkg;
-+my $name = urpm_name($pkg);
-+my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
-+my %xml_info_pkgs;
-+put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
-+my $description = $xml_info_pkgs{$name}{description};
-+$description =~ s/\n/;/g;
-+$description =~ s/\t/ /g;
-+
-+pk_print_details(get_package_id($pkg), "N/A", $pkg->group, ensure_utf8($description), "N/A", $pkg->size);
-+
-diff --git a/backends/urpmi/helpers/get-files.pl b/backends/urpmi/helpers/get-files.pl
-new file mode 100755
-index 0000000..74ae157
---- /dev/null
-+++ b/backends/urpmi/helpers/get-files.pl
-@@ -0,0 +1,40 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpmi_backend::tools;
-+use MDK::Common;
-+
-+use perl_packagekit::prints;
-+
-+# One argument (package id)
-+exit if($#ARGV != 0);
-+
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $pkg = get_package_by_package_id($urpm, $ARGV[0]);
-+
-+my $medium = pkg2medium($pkg, $urpm);
-+my $xml_info = 'files';
-+my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
-+require urpm::xml_info;
-+require urpm::xml_info_pkg;
-+my $name = urpm_name($pkg);
-+my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
-+my %xml_info_pkgs;
-+put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
-+my @files = map { chomp_($_) } split("\n", $xml_info_pkgs{$name}{files});
-+
-+pk_print_files(get_package_id($pkg), join(';', @files));
-diff --git a/backends/urpmi/helpers/get-packages.pl b/backends/urpmi/helpers/get-packages.pl
-new file mode 100755
-index 0000000..9e3e525
---- /dev/null
-+++ b/backends/urpmi/helpers/get-packages.pl
-@@ -0,0 +1,53 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::args;
-+
-+use urpmi_backend::open_db;
-+use urpmi_backend::tools;
-+use urpmi_backend::filters;
-+
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# One argument (the filter)
-+exit if ($#ARGV != 0);
-+my @filters = split(/;/, $ARGV[0]);
-+
-+my $urpm = urpm->new_parse_cmdline;
-+
-+urpm::media::configure($urpm);
-+
-+my $db = open_rpm_db();
-+$urpm->compute_installed_flags($db);
-+
-+# Here we display installed packages
-+if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filters)) {
-+ $db->traverse(sub {
-+ my ($pkg) = @_;
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ pk_print_package(INFO_INSTALLED, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ });
-+}
-+
-+# Here are package which can be installed
-+if(not grep(/^${\FILTER_INSTALLED}$/, @filters)) {
-+ foreach my $pkg(@{$urpm->{depslist}}) {
-+ if($pkg->flag_upgrade) {
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ pk_print_package(INFO_AVAILABLE, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+ }
-+}
-diff --git a/backends/urpmi/helpers/get-requires.pl b/backends/urpmi/helpers/get-requires.pl
-new file mode 100755
-index 0000000..0012b2a
---- /dev/null
-+++ b/backends/urpmi/helpers/get-requires.pl
-@@ -0,0 +1,54 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpm::select;
-+use urpmi_backend::tools;
-+use urpmi_backend::actions;
-+use urpmi_backend::filters;
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# 3 arguments
-+# (filter, packageid, and recursive option)
-+exit if($#ARGV != 2);
-+
-+my @filters = split(/;/, $ARGV[0]);
-+my $pkgid = $ARGV[1];
-+my $recursive_option = 0;
-+$recursive_option = 1 if($ARGV[2] eq "yes");
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $pkg = get_package_by_package_id($urpm, $pkgid);
-+if(!$pkg) {
-+ pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Requested package wasn't found");
-+ exit;
-+}
-+# print "Checking requires of the package : ", urpm_name($pkg), "\n";
-+pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
-+my @requires = perform_requires_search($urpm, $pkg, $recursive_option);
-+
-+foreach(@requires) {
-+ if(filter($_, \@filters, { FILTER_GUI => 1, FILTER_DEVELOPMENT => 1 })) {
-+ if(package_version_is_installed($_)) {
-+ !grep(/^${\FILTER_NOT_INSTALLED}$/, @filters) and pk_print_package(INFO_INSTALLED, get_package_id($_), $_->summary);
-+ }
-+ else {
-+ !grep(/^${\FILTER_INSTALLED}$/, @filters) and pk_print_package(INFO_AVAILABLE, get_package_id($_), $_->summary);
-+ }
-+ }
-+}
-+pk_print_status(PK_STATUS_ENUM_FINISHED);
-+
-diff --git a/backends/urpmi/helpers/get-update-detail.pl b/backends/urpmi/helpers/get-update-detail.pl
-new file mode 100755
-index 0000000..69ea452
---- /dev/null
-+++ b/backends/urpmi/helpers/get-update-detail.pl
-@@ -0,0 +1,88 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpm::select;
-+use urpmi_backend::tools;
-+use urpmi_backend::open_db;
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+use MDK::Common;
-+
-+# One argument (package id)
-+exit if($#ARGV != 0);
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $pkg = get_package_by_package_id($urpm, @ARGV[0]);
-+
-+if(!$pkg) {
-+ pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Requested package was not found");
-+ exit;
-+}
-+
-+my %requested;
-+$requested{$pkg->id} = 1;
-+
-+if(!find_installed_version($pkg)) {
-+ pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, "The selected package isn't installed on your system");
-+}
-+elsif(package_version_is_installed($pkg)) {
-+ pk_print_error(PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, "The selected package is already at the latest version");
-+}
-+else {
-+ my $state = {};
-+ my $restart = urpm::select::resolve_dependencies($urpm, $state, \%requested);
-+ my %selected = %{$state->{selected}};
-+ my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
-+ my @to_remove = urpm::select::removed_packages($urpm, $state);
-+ my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}];
-+ my ($src, $binary) = partition { $_->arch eq 'src' } @to_install;
-+ @to_install = @$binary;
-+ my $updates_descr = urpm::get_updates_description($urpm);
-+ my $updesc = $updates_descr->{URPM::pkg2media($urpm->{media}, $pkg)->{name}}{$pkg->name};
-+ my $desc;
-+ if($updesc) {
-+ $desc = $updesc->{pre};
-+ $desc =~ s/\n/;/g;
-+ }
-+
-+ my @to_upgrade_pkids;
-+ foreach(@to_install) {
-+ my $pkid = get_installed_version_pkid($_);
-+ push @to_upgrade_pkids, $pkid if $pkid;
-+ }
-+
-+ if($restart) {
-+ pk_print_update_detail(get_package_id($pkg),
-+ join("^", @to_upgrade_pkids),
-+ join("^", map(fullname_to_package_id($_), @to_remove)),
-+ "http://qa.mandriva.com",
-+ "http://qa.mandriva.com",
-+ "http://qa.mandriva.com",
-+ PK_RESTART_ENUM_SYSTEM,
-+ $desc);
-+ }
-+ else {
-+ pk_print_update_detail(get_package_id($pkg),
-+ join("^", @to_upgrade_pkids),
-+ join("^", map(fullname_to_package_id($_), @to_remove)),
-+ "http://qa.mandriva.com",
-+ "http://qa.mandriva.com",
-+ "http://qa.mandriva.com",
-+ PK_RESTART_ENUM_APPLICATION,
-+ $desc);
-+ }
-+
-+}
-diff --git a/backends/urpmi/helpers/get-updates.pl b/backends/urpmi/helpers/get-updates.pl
-new file mode 100755
-index 0000000..02d574c
---- /dev/null
-+++ b/backends/urpmi/helpers/get-updates.pl
-@@ -0,0 +1,46 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpm::select;
-+use MDK::Common;
-+use urpmi_backend::tools;
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# On argument (filter)
-+exit if($#ARGV != 0);
-+# Fix me
-+# Filter are to be implemented.
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $state = {};
-+my %requested;
-+my $restart = urpm::select::resolve_dependencies($urpm, $state, \%requested,
-+ auto_select => 1);
-+
-+my %selected = %{$state->{selected} || {}};
-+my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
-+my @to_remove = urpm::select::removed_packages($urpm, $state);
-+my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}];
-+my ($src, $binary) = partition { $_->arch eq 'src' } @to_install;
-+@to_install = @$binary;
-+
-+foreach(@to_install) {
-+ # Fix me
-+ # Be default, we set to bugfix info type
-+ # Need to be implemented, see urpmq source.
-+ pk_print_package(INFO_BUGFIX, get_package_id($_), $_->summary);
-+}
-diff --git a/backends/urpmi/helpers/install-packages.pl b/backends/urpmi/helpers/install-packages.pl
-new file mode 100755
-index 0000000..c9cf6c8
---- /dev/null
-+++ b/backends/urpmi/helpers/install-packages.pl
-@@ -0,0 +1,40 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::select;
-+
-+use urpmi_backend::actions;
-+use urpmi_backend::tools;
-+
-+# One argument (package id)
-+exit if($#ARGV != 0);
-+
-+my @pkg_ids = split(/\|/, pop @ARGV);
-+my @names;
-+foreach(@pkg_ids) {
-+ my @pkg_id = (split(/;/, $_));
-+ push @names, $pkg_id[0];
-+}
-+
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my %requested;
-+
-+urpm::select::search_packages($urpm, \%requested, \@names,
-+ fuzzy => 0,
-+ caseinsensitive => 0,
-+ all => 0);
-+
-+perform_installation($urpm, \%requested);
-diff --git a/backends/urpmi/helpers/perl_packagekit/Makefile.am b/backends/urpmi/helpers/perl_packagekit/Makefile.am
-new file mode 100644
-index 0000000..6ed63b5
---- /dev/null
-+++ b/backends/urpmi/helpers/perl_packagekit/Makefile.am
-@@ -0,0 +1,12 @@
-+helperdir = $(datadir)/PackageKit/helpers/urpmi/perl_packagekit/
-+
-+NULL =
-+
-+dist_helper_DATA = \
-+ enums.pm \
-+ prints.pm \
-+ $(NULL)
-+
-+clean-local :
-+ rm -f *~
-+
-diff --git a/backends/urpmi/helpers/perl_packagekit/enums.pm b/backends/urpmi/helpers/perl_packagekit/enums.pm
-new file mode 100644
-index 0000000..8dbb4b0
---- /dev/null
-+++ b/backends/urpmi/helpers/perl_packagekit/enums.pm
-@@ -0,0 +1,293 @@
-+package perl_packagekit::enums;
-+
-+use Exporter;
-+
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(
-+ FILTER_BASENAME
-+ FILTER_DEVELOPMENT
-+ FILTER_FREE
-+ FILTER_GUI
-+ FILTER_INSTALLED
-+ FILTER_NEWEST
-+ FILTER_NONE
-+ FILTER_NOT_BASENAME
-+ FILTER_NOT_DEVELOPMENT
-+ FILTER_NOT_FREE
-+ FILTER_NOT_GUI
-+ FILTER_NOT_INSTALLED
-+ FILTER_NOT_NEWEST
-+ FILTER_NOT_SUPPORTED
-+ FILTER_NOT_VISIBLE
-+ FILTER_SUPPORTED
-+ FILTER_UNKNOWN
-+ FILTER_VISIBLE
-+
-+ GROUP_ACCESSIBILITY
-+ GROUP_ACCESSORIES
-+ GROUP_ADMIN_TOOLS
-+ GROUP_COMMUNICATION
-+ GROUP_DESKTOP_GNOME
-+ GROUP_DESKTOP_KDE
-+ GROUP_DESKTOP_OTHER
-+ GROUP_DESKTOP_XFCE
-+ GROUP_EDUCATION
-+ GROUP_FONTS
-+ GROUP_GAMES
-+ GROUP_GRAPHICS
-+ GROUP_INTERNET
-+ GROUP_LEGACY
-+ GROUP_LOCALIZATION
-+ GROUP_MAPS
-+ GROUP_MULTIMEDIA
-+ GROUP_NETWORK
-+ GROUP_OFFICE
-+ GROUP_OTHER
-+ GROUP_POWER_MANAGEMENT
-+ GROUP_PROGRAMMING
-+ GROUP_PUBLISHING
-+ GROUP_REPOS
-+ GROUP_SECURITY
-+ GROUP_SERVERS
-+ GROUP_SYSTEM
-+ GROUP_UNKNOWN
-+ GROUP_VIRTUALIZATION
-+
-+ INFO_AVAILABLE
-+ INFO_BLOCKED
-+ INFO_BUGFIX
-+ INFO_CLEANUP
-+ INFO_DOWNLOADING
-+ INFO_ENHANCEMENT
-+ INFO_IMPORTANT
-+ INFO_INSTALLED
-+ INFO_INSTALLING
-+ INFO_LOW
-+ INFO_NORMAL
-+ INFO_OBSOLETING
-+ INFO_REMOVING
-+ INFO_SECURITY
-+ INFO_UNKNOWN
-+ INFO_UPDATING
-+
-+ PK_ERROR_ENUM_UNKNOWN
-+ PK_ERROR_ENUM_OOM
-+ PK_ERROR_ENUM_NO_CACHE
-+ PK_ERROR_ENUM_NO_NETWORK
-+ PK_ERROR_ENUM_NOT_SUPPORTED
-+ PK_ERROR_ENUM_INTERNAL_ERROR
-+ PK_ERROR_ENUM_GPG_FAILURE
-+ PK_ERROR_ENUM_FILTER_INVALID
-+ PK_ERROR_ENUM_PACKAGE_ID_INVALID
-+ PK_ERROR_ENUM_TRANSACTION_ERROR
-+ PK_ERROR_ENUM_TRANSACTION_CANCELLED
-+ PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED
-+ PK_ERROR_ENUM_PACKAGE_NOT_FOUND
-+ PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED
-+ PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED
-+ PK_ERROR_ENUM_GROUP_NOT_FOUND
-+ PK_ERROR_ENUM_GROUP_LIST_INVALID
-+ PK_ERROR_ENUM_DEP_RESOLUTION_FAILED
-+ PK_ERROR_ENUM_CREATE_THREAD_FAILED
-+ PK_ERROR_ENUM_REPO_NOT_FOUND
-+ PK_ERROR_ENUM_CANNOT_REMOVE_SYSTEM_PACKAGE
-+ PK_ERROR_ENUM_PROCESS_KILL
-+ PK_ERROR_ENUM_FAILED_INITIALIZATION
-+ PK_ERROR_ENUM_FAILED_FINALISE
-+ PK_ERROR_ENUM_FAILED_CONFIG_PARSING
-+ PK_ERROR_ENUM_CANNOT_CANCEL
-+ PK_ERROR_ENUM_CANNOT_GET_LOCK
-+ PK_ERROR_ENUM_NO_PACKAGES_TO_UPDATE
-+ PK_ERROR_ENUM_CANNOT_WRITE_REPO_CONFIG
-+ PK_ERROR_ENUM_LOCAL_INSTALL_FAILED
-+ PK_ERROR_ENUM_BAD_GPG_SIGNATURE
-+ PK_ERROR_ENUM_MISSING_GPG_SIGNATURE
-+ PK_ERROR_ENUM_CANNOT_INSTALL_SOURCE_PACKAGE
-+ PK_ERROR_ENUM_REPO_CONFIGURATION_ERROR
-+ PK_ERROR_ENUM_NO_LICENSE_AGREEMENT
-+ PK_ERROR_ENUM_FILE_CONFLICTS
-+ PK_ERROR_ENUM_REPO_NOT_AVAILABLE
-+ PK_ERROR_ENUM_INVALID_PACKAGE_FILE
-+ PK_ERROR_ENUM_PACKAGE_INSTALL_BLOCKED
-+
-+ PK_RESTART_ENUM_UNKNOWN
-+ PK_RESTART_ENUM_NONE
-+ PK_RESTART_ENUM_SYSTEM
-+ PK_RESTART_ENUM_SESSION
-+ PK_RESTART_ENUM_APPLICATION
-+
-+ PK_STATUS_ENUM_UNKNOWN
-+ PK_STATUS_ENUM_WAIT
-+ PK_STATUS_ENUM_SETUP
-+ PK_STATUS_ENUM_RUNNING
-+ PK_STATUS_ENUM_QUERY
-+ PK_STATUS_ENUM_INFO
-+ PK_STATUS_ENUM_REFRESH_CACHE
-+ PK_STATUS_ENUM_REMOVE
-+ PK_STATUS_ENUM_DOWNLOAD
-+ PK_STATUS_ENUM_INSTALL
-+ PK_STATUS_ENUM_UPDATE
-+ PK_STATUS_ENUM_CLEANUP
-+ PK_STATUS_ENUM_OBSOLETE
-+ PK_STATUS_ENUM_DEP_RESOLVE
-+ PK_STATUS_ENUM_SIG_CHECK
-+ PK_STATUS_ENUM_ROLLBACK
-+ PK_STATUS_ENUM_TEST_COMMIT
-+ PK_STATUS_ENUM_COMMIT
-+ PK_STATUS_ENUM_REQUEST
-+ PK_STATUS_ENUM_FINISHED
-+ PK_STATUS_ENUM_CANCEL
-+ PK_STATUS_ENUM_DOWNLOAD_REPOSITORY
-+ PK_STATUS_ENUM_DOWNLOAD_PACKAGELIST
-+ PK_STATUS_ENUM_DOWNLOAD_FILELIST
-+ PK_STATUS_ENUM_DOWNLOAD_CHANGELOG
-+ PK_STATUS_ENUM_DOWNLOAD_GROUP
-+ PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO
-+
-+ );
-+
-+use constant {
-+ FILTER_BASENAME => "basename",
-+ FILTER_DEVELOPMENT => "devel",
-+ FILTER_FREE => "free",
-+ FILTER_GUI => "gui",
-+ FILTER_INSTALLED => "installed",
-+ FILTER_NEWEST => "newest",
-+ FILTER_NONE => "none",
-+ FILTER_NOT_BASENAME => "~basename",
-+ FILTER_NOT_DEVELOPMENT => "~devel",
-+ FILTER_NOT_FREE => "~free",
-+ FILTER_NOT_GUI => "~gui",
-+ FILTER_NOT_INSTALLED => "~installed",
-+ FILTER_NOT_NEWEST => "~newest",
-+ FILTER_NOT_SUPPORTED => "~supported",
-+ FILTER_NOT_VISIBLE => "~visible",
-+ FILTER_SUPPORTED => "supported",
-+ FILTER_UNKNOWN => "unknown",
-+ FILTER_VISIBLE => "visible",
-+
-+ GROUP_ACCESSIBILITY => "accessibility",
-+ GROUP_ACCESSORIES => "accessories",
-+ GROUP_ADMIN_TOOLS => "admin-tools",
-+ GROUP_COMMUNICATION => "communication",
-+ GROUP_DESKTOP_GNOME => "desktop-gnome",
-+ GROUP_DESKTOP_KDE => "desktop-kde",
-+ GROUP_DESKTOP_OTHER => "desktop-other",
-+ GROUP_DESKTOP_XFCE => "desktop-xfce",
-+ GROUP_EDUCATION => "education",
-+ GROUP_FONTS => "fonts",
-+ GROUP_GAMES => "games",
-+ GROUP_GRAPHICS => "graphics",
-+ GROUP_INTERNET => "internet",
-+ GROUP_LEGACY => "legacy",
-+ GROUP_LOCALIZATION => "localization",
-+ GROUP_MAPS => "maps",
-+ GROUP_MULTIMEDIA => "multimedia",
-+ GROUP_NETWORK => "network",
-+ GROUP_OFFICE => "office",
-+ GROUP_OTHER => "other",
-+ GROUP_POWER_MANAGEMENT => "power-management",
-+ GROUP_PROGRAMMING => "programming",
-+ GROUP_PUBLISHING => "publishing",
-+ GROUP_REPOS => "repos",
-+ GROUP_SECURITY => "security",
-+ GROUP_SERVERS => "servers",
-+ GROUP_SYSTEM => "system",
-+ GROUP_UNKNOWN => "unknown",
-+ GROUP_VIRTUALIZATION => "virtualization",
-+
-+ INFO_AVAILABLE => "available",
-+ INFO_BLOCKED => "blocked",
-+ INFO_BUGFIX => "bugfix",
-+ INFO_CLEANUP => "cleanup",
-+ INFO_DOWNLOADING => "downloading",
-+ INFO_ENHANCEMENT => "enhancement",
-+ INFO_IMPORTANT => "important",
-+ INFO_INSTALLED => "installed",
-+ INFO_INSTALLING => "installing",
-+ INFO_LOW => "low",
-+ INFO_NORMAL => "normal",
-+ INFO_OBSOLETING => "obsoleting",
-+ INFO_REMOVING => "removing",
-+ INFO_SECURITY => "security",
-+ INFO_UNKNOWN => "unknown",
-+ INFO_UPDATING => "updating",
-+
-+ PK_ERROR_ENUM_UNKNOWN => "unknown",
-+ PK_ERROR_ENUM_OOM => "out-of-memory",
-+ PK_ERROR_ENUM_NO_CACHE => "no-cache",
-+ PK_ERROR_ENUM_NO_NETWORK => "no-network",
-+ PK_ERROR_ENUM_NOT_SUPPORTED => "not-supported",
-+ PK_ERROR_ENUM_INTERNAL_ERROR => "internal-error",
-+ PK_ERROR_ENUM_GPG_FAILURE => "gpg-failure",
-+ PK_ERROR_ENUM_FILTER_INVALID => "filter-invalid",
-+ PK_ERROR_ENUM_PACKAGE_ID_INVALID => "package-id-invalid",
-+ PK_ERROR_ENUM_TRANSACTION_ERROR => "transaction-error",
-+ PK_ERROR_ENUM_TRANSACTION_CANCELLED => "transaction-cancelled",
-+ PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED => "package-not-installed",
-+ PK_ERROR_ENUM_PACKAGE_NOT_FOUND => "package-not-found",
-+ PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED => "package-already-installed",
-+ PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED => "package-download-failed",
-+ PK_ERROR_ENUM_GROUP_NOT_FOUND => "group-not-found",
-+ PK_ERROR_ENUM_GROUP_LIST_INVALID => "group-list-invalid",
-+ PK_ERROR_ENUM_DEP_RESOLUTION_FAILED => "dep-resolution-failed",
-+ PK_ERROR_ENUM_CREATE_THREAD_FAILED => "create-thread-failed",
-+ PK_ERROR_ENUM_REPO_NOT_FOUND => "repo-not-found",
-+ PK_ERROR_ENUM_CANNOT_REMOVE_SYSTEM_PACKAGE => "cannot-remove-system-package",
-+ PK_ERROR_ENUM_PROCESS_KILL => "process-kill",
-+ PK_ERROR_ENUM_FAILED_INITIALIZATION => "failed-initialization",
-+ PK_ERROR_ENUM_FAILED_FINALISE => "failed-finalise",
-+ PK_ERROR_ENUM_FAILED_CONFIG_PARSING => "failed-config-parsing",
-+ PK_ERROR_ENUM_CANNOT_CANCEL => "cannot-cancel",
-+ PK_ERROR_ENUM_CANNOT_GET_LOCK => "cannot-get-lock",
-+ PK_ERROR_ENUM_NO_PACKAGES_TO_UPDATE => "no-packages-to-update",
-+ PK_ERROR_ENUM_CANNOT_WRITE_REPO_CONFIG => "cannot-write-repo-config",
-+ PK_ERROR_ENUM_LOCAL_INSTALL_FAILED => "local-install-failed",
-+ PK_ERROR_ENUM_BAD_GPG_SIGNATURE => "bad-gpg-signature",
-+ PK_ERROR_ENUM_MISSING_GPG_SIGNATURE => "missing-gpg-signature",
-+ PK_ERROR_ENUM_CANNOT_INSTALL_SOURCE_PACKAGE => "cannot-install-source-package",
-+ PK_ERROR_ENUM_REPO_CONFIGURATION_ERROR => "repo-configuration-error",
-+ PK_ERROR_ENUM_NO_LICENSE_AGREEMENT => "no-license-agreement",
-+ PK_ERROR_ENUM_FILE_CONFLICTS => "file-conflicts",
-+ PK_ERROR_ENUM_REPO_NOT_AVAILABLE => "repo-not-available",
-+ PK_ERROR_ENUM_INVALID_PACKAGE_FILE => "invalid-package-file",
-+ PK_ERROR_ENUM_PACKAGE_INSTALL_BLOCKED => "package-install-blocked",
-+
-+ PK_RESTART_ENUM_UNKNOWN => "unknown",
-+ PK_RESTART_ENUM_NONE => "none",
-+ PK_RESTART_ENUM_SYSTEM => "system",
-+ PK_RESTART_ENUM_SESSION => "session",
-+ PK_RESTART_ENUM_APPLICATION => "application",
-+
-+ PK_STATUS_ENUM_UNKNOWN => "unknown",
-+ PK_STATUS_ENUM_WAIT => "wait",
-+ PK_STATUS_ENUM_SETUP => "setup",
-+ PK_STATUS_ENUM_RUNNING => "running",
-+ PK_STATUS_ENUM_QUERY => "query",
-+ PK_STATUS_ENUM_INFO => "info",
-+ PK_STATUS_ENUM_REFRESH_CACHE => "refresh-cache",
-+ PK_STATUS_ENUM_REMOVE => "remove",
-+ PK_STATUS_ENUM_DOWNLOAD => "download",
-+ PK_STATUS_ENUM_INSTALL => "install",
-+ PK_STATUS_ENUM_UPDATE => "update",
-+ PK_STATUS_ENUM_CLEANUP => "cleanup",
-+ PK_STATUS_ENUM_OBSOLETE => "obsolete",
-+ PK_STATUS_ENUM_DEP_RESOLVE => "dep-resolve",
-+ PK_STATUS_ENUM_SIG_CHECK => "sig-check",
-+ PK_STATUS_ENUM_ROLLBACK => "rollback",
-+ PK_STATUS_ENUM_TEST_COMMIT => "test-commit",
-+ PK_STATUS_ENUM_COMMIT => "commit",
-+ PK_STATUS_ENUM_REQUEST => "request",
-+ PK_STATUS_ENUM_FINISHED => "finished",
-+ PK_STATUS_ENUM_CANCEL => "cancel",
-+ PK_STATUS_ENUM_DOWNLOAD_REPOSITORY => "download-repository",
-+ PK_STATUS_ENUM_DOWNLOAD_PACKAGELIST => "download-package",
-+ PK_STATUS_ENUM_DOWNLOAD_FILELIST => "download-filelist",
-+ PK_STATUS_ENUM_DOWNLOAD_CHANGELOG => "download-changelog",
-+ PK_STATUS_ENUM_DOWNLOAD_GROUP => "download-group",
-+ PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO => "download-updateinfo",
-+
-+
-+};
-+
-+1;
-diff --git a/backends/urpmi/helpers/perl_packagekit/prints.pm b/backends/urpmi/helpers/perl_packagekit/prints.pm
-new file mode 100644
-index 0000000..7411ca9
---- /dev/null
-+++ b/backends/urpmi/helpers/perl_packagekit/prints.pm
-@@ -0,0 +1,95 @@
-+package perl_packagekit::prints;
-+
-+use Exporter;
-+
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(
-+ pk_print_package
-+ pk_print_status
-+ pk_print_details
-+ pk_print_files
-+ pk_print_update_detail
-+ pk_print_require_restart
-+ pk_print_error
-+ pk_print_percentage
-+ pk_print_sub_percentage
-+ );
-+
-+sub pk_print_package {
-+ # send 'package' signal
-+ # @param info: the enumerated INFO_* string
-+ # @param id: The package ID name, e.g. openoffice-clipart;2.6.22;ppc64;fedora
-+ # @param summary: The package Summary
-+ my ($info, $id, $summary) = @_;
-+ printf("package\t%s\t%s\t%s\n", $info, $id, $summary);
-+}
-+
-+sub pk_print_status {
-+ # send 'status' signal
-+ # @param state: STATUS_*
-+ my ($status) = @_;
-+ printf("status\t%s\n", $status);
-+}
-+
-+sub pk_print_details {
-+ # Send 'details' signal
-+ # @param id: The package ID name, e.g. openoffice-clipart;2.6.22;ppc64;fedora
-+ # @param license: The license of the package
-+ # @param group: The enumerated group
-+ # @param desc: The multi line package description
-+ # @param url: The upstream project homepage
-+ # @param bytes: The size of the package, in bytes
-+ my ($id, $license, $group, $desc, $url, $bytes) = @_;
-+ printf("details\t%s\t%s\t%s\t%s\t%s\t%ld\n", $id, $license, $group, $desc, $url, $bytes);
-+}
-+
-+sub pk_print_files {
-+ # Send 'files' signal
-+ # @param file_list: List of the files in the package, separated by ';'
-+ my ($id, $file_list) = @_;
-+ printf("files\t%s\t%s\n", $id, $file_list);
-+}
-+
-+sub pk_print_update_detail {
-+ # Send 'updatedetail' signal
-+ # @param id: The package ID name, e.g. openoffice-clipart;2.6.22;ppc64;fedora
-+ # @param updates:
-+ # @param obsoletes:
-+ # @param vendor_url:
-+ # @param bugzilla_url:
-+ # @param cve_url:
-+ # @param restart:
-+ # @param update_text:
-+ my ($id, $updates, $obsoletes, $vendor_url, $bugzilla_url, $cve_url, $restart, $update_text) = @_;
-+ printf("updatedetail\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", $id, $updates, $obsoletes, $vendor_url, $bugzilla_url, $cve_url, $restart, $update_text);
-+}
-+
-+sub pk_print_require_restart {
-+ # Send 'requirerestart' signal
-+ # @param restart_type: RESTART_SYSTEM, RESTART_APPLICATION,RESTART_SESSION
-+ # @param details: Optional details about the restart
-+ my ($restart_type, $details) = @_;
-+ printf("requirerestart\t%s\t%s\n", $restart_type, $details);
-+}
-+
-+sub pk_print_error {
-+ # send 'error'
-+ # @param err: Error Type ERROR_*
-+ # @param description: Error description
-+ # @param exit: exit application with rc=1, if true
-+ my ($err, $description) = @_;
-+ printf("error\t%s\t%s\n", $err, $description);
-+ exit if($exit);
-+}
-+
-+sub pk_print_percentage {
-+ my ($percentage) = @_;
-+ printf("percentage\t%i\n", $percentage);
-+}
-+
-+sub pk_print_sub_percentage {
-+ my ($sub_percentage) = @_;
-+ printf("subpercentage\t%i\n", $sub_percentage);
-+}
-+
-+1;
-diff --git a/backends/urpmi/helpers/refresh-cache.pl b/backends/urpmi/helpers/refresh-cache.pl
-new file mode 100755
-index 0000000..555a8b8
---- /dev/null
-+++ b/backends/urpmi/helpers/refresh-cache.pl
-@@ -0,0 +1,33 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::select;
-+use urpm::args;
-+use urpmi_backend::actions;
-+
-+# No arguments
-+exit if($#ARGV != -1);
-+
-+#my $urpm = urpm->new_parse_cmdline;
-+my $urpm = urpm->new_parse_cmdline;
-+my $urpmi_lock = urpm::lock::urpmi_db($urpm, 'exclusive', wait => 0);
-+urpm::media::read_config($urpm);
-+
-+my @entries = map { $_->{name} } @{$urpm->{media}};
-+@entries == 0 and die N("nothing to update (use urpmi.addmedia to add a media)\n");
-+
-+my %options = ( all => 1 );
-+
-+my $ok = urpm::media::update_media($urpm, %options,
-+ quiet => 0);
-+exit($ok ? 0 : 1);
-diff --git a/backends/urpmi/helpers/remove-packages.pl b/backends/urpmi/helpers/remove-packages.pl
-new file mode 100755
-index 0000000..3be38ea
---- /dev/null
-+++ b/backends/urpmi/helpers/remove-packages.pl
-@@ -0,0 +1,90 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpm::select;
-+use urpm::install;
-+use urpmi_backend::tools;
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+my $notfound = 0;
-+my @breaking_pkgs = ();
-+my $allowdeps_option = 0;
-+my @pkgid;
-+my $state = {};
-+my $notfound_callback = sub {
-+ $notfound = 1;
-+};
-+
-+# This script call only be called with two arguments (allow_deps (yes/no) and a package id)
-+exit if($#ARGV != 1);
-+
-+my $urpm = urpm->new_parse_cmdline;
-+my $urpmi_lock = urpm::lock::urpmi_db($urpm, 'exclusive', wait => 1);
-+urpm::media::configure($urpm);
-+
-+$allowdeps_option = 1 if($ARGV[0] eq "yes");
-+
-+my @pkg_ids = split(/\|/, pop @ARGV);
-+my @names;
-+foreach(@pkg_ids) {
-+ my @pkg_id = (split(/;/, $_));
-+ push @names, $pkg_id[0];
-+}
-+
-+pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
-+
-+my @to_remove = urpm::select::find_packages_to_remove($urpm,
-+ $state,
-+ \@names,
-+ callback_notfound => $notfound_callback,
-+ callback_fuzzy => $notfound_callback,
-+ callback_base => sub {
-+ my $urpm = shift @_;
-+ push @breaking_pkgs, @_;
-+ }
-+);
-+
-+if($notfound) {
-+ # printf("Error: package %s not found\n", $pkgid[0]);
-+ pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, "Selected package isn't installed on your system");
-+}
-+elsif(@breaking_pkgs) {
-+ # printf("Error: These packages will break your system = \n\t%s\n", join("\n\t", @breaking_pkgs));
-+ pk_print_error(PK_ERROR_ENUM_CANNOT_REMOVE_SYSTEM_PACKAGE, "Removing selected packages will break your system");
-+}
-+else {
-+ # printf("It's ok, I will remove %s NOW !\n", $pkgid[0]);
-+ # printf("To remove list = \n\t%s\n", join("\n\t", @to_remove));
-+ if(!$allowdeps_option && $#to_remove > 1) {
-+ pk_print_error(PK_ERROR_ENUM_TRANSACTION_ERROR, "Packages can't be removed because dependencies remove is forbidden");
-+ # printf("I can't remove, because you don't allow deps remove :'(\n");
-+ }
-+ else {
-+ # printf("Let's go for removing ...\n");
-+ pk_print_status(PK_STATUS_ENUM_REMOVE);
-+ urpm::install::install($urpm,
-+ \@to_remove, {}, {},
-+ callback_report_uninst => sub {
-+ my @return = split(/ /, $_[0]);
-+ # printf("Package\tRemoving\t%s\n", fullname_to_package_id($return[$#return]));
-+ pk_print_package(INFO_REMOVING, fullname_to_package_id($return[$#return]), "");
-+ }
-+ );
-+ }
-+}
-+
-+$urpmi_lock->unlock;
-+
-+pk_print_status(PK_STATUS_ENUM_FINISHED);
-diff --git a/backends/urpmi/helpers/resolve.pl b/backends/urpmi/helpers/resolve.pl
-new file mode 100755
-index 0000000..32e0866
---- /dev/null
-+++ b/backends/urpmi/helpers/resolve.pl
-@@ -0,0 +1,64 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::args;
-+use urpm::media;
-+use urpmi_backend::open_db;
-+use urpmi_backend::tools;
-+use urpmi_backend::filters;
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# Two arguments (filter and package name)
-+exit if ($#ARGV != 1);
-+my @filters = split(/;/, $ARGV[0]);
-+my $search_term = $ARGV[1];
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my @names = ( $search_term );
-+my %requested;
-+my $result = urpm::select::search_packages($urpm, \%requested, \@names,
-+ fuzzy => 0,
-+ caseinsensitive => 0,
-+ all => 0
-+);
-+
-+if($result) {
-+ my @requested_keys = keys %requested;
-+ my $db = open_rpm_db();
-+ $urpm->compute_installed_flags($db);
-+ my $pkg = @{$urpm->{depslist}}[$requested_keys[0]];
-+
-+ # We exit the script if found package does not match with
-+ # specified filters
-+ if(!filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ exit;
-+ }
-+ if($pkg->version."-".$pkg->release eq find_installed_version($pkg)) {
-+ if(grep(/^${\FILTER_NOT_INSTALLED}$/, @filters)) {
-+ exit;
-+ }
-+ pk_print_package(INFO_INSTALLED, get_package_id($pkg), $pkg->summary);
-+ }
-+ else {
-+ if(grep(/^${\FILTER_INSTALLED}$/, @filters)) {
-+ exit;
-+ }
-+ pk_print_package(INFO_AVAILABLE, get_package_id($pkg), $pkg->summary);
-+ }
-+}
-+else {
-+ pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Can't find any package for the specified name");
-+}
-+
-diff --git a/backends/urpmi/helpers/search-details.pl b/backends/urpmi/helpers/search-details.pl
-new file mode 100755
-index 0000000..3081abe
---- /dev/null
-+++ b/backends/urpmi/helpers/search-details.pl
-@@ -0,0 +1,57 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::args;
-+
-+use urpmi_backend::open_db;
-+use urpmi_backend::tools;
-+use urpmi_backend::filters;
-+
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# Two arguments (filterand search term)
-+exit if ($#ARGV != 1);
-+my @filters = split(/;/, $ARGV[0]);
-+my $search_term = $ARGV[1];
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $db = open_rpm_db();
-+$urpm->compute_installed_flags($db);
-+
-+# Here we display installed packages
-+if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filters)) {
-+ $db->traverse(sub {
-+ my ($pkg) = @_;
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ if($pkg->name =~ /$search_term/ || $pkg->summary =~ /$search_term/ || $pkg->url =~ /$search_term/) {
-+ pk_print_package(INFO_INSTALLED, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+ });
-+}
-+
-+# Here are package which can be installed
-+if(not grep(/^${\FILTER_INSTALLED}$/, @filters)) {
-+ foreach my $pkg(@{$urpm->{depslist}}) {
-+ if($pkg->flag_upgrade) {
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ if($pkg->name =~ /$search_term/ || $pkg->summary =~ /$search_term/ || $pkg->url =~ /$search_term/) {
-+ pk_print_package(INFO_AVAILABLE, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+ }
-+ }
-+}
-diff --git a/backends/urpmi/helpers/search-file.pl b/backends/urpmi/helpers/search-file.pl
-new file mode 100755
-index 0000000..03d348e
---- /dev/null
-+++ b/backends/urpmi/helpers/search-file.pl
-@@ -0,0 +1,48 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+
-+use urpmi_backend::actions;
-+use urpmi_backend::filters;
-+use urpmi_backend::tools;
-+use perl_packagekit::prints;
-+use perl_packagekit::enums;
-+
-+# Two arguments (filter and search term)
-+exit if ($#ARGV != 1);
-+my @filters = split(/;/, $ARGV[0]);
-+my $search_term = $ARGV[1];
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my %requested;
-+
-+pk_print_status(PK_STATUS_ENUM_QUERY);
-+
-+perform_file_search($urpm, \%requested, $search_term, fuzzy => 1);
-+
-+foreach(keys %requested) {
-+ my $p = @{$urpm->{depslist}}[$_];
-+ if(filter($p, \@filters, { FILTER_INSTALLED => 1, FILTER_DEVELOPMENT=> 1, FILTER_GUI => 1})) {
-+ my $version = find_installed_version($p);
-+ if($version eq $p->version."-".$p->release) {
-+ pk_print_package(INFO_INSTALLED, get_package_id($p), ensure_utf8($p->summary));
-+ }
-+ else {
-+ pk_print_package(INFO_AVAILABLE, get_package_id($p), ensure_utf8($p->summary));
-+ }
-+ }
-+}
-+
-+pk_print_status(PK_STATUS_ENUM_FINISHED);
-diff --git a/backends/urpmi/helpers/search-group.pl b/backends/urpmi/helpers/search-group.pl
-new file mode 100755
-index 0000000..e5b7b92
---- /dev/null
-+++ b/backends/urpmi/helpers/search-group.pl
-@@ -0,0 +1,58 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::args;
-+
-+use urpmi_backend::open_db;
-+use urpmi_backend::tools;
-+use urpmi_backend::filters;
-+use urpmi_backend::groups;
-+
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# Two arguments (filter and packagekit group)
-+exit if ($#ARGV != 1);
-+my @filters = split(/;/, $ARGV[0]);
-+my $pk_group = $ARGV[1];
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $db = open_rpm_db();
-+$urpm->compute_installed_flags($db);
-+
-+# Here we display installed packages
-+if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filters)) {
-+ $db->traverse(sub {
-+ my ($pkg) = @_;
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ if(package_belongs_to_pk_group($pkg, $pk_group)) {
-+ pk_print_package(INFO_INSTALLED, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+ });
-+}
-+
-+# Here are package which can be installed
-+if(not grep(/^${\FILTER_INSTALLED}$/, @filters)) {
-+ foreach my $pkg(@{$urpm->{depslist}}) {
-+ if($pkg->flag_upgrade) {
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ if(package_belongs_to_pk_group($pkg, $pk_group)) {
-+ pk_print_package(INFO_AVAILABLE, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+ }
-+ }
-+}
-diff --git a/backends/urpmi/helpers/search-name.pl b/backends/urpmi/helpers/search-name.pl
-new file mode 100755
-index 0000000..383921f
---- /dev/null
-+++ b/backends/urpmi/helpers/search-name.pl
-@@ -0,0 +1,64 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::args;
-+
-+use urpmi_backend::open_db;
-+use urpmi_backend::tools;
-+use urpmi_backend::filters;
-+
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+# Two arguments (filter, search term)
-+exit if ($#ARGV != 1);
-+
-+my @filters = split(/;/, $ARGV[0]);
-+my $search_term = $ARGV[1];
-+
-+my $basename_option = FILTER_BASENAME;
-+$basename_option = grep(/$basename_option/, @filters);
-+
-+my $urpm = urpm->new_parse_cmdline;
-+
-+urpm::media::configure($urpm);
-+
-+my $db = open_rpm_db();
-+$urpm->compute_installed_flags($db);
-+
-+# Here we display installed packages
-+if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filters)) {
-+ $db->traverse(sub {
-+ my ($pkg) = @_;
-+ if(filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ if( (!$basename_option && $pkg->name =~ /$search_term/)
-+ || $pkg->name =~ /^$search_term$/ ) {
-+ pk_print_package(INFO_INSTALLED, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+ });
-+}
-+
-+# Here are packages which can be installed
-+if(grep(/^${\FILTER_INSTALLED}$/, @filters)) {
-+ exit 0;
-+}
-+
-+foreach my $pkg(@{$urpm->{depslist}}) {
-+ if($pkg->flag_upgrade && filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-+ if( (!$basename_option && $pkg->name =~ /$search_term/)
-+ || $pkg->name =~ /^$search_term$/ ) {
-+ pk_print_package(INFO_AVAILABLE, get_package_id($pkg), ensure_utf8($pkg->summary));
-+ }
-+ }
-+}
-diff --git a/backends/urpmi/helpers/update-packages.pl b/backends/urpmi/helpers/update-packages.pl
-new file mode 100755
-index 0000000..88274bc
---- /dev/null
-+++ b/backends/urpmi/helpers/update-packages.pl
-@@ -0,0 +1,50 @@
-+#!/usr/bin/perl
-+
-+use strict;
-+
-+use lib;
-+use File::Basename;
-+
-+BEGIN {
-+ push @INC, dirname($0);
-+}
-+
-+use urpm;
-+use urpm::media;
-+use urpm::select;
-+use urpm::args;
-+use urpmi_backend::tools;
-+use urpmi_backend::open_db;
-+use urpmi_backend::actions;
-+
-+# This script call only be called with one argument (the package id)
-+exit if($#ARGV != 0);
-+
-+my @names;
-+foreach(split(/\|/, $ARGV[0])) {
-+ my @pkgid = split(/;/, $_);
-+ push @names, $pkgid[0];
-+}
-+
-+my $urpm = urpm->new_parse_cmdline;
-+urpm::media::configure($urpm);
-+
-+my $db = open_rpm_db();
-+$urpm->compute_installed_flags($db);
-+
-+my %requested;
-+
-+my @depslist = @{$urpm->{depslist}};
-+my $pkg = undef;
-+foreach my $depslistpkg (@depslist) {
-+ foreach my $name (@names) {
-+ if($depslistpkg->name =~ /^$name$/ && $depslistpkg->flag_upgrade) {
-+ $requested{$depslistpkg->id} = 1;
-+ goto tonext;
-+ }
-+ }
-+ tonext:
-+}
-+
-+perform_installation($urpm, \%requested);
-+
-diff --git a/backends/urpmi/helpers/urpmi_backend/Makefile.am b/backends/urpmi/helpers/urpmi_backend/Makefile.am
-new file mode 100644
-index 0000000..3eb8280
---- /dev/null
-+++ b/backends/urpmi/helpers/urpmi_backend/Makefile.am
-@@ -0,0 +1,15 @@
-+helperdir = $(datadir)/PackageKit/helpers/urpmi/urpmi_backend/
-+
-+NULL =
-+
-+dist_helper_DATA = \
-+ actions.pm \
-+ filters.pm \
-+ groups.pm \
-+ open_db.pm \
-+ tools.pm \
-+ $(NULL)
-+
-+clean-local :
-+ rm -f *~
-+
-diff --git a/backends/urpmi/helpers/urpmi_backend/actions.pm b/backends/urpmi/helpers/urpmi_backend/actions.pm
-new file mode 100644
-index 0000000..a01b893
---- /dev/null
-+++ b/backends/urpmi/helpers/urpmi_backend/actions.pm
-@@ -0,0 +1,297 @@
-+package urpmi_backend::actions;
-+
-+use strict;
-+
-+use urpm;
-+use urpm::args;
-+use urpm::msg;
-+use urpm::main_loop;
-+use urpm::lock;
-+use urpmi_backend::tools;
-+use urpmi_backend::open_db;
-+use MDK::Common;
-+use perl_packagekit::enums;
-+use perl_packagekit::prints;
-+
-+use Exporter;
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(
-+ perform_installation
-+ perform_file_search
-+ perform_requires_search
-+);
-+
-+sub perform_installation {
-+ my ($urpm, $requested, %options) = @_;
-+ my $state = {};
-+ my $restart;
-+ my $no_remove = 0;
-+
-+ # Here we lock urpmi & rpm databases
-+ # In third argument we can specified if the script must wait until urpmi or rpm
-+ # databases are locked
-+ my $lock = urpm::lock::urpmi_db($urpm, undef, wait => 0);
-+ my $rpm_lock = urpm::lock::rpm_db($urpm, 'exclusive');
-+
-+ pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
-+
-+ $restart = urpm::select::resolve_dependencies($urpm, $state, $requested, auto_select => $options{auto_select});
-+ my %selected = %{$state->{selected} || {}};
-+
-+ print "Dependencies = \n\t";
-+ print join("\n\t", map(@{$urpm->{depslist}}[$_]->name, keys %selected)), "\n";
-+
-+ # Here we have packages which cannot be installed because of dependencies
-+ my @unselected_uninstalled = @{$state->{unselected_uninstalled} || []};
-+ if(@unselected_uninstalled) {
-+ my $list = join "\n", map { $_->name . '-' . $_->version . '-' . $_->release } @unselected_uninstalled;
-+ }
-+ # Fix me !
-+ # Display warning (With pk enum?) which warning the user
-+ # that the following packages can't be installed because they depend
-+ # on packages that are older than the installed ones (copy/paste from
-+ # the diplayed message in urpmi)
-+
-+ # Here we have packages which cannot be installed
-+ my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
-+ if (@ask_unselect) {
-+ my $list = urpm::select::translate_why_unselected($urpm, $state, @ask_unselect);
-+ }
-+ # Fix me !
-+ # Display warning (With pk enum?) which warning the user
-+ # that the following packages can't be installed (copy/paste from
-+ # the diplayed message in urpmi)
-+
-+ my @ask_remove = urpm::select::removed_packages($urpm, $state);
-+ if(@ask_remove) {
-+ my $db = urpm::db_open_or_die($urpm, $urpm->{root});
-+ urpm::select::find_removed_from_basesystem($urpm, $db, $state, sub {
-+ my $urpm = shift @_;
-+ foreach (@_) {
-+ # Fix me
-+ # Someting like that. With a clean pk error enum.
-+ # printf ("removing package %s will break your system", $_);
-+ }
-+ @_ and $no_remove = 1;
-+ });
-+ my $list = urpm::select::translate_why_removed($urpm, $state, @ask_remove);
-+ if($no_remove) {
-+ # Fix me
-+ # Display message to prevent that the installation cannot continue because some
-+ # packages has to be removed for others to be upgraded.
-+ exit 0;
-+ }
-+ # Else, it's ok.
-+ # Here we can display $list, which describe packages which has to be removed for
-+ # others to be upgraded.
-+ printf("Following package(s) will be removed for others to be upgraded:\n%s\n", $list);
-+ }
-+
-+ # sorted by medium for format_selected_packages
-+ my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}];
-+ my ($src, $binary) = partition { $_->arch eq 'src' } @to_install;
-+ # With packagekit, we will never install src packages.
-+ @to_install = @$binary;
-+
-+ print "\@to_install debug : \n\t";
-+ print join("\n\t", map(urpm_name($_), @to_install)), "\n";
-+
-+ my $nb_to_install = $#to_install + 1;
-+ my $percentage = 0;
-+
-+ $urpm->{nb_install} = @to_install;
-+ # For debug issue, we will display sizes
-+ my ($size, $filesize) = $urpm->selected_size_filesize($state);
-+ printf("%s of additional disk space will be used.\n", formatXiB($size));
-+ printf("%s of packages will be retrieved.\n", formatXiB($filesize));
-+
-+ my $callback_inst = sub {
-+ my ($urpm, $type, $id, $subtype, $amount, $total) = @_;
-+ my $pkg = defined $id ? $urpm->{depslist}[$id] : undef;
-+ if ($subtype eq 'start') {
-+ if ($type eq 'trans') {
-+ print "Preparing packages installation ...\n";
-+ pk_print_status(PK_STATUS_ENUM_INSTALL);
-+ }
-+ elsif (defined $pkg) {
-+ printf("Installing package %s ...\n", $pkg->name);
-+ pk_print_package(INFO_INSTALLING, get_package_id($pkg), $pkg->summary);
-+ }
-+ }
-+ elsif ($subtype eq 'progress') {
-+ print "($type) Progress : total = ", $total, " ; amount/total = ", $amount/$total, " ; amount = ", $amount, "\n";
-+ if($type eq "inst") {
-+ pk_print_percentage($percentage + ($amount/$total)*(100/$nb_to_install));
-+ if(($amount/$total) == 1) {
-+ $percentage = $percentage + ($amount/$total)*(100/$nb_to_install);
-+ }
-+ }
-+ }
-+ };
-+
-+ # Now, the script will call the urpmi main loop to make installation
-+ my $exit_code = urpm::main_loop::run($urpm, $state, undef, \@ask_unselect, $requested, {
-+ inst => $callback_inst,
-+ trans => $callback_inst,
-+ trans_log => sub {
-+ my ($mode, $file, $percent, $total, $eta, $speed) = @_;
-+ # Transfer log need to be improved.
-+ if($mode eq "progress") {
-+ pk_print_status(PK_STATUS_ENUM_DOWNLOAD);
-+ }
-+ print "Install current mode = ", $mode, "\n";
-+ },
-+ bad_signature => sub {
-+ # Here we display a message (with PK enum) to warn the user
-+ # about a bad signature, then we exit
-+ exit 1;
-+ },
-+ ask_yes_or_no => sub {
-+ # Return 1 = Return Yes
-+ return 1;
-+ },
-+ need_restart => sub {
-+ my ($need_restart_formatted) = @_;
-+ print "$_\n" foreach values %$need_restart_formatted;
-+ },
-+ completed => sub {
-+ undef $lock;
-+ undef $rpm_lock;
-+ pk_print_status(PK_STATUS_ENUM_FINISHED);
-+ },
-+ post_download => sub {
-+ # Fix me !
-+ # At this point, we need to refuse cancel action
-+ },
-+ }
-+ );
-+}
-+
-+sub perform_file_search {
-+ my ($urpm, $requested, $search_term, %options) = @_;
-+ my $db = open_rpm_db();
-+ $urpm->compute_installed_flags($db);
-+
-+ my $xml_info = 'files';
-+ my %result_hash;
-+
-+ # - For each medium, we browse the xml info file,
-+ # while looking for files which matched with the
-+ # search term given in argument. We store results
-+ # in a hash.
-+ foreach my $medium (urpm::media::non_ignored_media($urpm)) {
-+ my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, ( "files", "summary" ), undef, undef);
-+ $xml_info_file or next;
-+ require urpm::xml_info;
-+ require urpm::xml_info_pkg;
-+ my $F = urpm::xml_info::open_lzma($xml_info_file);
-+ my $fn;
-+ local $_;
-+ while (<$F>) {
-+ if (m!^<!) {
-+ ($fn) = /fn="(.*)"/;
-+ }
-+ elsif ( (!$options{'fuzzy'} && $_ =~ /^$search_term$/)
-+ || ($options{'fuzzy'} && $_ =~ /$search_term/) ) {
-+ # Fix me : Replace with pk error enum.
-+ # $fn or $urpm->{fatal}("fast algorithm is broken, please report a bug");
-+ my $pkg = urpm::xml_info_pkg->new({ fn => $fn });
-+ $result_hash{$pkg->name} = $pkg;
-+ }
-+ }
-+ }
-+
-+ # - In order to get package summaries, we need to
-+ # use the search package method from perl-URPM
-+ # which return Package type on which we can call
-+ # methods to create the printing output.
-+ # (It's about the same code as search-name.pl)
-+ my @names = keys %result_hash;
-+
-+ urpm::select::search_packages($urpm, $requested, \@names,
-+ fuzzy => 0,
-+ caseinsensitive => 0,
-+ all => 0,);
-+}
-+
-+sub perform_requires_search {
-+
-+ my ($urpm, $pkg, $recursive_option) = @_;
-+
-+ my (@properties, %requires, %properties, $dep);
-+ my %requested;
-+ urpm::select::search_packages($urpm,
-+ \%requested, [ $pkg->name ],
-+ use_provides => 0,
-+ fuzzy => 0,
-+ all => 0
-+ );
-+ @properties = keys %requested;
-+ my $state = {};
-+
-+ foreach my $pkg (@{$urpm->{depslist}}) {
-+ foreach ($pkg->requires_nosense) {
-+ $requires{$_}{$pkg->id} = undef;
-+ }
-+ }
-+
-+ while (defined ($dep = shift @properties)) {
-+ my $packages = $urpm->find_candidate_packages($dep);
-+ foreach (values %$packages) {
-+ my ($best_requested, $best);
-+ foreach (@$_) {
-+ if ($best_requested || exists $requested{$_->id}) {
-+ if ($best_requested && $best_requested != $_) {
-+ $_->compare_pkg($best_requested) > 0 and $best_requested = $_;
-+ } else {
-+ $best_requested = $_;
-+ }
-+ } elsif ($best && $best != $_) {
-+ $_->compare_pkg($best) > 0 and $best = $_;
-+ } else {
-+ $best = $_;
-+ }
-+ }
-+
-+ my $pkg = $best_requested || $best or next;
-+ exists $state->{selected}{$pkg->id} and next;
-+ $state->{selected}{$pkg->id} = undef;
-+
-+ next if !$requested{$dep} && !$recursive_option;
-+
-+ #- for all provides of package, look up what is requiring them.
-+ foreach ($pkg->provides) {
-+ if (my ($n, $s) = /^([^\s\[]*)(?:\[\*\])?\[?([^\s\]]*\s*[^\s\]]*)/) {
-+ if (my @l = grep { $_ ne $pkg->name } map { $_->name } $urpm->packages_providing($n)) {
-+ #- If another package provides this requirement,
-+ #- then don't bother finding stuff that needs it as it will be invalid
-+ # $urpm->{log}(sprintf "skipping package(s) requiring %s via %s, since %s is also provided by %s", $pkg->name, $n, $n, join(' ', @l));
-+ next;
-+ }
-+
-+ foreach (map { $urpm->{depslist}[$_] }
-+ grep { ! exists $state->{selected}{$_} && ! exists $properties{$_} }
-+ keys %{$requires{$n} || {}}) {
-+ if (grep { URPM::ranges_overlap("$n $s", $_) } $_->requires) {
-+ push @properties, $_->id;
-+ # $urpm->{debug} and $urpm->{debug}(sprintf "adding package %s (requires %s%s)", $_->name, $pkg->name, $n eq $pkg->name ? '' : " via $n");
-+ $properties{$_->id} = undef;
-+ }
-+ }
-+ }
-+ }
-+ }
-+ }
-+
-+ my @depslist = @{$urpm->{depslist}};
-+ my @requires = ();
-+ foreach(@depslist) {
-+ my $pkgid = $_->id;
-+ if(grep(/^$pkgid$/, keys %{$state->{selected}})) {
-+ push @requires, $_;
-+ }
-+ }
-+
-+ @requires;
-+
-+}
-diff --git a/backends/urpmi/helpers/urpmi_backend/filters.pm b/backends/urpmi/helpers/urpmi_backend/filters.pm
-new file mode 100644
-index 0000000..2c2f13a
---- /dev/null
-+++ b/backends/urpmi/helpers/urpmi_backend/filters.pm
-@@ -0,0 +1,78 @@
-+package urpmi_backend::filters;
-+
-+use MDK::Common;
-+use perl_packagekit::enums;
-+use urpmi_backend::tools;
-+
-+use Exporter;
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(filter);
-+
-+my @gui_pkgs = map { chomp; $_ } cat_('/usr/share/rpmdrake/gui.lst');
-+
-+sub filter {
-+ my ($pkg, $filters, $enabled_filters) = @_;
-+
-+ my %e_filters = %{$enabled_filters};
-+
-+ foreach my $filter (@{$filters}) {
-+ if($filter eq FILTER_INSTALLED || $filter eq FILTER_NOT_INSTALLED) {
-+ if($e_filters{FILTER_INSTALLED}) {
-+ return 0 if not filter_installed($pkg, $filter);
-+ }
-+ }
-+ elsif($filter eq FILTER_DEVELOPMENT || $filter eq FILTER_NOT_DEVELOPMENT) {
-+ if($e_filters{FILTER_DEVELOPMENT}) {
-+ return 0 if not filter_devel($pkg, $filter);
-+ }
-+ }
-+ elsif($filter eq FILTER_GUI || $filter eq FILTER_NOT_GUI) {
-+ if($e_filters{FILTER_GUI}) {
-+ return 0 if not filter_gui($pkg, $filter);
-+ }
-+ }
-+ }
-+ return 1;
-+}
-+
-+sub filter_installed {
-+ my ($pkg, $filter) = @_;
-+ my $installed;
-+ $installed = 1 if(find_installed_version($pkg));
-+ if($filter eq FILTER_INSTALLED && $installed) {
-+ return 1;
-+ }
-+ if($filter eq FILTER_NOT_INSTALLED && !$installed) {
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+sub filter_devel {
-+ my ($pkg, $filter) = @_;
-+ my $pkgname = $pkg->name;
-+ my $devel = ($pkgname =~ /-devel$/);
-+ if($filter eq FILTER_DEVELOPMENT && $devel) {
-+ return 1;
-+ }
-+ if($filter eq FILTER_NOT_DEVELOPMENT && !$devel) {
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+sub filter_gui {
-+ my ($pkg, $filter) = @_;
-+ my $pkgname = $pkg->name;
-+ my $gui = member($pkgname, @gui_pkgs);
-+
-+ if($filter eq FILTER_NOT_GUI && !$gui) {
-+ return 1;
-+ }
-+ if($filter eq FILTER_GUI && $gui) {
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+1;
-diff --git a/backends/urpmi/helpers/urpmi_backend/groups.pm b/backends/urpmi/helpers/urpmi_backend/groups.pm
-new file mode 100644
-index 0000000..d377ab2
---- /dev/null
-+++ b/backends/urpmi/helpers/urpmi_backend/groups.pm
-@@ -0,0 +1,129 @@
-+package urpmi_backend::groups;
-+
-+use strict;
-+
-+use perl_packagekit::enums;
-+use Exporter;
-+
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(
-+ MDV_GROUPS
-+ get_mdv_groups
-+ get_pk_group
-+ package_belongs_to_pk_group
-+);
-+
-+use constant MDV_GROUPS => {
-+ 'Accessibility' => GROUP_ACCESSIBILITY,
-+ 'Archiving/Backup' => GROUP_OTHER,
-+ 'Archiving/Cd burning' => GROUP_MULTIMEDIA,
-+ 'Archiving/Compression' => GROUP_ACCESSORIES,
-+ 'Archiving/Other' => GROUP_OTHER,
-+ 'Books/Computer books' => GROUP_OTHER,
-+ 'Books/Faqs' => GROUP_OTHER,
-+ 'Books/Howtos' => GROUP_OTHER,
-+ 'Books/Literature' => GROUP_OTHER,
-+ 'Books/Other' => GROUP_OTHER,
-+ 'Communications' => GROUP_COMMUNICATION,
-+ 'Databases' => GROUP_PROGRAMMING,
-+ 'Development/C' => GROUP_PROGRAMMING,
-+ 'Development/C++' => GROUP_PROGRAMMING,
-+ 'Development/Databases' => GROUP_PROGRAMMING,
-+ 'Development/GNOME and GTK+' => GROUP_PROGRAMMING,
-+ 'Development/Java' => GROUP_PROGRAMMING,
-+ 'Development/KDE and Qt' => GROUP_PROGRAMMING,
-+ 'Development/Kernel' => GROUP_PROGRAMMING,
-+ 'Development/Other' => GROUP_PROGRAMMING,
-+ 'Development/Perl' => GROUP_PROGRAMMING,
-+ 'Development/PHP' => GROUP_PROGRAMMING,
-+ 'Development/Python' => GROUP_PROGRAMMING,
-+ 'Development/Ruby' => GROUP_PROGRAMMING,
-+ 'Development/X11' => GROUP_PROGRAMMING,
-+ 'Editors' => GROUP_ACCESSORIES,
-+ 'Education' => GROUP_EDUCATION,
-+ 'Emulators' => GROUP_VIRTUALIZATION,
-+ 'File tools' => GROUP_ACCESSORIES,
-+ 'Games/Adventure' => GROUP_GAMES,
-+ 'Games/Arcade' => GROUP_GAMES,
-+ 'Games/Boards' => GROUP_GAMES,
-+ 'Games/Cards' => GROUP_GAMES,
-+ 'Games/Other' => GROUP_GAMES,
-+ 'Games/Puzzles' => GROUP_GAMES,
-+ 'Games/Sports' => GROUP_GAMES,
-+ 'Games/Strategy' => GROUP_GAMES,
-+ 'Graphical desktop/Enlightenment' => GROUP_DESKTOP_OTHER,
-+ 'Graphical desktop/FVWM based' => GROUP_DESKTOP_OTHER,
-+ 'Graphical desktop/GNOME' => GROUP_DESKTOP_GNOME,
-+ 'Graphical desktop/Icewm' => GROUP_DESKTOP_OTHER,
-+ 'Graphical desktop/KDE' => GROUP_DESKTOP_KDE,
-+ 'Graphical desktop/Other' => GROUP_DESKTOP_OTHER,
-+ 'Graphical desktop/Sawfish' => GROUP_DESKTOP_OTHER,
-+ 'Graphical desktop/WindowMaker' => GROUP_DESKTOP_OTHER,
-+ 'Graphical desktop/Xfce' => GROUP_DESKTOP_XFCE,
-+ 'Graphics' => GROUP_GRAPHICS,
-+ 'Monitoring' => GROUP_NETWORK,
-+ 'Networking/Chat' => GROUP_INTERNET,
-+ 'Networking/File transfer' => GROUP_INTERNET,
-+ 'Networking/IRC' => GROUP_INTERNET,
-+ 'Networking/Instant messaging' => GROUP_INTERNET,
-+ 'Networking/Mail' => GROUP_INTERNET,
-+ 'Networking/News' => GROUP_INTERNET,
-+ 'Networking/Other' => GROUP_INTERNET,
-+ 'Networking/Remote access' => GROUP_INTERNET,
-+ 'Networking/WWW' => GROUP_INTERNET,
-+ 'Office' => GROUP_OFFICE,
-+ 'Publishing' => GROUP_PUBLISHING,
-+ 'Sciences/Astronomy' => GROUP_OTHER,
-+ 'Sciences/Biology' => GROUP_OTHER,
-+ 'Sciences/Chemistry' => GROUP_OTHER,
-+ 'Sciences/Computer science' => GROUP_OTHER,
-+ 'Sciences/Geosciences' => GROUP_OTHER,
-+ 'Sciences/Mathematics' => GROUP_OTHER,
-+ 'Sciences/Other' => GROUP_OTHER,
-+ 'Sciences/Physics' => GROUP_OTHER,
-+ 'Shells' => GROUP_SYSTEM,
-+ 'Sound' => GROUP_MULTIMEDIA,
-+ 'System/Base' => GROUP_SYSTEM,
-+ 'System/Cluster' => GROUP_SYSTEM,
-+ 'System/Configuration/Boot and Init' => GROUP_SYSTEM,
-+ 'System/Configuration/Hardware' => GROUP_SYSTEM,
-+ 'System/Configuration/Networking' => GROUP_SYSTEM,
-+ 'System/Configuration/Other' => GROUP_SYSTEM,
-+ 'System/Configuration/Packaging' => GROUP_SYSTEM,
-+ 'System/Configuration/Printing' => GROUP_SYSTEM,
-+ 'System/Fonts/Console' => GROUP_FONTS,
-+ 'System/Fonts/True type' => GROUP_FONTS,
-+ 'System/Fonts/Type1' => GROUP_FONTS,
-+ 'System/Fonts/X11 bitmap' => GROUP_FONTS,
-+ 'System/Internationalization' => GROUP_LOCALIZATION,
-+ 'System/Kernel and hardware' => GROUP_SYSTEM,
-+ 'System/Libraries' => GROUP_SYSTEM,
-+ 'System/Printing' => GROUP_SYSTEM,
-+ 'System/Servers' => GROUP_SYSTEM,
-+ 'System/X11' => GROUP_SYSTEM,
-+ 'Terminals' => GROUP_SYSTEM,
-+ 'Text tools' => GROUP_ACCESSORIES,
-+ 'Toys' => GROUP_GAMES,
-+ 'Video' => GROUP_MULTIMEDIA
-+ };
-+
-+sub get_mdv_groups {
-+ my ($pk_group) = @_;
-+ my @groups = ();
-+ foreach(keys %{(MDV_GROUPS)}) {
-+ if(%{(MDV_GROUPS)}->{$_} eq $pk_group) {
-+ push @groups, $_;
-+ }
-+ }
-+ return @groups;
-+}
-+
-+sub package_belongs_to_pk_group {
-+ my ($pkg, $pk_group) = @_;
-+ my @groups = get_mdv_groups($pk_group);
-+ my $pkg_group = $pkg->group;
-+ return grep(/$pkg_group/, @groups);
-+}
-+
-+1;
-+
-diff --git a/backends/urpmi/helpers/urpmi_backend/open_db.pm b/backends/urpmi/helpers/urpmi_backend/open_db.pm
-new file mode 100644
-index 0000000..795edc6
---- /dev/null
-+++ b/backends/urpmi/helpers/urpmi_backend/open_db.pm
-@@ -0,0 +1,48 @@
-+package urpmi_backend::open_db;
-+
-+use strict;
-+
-+use MDK::Common;
-+
-+use urpm;
-+use urpm::media;
-+use urpm::select;
-+
-+use URPM;
-+
-+use Exporter;
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(fast_open_urpmi_db open_urpmi_db open_rpm_db);
-+
-+# Note that most part of this perl module
-+# is extracted from Rpmdrake
-+
-+sub fast_open_urpmi_db() {
-+ my $urpm = urpm->new;
-+ $urpm->get_global_options;
-+ urpm::media::read_config($urpm);
-+ $urpm;
-+}
-+
-+sub open_urpmi_db {
-+ my (%urpmi_options) = @_;
-+ my $urpm = fast_open_urpmi_db();
-+ my $media = ''; # See Rpmdrake source code for more information.
-+
-+ my $searchmedia = $urpmi_options{update} ? undef : join(',', get_inactive_backport_media($urpm));
-+ $urpm->{lock} = urpm::lock::urpmi_db($urpm, undef, wait => $urpm->{options}{wait_lock});
-+ my $previous = ''; # Same as $media above.
-+ urpm::select::set_priority_upgrade_option($urpm, (ref $previous ? join(',', @$previous) : ()));
-+ urpm::media::configure($urpm, media => $media, if_($searchmedia, searchmedia => $searchmedia), %urpmi_options);
-+ $urpm;
-+}
-+
-+sub get_inactive_backport_media {
-+ my ($urpm) = @_;
-+ map { $_->{name} } grep { $_->{ignore} && $_->{name} =~ /backport/i } @{$urpm->{media}};
-+}
-+
-+sub open_rpm_db {
-+ URPM::DB::open() or die "Couldn't open RPM DB";
-+}
-+
-diff --git a/backends/urpmi/helpers/urpmi_backend/tools.pm b/backends/urpmi/helpers/urpmi_backend/tools.pm
-new file mode 100644
-index 0000000..e078134
---- /dev/null
-+++ b/backends/urpmi/helpers/urpmi_backend/tools.pm
-@@ -0,0 +1,151 @@
-+package urpmi_backend::tools;
-+
-+use strict;
-+
-+use URPM;
-+use urpmi_backend::open_db;
-+
-+use Exporter;
-+our @ISA = qw(Exporter);
-+our @EXPORT = qw(
-+ get_update_medias
-+ rpm_description
-+ urpm_name
-+ find_installed_version
-+ get_package_id
-+ ensure_utf8
-+ pkg2medium
-+ fullname_to_package_id
-+ get_package_by_package_id
-+ package_version_is_installed
-+ get_package_upgrade
-+ get_installed_version
-+ get_installed_version_pkid
-+);
-+
-+sub get_update_medias {
-+ my ($urpm) = @_;
-+ grep { !$_->{ignore} && $_->{update} } @{$urpm->{media}};
-+}
-+
-+sub rpm_description {
-+ my ($description) = @_;
-+ ensure_utf8($description);
-+ my ($t, $tmp);
-+ foreach (split "\n", $description) {
-+ s/^\s*//;
-+ if (/^$/ || /^\s*(-|\*|\+|o)\s/) {
-+ $t || $tmp and $t .= "$tmp\n";
-+ $tmp = $_;
-+ } else {
-+ $tmp = ($tmp ? "$tmp " : ($t && "\n") . $tmp) . $_;
-+ }
-+ }
-+ "$t$tmp\n";
-+}
-+
-+sub urpm_name {
-+ return '?-?-?.?' unless ref $_[0];
-+ my ($name, $version, $release, $arch) = $_[0]->fullname;
-+ "$name-$version-$release.$arch";
-+}
-+
-+sub ensure_utf8 {
-+ my ($s) = @_;
-+ require Encode;
-+ Encode::_utf8_on($s); #- this is done on the copy
-+ if (!Encode::is_utf8($s, 1)) {
-+ Encode::_utf8_off($_[0]);
-+ Encode::from_to($_[0], 'iso-8859-15', 'utf8'); # most probable
-+ }
-+ Encode::_utf8_on($_[0]); #- now we know it is valid utf8
-+ $_[0];
-+}
-+
-+sub find_installed_version {
-+ my ($p) = @_;
-+ my @version;
-+ URPM::DB::open()->traverse_tag('name', [ $p->name ], sub { push @version, $_[0]->version . '-' . $_[0]->release });
-+ @version ? join(',', sort @version) : "";
-+}
-+
-+sub get_package_id {
-+ my ($pkg) = @_;
-+ return $pkg->name.";".$pkg->version."-".$pkg->release.";".$pkg->arch.";mandriva";
-+}
-+
-+sub pkg2medium {
-+ my ($p, $urpm) = @_;
-+ return if !ref $p;
-+ return { name => N("None (installed)") } if !$p->id; # if installed
-+ URPM::pkg2media($urpm->{media}, $p) || undef;
-+}
-+
-+sub fullname_to_package_id {
-+ # fullname, ie 'xeyes-1.0.1-5mdv2008.1.i586'
-+ my ($pkg_string) = @_;
-+ chomp($pkg_string);
-+ $pkg_string =~ /^(.*)-([^-]*)-([^-]*)\.([^\.]*)$/;
-+ my %pkg = (
-+ name => $1,
-+ version => $2,
-+ release => $3,
-+ arch => $4
-+ );
-+ return $pkg{name}.";".$pkg{version}."-".$pkg{release}.";".$pkg{arch}.";mandriva";
-+}
-+
-+sub get_package_by_package_id {
-+ my ($urpm, $package_id) = @_;
-+ my @depslist = @{$urpm->{depslist}};
-+ foreach(@depslist) {
-+ if(get_package_id($_) eq $package_id) {
-+ return $_;
-+ }
-+ }
-+ return;
-+}
-+
-+sub package_version_is_installed {
-+ my ($pkg) = @_;
-+ return $pkg->version."-".$pkg->release eq find_installed_version($pkg);
-+}
-+
-+sub get_package_upgrade {
-+ my ($urpm, $pkg) = @_;
-+ my $db = open_rpm_db();
-+ $urpm->compute_installed_flags($db);
-+ my @depslist = @{$urpm->{depslist}};
-+ my $pkgname = $pkg->name;
-+ foreach(@depslist) {
-+ if($_->name =~ /^$pkgname$/ && $_->flag_upgrade) {
-+ return $_;
-+ }
-+ }
-+}
-+
-+sub get_installed_version {
-+ my ($urpm, $pkg) = @_;
-+ my @depslist = @{$urpm->{depslist}};
-+ my $pkgname = $pkg->name;
-+ foreach $_ (@depslist) {
-+ if($_->name =~ /^$pkgname$/ && package_version_is_installed($_)) {
-+ return $_;
-+ }
-+ }
-+ return;
-+}
-+
-+sub get_installed_version_pkid {
-+ my ($pkg) = @_;
-+ my $pkgname = $pkg->name;
-+ my $db = open_rpm_db();
-+ my $installed_pkid;
-+ $db->traverse(sub {
-+ my ($pkg) = @_;
-+ if($pkg->name =~ /^$pkgname$/) {
-+ $installed_pkid = get_package_id($pkg);
-+ }
-+ });
-+ return $installed_pkid;
-+}
-diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
-new file mode 100644
-index 0000000..e7b56a7
---- /dev/null
-+++ b/backends/urpmi/pk-backend-urpmi.c
-@@ -0,0 +1,355 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2007-2008 Richard Hughes <richard@hughsie.com>
-+ *
-+ * Licensed under the GNU General Public License Version 2
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <pk-backend.h>
-+#include <pk-backend-spawn.h>
-+#include <pk-package-ids.h>
-+
-+static PkBackendSpawn *spawn;
-+
-+/**
-+ * backend_initialize:
-+ * This should only be run once per backend load, i.e. not every transaction
-+ */
-+static void
-+backend_initialize (PkBackend *backend)
-+{
-+ pk_debug ("FILTER: initialize");
-+ spawn = pk_backend_spawn_new ();
-+ pk_backend_spawn_set_name (spawn, "urpmi");
-+}
-+
-+/**
-+ * backend_destroy:
-+ * This should only be run once per backend load, i.e. not every transaction
-+ */
-+static void
-+backend_destroy (PkBackend *backend)
-+{
-+ pk_debug ("FILTER: destroy");
-+ g_object_unref (spawn);
-+}
-+
-+/**
-+ * backend_get_groups:
-+ */
-+static PkGroupEnum
-+backend_get_groups (PkBackend *backend)
-+{
-+ return(PK_GROUP_ENUM_UNKNOWN |
-+ PK_GROUP_ENUM_ACCESSIBILITY |
-+ PK_GROUP_ENUM_ACCESSORIES |
-+ PK_GROUP_ENUM_EDUCATION |
-+ PK_GROUP_ENUM_GAMES |
-+ PK_GROUP_ENUM_GRAPHICS |
-+ PK_GROUP_ENUM_INTERNET |
-+ PK_GROUP_ENUM_OFFICE |
-+ PK_GROUP_ENUM_OTHER |
-+ PK_GROUP_ENUM_PROGRAMMING |
-+ PK_GROUP_ENUM_MULTIMEDIA |
-+ PK_GROUP_ENUM_SYSTEM |
-+ PK_GROUP_ENUM_DESKTOP_GNOME |
-+ PK_GROUP_ENUM_DESKTOP_KDE |
-+ PK_GROUP_ENUM_DESKTOP_XFCE |
-+ PK_GROUP_ENUM_DESKTOP_OTHER |
-+ PK_GROUP_ENUM_PUBLISHING |
-+ PK_GROUP_ENUM_SERVERS |
-+ PK_GROUP_ENUM_FONTS |
-+ PK_GROUP_ENUM_ADMIN_TOOLS |
-+ PK_GROUP_ENUM_LEGACY |
-+ PK_GROUP_ENUM_LOCALIZATION |
-+ PK_GROUP_ENUM_VIRTUALIZATION |
-+ PK_GROUP_ENUM_POWER_MANAGEMENT |
-+ PK_GROUP_ENUM_SECURITY |
-+ PK_GROUP_ENUM_COMMUNICATION |
-+ PK_GROUP_ENUM_NETWORK |
-+ PK_GROUP_ENUM_MAPS |
-+ PK_GROUP_ENUM_REPOS);
-+}
-+
-+/**
-+ * backend_get_filters:
-+ */
-+static PkFilterEnum
-+backend_get_filters (PkBackend *backend)
-+{
-+ return (PK_FILTER_ENUM_GUI |
-+ PK_FILTER_ENUM_INSTALLED |
-+ PK_FILTER_ENUM_DEVELOPMENT);
-+}
-+
-+/**
-+ * pk_backend_bool_to_text:
-+ */
-+static const gchar *
-+pk_backend_bool_to_text (gboolean value)
-+{
-+ if (value == TRUE) {
-+ return "yes";
-+ }
-+ return "no";
-+}
-+
-+
-+/**
-+ * pk_backend_search_name:
-+ */
-+static void
-+backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "search-name.pl", filters_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_details:
-+ */
-+static void
-+backend_get_details (PkBackend *backend, const gchar *package_id)
-+{
-+ pk_backend_spawn_helper (spawn, "get-details.pl", package_id, NULL);
-+}
-+
-+/**
-+ * backend_get_files:
-+ */
-+static void
-+backend_get_files (PkBackend *backend, const gchar *package_id)
-+{
-+ pk_backend_spawn_helper (spawn, "get-files.pl", package_id, NULL);
-+}
-+
-+/**
-+ * backend_get_depends:
-+ */
-+static void
-+backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-depends.pl", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_updates:
-+ */
-+static void
-+backend_get_updates (PkBackend *backend, PkFilterEnum filters)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-updates.pl", filters_text, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_update_detail:
-+ */
-+static void
-+backend_get_update_detail (PkBackend *backend, const gchar *package_id)
-+{
-+ pk_backend_spawn_helper (spawn, "get-update-detail.pl", package_id, NULL);
-+}
-+
-+/**
-+ * backend_refresh_cache:
-+ */
-+static void
-+backend_refresh_cache (PkBackend *backend, gboolean force)
-+{
-+ /* check network state */
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache whilst offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ pk_backend_spawn_helper (spawn, "refresh-cache.pl", NULL);
-+}
-+
-+/**
-+ * backend_install_packages:
-+ */
-+static void
-+backend_install_packages (PkBackend *backend, gchar **package_ids)
-+{
-+ gchar *package_ids_temp;
-+
-+ /* check network state */
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ /* send the complete list as stdin */
-+ package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-+ pk_backend_spawn_helper (spawn, "install-packages.pl", package_ids_temp, NULL);
-+ g_free (package_ids_temp);
-+}
-+
-+/**
-+ * pk_backend_remove_packages:
-+ */
-+static void
-+backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
-+{
-+ gchar *package_ids_temp;
-+
-+ /* send the complete list as stdin */
-+ package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-+ pk_backend_spawn_helper (spawn, "remove-packages.pl", pk_backend_bool_to_text (allow_deps), package_ids_temp, NULL);
-+ g_free (package_ids_temp);
-+}
-+
-+/**
-+ * pk_backend_search_group:
-+ */
-+static void
-+backend_search_group (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "search-group.pl", filters_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_packages:
-+ */
-+static void
-+backend_get_packages (PkBackend *backend, PkFilterEnum filters)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-packages.pl", filters_text, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * backend_get_requires:
-+ */
-+static void
-+backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "get-requires.pl", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * pk_backend_search_details:
-+ */
-+static void
-+backend_search_details (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "search-details.pl", filters_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * pk_backend_search_file:
-+ */
-+static void
-+backend_search_file (PkBackend *backend, PkFilterEnum filters, const gchar *search)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "search-file.pl", filters_text, search, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * pk_backend_resolve:
-+ */
-+static void
-+backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
-+{
-+ gchar *filters_text;
-+ filters_text = pk_filter_enums_to_text (filters);
-+ pk_backend_spawn_helper (spawn, "resolve.pl", filters_text, package_id, NULL);
-+ g_free (filters_text);
-+}
-+
-+/**
-+ * pk_backend_update_packages:
-+ */
-+static void
-+backend_update_packages (PkBackend *backend, gchar **package_ids)
-+{
-+ gchar *package_ids_temp;
-+
-+
-+ /* check network state */
-+ if (!pk_backend_is_online (backend)) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
-+ pk_backend_finished (backend);
-+ return;
-+ }
-+
-+ /* send the complete list as stdin */
-+ package_ids_temp = pk_package_ids_to_text (package_ids, "|");
-+ pk_backend_spawn_helper (spawn, "update-packages.pl", package_ids_temp, NULL);
-+ g_free (package_ids_temp);
-+}
-+
-+
-+PK_BACKEND_OPTIONS (
-+ "URPMI", /* description */
-+ "Aurelien Lefebvre <alefebvre@mandriva.com>", /* author */
-+ backend_initialize, /* initalize */
-+ backend_destroy, /* destroy */
-+ backend_get_groups, /* get_groups */
-+ backend_get_filters, /* get_filters */
-+ NULL, /* cancel */
-+ backend_get_depends, /* get_depends */
-+ backend_get_details, /* get_details */
-+ backend_get_files, /* get_files */
-+ backend_get_packages, /* get_packages */
-+ NULL, /* get_repo_list */
-+ backend_get_requires, /* get_requires */
-+ backend_get_update_detail, /* get_update_detail */
-+ backend_get_updates, /* get_updates */
-+ NULL, /* install_files */
-+ backend_install_packages, /* install_packages */
-+ NULL, /* install_signature */
-+ backend_refresh_cache, /* refresh_cache */
-+ backend_remove_packages, /* remove_packages */
-+ NULL, /* repo_enable */
-+ NULL, /* repo_set_data */
-+ backend_resolve, /* resolve */
-+ NULL, /* rollback */
-+ backend_search_details, /* search_details */
-+ backend_search_file, /* search_file */
-+ backend_search_group, /* search_group */
-+ backend_search_name, /* search_name */
-+ NULL, /* service_pack */
-+ backend_update_packages, /* update_packages */
-+ NULL, /* update_system */
-+ NULL /* what_provides */
-+);
-+
-diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
-index 5b2da8f..d70d8dc 100644
---- a/backends/yum/helpers/yumBackend.py
-+++ b/backends/yum/helpers/yumBackend.py
-@@ -901,14 +901,16 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- if pkg and not inst:
- repo = self.yumbase.repos.getRepo(pkg.repoid)
- if not already_warned and not repo.gpgcheck:
-- self.message(MESSAGE_WARNING,"The package %s was installed untrusted from %s." % (pkg.name, repo))
-+ self.message(MESSAGE_WARNING,"The untrusted package %s will be installed from %s." % (pkg.name, repo))
- already_warned = True
- txmbr = self.yumbase.install(name=pkg.name)
- txmbrs.extend(txmbr)
-+ if inst:
-+ self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The package %s is already installed", pkg.name)
- if txmbrs:
- self._runYumTransaction()
- else:
-- self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The package is already installed")
-+ self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The packages failed to be installed")
-
- def _checkForNewer(self,po):
- pkgs = self.yumbase.pkgSack.returnNewestByName(name=po.name)
-@@ -927,6 +929,10 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- if inst_file.endswith('.src.rpm'):
- self.error(ERROR_CANNOT_INSTALL_SOURCE_PACKAGE,'Backend will not install a src rpm file')
- return
-+ for inst_file in inst_files:
-+ if not inst_file.endswith('.rpm'):
-+ self.error(ERROR_INVALID_PACKAGE_FILE,'Only rpm packages are supported')
-+ return
- self._check_init()
- self.allow_cancel(False);
- self.percentage(0)
-@@ -1056,8 +1062,11 @@ class PackageKitYumBackend(PackageKitBaseBackend):
-
- def _format_msgs(self,msgs):
- if isinstance(msgs,basestring):
-- msgs = msgs.split('\n')
-- return ";".join(msgs)
-+ msgs = msgs.split('\n')
-+ text = ";".join(msgs)
-+ text = text.replace("Missing Dependency: ","")
-+ text = text.replace(" (installed)","")
-+ return text
-
- def _runYumTransaction(self,removedeps=None):
- '''
-@@ -1092,16 +1101,19 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- if not keyData:
- self.error(ERROR_BAD_GPG_SIGNATURE,
- "GPG key not imported, and no GPG information was found.")
--
- id = self._pkg_to_id(keyData['po'])
-+ fingerprint = keyData['fingerprint']
-+ hex_fingerprint = "%02x" * len(fingerprint) % tuple(map(ord, fingerprint))
-+ # Borrowed from http://mail.python.org/pipermail/python-list/2000-September/053490.html
-+
- self.repo_signature_required(id,
- keyData['po'].repoid,
-- keyData['keyurl'],
-+ keyData['keyurl'].replace("file://",""),
- keyData['userid'],
- keyData['hexkeyid'],
-- keyData['fingerprint'],
-- keyData['timestamp'],
-- 'GPG')
-+ hex_fingerprint,
-+ time.ctime(keyData['timestamp']),
-+ 'gpg')
- self.error(ERROR_GPG_FAILURE,"GPG key %s required" % keyData['hexkeyid'])
- except yum.Errors.YumBaseError,ye:
- message = self._format_msgs(ye.value)
-@@ -1110,7 +1122,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- else:
- self.error(ERROR_TRANSACTION_ERROR,message)
-
-- def remove(self,allowdep,package):
-+ def remove_packages(self,allowdep,package):
- '''
- Implement the {backend}-remove functionality
- Needed to be implemented in a sub class
-@@ -1394,6 +1406,10 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- typ = ref['type']
- href = ref['href']
- title = ref['title'] or ""
-+
-+ # Description can sometimes have ';' in them, and we use that as the delimiter
-+ title = title.replace(";",",")
-+
- if href:
- if typ in ('bugzilla','cve'):
- urls[typ].append("%s;%s" % (href,title))
-@@ -1555,11 +1571,7 @@ class DownloadCallback(BaseMeter):
- '''
- Get the name of the package being downloaded
- '''
-- if self.text and type(self.text) == type(""):
-- name = self.text
-- else:
-- name = self.basename
-- return name
-+ return self.basename
-
- def updateProgress(self,name,frac,fread,ftime):
- '''
-diff --git a/backends/yum2/helpers/yumDBUSBackend.py b/backends/yum2/helpers/yumDBUSBackend.py
-index 29f5b03..a708a0c 100755
---- a/backends/yum2/helpers/yumDBUSBackend.py
-+++ b/backends/yum2/helpers/yumDBUSBackend.py
-@@ -823,15 +823,24 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- self.PercentageChanged(0)
- self.StatusChanged(STATUS_RUNNING)
-
-- pkg,inst = self._findPackage(package)
-- if pkg:
-+ txmbrs = []
-+ already_warned = False
-+ for package in packages:
-+ pkg,inst = self._findPackage(package)
-+ if pkg and not inst:
-+ repo = self.yumbase.repos.getRepo(pkg.repoid)
-+ if not already_warned and not repo.gpgcheck:
-+ self.message(MESSAGE_WARNING,"The untrusted package %s will be installed from %s." % (pkg.name, repo))
-+ already_warned = True
-+ txmbr = self.yumbase.install(name=pkg.name)
-+ txmbrs.extend(txmbr)
- if inst:
- self._unlock_yum()
-- self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,'Package already installed')
-+ self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,"The package %s is already installed", pkg.name)
- self.Finished(EXIT_FAILED)
- return
-+ if txmbrs:
- try:
-- txmbr = self.yumbase.install(name=pkg.name)
- successful = self._runYumTransaction()
- if not successful:
- # _runYumTransaction unlocked yum, set the error code, and called Finished.
-@@ -844,7 +853,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- return
- else:
- self._unlock_yum()
-- self.ErrorCode(ERROR_PACKAGE_NOT_FOUND,"Package was not found")
-+ self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,"The packages failed to be installed")
- self.Finished(EXIT_FAILED)
- return
-
-@@ -1761,13 +1770,15 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- "GPG key not imported, but no GPG information received from Yum.")
- self.Finished(EXIT_FAILED)
- return False
-- self.RepoSignatureRequired(keyData['po'].repoid,
-- keyData['keyurl'],
-+ id = self._pkg_to_id(keyData['po'])
-+ self.RepoSignatureRequired(id,
-+ keyData['po'].repoid,
-+ keyData['keyurl'].replace("file://",""),
- keyData['userid'],
- keyData['hexkeyid'],
- keyData['fingerprint'],
-- keyData['timestamp'],
-- SIGTYE_GPG)
-+ time.ctime(keyData['timestamp']),
-+ SIGTYPE_GPG)
- self._unlock_yum()
- self.ErrorCode(ERROR_GPG_FAILURE,"GPG key not imported.")
- self.Finished(EXIT_FAILED)
-@@ -1893,6 +1904,10 @@ class PackageKitYumBackend(PackageKitBaseBackend):
- type_ = ref['type']
- href = ref['href']
- title = ref['title'] or ""
-+
-+ # Description can sometimes have ';' in them, and we use that as the delimiter
-+ title = title.replace(";",",")
-+
- if href:
- if type_ in ('bugzilla', 'cve'):
- urls[type_].append("%s;%s" % (href, title))
-diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
-index 15c4b4f..a971707 100644
---- a/backends/zypp/pk-backend-zypp.cpp
-+++ b/backends/zypp/pk-backend-zypp.cpp
-@@ -26,6 +26,7 @@
- #include <pk-debug.h>
- #include <string>
- #include <set>
-+#include <glib/gi18n.h>
-
- #include <zypp/ZYppFactory.h>
- #include <zypp/ResObject.h>
-@@ -47,7 +48,6 @@
- #include <zypp/target/rpm/RpmDb.h>
- #include <zypp/target/rpm/RpmHeader.h>
- #include <zypp/target/rpm/RpmException.h>
--#include <zypp/base/LogControl.h>
- #include <zypp/TmpPath.h>
-
- #include <zypp/sat/Solvable.h>
-@@ -90,12 +90,13 @@ std::map<PkBackend *, std::vector<std::string> *> _signatures;
- static void
- backend_initialize (PkBackend *backend)
- {
-- zypp::base::LogControl::instance ().logfile("/var/log/pk_backend_zypp");
-+ zypp_logging ();
- pk_debug ("zypp_backend_initialize");
- EventDirector *eventDirector = new EventDirector (backend);
- _eventDirectors [backend] = eventDirector;
- std::vector<std::string> *signature = new std::vector<std::string> ();
- _signatures [backend] = signature;
-+ _updating_self = FALSE;
- }
-
- /**
-@@ -287,7 +288,9 @@ backend_get_filters (PkBackend *backend)
- return (PkFilterEnum) (PK_FILTER_ENUM_INSTALLED |
- PK_FILTER_ENUM_NOT_INSTALLED |
- PK_FILTER_ENUM_ARCH |
-- PK_FILTER_ENUM_NOT_ARCH);
-+ PK_FILTER_ENUM_NOT_ARCH |
-+ PK_FILTER_ENUM_SOURCE |
-+ PK_FILTER_ENUM_NOT_SOURCE);
- }
-
- static gboolean
-@@ -403,7 +406,7 @@ backend_get_depends_thread (PkBackend *backend)
- package_id_temp = pk_package_id_build (it->second.name ().c_str(),
- it->second.edition ().asString ().c_str(),
- it->second.arch ().c_str(),
-- it->second.repository ().name ().c_str());
-+ it->second.repository ().alias ().c_str());
-
- zypp::PoolItem item = zypp::ResPool::instance ().find (it->second);
-
-@@ -570,6 +573,32 @@ backend_refresh_cache (PkBackend *backend, gboolean force)
- pk_backend_thread_create (backend, backend_refresh_cache_thread);
- }
-
-+/* If a critical self update (see qualifying steps below) is available then only show/install that update first.
-+ 1. there is a patch available with the <restart_suggested> tag set
-+ 2. The patch contains the package "PackageKit" or "gnome-packagekit
-+*/
-+/*static gboolean
-+check_for_self_update (PkBackend *backend, std::set<zypp::PoolItem> *candidates)
-+{
-+ std::set<zypp::PoolItem>::iterator cb = candidates->begin (), ce = candidates->end (), ci;
-+ for (ci = cb; ci != ce; ++ci) {
-+ zypp::ResObject::constPtr res = ci->resolvable();
-+ if (zypp::isKind<zypp::Patch>(res)) {
-+ zypp::Patch::constPtr patch = zypp::asKind<zypp::Patch>(res);
-+ //pk_debug ("restart_suggested is %d",(int)patch->restartSuggested());
-+ if (patch->restartSuggested ()) {
-+ if (!strcmp (PACKAGEKIT_RPM_NAME, res->satSolvable ().name ().c_str ()) ||
-+ !strcmp (GNOME_PACKAGKEKIT_RPM_NAME, res->satSolvable ().name ().c_str ())) {
-+ g_free (update_self_patch_name);
-+ update_self_patch_name = zypp_build_package_id_from_resolvable (res->satSolvable ());
-+ return TRUE;
-+ }
-+ }
-+ }
-+ }
-+ return FALSE;
-+}*/
-+
- static gboolean
- backend_get_updates_thread (PkBackend *backend)
- {
-@@ -586,12 +615,23 @@ backend_get_updates_thread (PkBackend *backend)
- pk_backend_set_percentage (backend, 40);
-
- // get all Packages and Patches for Update
-- std::set<zypp::PoolItem> *candidates = zypp_get_updates ();
-- std::set<zypp::PoolItem> *candidates2 = zypp_get_patches ();
-+ std::set<zypp::PoolItem> *candidates = zypp_get_patches ();
-+ std::set<zypp::PoolItem> *candidates2 = new std::set<zypp::PoolItem> ();
-+
-+ if (!_updating_self) {
-+ // exclude the patch-repository
-+ std::string patchRepo;
-+ if (!candidates->empty ()) {
-+ patchRepo = candidates->begin ()->resolvable ()->repoInfo ().alias ();
-+ }
-+
-+ candidates2 = zypp_get_updates (patchRepo);
-
-- candidates->insert (candidates2->begin (), candidates2->end ());
-+ candidates->insert (candidates2->begin (), candidates2->end ());
-+ }
-
- pk_backend_set_percentage (backend, 80);
-+
- std::set<zypp::PoolItem>::iterator cb = candidates->begin (), ce = candidates->end (), ci;
- for (ci = cb; ci != ce; ++ci) {
- zypp::ResObject::constPtr res = ci->resolvable();
-@@ -716,7 +756,7 @@ backend_install_files_thread (PkBackend *backend)
- gboolean found = FALSE;
-
- for (std::vector<zypp::sat::Solvable>::iterator it = solvables->begin (); it != solvables->end (); it ++) {
-- if (it->repository ().name () == "PK_TMP_DIR") {
-+ if (it->repository ().alias () == "PK_TMP_DIR") {
- item = new zypp::PoolItem(*it);
- found = TRUE;
- break;
-@@ -861,14 +901,28 @@ backend_update_system_thread (PkBackend *backend)
- zypp::ResPool pool = zypp_build_pool (TRUE);
- pk_backend_set_percentage (backend, 40);
-
-- // get all Packages for Update
-- std::set<zypp::PoolItem> *candidates = zypp_get_updates ();
- //get all Patches for Update
-- std::set<zypp::PoolItem> *candidates2 = zypp_get_patches ();
-+ std::set<zypp::PoolItem> *candidates = zypp_get_patches ();
-+ std::set<zypp::PoolItem> *candidates2 = new std::set<zypp::PoolItem> ();
-+
-+ if (_updating_self) {
-+ pk_backend_require_restart (backend, PK_RESTART_ENUM_SESSION, "Package Management System updated - restart needed");
-+ _updating_self = FALSE;
-+ }
-+ else {
-+ //disabling patchrepo
-+ std::string patchRepo;
-+ if (!candidates->empty ()) {
-+ patchRepo = candidates->begin ()->resolvable ()->repoInfo ().alias ();
-+ }
-+
-+ //get all Updates
-+ candidates2 = zypp_get_updates (patchRepo);
-
-- //concatenate these sets
-+ //concatenate these sets
-
-- candidates->insert (candidates->begin (), candidates->end ());
-+ candidates->insert (candidates2->begin (), candidates2->end ());
-+ }
-
- pk_backend_set_percentage (backend, 80);
- std::set<zypp::PoolItem>::iterator cb = candidates->begin (), ce = candidates->end (), ci;
-@@ -1332,6 +1386,10 @@ backend_repo_enable (PkBackend *backend, const gchar *rid, gboolean enabled)
- repo = manager.getRepositoryInfo (rid);
- repo.setEnabled (enabled);
- manager.modifyRepository (rid, repo);
-+ if (!enabled) {
-+ zypp::Repository repository = zypp::sat::Pool::instance ().reposFind (repo.alias ());
-+ repository.eraseFromPool ();
-+ }
- } catch (const zypp::repo::RepoNotFoundException &ex) {
- pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Couldn't find the specified repository");
- pk_backend_finished (backend);
-@@ -1463,6 +1521,13 @@ backend_update_packages_thread (PkBackend *backend)
- gchar **package_ids;
- package_ids = pk_backend_get_strv (backend, "package_ids");
-
-+ zypp_get_patches (); // make shure _updating_self is set
-+
-+ if (_updating_self) {
-+ pk_debug ("updating self and setting restart");
-+ pk_backend_require_restart (backend, PK_RESTART_ENUM_SESSION, "Package Management System updated - restart needed");
-+ _updating_self = FALSE;
-+ }
- for (guint i = 0; i < g_strv_length (package_ids); i++) {
- zypp::sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
- zypp::PoolItem item = zypp::ResPool::instance ().find (solvable);
-diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
-index 2b848f0..d81d0dd 100644
---- a/backends/zypp/zypp-utils.cpp
-+++ b/backends/zypp/zypp-utils.cpp
-@@ -25,6 +25,8 @@
- #include <sstream>
- #include <stdlib.h>
- #include <glib.h>
-+#include <glib/gstdio.h>
-+#include <glib/gi18n.h>
- #include <zypp/ZYpp.h>
- #include <zypp/ZYppFactory.h>
- #include <zypp/RepoManager.h>
-@@ -45,6 +47,7 @@
- #include <zypp/target/rpm/RpmDb.h>
- #include <zypp/target/rpm/RpmHeader.h>
- #include <zypp/target/rpm/librpmDb.h>
-+#include <zypp/base/LogControl.h>
-
- #include <zypp/base/Logger.h>
-
-@@ -53,6 +56,7 @@
- #include "zypp-utils.h"
-
- gchar * _repoName;
-+gboolean _updating_self = FALSE;
- /**
- * Collect items, select best edition. This is used to find the best
- * available or installed. The name of the class is a bit misleading though ...
-@@ -98,6 +102,34 @@ get_zypp ()
- return zypp;
- }
-
-+/**
-+ * Enable and rotate zypp logging
-+ */
-+gboolean
-+zypp_logging ()
-+{
-+ gchar *file = g_strdup ("/var/log/pk_backend_zypp");
-+ gchar *file_old = g_strdup ("/var/log/pk_backend_zypp-1");
-+
-+ if (g_file_test (file, G_FILE_TEST_EXISTS)) {
-+ struct stat buffer;
-+ g_stat (file, &buffer);
-+ // if the file is bigger than 10 MB rotate
-+ if ((guint)buffer.st_size > 10485760) {
-+ if (g_file_test (file_old, G_FILE_TEST_EXISTS))
-+ g_remove (file_old);
-+ g_rename (file, file_old);
-+ }
-+ }
-+
-+ zypp::base::LogControl::instance ().logfile(file);
-+
-+ g_free (file);
-+ g_free (file_old);
-+
-+ return TRUE;
-+}
-+
- gboolean
- zypp_is_changeable_media (const zypp::Url &url)
- {
-@@ -120,13 +152,13 @@ zypp_build_pool (gboolean include_local)
- zypp::ZYpp::Ptr zypp = get_zypp ();
-
- if (include_local == TRUE) {
-- //FIXME have to wait for fix in zypp (repeated loading of target)
-- if (zypp::sat::Pool::instance().reposFind( zypp::sat::Pool::systemRepoName() ).solvablesEmpty ())
-- {
-- // Add local resolvables
-- zypp::Target_Ptr target = zypp->target ();
-- target->load ();
-- }
-+ //FIXME have to wait for fix in zypp (repeated loading of target)
-+ if (zypp::sat::Pool::instance().reposFind( zypp::sat::Pool::systemRepoAlias() ).solvablesEmpty ())
-+ {
-+ // Add local resolvables
-+ zypp::Target_Ptr target = zypp->target ();
-+ target->load ();
-+ }
- }
-
- // Add resolvables from enabled repos
-@@ -163,16 +195,16 @@ zypp_build_pool (gboolean include_local)
- zypp::ResPool
- zypp_build_local_pool ()
- {
-- zypp::sat::Pool pool = zypp::sat::Pool::instance ();
-+ zypp::sat::Pool pool = zypp::sat::Pool::instance ();
- zypp::ZYpp::Ptr zypp = get_zypp ();
-
- try {
- for (zypp::detail::RepositoryIterator it = pool.reposBegin (); it != pool.reposEnd (); it++){
- if (! it->isSystemRepo ())
-- pool.reposErase(it->name ());
-+ pool.reposErase(it->alias ());
- }
-
-- if (zypp::sat::Pool::instance().reposFind( zypp::sat::Pool::systemRepoName() ).solvablesEmpty ())
-+ if (zypp::sat::Pool::instance().reposFind( zypp::sat::Pool::systemRepoAlias() ).solvablesEmpty ())
- {
- // Add local resolvables
- zypp::Target_Ptr target = zypp->target ();
-@@ -371,27 +403,49 @@ zypp_build_package_id_from_resolvable (zypp::sat::Solvable resolvable)
- package_id = pk_package_id_build (resolvable.name ().c_str (),
- resolvable.edition ().asString ().c_str (),
- resolvable.arch ().asString ().c_str (),
-- resolvable.repository (). name().c_str ());
-+ resolvable.repository (). alias().c_str ());
-
- return package_id;
- }
-
-+zypp::RepoInfo
-+zypp_get_Repository (PkBackend *backend, const gchar *alias)
-+{
-+ zypp::RepoInfo info;
-+
-+ try {
-+ zypp::RepoManager manager;
-+ info = manager.getRepositoryInfo (alias);
-+ } catch (const zypp::repo::RepoNotFoundException &ex) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str() );
-+ return zypp::RepoInfo ();
-+ }
-+
-+ return info;
-+}
-+
- gboolean
- zypp_signature_required (PkBackend *backend, const zypp::PublicKey &key)
- {
- gboolean ok = FALSE;
-
- if (std::find (_signatures[backend]->begin (), _signatures[backend]->end (), key.id ()) == _signatures[backend]->end ()) {
-+ zypp::RepoInfo info = zypp_get_Repository (backend, _repoName);
-+ if (info.type () == zypp::repo::RepoType::NONE) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Repository unknown");
-+ return FALSE;
-+ }
-+
- pk_backend_repo_signature_required (backend,
- "dummy;0.0.1;i386;data",
- _repoName,
-- key.path ().c_str (),
-- key.id ().c_str (),
-+ info.baseUrlsBegin ()->asString ().c_str (),
-+ key.name ().c_str (),
- key.id ().c_str (),
- key.fingerprint ().c_str (),
- key.created ().asString ().c_str (),
- PK_SIGTYPE_ENUM_GPG);
-- pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, "Repo signature verification failed");
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, "Signature verification for Repository %s failed", _repoName);
- }else{
- ok = TRUE;
- }
-@@ -405,16 +459,22 @@ zypp_signature_required (PkBackend *backend, const std::string &file, const std:
- gboolean ok = FALSE;
-
- if (std::find (_signatures[backend]->begin (), _signatures[backend]->end (), id) == _signatures[backend]->end ()) {
-+ zypp::RepoInfo info = zypp_get_Repository (backend, _repoName);
-+ if (info.type () == zypp::repo::RepoType::NONE) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Repository unknown");
-+ return FALSE;
-+ }
-+
- pk_backend_repo_signature_required (backend,
- "dummy;0.0.1;i386;data",
- _repoName,
-- file.c_str (),
-+ info.baseUrlsBegin ()->asString ().c_str (),
- id.c_str (),
- id.c_str (),
- "UNKNOWN",
- "UNKNOWN",
- PK_SIGTYPE_ENUM_GPG);
-- pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, "Repo signature verification failed");
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, "Signature verification for Repository %s failed", _repoName);
- }else{
- ok = TRUE;
- }
-@@ -428,16 +488,22 @@ zypp_signature_required (PkBackend *backend, const std::string &file)
- gboolean ok = FALSE;
-
- if (std::find (_signatures[backend]->begin (), _signatures[backend]->end (), file) == _signatures[backend]->end ()) {
-- pk_backend_repo_signature_required (backend,
-+ zypp::RepoInfo info = zypp_get_Repository (backend, _repoName);
-+ if (info.type () == zypp::repo::RepoType::NONE) {
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Repository unknown");
-+ return FALSE;
-+ }
-+
-+ pk_backend_repo_signature_required (backend,
- "dummy;0.0.1;i386;data",
- _repoName,
-- file.c_str (),
-+ info.baseUrlsBegin ()->asString ().c_str (),
- "UNKNOWN",
- file.c_str (),
- "UNKNOWN",
- "UNKNOWN",
- PK_SIGTYPE_ENUM_GPG);
-- pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, "Repo signature verification failed");
-+ pk_backend_error_code (backend, PK_ERROR_ENUM_GPG_FAILURE, "Signature verification for Repository %s failed", _repoName);
- }else{
- ok = TRUE;
- }
-@@ -481,6 +547,12 @@ zypp_emit_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable>
- system_and_package_are_x86 (*it))
- print = FALSE;
- }
-+ if (i == PK_FILTER_ENUM_SOURCE && !(zypp::isKind<zypp::SrcPackage>(*it))) {
-+ print = FALSE;
-+ }
-+ if (i == PK_FILTER_ENUM_NOT_SOURCE && zypp::isKind<zypp::SrcPackage>(*it)) {
-+ print = FALSE;
-+ }
- //const gchar * myarch = zypp::ZConfig::defaultSystemArchitecture().asString().c_str();
- //pk_debug ("my default arch is %s", myarch);
- }
-@@ -527,7 +599,7 @@ zypp_find_arch_update_item (const zypp::ResPool & pool, zypp::PoolItem item)
- }
-
- std::set<zypp::PoolItem> *
--zypp_get_updates ()
-+zypp_get_updates (std::string repo)
- {
- std::set<zypp::PoolItem> *pks = new std::set<zypp::PoolItem> ();
- zypp::ResPool pool = zypp::ResPool::instance ();
-@@ -542,7 +614,12 @@ zypp_get_updates ()
- zypp::PoolItem candidate = zypp_find_arch_update_item (pool, *it);
- if (!candidate.resolvable ())
- continue;
-- pks->insert (candidate);
-+ if (repo.empty ()) {
-+ pks->insert (candidate);
-+ }else{
-+ if (candidate->repoInfo ().alias ().compare (repo) != 0)
-+ pks->insert (candidate);
-+ }
- }
-
- return pks;
-@@ -552,6 +629,7 @@ std::set<zypp::PoolItem> *
- zypp_get_patches ()
- {
- std::set<zypp::PoolItem> *patches = new std::set<zypp::PoolItem> ();
-+ _updating_self = FALSE;
-
- zypp::ZYpp::Ptr zypp;
- zypp = get_zypp ();
-@@ -561,8 +639,18 @@ zypp_get_patches ()
- for (zypp::ResPoolProxy::const_iterator it = zypp->poolProxy ().byKindBegin<zypp::Patch>();
- it != zypp->poolProxy ().byKindEnd<zypp::Patch>(); it ++) {
- // check if patch is needed
-- if((*it)->candidateObj ().isBroken())
-+ if((*it)->candidateObj ().isBroken()) {
- patches->insert ((*it)->candidateObj ());
-+ zypp::Patch::constPtr patch = zypp::asKind<zypp::Patch>((*it)->candidateObj ().resolvable ());
-+
-+ // check if the patch updates libzypp or packageKit and show only this one
-+ if (patch->restartSuggested ()) {
-+ _updating_self = TRUE;
-+ patches->clear ();
-+ patches->insert ((*it)->candidateObj ());
-+ break;
-+ }
-+ }
-
- }
-
-diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
-index 9e3bad1..4f785cf 100644
---- a/backends/zypp/zypp-utils.h
-+++ b/backends/zypp/zypp-utils.h
-@@ -62,6 +62,11 @@ typedef enum {
- */
- extern std::map<PkBackend *, std::vector<std::string> *> _signatures;
-
-+/** Used to show/install only an update to ourself. This way if we find a critical bug
-+ * in the way we update packages we will install the fix before any other updates.
-+ */
-+extern gboolean _updating_self;
-+
- /** A string to store the last refreshed repo
- * this is needed for gpg-key handling stuff (UGLY HACK)
- * FIXME
-@@ -70,6 +75,11 @@ extern gchar *_repoName;
-
- zypp::ZYpp::Ptr get_zypp ();
-
-+/**
-+ * Enable and rotate logging
-+ */
-+gboolean zypp_logging ();
-+
- gboolean zypp_is_changeable_media (const zypp::Url &url);
-
- /**
-@@ -125,6 +135,12 @@ zypp::sat::Solvable zypp_get_package_by_id (const gchar *package_id);
- gchar * zypp_build_package_id_from_resolvable (zypp::sat::Solvable resolvable);
-
- /**
-+ * Get the RepoInfo
-+ */
-+zypp::RepoInfo
-+zypp_get_Repository (PkBackend *backend, const gchar *alias);
-+
-+/**
- * Ask the User if it is OK to import an GPG-Key for a repo
- */
- gboolean zypp_signature_required (PkBackend *backend, const zypp::PublicKey &key);
-@@ -145,9 +161,9 @@ gboolean zypp_signature_required (PkBackend *backend, const std::string &file, c
- zypp::PoolItem zypp_find_arch_update_item (const zypp::ResPool & pool, zypp::PoolItem item);
-
- /**
-- * Returns a set of all packages the could be updated
-+ * Returns a set of all packages the could be updated (you're able to exclude a repo)
- */
--std::set<zypp::PoolItem> * zypp_get_updates ();
-+std::set<zypp::PoolItem> * zypp_get_updates (std::string repo);
-
- /**
- * Returns a set of all patches the could be installed
-diff --git a/client/pk-console.c b/client/pk-console.c
-index 5a05a8e..ec93978 100644
---- a/client/pk-console.c
-+++ b/client/pk-console.c
-@@ -76,7 +76,6 @@ pk_console_bar (guint subpercentage)
- return;
- }
- if (!has_output_bar) {
-- pk_warning ("no bar");
- return;
- }
- /* restore cursor */
-@@ -487,6 +486,7 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
- guint i;
- guint length;
- PkPackageItem *item;
-+ PkPackageList *list;
-
- /* have we passed a complete package_id? */
- valid = pk_package_id_check (package);
-@@ -508,7 +508,9 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
- }
-
- /* get length of items found */
-- length = pk_client_package_buffer_get_size (client_task);
-+ list = pk_client_get_package_list (client_task);
-+ length = pk_package_list_get_size (list);
-+ g_object_unref (list);
-
- /* didn't resolve to anything, try to get a provide */
- if (length == 0) {
-@@ -524,8 +526,9 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
- }
- }
-
-- /* get length of items found again (we might have has success) */
-- length = pk_client_package_buffer_get_size (client_task);
-+ /* get length of items found again (we might have had success) */
-+ list = pk_client_get_package_list (client_task);
-+ length = pk_package_list_get_size (list);
- if (length == 0) {
- pk_warning (_("Could not find a package match"));
- return NULL;
-@@ -533,7 +536,7 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
-
- /* only found one, great! */
- if (length == 1) {
-- item = pk_client_package_buffer_get_item (client_task, 0);
-+ item = pk_package_list_get_item (list, 0);
- return g_strdup (item->package_id);
- }
-
-@@ -543,14 +546,16 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
- }
- g_print ("%s\n", _("There are multiple package matches"));
- for (i=0; i<length; i++) {
-- item = pk_client_package_buffer_get_item (client_task, i);
-+ item = pk_package_list_get_item (list, i);
- g_print ("%i. %s\n", i+1, item->package_id);
- }
-
- /* find out what package the user wants to use */
- i = pk_console_get_number (_("Please enter the package number: "), length);
-- item = pk_client_package_buffer_get_item (client_task, i-1);
-+ item = pk_package_list_get_item (list, i-1);
- pk_debug ("package_id = %s", item->package_id);
-+ g_object_unref (list);
-+
- return g_strdup (item->package_id);
- }
-
-@@ -574,7 +579,8 @@ pk_console_install_stuff (PkClient *client, gchar **packages, GError **error)
- array_files = g_ptr_array_new ();
- length = g_strv_length (packages);
- for (i=2; i<length; i++) {
-- is_local = g_file_test (packages[i], G_FILE_TEST_EXISTS);
-+ /* are we a local file */
-+ is_local = g_file_test (packages[i], G_FILE_TEST_EXISTS & G_FILE_TEST_IS_REGULAR);
- if (is_local) {
- g_ptr_array_add (array_files, g_strdup (packages[i]));
- } else {
-@@ -720,6 +726,7 @@ pk_console_remove_packages (PkClient *client, gchar **packages, GError **error)
- GPtrArray *array;
- gchar **package_ids = NULL;
- PkPackageList *list;
-+ PkPackageList *list_single;
-
- array = g_ptr_array_new ();
- list = pk_package_list_new ();
-@@ -769,11 +776,13 @@ pk_console_remove_packages (PkClient *client, gchar **packages, GError **error)
- }
-
- /* see how many packages there are */
-- size = pk_client_package_buffer_get_size (client_task);
-+ list_single = pk_client_get_package_list (client_task);
-+ size = pk_package_list_get_size (list_single);
- for (j=0; j<size; j++) {
-- item = pk_client_package_buffer_get_item (client_task, j);
-+ item = pk_package_list_get_item (list_single, j);
- pk_package_list_add_item (list, item);
- }
-+ g_object_unref (list_single);
- }
-
- /* one of the get-requires failed */
-diff --git a/client/pk-import-desktop.c b/client/pk-import-desktop.c
-index f5be0a5..bfe364f 100644
---- a/client/pk-import-desktop.c
-+++ b/client/pk-import-desktop.c
-@@ -44,53 +44,58 @@ static gchar *
- pk_desktop_get_name_for_file (const gchar *filename)
- {
- guint size;
-- gchar *name;
-+ gchar *name = NULL;
- PkPackageItem *item;
- PkPackageId *pid;
- gboolean ret;
- GError *error = NULL;
-+ PkPackageList *list = NULL;
-
- /* use PK to find the correct package */
- ret = pk_client_reset (client, &error);
- if (!ret) {
- pk_warning ("failed to reset client: %s", error->message);
- g_error_free (error);
-- return NULL;
-+ goto out;
- }
-
- ret = pk_client_search_file (client, PK_FILTER_ENUM_INSTALLED, filename, &error);
- if (!ret) {
- pk_warning ("failed to search file: %s", error->message);
- g_error_free (error);
-- return NULL;
-+ goto out;
- }
-
- /* check that we only matched one package */
-- size = pk_client_package_buffer_get_size (client);
-+ list = pk_client_get_package_list (client);
-+ size = pk_package_list_get_size (list);
- if (size != 1) {
- pk_warning ("not correct size, %i", size);
-- return NULL;
-+ goto out;
- }
-
- /* get the item */
-- item = pk_client_package_buffer_get_item (client, 0);
-+ item = pk_package_list_get_item (list, 0);
- if (item == NULL) {
- pk_error ("cannot get item");
-- return NULL;
-+ goto out;
- }
-
- /* get the package name */
- pid = pk_package_id_new_from_string (item->package_id);
- if (pid == NULL) {
- pk_error ("cannot allocate package id");
-- return NULL;
-+ goto out;
- }
-
- /* strip the name */
- name = g_strdup (pid->name);
- pk_package_id_free (pid);
-
-- /* return a copy */
-+out:
-+ if (list != NULL) {
-+ g_object_unref (list);
-+ }
- return name;
- }
-
-diff --git a/client/pk-import-specspo.c b/client/pk-import-specspo.c
-index cf14cc2..bffd45b 100644
---- a/client/pk-import-specspo.c
-+++ b/client/pk-import-specspo.c
-@@ -56,6 +56,7 @@ pk_import_specspo_get_summary (const gchar *name)
- gboolean ret;
- PkPackageItem *item;
- GError *error = NULL;
-+ PkPackageList *list;
-
- ret = pk_client_reset (client, &error);
- if (!ret) {
-@@ -74,18 +75,21 @@ pk_import_specspo_get_summary (const gchar *name)
- }
-
- /* check that we only matched one package */
-- size = pk_client_package_buffer_get_size (client);
-+ list = pk_client_get_package_list (client);
-+ size = pk_package_list_get_size (list);
- if (size != 1) {
- pk_warning ("not correct size, %i", size);
- return NULL;
- }
-
- /* get the item */
-- item = pk_client_package_buffer_get_item (client, 0);
-+ item = pk_package_list_get_item (list, 0);
- if (item == NULL) {
- pk_error ("cannot get item");
-+ g_object_unref (list);
- return NULL;
- }
-+ g_object_unref (list);
-
- return item->summary;
- }
-diff --git a/configure.ac b/configure.ac
-index f614d2b..7510b03 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -223,7 +223,6 @@ AC_ARG_ENABLE(gprof, AS_HELP_STRING([--enable-gprof],[compile with gprof support
- # backends
- AC_ARG_ENABLE(alpm, AS_HELP_STRING([--enable-alpm],[use the ALPM backend]),enable_alpm=$enableval,enable_alpm=no)
- AC_ARG_ENABLE(apt, AS_HELP_STRING([--enable-apt],[use the APT backend]),enable_apt=$enableval,enable_apt=no)
--AC_ARG_ENABLE(apt2, AS_HELP_STRING([--enable-apt2],[use the DBus based APT backend]),enable_apt2=$enableval,enable_apt2=no)
- AC_ARG_ENABLE(box, AS_HELP_STRING([--enable-box],[use the BOX backend]),enable_box=$enableval,enable_box=no)
- AC_ARG_ENABLE(conary, AS_HELP_STRING([--enable-conary],[use the CONARY backend]),enable_conary=$enableval,enable_conary=no)
- AC_ARG_ENABLE(dummy, AS_HELP_STRING([--enable-dummy],[use the dummy backend]),enable_dummy=$enableval,enable_dummy=yes)
-@@ -231,6 +230,7 @@ AC_ARG_ENABLE(opkg, AS_HELP_STRING([--enable-opkg],[use the OPKG backend]),enabl
- AC_ARG_ENABLE(pisi, AS_HELP_STRING([--enable-pisi],[use the PiSi backend]),enable_pisi=$enableval,enable_pisi=no)
- AC_ARG_ENABLE(poldek, AS_HELP_STRING([--enable-poldek],[use the poldek backend]),enable_poldek=$enableval,enable_poldek=no)
- AC_ARG_ENABLE(smart, AS_HELP_STRING([--enable-smart],[use the SMART backend]),enable_smart=$enableval,enable_smart=no)
-+AC_ARG_ENABLE(urpmi, AS_HELP_STRING([--enable-urpmi],[use the URPMI backend]),enable_urpmi=$enableval,enable_urpmi=no)
- AC_ARG_ENABLE(yum, AS_HELP_STRING([--enable-yum],[use the YUM backend]),enable_yum=$enableval,enable_yum=no)
- AC_ARG_ENABLE(yum2, AS_HELP_STRING([--enable-yum2],[use the YUM DBUS backend]),enable_yum2=$enableval,enable_yum2=no)
- AC_ARG_ENABLE(zypp, AS_HELP_STRING([--enable-zypp],[use the Zypp backend]),enable_zypp=$enableval,enable_zypp=no)
-@@ -238,7 +238,6 @@ AC_ARG_ENABLE(zypp, AS_HELP_STRING([--enable-zypp],[use the Zypp backend]),enabl
- # export to Makefile.am's
- AM_CONDITIONAL(BACKEND_TYPE_ALPM, [test x$enable_alpm = xyes], [using ALPM backend])
- AM_CONDITIONAL(BACKEND_TYPE_APT, [test x$enable_apt = xyes], [using APT backend])
--AM_CONDITIONAL(BACKEND_TYPE_APT_DBUS, [test x$enable_apt2 = xyes], [using DBus based APT backend])
- AM_CONDITIONAL(BACKEND_TYPE_BOX, [test x$enable_box = xyes], [using BOX backend])
- AM_CONDITIONAL(BACKEND_TYPE_CONARY, [test x$enable_conary = xyes], [using CONARY backend])
- AM_CONDITIONAL(BACKEND_TYPE_DUMMY, [test x$enable_dummy = xyes], [using dummy backend])
-@@ -246,6 +245,7 @@ AM_CONDITIONAL(BACKEND_TYPE_OPKG, [test x$enable_opkg = xyes], [using OPKG backe
- AM_CONDITIONAL(BACKEND_TYPE_PISI, [test x$enable_pisi = xyes], [using PiSi backend])
- AM_CONDITIONAL(BACKEND_TYPE_POLDEK, [test x$enable_poldek = xyes], [using poldek backend])
- AM_CONDITIONAL(BACKEND_TYPE_SMART, [test x$enable_smart = xyes], [using SMART backend])
-+AM_CONDITIONAL(BACKEND_TYPE_URPMI, [test x$enable_urpmi = xyes], [using URPMI backend])
- AM_CONDITIONAL(BACKEND_TYPE_YUM, [test x$enable_yum = xyes], [using YUM backend])
- AM_CONDITIONAL(BACKEND_TYPE_YUM2, [test x$enable_yum2 = xyes], [using YUM DBUS backend])
- AM_CONDITIONAL(BACKEND_TYPE_ZYPP, [test x$enable_zypp = xyes], [using Zypp backend])
-@@ -369,7 +369,7 @@ dnl ---------------------------------------------------------------------------
- AC_ARG_WITH([default_backend],
- AS_HELP_STRING([--with-default-backend=<option>],
- [Default backend to use
-- alpm,apt,apt2,box,conary,dummy,smart,yum,pisi,zypp,opkg (dummy)]))
-+ alpm,apt,box,conary,dummy,smart,urpmi,yum,pisi,zypp,opkg (dummy)]))
- # default to a sane option for the installed tool
- if test x$with_default_backend = x; then
- if test -f /usr/bin/yum ; then
-@@ -388,6 +388,8 @@ if test x$with_default_backend = x; then
- with_default_backend=pisi
- elif test -f /usr/bin/poldek ; then
- with_default_backend=poldek
-+ elif test -f /usr/bin/urpmq ; then
-+ with_default_backend=urpmi
- elif test -f /usr/bin/zypper ; then
- with_default_backend=zypp
- else
-@@ -398,134 +400,8 @@ fi
- AC_DEFINE_UNQUOTED(DEFAULT_BACKEND, "$with_default_backend", [default backend prefix])
- AC_SUBST(DEFAULT_BACKEND, "$with_default_backend")
-
--AC_DEFUN([APT_BACKEND],
--[
-- if test "$APT_PKG_TYPE" == "" ; then
-- AC_LANG_PUSH(C++)
-- _libaptpkg_save_cppflags=$CPPFLAGS
-- CPPFLAGS="$APT_CFLAGS $CPPFLAGS"
-- _APT_save_libs=$LIBS
-- LIBS="$APT_LIBS $LIBS"
--
-- AC_MSG_CHECKING([for apt support for $1 packages])
-- AC_RUN_IFELSE(AC_LANG_PROGRAM([
-- #include <apt-pkg/configuration.h>
-- #include <apt-pkg/pkgsystem.h>
-- #include <apt-pkg/init.h>
-- #include <stdio.h>
-- ],[
-- if (pkgInitConfig(*_config) == false)
-- {
-- fprintf(stderr,"pkginitconfig was false");
-- return -1;
-- }
-- if (pkgInitSystem(*_config, _system) == false)
-- {
-- fprintf(stderr,"pkginitsystem was false");
-- return -1;
-- }
-- if (_system->ArchiveSupported("$1"))
-- return 0;
-- else
-- return 1;
-- ]),[
-- APT_PKG_TYPE=$1
-- AC_MSG_RESULT([yes])
-- AC_DEFINE(APT_PKG_$2,1,[apt-pkg support files of type $1])
-- ],)
-- AC_LANG_POP(C++)
-- CPPFLAGS=$_libaptpkg_save_cppflags
-- LIBS=$_libaptpkg_save_libs
-- unset _libaptpkg_save_cppflags
-- unset _libaptpkg_save_libs
-- fi
--])
--
- if test x$enable_apt = xyes; then
- PY_CHECK_MOD([apt_pkg],,,AC_MSG_ERROR([Apt backend needs python-apt]))
--
-- AC_ARG_WITH([apt_search],
-- AS_HELP_STRING([--with-apt-search=<option>],
-- [Apt search type to use - plain,sqlite (plain)]))
--
-- if test x$with_apt_search = x; then
-- with_apt_search=plain
-- fi
-- AC_MSG_NOTICE([using $with_apt_search for apt searching])
-- AC_DEFINE_UNQUOTED(APT_SEARCH, "$with_apt_search", [apt search type])
-- AC_SUBST(APT_SEARCH, $with_apt_search)
-- AM_CONDITIONAL(APT_SEARCH_PLAIN, [test x$with_apt_search = xplain], [using plain apt search])
-- AM_CONDITIONAL(APT_SEARCH_SQLITE, [test x$with_apt_search = xsqlite], [using sqlite apt search])
--
-- AC_ARG_WITH(libapt-pkg-lib,
-- AC_HELP_STRING([--with-libapt-pkg-lib=DIR],[look for the libapt-pkg library in DIR]),
-- [_libaptpkg_with_lib=$withval],[_libaptpkg_with_lib=no])
-- if test "$_libaptpkg_with_lib" == "no" ; then
-- APT_LIBS="-lapt-pkg"
-- else
-- APT_LIBS="-L$withval -lapt-pkg"
-- fi
--
-- AC_ARG_WITH(libapt-pkg-includes,
-- AC_HELP_STRING([--with-libapt-pkg-includes=DIR],[look for the libapt-pkg includes in DIR]),
-- [_libaptpkg_with_inc=$withval],[_libaptpkg_with_inc=no])
-- if test "$_libaptpkg_with_inc" == "no" ; then
-- APT_CFLAGS="-I/usr/include/apt-pkg"
-- else
-- APT_CFLAGS="-I$withval"
-- fi
--
-- AC_CACHE_CHECK([whether libapt-pkg is usable],
-- [libaptpkg_usable],
-- [
-- _libaptpkg_save_cppflags=$CPPFLAGS
-- CPPFLAGS="$APT_CFLAGS $CPPFLAGS"
-- _APT_save_libs=$LIBS
-- LIBS="$APT_LIBS $LIBS"
--
-- AC_LANG_PUSH(C++)
-- AC_LINK_IFELSE(AC_LANG_PROGRAM([
-- #include <apt-pkg/configuration.h>
-- #include <apt-pkg/pkgsystem.h>
-- #include <apt-pkg/init.h>
-- #include <stdio.h>
-- ],[
-- if (pkgInitConfig(*_config) == false)
-- {
-- fprintf(stderr,"pkginitconfig was false");
-- return -1;
-- }
-- if (pkgInitSystem(*_config, _system) == false)
-- {
-- fprintf(stderr,"pkginitsystem was false");
-- return -1;
-- }
-- return 0;
--]),libaptpkg_usable=yes,AC_MSG_ERROR([libapt-pkg not found]))
--
-- CPPFLAGS=$_libaptpkg_save_cppflags
-- LIBS=$_libaptpkg_save_libs
-- unset _libaptpkg_save_cppflags
-- unset _libaptpkg_save_libs
-- ])
-- AC_LANG_POP(C++)
--
-- APT_BACKEND(deb,DEB)
-- APT_BACKEND(rpm,RPM)
-- if test "$APT_PKG_TYPE" == "" ; then
-- AC_MSG_ERROR([Couldn't find support for any type of packages that we know about for Apt!])
-- fi
--
-- AC_SUBST(APT_CFLAGS)
-- AC_SUBST(APT_LIBS)
-- AC_SUBST(APT_PKG_TYPE)
--else
-- AM_CONDITIONAL(APT_SEARCH_PLAIN, [false])
-- AM_CONDITIONAL(APT_SEARCH_SQLITE, [false])
--fi
--
--if test x$enable_apt2 = xyes; then
-- PY_CHECK_MOD([apt_pkg],,,AC_MSG_ERROR([Apt backend needs python-apt]))
- fi
-
- if test x$enable_box = xyes; then
-@@ -535,7 +411,7 @@ if test x$enable_box = xyes; then
- fi
-
- if test x$enable_opkg = xyes; then
-- PKG_CHECK_MODULES(OPKG, libopkg = 0.1.4)
-+ PKG_CHECK_MODULES(OPKG, libopkg = 0.1.5)
- AC_SUBST(OPKG_CFLAGS)
- AC_SUBST(OPKG_LIBS)
- fi
-@@ -555,7 +431,7 @@ if test x$enable_poldek = xyes; then
- fi
-
- if test x$enable_zypp = xyes; then
-- PKG_CHECK_MODULES(ZYPP, libzypp >= 4.14.0)
-+ PKG_CHECK_MODULES(ZYPP, libzypp >= 4.25.0)
- AC_SUBST(ZYPP_CFLAGS)
- AC_SUBST(ZYPP_LIBS)
- fi
-@@ -568,11 +444,6 @@ AC_SUBST(PK_PLUGIN_DIR, "\$(libdir)/packagekit-backend")
- AC_SUBST(PK_PLUGIN_CFLAGS, "-I\$(top_srcdir)/src -I\$(top_srcdir)/libpackagekit $GLIB_CFLAGS $DBUS_CFLAGS $GMODULE_CFLAGS")
- AC_SUBST(PK_PLUGIN_LIBS, "$GLIB_LIBS $DBUS_LIBS $GMODULE_LIBS")
-
--if test x$with_default_backend = xapt; then
-- # now we've done the conditionals, rename for searching backend
-- with_default_backend="apt (with $with_apt_search searching)"
--fi
--
- dnl ---------------------------------------------------------------------------
- dnl - Makefiles, etc.
- dnl ---------------------------------------------------------------------------
-@@ -592,8 +463,6 @@ contrib/yum-packagekit/Makefile
- backends/Makefile
- backends/alpm/Makefile
- backends/apt/Makefile
--backends/apt/helpers/Makefile
--backends/apt2/Makefile
- backends/box/Makefile
- backends/conary/Makefile
- backends/conary/helpers/Makefile
-@@ -603,6 +472,10 @@ backends/smart/Makefile
- backends/smart/helpers/Makefile
- backends/test/Makefile
- backends/test/helpers/Makefile
-+backends/urpmi/Makefile
-+backends/urpmi/helpers/Makefile
-+backends/urpmi/helpers/perl_packagekit/Makefile
-+backends/urpmi/helpers/urpmi_backend/Makefile
- backends/yum/Makefile
- backends/yum/helpers/Makefile
- backends/yum2/Makefile
-@@ -650,7 +523,6 @@ echo "
- Backends:
- ALPM backend: ${enable_alpm}
- APT backend: ${enable_apt}
-- APT DBus backend: ${enable_apt2}
- BOX backend: ${enable_box}
- CONARY backend: ${enable_conary}
- dummy backend: ${enable_dummy}
-@@ -658,6 +530,7 @@ echo "
- PiSi backend: ${enable_pisi}
- poldek backend: ${enable_poldek}
- SMART backend: ${enable_smart}
-+ URPMI backend: ${enable_urpmi}
- YUM backend: ${enable_yum}
- YUM2 backend: ${enable_yum2}
- Zypp backend: ${enable_zypp}
-diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
-index 4d4a7e3..61a67d1 100644
---- a/contrib/PackageKit.spec.in
-+++ b/contrib/PackageKit.spec.in
-@@ -10,6 +10,7 @@ Summary: System daemon that is a DBUS abstraction layer for packages
- Name: PackageKit
- Version: #VERSION#
- Release: 0.#BUILD#%{?alphatag}%{?dist}
-+Epoch: 1
- License: GPLv2+
- Group: System Environment/Libraries
- URL: http://packagekit.freedesktop.org
-@@ -17,8 +18,8 @@ Source0: http://people.freedesktop.org/~hughsient/releases/%{name}-%{version}.
- BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-
- Requires: dbus >= %{dbus_version}
--Requires: PackageKit-libs = %{version}-%{release}
--Requires: yum-packagekit = %{version}-%{release}
-+Requires: PackageKit-libs = %{epoch}:%{version}-%{release}
-+Requires: yum-packagekit = %{epoch}:%{version}-%{release}
- Requires: yum >= 3.2.6
-
- BuildRequires: glib2-devel >= %{glib2_version}
-@@ -69,7 +70,7 @@ will almost instantly update itself to reflect this.
- Summary: Libraries for accessing PackageKit
- Group: Development/Libraries
- Requires: dbus >= %{dbus_version}
--Requires: %{name} = %{version}-%{release}
-+Requires: %{name} = %{epoch}:%{version}-%{release}
-
- %description libs
- Libraries for accessing PackageKit.
-@@ -78,7 +79,7 @@ Libraries for accessing PackageKit.
- Summary: Cron job and related utilities for PackageKit
- Group: System Environment/Base
- Requires: cronie
--Requires: %{name} = %{version}-%{release}
-+Requires: %{name} = %{epoch}:%{version}-%{release}
-
- %description cron
- Crontab and utilities for running PackageKit as a cron job.
-@@ -86,7 +87,7 @@ Crontab and utilities for running PackageKit as a cron job.
- %package devel
- Summary: Libraries and headers for PackageKit
- Group: Development/Libraries
--Requires: %{name} = %{version}-%{release}
-+Requires: %{name} = %{epoch}:%{version}-%{release}
- Requires: dbus-devel >= %{dbus_version}
- Requires: pkgconfig
- Requires: sqlite-devel
-diff --git a/contrib/gnome-packagekit.spec.in b/contrib/gnome-packagekit.spec.in
-index a97fc3b..ded7799 100644
---- a/contrib/gnome-packagekit.spec.in
-+++ b/contrib/gnome-packagekit.spec.in
-@@ -6,6 +6,7 @@ Summary: GNOME PackageKit Client
- Name: gnome-packagekit
- Version: #VERSION#
- Release: 0.#BUILD#%{?alphatag}%{?dist}
-+Epoch: 1
- License: GPLv2+
- Group: Applications/System
- URL: http://www.packagekit.org
-diff --git a/docs/html/pk-authors.html b/docs/html/pk-authors.html
-index 607a7a4..7aa298b 100644
---- a/docs/html/pk-authors.html
-+++ b/docs/html/pk-authors.html
-@@ -262,6 +262,22 @@
- </td>
- </tr>
-
-+<tr>
-+ <td>
-+ <img src="img/author-unknown.png" alt=""/><!-- image should be 120px wide -->
-+ </td>
-+ <td>
-+ <h2>Aurelien Lefebvre</h2>
-+ <p>
-+ Aurelien works for <a href="http://www.mandriva.org">Mandriva</a>.
-+ He works on the urpmi backend of PackageKit.
-+ </p>
-+ <p>
-+ <b>Responsible for: urpmi backend</b>
-+ </p>
-+ </td>
-+</tr>
-+
- </table>
-
- <p>Back to the <a href="index.html">main page</a></p>
-diff --git a/docs/html/pk-download.html b/docs/html/pk-download.html
-index 0cdc85c..d276a05 100644
---- a/docs/html/pk-download.html
-+++ b/docs/html/pk-download.html
-@@ -44,7 +44,7 @@ easier to install.
- <h2>Released Versions</h2>
- <p>
- Released versions are found on
--<a href="http://people.freedesktop.org/~hughsient/releases/">people.freedesktop.org</a>.
-+<a href="http://www.packagekit.org/releases/">http://www.packagekit.org/releases/</a>.
- </p>
- <table>
- <tr><td><b>Version</b></td><td>&nbsp;&nbsp;</td><td><b>Date</b></td></tr>
-diff --git a/docs/html/pk-faq.html b/docs/html/pk-faq.html
-index efa8344..3e37cc1 100644
---- a/docs/html/pk-faq.html
-+++ b/docs/html/pk-faq.html
-@@ -22,6 +22,7 @@
- <h2>Table Of Contents</h2>
- <ul>
- <li><a href="#how-complete">How complete are the backends?</a></li>
-+<li><a href="#1-click-install">Does PackageKit support 1-Click Install?</a></li>
- <li><a href="#run-as-root">When run as root, gpk-application and pkcon do not work!</a></li>
- <li><a href="#session-system">Why is there a session service and and a system service?</a></li>
- <li><a href="#session-methods">How do I use PackageKit in my application?</a></li>
-@@ -52,7 +53,6 @@
- <tr>
- <td width="150px">&nbsp;</td>
- <td><center>apt</center></td>
--<td><center>apt2</center></td>
- <td><center>alpm</center></td>
- <td><center>box</center></td>
- <td><center>conary</center></td>
-@@ -60,14 +60,14 @@
- <td><center>pisi</center></td>
- <td><center>poldek</center></td>
- <td><center>smart</center></td>
-+<td><center>urpmi</center></td>
- <td><center>yum</center></td>
- <td><center>yum2</center></td>
- <td><center>zypp</center></td>
- </tr>
- <tr>
- <td><b>Resolve</b></td>
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -75,6 +75,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -82,7 +83,6 @@
- <tr>
- <td><b>RefreshCache</b></td>
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -90,14 +90,14 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
- </tr>
- <tr>
- <td><b>GetUpdates</b></td>
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -105,14 +105,14 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
- </tr>
- <tr>
- <td><b>UpdateSystem</b></td>
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -120,6 +120,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -127,7 +128,6 @@
- <tr>
- <td><b>SearchName</b></td>
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -135,6 +135,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -142,7 +143,6 @@
- <tr>
- <td><b>SearchDetails</b></td>
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -150,6 +150,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -157,7 +158,6 @@
- <tr>
- <td><b>SearchFile</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -165,6 +165,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -172,22 +173,21 @@
- <tr>
- <td><b>SearchGroup</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- opkg -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
- </tr>
- <tr>
- <td><b>InstallPackages</b></td>
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -195,6 +195,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -202,7 +203,6 @@
- <tr>
- <td><b>InstallFiles</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -210,14 +210,14 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
- </tr>
- <tr>
- <td><b>RemovePackages</b></td>
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -225,6 +225,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -232,7 +233,6 @@
- <tr>
- <td><b>UpdatePackage</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -240,6 +240,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -247,7 +248,6 @@
- <tr>
- <td><b>GetDepends</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -255,6 +255,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -262,7 +263,6 @@
- <tr>
- <td><b>GetRequires</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -270,6 +270,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -277,7 +278,6 @@
- <tr>
- <td><b>GetDetails</b></td>
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -285,6 +285,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -292,7 +293,6 @@
- <tr>
- <td><b>GetFiles</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -300,6 +300,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -307,7 +308,6 @@
- <tr>
- <td><b>GetUpdateDetail</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -315,6 +315,7 @@
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
-@@ -322,7 +323,6 @@
- <tr>
- <td><b>GetRepoList</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -330,6 +330,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -337,7 +338,6 @@
- <tr>
- <td><b>RepoEnable</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -345,6 +345,7 @@
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -352,7 +353,6 @@
- <tr>
- <td><b>RepoSetData</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -360,6 +360,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -367,7 +368,6 @@
- <tr>
- <td><b>Cancel</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -375,6 +375,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
-@@ -382,7 +383,6 @@
- <tr>
- <td><b>ServicePack</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -390,6 +390,7 @@
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
-@@ -397,22 +398,21 @@
- <tr>
- <td><b>WhatProvides</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- opkg -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
- </tr>
- <tr>
- <td><b>GetPackages</b></td>
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- apt -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -420,6 +420,7 @@
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[good]"/></td><!-- zypp -->
-@@ -431,7 +432,6 @@
- <tr>
- <td width="150px">&nbsp;</td>
- <td><center>apt</center></td>
--<td><center>apt2</center></td>
- <td><center>alpm</center></td>
- <td><center>box</center></td>
- <td><center>conary</center></td>
-@@ -439,6 +439,7 @@
- <td><center>pisi</center></td>
- <td><center>poldek</center></td>
- <td><center>smart</center></td>
-+<td><center>urpmi</center></td>
- <td><center>yum</center></td>
- <td><center>yum2</center></td>
- <td><center>zypp</center></td>
-@@ -446,7 +447,6 @@
- <tr>
- <td><b>Installed</b></td>
- <td><img src="img/status-good.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-good.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- conary -->
-@@ -454,6 +454,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
-@@ -461,7 +462,6 @@
- <tr>
- <td><b>Development</b></td>
- <td><img src="img/status-good.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -469,6 +469,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
-@@ -476,7 +477,6 @@
- <tr>
- <td><b>GUI</b></td>
- <td><img src="img/status-good.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-good.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -484,6 +484,7 @@
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
-@@ -491,7 +492,6 @@
- <tr>
- <td><b>Free</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
-@@ -499,6 +499,7 @@
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
-@@ -506,13 +507,13 @@
- <tr>
- <td><b>Visible</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- opkg -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
-@@ -521,13 +522,13 @@
- <tr>
- <td><b>Supported</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- opkg -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
-@@ -536,13 +537,13 @@
- <tr>
- <td><b>Newest</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- opkg -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-good.png" alt="[yes]"/></td><!-- poldek -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
-@@ -551,13 +552,13 @@
- <tr>
- <td><b>Arch</b></td>
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt -->
--<td><img src="img/status-bad.png" alt="[no]"/></td><!-- apt2 -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- alpm -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- box -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- conary -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- opkg -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
-+<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum -->
- <td><img src="img/status-bad.png" alt="[no]"/></td><!-- yum2 -->
-@@ -566,6 +567,43 @@
- </table>
-
- <hr>
-+<h3><a name="1-click-install">Does PackageKit support 1-Click Install?</a></h3>
-+<p>
-+No, as they are a potential security problem. The issues are as follows:
-+</p>
-+<ul>
-+<li>
-+That some developer creates a repository with a package with a higher package epoch, and then the
-+distro releases a critical security package (with an updated version, but smaller epoch) and the
-+package does not get upgraded, leaving the user vulnerable.
-+</li>
-+<li>
-+The user installs some random repository, where the developer pushes a few svn packages.
-+The developer gets bored, and stop produces updates, and then one of the old packages blocks
-+on the distribution update, causing no further automatic system updates.
-+</li>
-+<li>
-+There's no signing of 1-click-install files, so we can't actually be sure that they come from a
-+reputable source.
-+</li>
-+<li>
-+There's no localisation in the 1-click-files.
-+For instance, if we only show a French language speaker a description of "remote exploit trojan"
-+they are not going to understand the description.
-+</li>
-+</ul>
-+<p>
-+So what's the solution? Using a standard <code>$vendor-release.rpm</code> or <code>.deb</code>
-+you can ship the standard repo or source with a signed GPG key.
-+</p>
-+<p>
-+Quoting Sebastian Heinlein,
-+<i>Allowing to easily add third party repositories and install third party software without a
-+certification infrastructure is like opening the gates to hell.
-+Most user just don't have got the technical understanding to handle this well.</i>
-+</p>
-+
-+<hr>
- <h3><a name="run-as-root">When run as root, <code>gpk-application</code> and <code>pkcon</code> do not work!</a></h3>
- <p>
- GTK+ tools should not be run as the root user, <b>PERIOD</b>.
-diff --git a/docs/spec/pk-concepts.xml b/docs/spec/pk-concepts.xml
-index 0b75b10..51a165a 100644
---- a/docs/spec/pk-concepts.xml
-+++ b/docs/spec/pk-concepts.xml
-@@ -402,6 +402,13 @@
- signature is not valid in some way.
- </entry>
- </row>
-+ <row>
-+ <entry><literal>package-corrupt</literal></entry>
-+ <entry>
-+ The downloaded package is corrupt.
-+ </entry>
-+ </row>
-+
- </tbody>
- </tgroup>
- </informaltable>
-diff --git a/docs/spec/pk-signals.xml b/docs/spec/pk-signals.xml
-index a79e647..2970dda 100644
---- a/docs/spec/pk-signals.xml
-+++ b/docs/spec/pk-signals.xml
-@@ -360,11 +360,21 @@
- </row>
- <row>
- <entry><literal>updates</literal></entry>
-- <entry>A list of package_id's that are to be updated</entry>
-+ <entry>
-+ A list of package_id's that are to be updated, seporated by <literal>^</literal>.
-+ This odd delimited was chosen as <literal>\t</literal> is already being used in the
-+ spawned backends, and <literal>^</literal> is a banned character in a package_id.
-+ This will change in 0.3.x where <literal>updates</literal> will be a proper string
-+ array field.
-+ </entry>
- </row>
- <row>
- <entry><literal>obsoletes</literal></entry>
-- <entry>A list of package_id's that are to be obsoletes</entry>
-+ <entry>
-+ A list of package_id's that are to be obsoleted, seporated by <literal>^</literal>
-+ This will change in 0.3.x where <literal>obsoletes</literal> will be a proper string
-+ array field.
-+ </entry>
- </row>
- <row>
- <entry><literal>vendor_url</literal></entry>
-diff --git a/etc/PackageKit.conf.in b/etc/PackageKit.conf.in
-index 8f9bd57..7a48320 100644
---- a/etc/PackageKit.conf.in
-+++ b/etc/PackageKit.conf.in
-@@ -39,5 +39,5 @@ DefaultBackend=@defaultbackend@
- # They are in the format username:password@server:port
- #
- # ProxyHTTP=username:password@server.lan:8080
--# ProxyFTP=username:password@server.lan:21
-+# ProxyFTP=server.lan:21
-
-diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
-index dd2387b..8fb82f1 100644
---- a/libpackagekit/pk-client.c
-+++ b/libpackagekit/pk-client.c
-@@ -275,7 +275,7 @@ pk_client_get_tid (PkClient *client)
- * If the package buffer is enabled then after the transaction has completed
- * then the package list can be retrieved in one go, rather than processing
- * each package request async.
-- * If this is not set true explicitly, then pk_client_package_buffer_get_size
-+ * If this is not set true explicitly, then pk_client_get_package_list
- * will always return zero items.
- *
- * This is not forced on as there may be significant overhead if the list
-@@ -364,26 +364,7 @@ pk_client_get_require_restart (PkClient *client)
- }
-
- /**
-- * pk_client_package_buffer_get_size:
-- * @client: a valid #PkClient instance
-- *
-- * We do not provide access to the internal package list (as it could be being
-- * updated) so provide a way to get access to the current size here.
-- *
-- * Return value: The size of the package buffer.
-- **/
--guint
--pk_client_package_buffer_get_size (PkClient *client)
--{
-- g_return_val_if_fail (PK_IS_CLIENT (client), 0);
-- if (!client->priv->use_buffer) {
-- return 0;
-- }
-- return pk_package_list_get_size (client->priv->package_list);
--}
--
--/**
-- * pk_client_package_buffer_get_item:
-+ * pk_client_get_package_list:
- * @client: a valid #PkClient instance
- * @item: the item in the package buffer
- *
-@@ -392,14 +373,17 @@ pk_client_package_buffer_get_size (PkClient *client)
- *
- * Return value: The #PkPackageItem or %NULL if not found or invalid
- **/
--PkPackageItem *
--pk_client_package_buffer_get_item (PkClient *client, guint item)
-+PkPackageList *
-+pk_client_get_package_list (PkClient *client)
- {
-+ PkPackageList *list;
- g_return_val_if_fail (PK_IS_CLIENT (client), NULL);
- if (!client->priv->use_buffer) {
- return NULL;
- }
-- return pk_package_list_get_item (client->priv->package_list, item);
-+ list = client->priv->package_list;
-+ g_object_ref (list);
-+ return list;
- }
-
- /**
-@@ -412,6 +396,10 @@ pk_client_finished_cb (DBusGProxy *proxy, const gchar *exit_text, guint runtime,
-
- g_return_if_fail (PK_IS_CLIENT (client));
-
-+ /* ref in case we unref the PkClient in ::finished --
-+ * see https://bugzilla.novell.com/show_bug.cgi?id=390929 for rationale */
-+ g_object_ref (client);
-+
- exit = pk_exit_enum_from_text (exit_text);
- pk_debug ("emit finished %s, %i", exit_text, runtime);
-
-@@ -420,16 +408,13 @@ pk_client_finished_cb (DBusGProxy *proxy, const gchar *exit_text, guint runtime,
-
- g_signal_emit (client, signals [PK_CLIENT_FINISHED], 0, exit, runtime);
-
-- /* check we are still valid */
-- if (!PK_IS_CLIENT (client)) {
-- pk_debug ("client was g_object_unref'd in finalise, object no longer valid");
-- return;
-- }
--
- /* exit our private loop */
- if (client->priv->synchronous) {
- g_main_loop_quit (client->priv->loop);
- }
-+
-+ /* unref what we previously ref'd */
-+ g_object_unref (client);
- }
-
- /**
-@@ -491,7 +476,6 @@ pk_client_package_cb (DBusGProxy *proxy,
-
- /* cache */
- if (client->priv->use_buffer || client->priv->synchronous) {
-- pk_debug ("adding to cache array package %i, %s, %s", info, package_id, summary);
- pk_package_list_add (client->priv->package_list, info, package_id, summary);
- }
- }
-@@ -566,16 +550,12 @@ pk_client_details_cb (DBusGProxy *proxy,
- * pk_client_files_cb:
- */
- static void
--pk_client_files_cb (DBusGProxy *proxy,
-- const gchar *package_id,
-- const gchar *filelist,
-- PkClient *client)
-+pk_client_files_cb (DBusGProxy *proxy, const gchar *package_id, const gchar *filelist, PkClient *client)
- {
- g_return_if_fail (PK_IS_CLIENT (client));
-
-- pk_debug ("emit files %s, %s", package_id, filelist);
-- g_signal_emit (client , signals [PK_CLIENT_FILES], 0, package_id,
-- filelist);
-+ pk_debug ("emit files %s, <lots of files>", package_id);
-+ g_signal_emit (client , signals [PK_CLIENT_FILES], 0, package_id, filelist);
- }
-
- /**
-@@ -934,10 +914,8 @@ pk_client_cancel (PkClient *client, GError **error)
- return TRUE;
- }
-
-- /* special case - if the tid is already finished, then cancel should
-- * return TRUE as it's what we wanted */
-- if (pk_strequal (error_local->message, "cancelling a non-running transaction") ||
-- g_str_has_suffix (error_local->message, " doesn't exist\n")) {
-+ /* special case - if the tid is already finished, then cancel should return TRUE */
-+ if (g_str_has_suffix (error_local->message, " doesn't exist\n")) {
- pk_debug ("error ignored '%s' as we are trying to cancel", error_local->message);
- g_error_free (error_local);
- return TRUE;
-@@ -1022,7 +1000,7 @@ pk_client_get_updates (PkClient *client, PkFilterEnum filters, GError **error)
- G_TYPE_STRING, filter_text,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1112,7 +1090,7 @@ pk_client_update_system (PkClient *client, GError **error)
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1167,7 +1145,7 @@ pk_client_search_name (PkClient *client, PkFilterEnum filters, const gchar *sear
- G_TYPE_STRING, search,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1223,7 +1201,7 @@ pk_client_search_details (PkClient *client, PkFilterEnum filters, const gchar *s
- G_TYPE_STRING, search,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1277,7 +1255,7 @@ pk_client_search_group (PkClient *client, PkFilterEnum filters, const gchar *sea
- G_TYPE_STRING, search,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1331,7 +1309,7 @@ pk_client_search_file (PkClient *client, PkFilterEnum filters, const gchar *sear
- G_TYPE_STRING, search,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1397,7 +1375,7 @@ pk_client_get_depends (PkClient *client, PkFilterEnum filters, const gchar *pack
- G_TYPE_BOOLEAN, recursive,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1448,7 +1426,7 @@ pk_client_get_packages (PkClient *client, PkFilterEnum filters, GError **error)
- G_TYPE_STRING, filter_text,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1514,7 +1492,7 @@ pk_client_get_requires (PkClient *client, PkFilterEnum filters, const gchar *pac
- G_TYPE_BOOLEAN, recursive,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1579,7 +1557,7 @@ pk_client_what_provides (PkClient *client, PkFilterEnum filters, PkProvidesEnum
- G_TYPE_STRING, search,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1637,7 +1615,7 @@ pk_client_get_update_detail (PkClient *client, const gchar *package_id, GError *
- ret = dbus_g_proxy_call (client->priv->proxy, "GetUpdateDetail", error,
- G_TYPE_STRING, package_id,
- G_TYPE_INVALID, G_TYPE_INVALID);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1686,7 +1664,7 @@ pk_client_rollback (PkClient *client, const gchar *transaction_id, GError **erro
- ret = dbus_g_proxy_call (client->priv->proxy, "Rollback", error,
- G_TYPE_STRING, transaction_id,
- G_TYPE_INVALID, G_TYPE_INVALID);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1743,7 +1721,7 @@ pk_client_resolve (PkClient *client, PkFilterEnum filters, const gchar *package,
- G_TYPE_STRING, package,
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1801,7 +1779,7 @@ pk_client_get_details (PkClient *client, const gchar *package_id, GError **error
- ret = dbus_g_proxy_call (client->priv->proxy, "GetDetails", error,
- G_TYPE_STRING, package_id,
- G_TYPE_INVALID, G_TYPE_INVALID);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1858,7 +1836,7 @@ pk_client_get_files (PkClient *client, const gchar *package_id, GError **error)
- ret = dbus_g_proxy_call (client->priv->proxy, "GetFiles", error,
- G_TYPE_STRING, package_id,
- G_TYPE_INVALID, G_TYPE_INVALID);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -1963,7 +1941,7 @@ pk_client_remove_packages (PkClient *client, gchar **package_ids, gboolean allow
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2048,7 +2026,7 @@ pk_client_refresh_cache (PkClient *client, gboolean force, GError **error)
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2142,7 +2120,7 @@ pk_client_install_packages (PkClient *client, gchar **package_ids, GError **erro
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2242,7 +2220,7 @@ pk_client_install_signature (PkClient *client, PkSigTypeEnum type, const gchar *
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2340,7 +2318,7 @@ pk_client_update_packages (PkClient *client, gchar **package_ids, GError **error
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2570,7 +2548,7 @@ pk_client_install_files (PkClient *client, gboolean trusted, gchar **files_rel,
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2622,7 +2600,7 @@ pk_client_get_repo_list (PkClient *client, PkFilterEnum filters, GError **error)
- G_TYPE_INVALID, G_TYPE_INVALID);
- g_free (filter_text);
- pk_client_error_fixup (error);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2703,7 +2681,7 @@ pk_client_accept_eula (PkClient *client, const gchar *eula_id, GError **error)
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2787,7 +2765,7 @@ pk_client_repo_enable (PkClient *client, const gchar *repo_id, gboolean enabled,
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2880,7 +2858,7 @@ pk_client_repo_set_data (PkClient *client, const gchar *repo_id, const gchar *pa
- g_propagate_error (error, error_pk);
- }
-
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
-
-@@ -2957,7 +2935,7 @@ pk_client_get_old_transactions (PkClient *client, guint number, GError **error)
- G_TYPE_UINT, number,
- G_TYPE_INVALID, G_TYPE_INVALID);
- pk_client_error_fixup (error);
-- if (ret) {
-+ if (ret && !client->priv->is_finished) {
- /* allow clients to respond in the status changed callback */
- pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
- }
-@@ -3085,6 +3063,7 @@ pk_client_set_tid (PkClient *client, const gchar *tid, GError **error)
- return FALSE;
- }
- client->priv->tid = g_strdup (tid);
-+ pk_debug ("set tid %s on %p", client->priv->tid, client);
-
- dbus_g_proxy_add_signal (proxy, "Finished",
- G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID);
-@@ -3523,9 +3502,8 @@ pk_client_reset (PkClient *client, GError **error)
-
- g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-
-- if (client->priv->tid != NULL &&
-- client->priv->is_finished != TRUE) {
-- pk_debug ("not exit status, will try to cancel");
-+ if (client->priv->tid != NULL && !client->priv->is_finished) {
-+ pk_debug ("not exit status, will try to cancel tid %s", client->priv->tid);
- /* we try to cancel the running tranaction */
- ret = pk_client_cancel (client, error);
- if (!ret) {
-@@ -3790,6 +3768,7 @@ libst_client (LibSelfTest *test)
- guint size_new;
- guint i;
- gchar *file;
-+ PkPackageList *list;
-
- if (libst_start (test, "PkClient", CLASS_AUTO) == FALSE) {
- return;
-@@ -3833,6 +3812,15 @@ libst_client (LibSelfTest *test)
- libst_failed (test, NULL);
- }
-
-+ /************************************************************/
-+ libst_title (test, "reset client, unused");
-+ ret = pk_client_reset (client, NULL);
-+ if (ret) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, NULL);
-+ }
-+
- /* check use after finalise */
- g_signal_connect (client, "finished",
- G_CALLBACK (libst_client_finished_cb), test);
-@@ -3871,7 +3859,9 @@ libst_client (LibSelfTest *test)
- }
-
- /* get size */
-- size = pk_client_package_buffer_get_size (client);
-+ list = pk_client_get_package_list (client);
-+ size = pk_package_list_get_size (list);
-+ g_object_unref (list);
- if (size == 0) {
- libst_failed (test, "failed: to get any results");
- }
-@@ -3891,7 +3881,9 @@ libst_client (LibSelfTest *test)
- g_error_free (error);
- }
- /* check we got the same results */
-- size_new = pk_client_package_buffer_get_size (client);
-+ list = pk_client_get_package_list (client);
-+ size_new = pk_package_list_get_size (list);
-+ g_object_unref (list);
- if (size != size_new) {
- libst_failed (test, "old size %i, new size %", size, size_new);
- }
-diff --git a/libpackagekit/pk-client.h b/libpackagekit/pk-client.h
-index 2b1d1a2..6617159 100644
---- a/libpackagekit/pk-client.h
-+++ b/libpackagekit/pk-client.h
-@@ -346,9 +346,7 @@ gboolean pk_client_repo_set_data (PkClient *client,
- G_GNUC_WARN_UNUSED_RESULT;
-
- /* cached stuff */
--guint pk_client_package_buffer_get_size (PkClient *client);
--PkPackageItem *pk_client_package_buffer_get_item (PkClient *client,
-- guint item);
-+PkPackageList *pk_client_get_package_list (PkClient *client);
- PkRestartEnum pk_client_get_require_restart (PkClient *client);
-
- /* not job specific */
-diff --git a/libpackagekit/pk-common.c b/libpackagekit/pk-common.c
-index 9d3cff7..0be0e6e 100644
---- a/libpackagekit/pk-common.c
-+++ b/libpackagekit/pk-common.c
-@@ -246,7 +246,7 @@ pk_strsafe (const gchar *text)
- }
-
- /* rip out any insane characters */
-- delimiters = "\\\f\n\r\t\"'";
-+ delimiters = "\\\f\r\t\"'";
- text_safe = g_strdup (text);
- g_strdelimit (text_safe, delimiters, ' ');
- return text_safe;
-@@ -613,6 +613,35 @@ pk_strpad_extra (const gchar *data, guint length, guint *extra)
- }
-
- /**
-+ * pk_strreplace:
-+ * @text: The input text to make safe
-+ * @find: What to search for
-+ * @replace: What to replace with
-+ *
-+ * Replaces chars in the text with a replacement.
-+ * The %find and %replace variables to not have to be of the same length
-+ *
-+ * Return value: the new string (copied)
-+ **/
-+gchar *
-+pk_strreplace (const gchar *text, const gchar *find, const gchar *replace)
-+{
-+ gchar **array;
-+ gchar *retval;
-+
-+ /* common case, not found */
-+ if (strstr (text, find) == NULL) {
-+ return g_strdup (text);
-+ }
-+
-+ /* split apart and rejoin with new delimiter */
-+ array = g_strsplit (text, find, 0);
-+ retval = g_strjoinv (replace, array);
-+ g_strfreev (array);
-+ return retval;
-+}
-+
-+/**
- * pk_delay_yield:
- * @delay: the desired delay in seconds
- *
-@@ -850,6 +879,23 @@ libst_common (LibSelfTest *test)
- }
- g_free (text_safe);
-
-+ /************************************************************/
-+ libst_title (test, "pk_strequal same argument");
-+ temp = "dave";
-+ if (pk_strequal (temp, temp)) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, "incorrect ret when both same");
-+ }
-+
-+ /************************************************************/
-+ libst_title (test, "pk_strequal both const");
-+ if (pk_strequal ("dave", "dave")) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, "incorrect ret when both same");
-+ }
-+
- /************************************************************
- **************** build var args **************
- ************************************************************/
-@@ -1283,6 +1329,48 @@ libst_common (LibSelfTest *test)
- g_free (text_safe);
-
- /************************************************************
-+ **************** Replace ******************
-+ ************************************************************/
-+ libst_title (test, "replace start");
-+ text_safe = pk_strreplace ("richard\nhughes", "r", "e");
-+ if (pk_strequal (text_safe, "eichaed\nhughes")) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, "failed the replace '%s'", text_safe);
-+ }
-+ g_free (text_safe);
-+
-+ /************************************************************/
-+ libst_title (test, "replace none");
-+ text_safe = pk_strreplace ("richard\nhughes", "dave", "e");
-+ if (pk_strequal (text_safe, "richard\nhughes")) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, "failed the replace '%s'", text_safe);
-+ }
-+ g_free (text_safe);
-+
-+ /************************************************************/
-+ libst_title (test, "replace end");
-+ text_safe = pk_strreplace ("richard\nhughes", "s", "e");
-+ if (pk_strequal (text_safe, "richard\nhughee")) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, "failed the replace '%s'", text_safe);
-+ }
-+ g_free (text_safe);
-+
-+ /************************************************************/
-+ libst_title (test, "replace unicode");
-+ text_safe = pk_strreplace ("richard\n- hughes", "\n- ", "\n• ");
-+ if (pk_strequal (text_safe, "richard\n• hughes")) {
-+ libst_success (test, NULL);
-+ } else {
-+ libst_failed (test, "failed the replace '%s'", text_safe);
-+ }
-+ g_free (text_safe);
-+
-+ /************************************************************
- **************** Padding ******************
- ************************************************************/
- libst_title (test, "pad smaller, no extra");
-diff --git a/libpackagekit/pk-common.h b/libpackagekit/pk-common.h
-index 9908ec2..9e5a05e 100644
---- a/libpackagekit/pk-common.h
-+++ b/libpackagekit/pk-common.h
-@@ -84,6 +84,9 @@ gchar **pk_strsplit (const gchar *id,
- gchar *pk_strbuild_va (const gchar *first_element,
- va_list *args)
- G_GNUC_WARN_UNUSED_RESULT;
-+gchar *pk_strreplace (const gchar *text,
-+ const gchar *find,
-+ const gchar *replace);
- gchar **pk_ptr_array_to_argv (GPtrArray *array)
- G_GNUC_WARN_UNUSED_RESULT;
- gchar **pk_va_list_to_argv (const gchar *string_first,
-diff --git a/libpackagekit/pk-control.c b/libpackagekit/pk-control.c
-index f2de5ae..5a54ccc 100644
---- a/libpackagekit/pk-control.c
-+++ b/libpackagekit/pk-control.c
-@@ -198,6 +198,43 @@ out:
- }
-
- /**
-+ * pk_control_set_proxy:
-+ * @control: a valid #PkControl instance
-+ * @proxy_http: a HTTP proxy string such as "username:password@server.lan:8080"
-+ * @proxy_ftp: a FTP proxy string such as "server.lan:8080"
-+ *
-+ * Set a proxy on the PK daemon
-+ *
-+ * Return value: if we set the proxy successfully
-+ **/
-+gboolean
-+pk_control_set_proxy (PkControl *control, const gchar *proxy_http, const gchar *proxy_ftp)
-+{
-+ gboolean ret = FALSE;
-+ GError *error = NULL;
-+
-+ g_return_val_if_fail (PK_IS_CONTROL (control), PK_GROUP_ENUM_UNKNOWN);
-+
-+ /* check to see if we have a valid proxy */
-+ if (control->priv->proxy == NULL) {
-+ pk_warning ("No proxy for manager");
-+ goto out;
-+ }
-+ ret = dbus_g_proxy_call (control->priv->proxy, "SetProxy", &error,
-+ G_TYPE_STRING, proxy_http,
-+ G_TYPE_STRING, proxy_ftp,
-+ G_TYPE_INVALID,
-+ G_TYPE_INVALID);
-+ if (!ret) {
-+ /* abort as the DBUS method failed */
-+ pk_warning ("SetProxy failed :%s", error->message);
-+ g_error_free (error);
-+ }
-+out:
-+ return ret;
-+}
-+
-+/**
- * pk_control_get_groups:
- * @control: a valid #PkControl instance
- *
-diff --git a/libpackagekit/pk-control.h b/libpackagekit/pk-control.h
-index 63b30d3..c1b1be8 100644
---- a/libpackagekit/pk-control.h
-+++ b/libpackagekit/pk-control.h
-@@ -88,6 +88,9 @@ PkControl *pk_control_new (void);
- gboolean pk_control_allocate_transaction_id (PkControl *control,
- gchar **tid,
- GError **error);
-+gboolean pk_control_set_proxy (PkControl *control,
-+ const gchar *proxy_http,
-+ const gchar *proxy_ftp);
- PkRoleEnum pk_control_get_actions (PkControl *control);
- PkFilterEnum pk_control_get_filters (PkControl *control);
- PkGroupEnum pk_control_get_groups (PkControl *control);
-diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
-index 5743dcb..9dccdd0 100644
---- a/libpackagekit/pk-enum.c
-+++ b/libpackagekit/pk-enum.c
-@@ -152,6 +152,7 @@ static PkEnumMatch enum_error[] = {
- {PK_ERROR_ENUM_REPO_NOT_AVAILABLE, "repo-not-available"},
- {PK_ERROR_ENUM_INVALID_PACKAGE_FILE, "invalid-package-file"},
- {PK_ERROR_ENUM_PACKAGE_INSTALL_BLOCKED, "package-install-blocked"},
-+ {PK_ERROR_ENUM_PACKAGE_CORRUPT, "package-corrupt"},
- {0, NULL}
- };
-
-@@ -417,6 +418,8 @@ static PkEnumMatch enum_free_licenses[] = {
- {PK_LICENSE_ENUM_XANO, "XANO"},
- {PK_LICENSE_ENUM_VOSTROM, "VOSTROM"},
- {PK_LICENSE_ENUM_XEROX, "Xerox License"},
-+ {PK_LICENSE_ENUM_RICEBSD, "RiceBSD"},
-+ {PK_LICENSE_ENUM_QHULL, "Qhull"},
- {0, NULL}
- };
-
-diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
-index e616b64..4cc317e 100644
---- a/libpackagekit/pk-enum.h
-+++ b/libpackagekit/pk-enum.h
-@@ -256,6 +256,7 @@ typedef enum {
- PK_ERROR_ENUM_REPO_NOT_AVAILABLE,
- PK_ERROR_ENUM_INVALID_PACKAGE_FILE,
- PK_ERROR_ENUM_PACKAGE_INSTALL_BLOCKED,
-+ PK_ERROR_ENUM_PACKAGE_CORRUPT,
- PK_ERROR_ENUM_UNKNOWN
- } PkErrorCodeEnum;
-
-@@ -493,6 +494,8 @@ typedef enum {
- PK_LICENSE_ENUM_XANO,
- PK_LICENSE_ENUM_VOSTROM,
- PK_LICENSE_ENUM_XEROX,
-+ PK_LICENSE_ENUM_RICEBSD,
-+ PK_LICENSE_ENUM_QHULL,
- PK_LICENSE_ENUM_UNKNOWN
- } PkLicenseEnum;
-
-diff --git a/libpackagekit/pk-extra.c b/libpackagekit/pk-extra.c
-index 7f01a4c..d0f0776 100644
---- a/libpackagekit/pk-extra.c
-+++ b/libpackagekit/pk-extra.c
-@@ -130,7 +130,6 @@ pk_extra_populate_package_cache_callback (void *data, gint argc, gchar **argv, g
- obj->icon_name = icon_name;
- obj->exec = exec;
- g_hash_table_insert (extra->priv->hash_package, (gpointer) package, (gpointer) obj);
-- pk_debug ("adding %s, %s", package, icon_name);
- out:
- return 0;
- }
-@@ -180,7 +179,6 @@ pk_extra_populate_locale_cache_callback (void *data, gint argc, gchar **argv, gc
- obj = g_new (PkExtraLocaleObj, 1);
- obj->summary = summary;
- g_hash_table_insert (extra->priv->hash_locale, (gpointer) package, (gpointer) obj);
-- pk_debug ("adding %s, %s", package, summary);
- out:
- return 0;
- }
-diff --git a/libpackagekit/pk-package-item.c b/libpackagekit/pk-package-item.c
-index 87905dc..ff4bd4e 100644
---- a/libpackagekit/pk-package-item.c
-+++ b/libpackagekit/pk-package-item.c
-@@ -56,7 +56,6 @@ pk_package_item_new (PkInfoEnum info, const gchar *package_id, const gchar *summ
-
- g_return_val_if_fail (package_id != NULL, FALSE);
-
-- pk_debug ("adding to cache item package %s, %s, %s", pk_info_enum_to_text (info), package_id, summary);
- item = g_new0 (PkPackageItem, 1);
- item->info = info;
- item->package_id = g_strdup (package_id);
-diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
-index 5d95e1b..6bdb0d4 100644
---- a/libpackagekit/pk-package-list.c
-+++ b/libpackagekit/pk-package-list.c
-@@ -77,7 +77,6 @@ pk_package_list_add (PkPackageList *plist, PkInfoEnum info, const gchar *package
- g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
- g_return_val_if_fail (package_id != NULL, FALSE);
-
-- pk_debug ("adding to cache array package %s, %s, %s", pk_info_enum_to_text (info), package_id, summary);
- item = pk_package_item_new (info, package_id, summary);
- g_ptr_array_add (plist->priv->array, item);
-
-@@ -104,9 +103,6 @@ pk_package_list_add_item (PkPackageList *plist, PkPackageItem *item)
- return FALSE;
- }
-
-- pk_debug ("adding to cache array package %s, %s, %s",
-- pk_info_enum_to_text (item->info), item->package_id, item->summary);
--
- item_new = pk_package_item_copy (item);
- g_ptr_array_add (plist->priv->array, item_new);
-
-@@ -114,6 +110,30 @@ pk_package_list_add_item (PkPackageList *plist, PkPackageItem *item)
- }
-
- /**
-+ * pk_package_list_add_list:
-+ *
-+ * Makes a deep copy of the list
-+ **/
-+gboolean
-+pk_package_list_add_list (PkPackageList *plist, PkPackageList *list)
-+{
-+ guint i;
-+ guint len;
-+ PkPackageItem *item;
-+
-+ g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
-+ g_return_val_if_fail (PK_IS_PACKAGE_LIST (list), FALSE);
-+
-+ /* add list to plist */
-+ len = pk_package_list_get_size (list);
-+ for (i=0; i<len; i++) {
-+ item = pk_package_list_get_item (list, i);
-+ pk_package_list_add_item (plist, item);
-+ }
-+ return TRUE;
-+}
-+
-+/**
- * pk_package_list_get_string:
- **/
- gchar *
-diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
-index 9734af4..83901ab 100644
---- a/libpackagekit/pk-package-list.h
-+++ b/libpackagekit/pk-package-list.h
-@@ -59,6 +59,8 @@ gboolean pk_package_list_add (PkPackageList *plist,
- const gchar *summary);
- gboolean pk_package_list_add_item (PkPackageList *plist,
- PkPackageItem *item);
-+gboolean pk_package_list_add_list (PkPackageList *plist,
-+ PkPackageList *list);
- gboolean pk_package_list_contains (PkPackageList *plist,
- const gchar *package_id);
- gboolean pk_package_list_contains_item (PkPackageList *plist,
-diff --git a/libpackagekit/pk-polkit-client.c b/libpackagekit/pk-polkit-client.c
-index dceb656..7308a29 100644
---- a/libpackagekit/pk-polkit-client.c
-+++ b/libpackagekit/pk-polkit-client.c
-@@ -54,9 +54,6 @@ static void pk_polkit_client_finalize (GObject *object);
- #define POLKIT_DBUS_PATH "/org/gnome/PolicyKit/Manager"
- #define POLKIT_DBUS_INTERFACE "org.gnome.PolicyKit.Manager"
-
--/* we only support auth on the the transaction interface */
--#define PK_ERROR_REFUSED_BY_POLICY "org.freedesktop.PackageKit.Transaction.RefusedByPolicy"
--
- /**
- * PkPolkitClientPrivate:
- *
-@@ -175,7 +172,10 @@ pk_polkit_client_error_denied_by_policy (GError *error)
- /* check for specific error */
- error_name = dbus_g_error_get_name (error);
- pk_debug ("ERROR: %s: %s", error_name, error->message);
-- if (pk_strequal (error_name, PK_ERROR_REFUSED_BY_POLICY)) {
-+ if (pk_strequal (error_name, "org.freedesktop.PackageKit.RefusedByPolicy")) {
-+ return TRUE;
-+ }
-+ if (pk_strequal (error_name, "org.freedesktop.PackageKit.Transaction.RefusedByPolicy")) {
- return TRUE;
- }
- return FALSE;
-diff --git a/libpackagekit/pk-task-list.c b/libpackagekit/pk-task-list.c
-index 76ab022..3dc1db0 100644
---- a/libpackagekit/pk-task-list.c
-+++ b/libpackagekit/pk-task-list.c
-@@ -161,7 +161,7 @@ pk_task_list_status_changed_cb (PkClient *client, PkStatusEnum status, PkTaskLis
- g_return_if_fail (PK_IS_TASK_LIST (tlist));
-
- tid = pk_client_get_tid (client);
-- pk_debug ("tid %s is now %i", tid, status);
-+ pk_debug ("tid %s is now %s", tid, pk_status_enum_to_text (status));
-
- /* get correct item */
- item = pk_task_list_find_existing_tid (tlist, tid);
-diff --git a/po/LINGUAS b/po/LINGUAS
-index 6dbee0e..f87e6b3 100644
---- a/po/LINGUAS
-+++ b/po/LINGUAS
-@@ -5,6 +5,7 @@ es
- fi
- fr
- he
-+hu
- it
- nl
- no_nb
-diff --git a/po/de.po b/po/de.po
-index 33d30c1..6e8013e 100644
---- a/po/de.po
-+++ b/po/de.po
-@@ -8,8 +8,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: PackageKit\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2008-04-23 01:36+0000\n"
--"PO-Revision-Date: 2008-04-23 19:28+0100\n"
-+"POT-Creation-Date: 2008-05-03 01:22+0000\n"
-+"PO-Revision-Date: 2008-05-20 21:52+0100\n"
- "Last-Translator: Fabian Affolter <fab@fedoraproject.org>\n"
- "Language-Team: German <fedora-trans-de@redhat.com>\n"
- "MIME-Version: 1.0\n"
-@@ -18,239 +18,239 @@ msgstr ""
- "Plural-Forms: nplurals=2; plural=(n != 1);\n"
- "X-Poedit-Language: German\n"
-
--#: ../client/pk-console.c:208
-+#: ../client/pk-console.c:224
- msgid "Update detail"
- msgstr "Aktualisierungsdetails"
-
--#: ../client/pk-console.c:400
-+#: ../client/pk-console.c:425
- msgid "A system restart is required"
- msgstr "Ein Systemneustart ist erforderlich"
-
--#: ../client/pk-console.c:402
-+#: ../client/pk-console.c:427
- msgid "A logout and login is required"
- msgstr "Eine Neuanmeldung ist erforderlich"
-
--#: ../client/pk-console.c:404
-+#: ../client/pk-console.c:429
- msgid "An application restart is required"
- msgstr "Ein Neustart der Anwendung ist erforderlich"
-
--#: ../client/pk-console.c:443
-+#: ../client/pk-console.c:474
- #, c-format
- msgid "Please enter a number from 1 to %i: "
- msgstr "Bitte eine Zahl zwischen 1 und %i eingeben: "
-
--#: ../client/pk-console.c:493
-+#: ../client/pk-console.c:524
- msgid "Could not find a package match"
- msgstr "Es konnte kein passendes Paket gefunden werden"
-
--#: ../client/pk-console.c:507
-+#: ../client/pk-console.c:538
- msgid "There are multiple package matches"
- msgstr "Es wurden mehrere passende Paket gefunden"
-
- #. find out what package the user wants to use
--#: ../client/pk-console.c:514
-+#: ../client/pk-console.c:545
- msgid "Please enter the package number: "
- msgstr "Bitte die Paketnummer eingeben: "
-
--#: ../client/pk-console.c:530
-+#: ../client/pk-console.c:561
- msgid "Could not find a package with that name to install, or package already installed"
- msgstr "Es konnten weder installierte noch zu installierende Paket mit diesem Namen gefunden werden"
-
--#: ../client/pk-console.c:612
-+#: ../client/pk-console.c:643
- msgid "Could not find a package with that name to remove"
- msgstr "Es konnte kein Paket mit diesem Namen zum Deinstallieren gefunden werden"
-
--#: ../client/pk-console.c:652
-+#: ../client/pk-console.c:683
- msgid "The following packages have to be removed"
- msgstr "Die folgenden Paket werden entfernt"
-
- #. get user input
--#: ../client/pk-console.c:661
-+#: ../client/pk-console.c:692
- msgid "Okay to remove additional packages?"
- msgstr "Die folgenden zusätzlichen Pakete entfernen?"
-
--#: ../client/pk-console.c:665
-+#: ../client/pk-console.c:696
- msgid "Cancelled!"
- msgstr "Abgebrochen!"
-
--#: ../client/pk-console.c:687
-+#: ../client/pk-console.c:718
- msgid "Could not find a package with that name to update"
- msgstr "Es konnte kein Paket mit diesem Namen zum Aktualisieren gefunden werden"
-
--#: ../client/pk-console.c:705
-+#: ../client/pk-console.c:736
- msgid "Could not find what packages require this package"
- msgstr "Es konnte nicht rausgefunden werden, welche Pakete dieses Paket benötigen"
-
--#: ../client/pk-console.c:723
-+#: ../client/pk-console.c:754
- msgid "Could not get dependencies for this package"
- msgstr "Die Abhängigkeiten für dieses Paket konnten nicht ermittelt werden"
-
--#: ../client/pk-console.c:741
--msgid "Could not find a description for this package"
--msgstr "Die Beschreibung für dieses Paket konnten nicht ermittelt werden"
-+#: ../client/pk-console.c:772
-+msgid "Could not find details for this package"
-+msgstr "Die Details für dieses Paket konnten nicht gefunden werden"
-
--#: ../client/pk-console.c:759
-+#: ../client/pk-console.c:790
- msgid "Could not find the files for this package"
- msgstr "Die Dateien für dieses Paket konnten nicht ermittelt werden"
-
--#: ../client/pk-console.c:819
-+#: ../client/pk-console.c:870
- msgid "Package description"
- msgstr "Paketbeschreibung"
-
--#: ../client/pk-console.c:842
-+#: ../client/pk-console.c:893
- msgid "Package files"
- msgstr "Paketinhalt"
-
--#: ../client/pk-console.c:850
-+#: ../client/pk-console.c:901
- msgid "No files"
- msgstr "Keine Dateien"
-
- #. get user input
--#: ../client/pk-console.c:882
-+#: ../client/pk-console.c:933
- msgid "Okay to import key?"
- msgstr "Soll der Schlüssel importiert werden?"
-
--#: ../client/pk-console.c:885
-+#: ../client/pk-console.c:936
- msgid "Did not import key"
- msgstr "Den Schlüssel nicht importieren"
-
- #. get user input
--#: ../client/pk-console.c:925
-+#: ../client/pk-console.c:976
- msgid "Do you agree?"
- msgstr "Sind Sie einverstanden?"
-
--#: ../client/pk-console.c:928
-+#: ../client/pk-console.c:979
- msgid "Did not agree to licence, task will fail"
- msgstr "Lizenz wurde abgelehnt, Aufgabe wird fehlschlagen"
-
--#: ../client/pk-console.c:957
-+#: ../client/pk-console.c:1008
- msgid "The daemon crashed mid-transaction!"
- msgstr "Der Dienst ist während der Verarbeitung abgestürzt!"
-
- #. header
--#: ../client/pk-console.c:1010
-+#: ../client/pk-console.c:1061
- msgid "PackageKit Console Interface"
- msgstr "PackageKit-Konsolenschnittstelle"
-
--#: ../client/pk-console.c:1010
-+#: ../client/pk-console.c:1061
- msgid "Subcommands:"
- msgstr "Unterbefehle:"
-
--#: ../client/pk-console.c:1114
--#: ../client/pk-monitor.c:100
-+#: ../client/pk-console.c:1165
-+#: ../client/pk-monitor.c:104
- #: ../src/pk-main.c:189
- msgid "Show extra debugging information"
- msgstr "Zusätzliche Debugging-Informationen anzeigen"
-
--#: ../client/pk-console.c:1116
--#: ../client/pk-monitor.c:102
-+#: ../client/pk-console.c:1167
-+#: ../client/pk-monitor.c:106
- msgid "Show the program version and exit"
- msgstr "Die Programmversion anzeigen und beenden"
-
--#: ../client/pk-console.c:1118
-+#: ../client/pk-console.c:1169
- msgid "Set the filter, e.g. installed"
- msgstr "Setzt den Filter, z. B. installiert"
-
--#: ../client/pk-console.c:1120
-+#: ../client/pk-console.c:1171
- msgid "Exit without waiting for actions to complete"
- msgstr "Beenden ohne auf das Ende der Aktionen zu warten"
-
--#: ../client/pk-console.c:1143
-+#: ../client/pk-console.c:1194
- msgid "Could not connect to system DBUS."
- msgstr "Mit System-DBUS konnte nicht verbunden werden."
-
--#: ../client/pk-console.c:1231
-+#: ../client/pk-console.c:1288
- msgid "You need to specify a search type"
- msgstr "Es muss eine Suchart angegeben werden"
-
--#: ../client/pk-console.c:1236
--#: ../client/pk-console.c:1243
--#: ../client/pk-console.c:1250
--#: ../client/pk-console.c:1257
--#: ../client/pk-console.c:1361
--#: ../client/pk-console.c:1368
--#: ../client/pk-console.c:1375
--#: ../client/pk-console.c:1382
-+#: ../client/pk-console.c:1293
-+#: ../client/pk-console.c:1300
-+#: ../client/pk-console.c:1307
-+#: ../client/pk-console.c:1314
-+#: ../client/pk-console.c:1421
-+#: ../client/pk-console.c:1428
-+#: ../client/pk-console.c:1435
-+#: ../client/pk-console.c:1442
- msgid "You need to specify a search term"
- msgstr "Es muss ein Suchausdruck angegeben werden"
-
--#: ../client/pk-console.c:1262
-+#: ../client/pk-console.c:1319
- msgid "Invalid search type"
- msgstr "Ungültige Suchart"
-
--#: ../client/pk-console.c:1267
-+#: ../client/pk-console.c:1324
- msgid "You need to specify a package or file to install"
- msgstr "Es muss ein Paket oder eine Datei zum Installieren angegeben werden"
-
--#: ../client/pk-console.c:1280
-+#: ../client/pk-console.c:1339
- msgid "You need to specify a type, key_id and package_id"
- msgstr "Es muss ein Typ angegeben werden, key_id oder package_id"
-
--#: ../client/pk-console.c:1287
-+#: ../client/pk-console.c:1346
- msgid "You need to specify a package to remove"
- msgstr "Es muss ein Paket zum Entfernen angegeben werden"
-
--#: ../client/pk-console.c:1294
-+#: ../client/pk-console.c:1353
- msgid "You need to specify a eula-id"
- msgstr "Es muss eine eula-id angegeben werden"
-
--#: ../client/pk-console.c:1309
-+#: ../client/pk-console.c:1369
- msgid "You need to specify a package name to resolve"
- msgstr "Es muss ein Paketname zum Auflösen angegeben werden"
-
--#: ../client/pk-console.c:1316
--#: ../client/pk-console.c:1323
-+#: ../client/pk-console.c:1376
-+#: ../client/pk-console.c:1383
- msgid "You need to specify a repo name"
- msgstr "Es muss ein Repository-Name angegeben werden"
-
--#: ../client/pk-console.c:1330
-+#: ../client/pk-console.c:1390
- msgid "You need to specify a repo name/parameter and value"
- msgstr "Es muss ein Repository-Name/Argument und Wert angegeben werden"
-
--#: ../client/pk-console.c:1343
-+#: ../client/pk-console.c:1403
- msgid "You need to specify a time term"
- msgstr "Es muss ein Zeitausdruck angegeben werden"
-
--#: ../client/pk-console.c:1348
-+#: ../client/pk-console.c:1408
- msgid "You need to specify a correct role"
- msgstr "Es muss eine korrekte Rolle angegeben werden"
-
--#: ../client/pk-console.c:1353
-+#: ../client/pk-console.c:1413
- msgid "Failed to get last time"
- msgstr "Die letzte Zeit konnte nicht abgefragt werden"
-
--#: ../client/pk-console.c:1389
--msgid "You need to specify a package to find the description for"
--msgstr "Es muss ein Paket angegeben werden zu dem die Beschreibung gefunden werden soll"
-+#: ../client/pk-console.c:1449
-+msgid "You need to specify a package to find the details for"
-+msgstr "Es muss ein Paket angegeben werden zu dem die Details gefunden werden sollen"
-
--#: ../client/pk-console.c:1396
-+#: ../client/pk-console.c:1456
- msgid "You need to specify a package to find the files for"
- msgstr "Es muss ein Paket angegeben werden zu dem die Dateien gefunden werden sollen"
-
--#: ../client/pk-console.c:1441
-+#: ../client/pk-console.c:1503
- #, c-format
- msgid "Option '%s' not supported"
- msgstr "Option '%s' wird nicht unterstützt"
-
--#: ../client/pk-console.c:1452
-+#: ../client/pk-console.c:1514
- msgid "Command failed"
- msgstr "Befehl fehlgeschlagen"
-
--#: ../client/pk-console.c:1456
-+#: ../client/pk-console.c:1518
- msgid "You don't have the necessary privileges for this operation"
- msgstr "Es fehlen die benötigten Rechte für diese Operation"
-
--#: ../client/pk-monitor.c:113
-+#: ../client/pk-monitor.c:117
- msgid "PackageKit Monitor"
- msgstr "PackageKit Monitor"
-
--#: ../client/pk-import-desktop.c:283
-+#: ../client/pk-import-desktop.c:293
- #: ../client/pk-import-specspo.c:169
- #, c-format
- msgid "Could not open database: %s"
- msgstr "Datenbank konnte nicht geöffnet werden: %s"
-
--#: ../client/pk-import-desktop.c:284
-+#: ../client/pk-import-desktop.c:294
- #: ../client/pk-import-specspo.c:170
- msgid "You probably need to run this program as the root user"
- msgstr "Das Programm muss möglicherweise als Benutzer root ausgeführt werden"
-@@ -308,6 +308,12 @@ msgstr "Es konnte nicht zum System-Bus verbunden werden"
- msgid "Error trying to start: %s\n"
- msgstr "Fehler beim Versuch zu starten: %s\n"
-
-+#~ msgid "Could not find a description for this package"
-+#~ msgstr "Die Beschreibung für dieses Paket konnten nicht ermittelt werden"
-+#~ msgid "You need to specify a package to find the description for"
-+#~ msgstr ""
-+#~ "Es muss ein Paket angegeben werden zu dem die Beschreibung gefunden "
-+#~ "werden soll"
- #~ msgid "Accept EULA"
- #~ msgstr "EULA akzeptieren"
- #~ msgid "Authentication is required to accept a EULA"
-diff --git a/po/hu.po b/po/hu.po
-new file mode 100644
-index 0000000..ea732d0
---- /dev/null
-+++ b/po/hu.po
-@@ -0,0 +1,311 @@
-+# SOME DESCRIPTIVE TITLE.
-+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-+# This file is distributed under the same license as the PACKAGE package.
-+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-+#
-+msgid ""
-+msgstr ""
-+"Project-Id-Version: packagekit\n"
-+"Report-Msgid-Bugs-To: \n"
-+"POT-Creation-Date: 2008-05-18 17:43+0000\n"
-+"PO-Revision-Date: 2008-05-19 00:08+0100\n"
-+"Last-Translator: Sulyok Péter <peti@fedoraproject.org>\n"
-+"Language-Team: Hungarian <fedora-trans-hu@redhat.com>\n"
-+"MIME-Version: 1.0\n"
-+"Content-Type: text/plain; charset=utf-8\n"
-+"Content-Transfer-Encoding: 8bit\n"
-+"Plural-Forms: nplurals=2; plural=n>1\n"
-+"X-Poedit-Language: Hungarian\n"
-+"X-Poedit-Country: HUNGARY\n"
-+"X-Poedit-SourceCharset: utf-8\n"
-+
-+#: ../client/pk-console.c:224
-+msgid "Update detail"
-+msgstr "Frissítés részletező"
-+
-+#: ../client/pk-console.c:425
-+msgid "A system restart is required"
-+msgstr "Rendszer-újraindítás szükséges"
-+
-+#: ../client/pk-console.c:427
-+msgid "A logout and login is required"
-+msgstr "Kijelentkezés és bejelentkezés szükséges"
-+
-+#: ../client/pk-console.c:429
-+msgid "An application restart is required"
-+msgstr "Alkalmazás-újraindítás szükséges"
-+
-+#: ../client/pk-console.c:474
-+#, c-format
-+msgid "Please enter a number from 1 to %i: "
-+msgstr "Kérem adjon meg egy számot 1-től %i-ig:"
-+
-+#: ../client/pk-console.c:524
-+msgid "Could not find a package match"
-+msgstr "Nincs megfelelő csomag"
-+
-+#: ../client/pk-console.c:538
-+msgid "There are multiple package matches"
-+msgstr "Több csomag illik"
-+
-+#. find out what package the user wants to use
-+#: ../client/pk-console.c:545
-+msgid "Please enter the package number: "
-+msgstr "Kérem adja meg a csomagszámot:"
-+
-+#: ../client/pk-console.c:561
-+msgid "Could not find a package with that name to install, or package already installed"
-+msgstr "Nem lehetett csomagot találni azzal a névvel telepítésre, vagy márt telepített csomagot"
-+
-+#: ../client/pk-console.c:643
-+msgid "Could not find a package with that name to remove"
-+msgstr "Nem lehetett csomagot találni azzal a névvel törlésre"
-+
-+#: ../client/pk-console.c:683
-+msgid "The following packages have to be removed"
-+msgstr "A következő csomagokat kell eltávolítani"
-+
-+#. get user input
-+#: ../client/pk-console.c:692
-+msgid "Okay to remove additional packages?"
-+msgstr "Eltávolíthatók további csomagok?"
-+
-+#: ../client/pk-console.c:696
-+msgid "Cancelled!"
-+msgstr "Megszakítva!"
-+
-+#: ../client/pk-console.c:718
-+msgid "Could not find a package with that name to update"
-+msgstr "Nem lehetett csomagot találni azzal a névvel frissítésre"
-+
-+#: ../client/pk-console.c:736
-+msgid "Could not find what packages require this package"
-+msgstr "Nem lehetett megtudni mely csomagok szükségesek"
-+
-+#: ../client/pk-console.c:754
-+msgid "Could not get dependencies for this package"
-+msgstr "Nem lehetett csomagfüggőséget megkapni e csomaghoz"
-+
-+#: ../client/pk-console.c:772
-+msgid "Could not find details for this package"
-+msgstr "Nem lehetett részletezőt találni e csomaghoz"
-+
-+#: ../client/pk-console.c:790
-+msgid "Could not find the files for this package"
-+msgstr "Nem lehetett fájlokat találni e csomaghoz"
-+
-+#: ../client/pk-console.c:870
-+msgid "Package description"
-+msgstr "Csomagleírás"
-+
-+#: ../client/pk-console.c:893
-+msgid "Package files"
-+msgstr "Csomagfájlok"
-+
-+#: ../client/pk-console.c:901
-+msgid "No files"
-+msgstr "Nincs fájl"
-+
-+#. get user input
-+#: ../client/pk-console.c:933
-+msgid "Okay to import key?"
-+msgstr "Behozhatunk kulcsot?"
-+
-+#: ../client/pk-console.c:936
-+msgid "Did not import key"
-+msgstr "Nem hoztunk be kulcsot"
-+
-+#. get user input
-+#: ../client/pk-console.c:976
-+msgid "Do you agree?"
-+msgstr "Egyetért?"
-+
-+#: ../client/pk-console.c:979
-+msgid "Did not agree to licence, task will fail"
-+msgstr "Nem egyezett meg az engedélyben, a munka elbukik"
-+
-+#: ../client/pk-console.c:1008
-+msgid "The daemon crashed mid-transaction!"
-+msgstr "A szolgáltatás összeomlott tranzakció közben!"
-+
-+#. header
-+#: ../client/pk-console.c:1061
-+msgid "PackageKit Console Interface"
-+msgstr "PackageKit parancssori felület"
-+
-+#: ../client/pk-console.c:1061
-+msgid "Subcommands:"
-+msgstr "Részparancsok:"
-+
-+#: ../client/pk-console.c:1165
-+#: ../client/pk-monitor.c:104
-+#: ../src/pk-main.c:189
-+msgid "Show extra debugging information"
-+msgstr "Extra hibakereső adatok megjelenítése"
-+
-+#: ../client/pk-console.c:1167
-+#: ../client/pk-monitor.c:106
-+msgid "Show the program version and exit"
-+msgstr "Programváltozat megmutatása és kilépés"
-+
-+#: ../client/pk-console.c:1169
-+msgid "Set the filter, e.g. installed"
-+msgstr "Szűrő beállítása, pl. telepítve"
-+
-+#: ../client/pk-console.c:1171
-+msgid "Exit without waiting for actions to complete"
-+msgstr "Kilépés cselekmény befejezésére várakozás nélkül"
-+
-+#: ../client/pk-console.c:1194
-+msgid "Could not connect to system DBUS."
-+msgstr "Nem lehetett kapcsolódni DBUS-hoz."
-+
-+#: ../client/pk-console.c:1288
-+msgid "You need to specify a search type"
-+msgstr "Meg kell adni a keresendő típust"
-+
-+#: ../client/pk-console.c:1293
-+#: ../client/pk-console.c:1300
-+#: ../client/pk-console.c:1307
-+#: ../client/pk-console.c:1314
-+#: ../client/pk-console.c:1421
-+#: ../client/pk-console.c:1428
-+#: ../client/pk-console.c:1435
-+#: ../client/pk-console.c:1442
-+msgid "You need to specify a search term"
-+msgstr "Meg kell adni a keresendő kifejezést"
-+
-+#: ../client/pk-console.c:1319
-+msgid "Invalid search type"
-+msgstr "Érvénytelen típus"
-+
-+#: ../client/pk-console.c:1324
-+msgid "You need to specify a package or file to install"
-+msgstr "Meg kell adnia a telepítendő csomag vagy fájl nevét"
-+
-+#: ../client/pk-console.c:1339
-+msgid "You need to specify a type, key_id and package_id"
-+msgstr "Meg kell adnia egy típust, kulcs azonosítót és csomag azonosítót"
-+
-+#: ../client/pk-console.c:1346
-+msgid "You need to specify a package to remove"
-+msgstr "Meg kell adnia egy eltávolítandó csomagot"
-+
-+#: ../client/pk-console.c:1353
-+msgid "You need to specify a eula-id"
-+msgstr "Meg kell adnia egy végfelhasználó azonosítót"
-+
-+#: ../client/pk-console.c:1369
-+msgid "You need to specify a package name to resolve"
-+msgstr "Meg kell adnia egy feloldandó csomagnevet"
-+
-+#: ../client/pk-console.c:1376
-+#: ../client/pk-console.c:1383
-+msgid "You need to specify a repo name"
-+msgstr "Meg kell adnia egy tár nevét"
-+
-+#: ../client/pk-console.c:1390
-+msgid "You need to specify a repo name/parameter and value"
-+msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
-+
-+#: ../client/pk-console.c:1403
-+msgid "You need to specify a time term"
-+msgstr "Meg kell adnia egy időszakot"
-+
-+#: ../client/pk-console.c:1408
-+msgid "You need to specify a correct role"
-+msgstr "Meg kell adnia egy helyes szerepet"
-+
-+#: ../client/pk-console.c:1413
-+msgid "Failed to get last time"
-+msgstr "Nem sikerült megkapni az utolsó időt"
-+
-+#: ../client/pk-console.c:1449
-+msgid "You need to specify a package to find the details for"
-+msgstr "Meg kell adnia egy egy csomagot, amihez részletező keresendő"
-+
-+#: ../client/pk-console.c:1456
-+msgid "You need to specify a package to find the files for"
-+msgstr "Meg kell adnia egy csomagot, amihez fájlokat kell találni"
-+
-+#: ../client/pk-console.c:1503
-+#, c-format
-+msgid "Option '%s' not supported"
-+msgstr "„%s” opció nem támogatott"
-+
-+#: ../client/pk-console.c:1514
-+msgid "Command failed"
-+msgstr "Parancs elbukott"
-+
-+#: ../client/pk-console.c:1518
-+msgid "You don't have the necessary privileges for this operation"
-+msgstr "Önnek nincs meg szükséges jogosultsága e műveletre"
-+
-+#: ../client/pk-monitor.c:117
-+msgid "PackageKit Monitor"
-+msgstr "PackageKit figyelő"
-+
-+#: ../client/pk-import-desktop.c:293
-+#: ../client/pk-import-specspo.c:169
-+#, c-format
-+msgid "Could not open database: %s"
-+msgstr "Nem lehetett megnyitni %s adatbázist"
-+
-+#: ../client/pk-import-desktop.c:294
-+#: ../client/pk-import-specspo.c:170
-+msgid "You probably need to run this program as the root user"
-+msgstr "E program valószínűleg rendszergazdaként futtatható"
-+
-+#: ../src/pk-main.c:83
-+msgid "Startup failed due to security policies on this machine."
-+msgstr "Indulás sikertelen a gép biztonsági szabályzata miatt."
-+
-+#: ../src/pk-main.c:84
-+msgid "This can happen for two reasons:"
-+msgstr "Két okból történet mehet:"
-+
-+#: ../src/pk-main.c:85
-+msgid "The correct user is not launching the executable (usually root)"
-+msgstr "A helyes használó nem indítja a futtathatót (rendszerint rendszergada)"
-+
-+#: ../src/pk-main.c:86
-+msgid "The org.freedesktop.PackageKit.conf file is not installed in the system /etc/dbus-1/system.d directory"
-+msgstr "Az org.freedesktop.PackageKit.conf a rendszert nem telepítették a system /etc/dbus-1/system.d mappába"
-+
-+#: ../src/pk-main.c:185
-+msgid "Packaging backend to use, e.g. dummy"
-+msgstr "Használandó csomagoló háttér, pl. dummy"
-+
-+#: ../src/pk-main.c:187
-+msgid "Daemonize and detach from the terminal"
-+msgstr "Szolgálatatás és leválasztás terminálról"
-+
-+#: ../src/pk-main.c:191
-+msgid "Disable the idle timer"
-+msgstr "Tétlen időzítő kikapcsolása"
-+
-+#: ../src/pk-main.c:193
-+msgid "Show version and exit"
-+msgstr "Változat mutatása és kilépés"
-+
-+#: ../src/pk-main.c:195
-+msgid "Exit after a small delay"
-+msgstr "Kilépés rövid késleltetés után"
-+
-+#: ../src/pk-main.c:197
-+msgid "Exit after the engine has loaded"
-+msgstr "Kilépés a motor betöltése után"
-+
-+#: ../src/pk-main.c:207
-+msgid "PackageKit service"
-+msgstr "PackageKit szolgáltatás"
-+
-+#: ../src/pk-main.c:233
-+msgid "Cannot connect to the system bus"
-+msgstr "Nem lehetett csatlakozni a rendszerbuszhoz"
-+
-+#: ../src/pk-main.c:273
-+#, c-format
-+msgid "Error trying to start: %s\n"
-+msgstr "Hiba %s indításakor\n"
-+
-diff --git a/policy/org.freedesktop.packagekit.policy.in b/policy/org.freedesktop.packagekit.policy.in
-index 32efce7..4c4607d 100644
---- a/policy/org.freedesktop.packagekit.policy.in
-+++ b/policy/org.freedesktop.packagekit.policy.in
-@@ -133,5 +133,17 @@
- <allow_active>yes</allow_active>
- </defaults>
- </action>
-+
-+ <action id="org.freedesktop.packagekit.set-proxy">
-+ <_description>Set network proxy</_description>
-+ <_message>Authentication is required to set the network proxy used for downloading packages</_message>
-+ <icon_name>applications-internet</icon_name>
-+ <vendor_url>http://www.packagekit.org/pk-reference.html#methods-set-proxy</vendor_url>
-+ <defaults>
-+ <allow_inactive>no</allow_inactive>
-+ <allow_active>yes</allow_active>
-+ </defaults>
-+ </action>
-+
- </policyconfig>
-
-diff --git a/python/packagekit/daemonBackend.py b/python/packagekit/daemonBackend.py
-index 5253b39..9fd627a 100644
---- a/python/packagekit/daemonBackend.py
-+++ b/python/packagekit/daemonBackend.py
-@@ -325,13 +325,13 @@ class PackageKitBaseBackend(dbus.service.Object):
-
- @PKSignalHouseKeeper
- @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
-- signature='sssssss')
-- def RepoSignatureRequired(self,repo_name,key_url,key_userid,key_id,key_fingerprint,key_timestamp,key_type):
-+ signature='ssssssss')
-+ def RepoSignatureRequired(self,id,repo_name,key_url,key_userid,key_id,key_fingerprint,key_timestamp,key_type):
- '''
- send 'repo-signature-required' signal:
- '''
- pklog.info("RepoSignatureRequired (%s, %s, %s, %s, %s, %s, %s, %s)" %
-- (repo_name,key_url,key_userid,key_id,key_fingerprint,key_timestamp,key_type))
-+ (id,repo_name,key_url,key_userid,key_id,key_fingerprint,key_timestamp,key_type))
-
-
- #
-@@ -658,8 +658,9 @@ class PackageKitBaseBackend(dbus.service.Object):
- '''
- Implement the {backend}-remove functionality
- '''
-- pklog.info("RemovePackages(%s, %s, %s)" % (package[0], allowdep, autoremove))
-- self.doRemovePackages(package, allowdep, autoremove)
-+ pklog.info("RemovePackages(%s, %s, %s)" % (packages, allowdep,
-+ autoremove))
-+ self.doRemovePackages(packages, allowdep, autoremove)
-
- def doRemovePackages(self, packages, allowdep, autoremove):
- '''
-diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
-index f9c9f12..2bd416d 100644
---- a/src/pk-backend-spawn.c
-+++ b/src/pk-backend-spawn.c
-@@ -316,8 +316,8 @@ pk_backend_spawn_parse_stdout (PkBackendSpawn *backend_spawn, const gchar *line)
- pk_backend_set_percentage (backend_spawn->priv->backend, PK_BACKEND_PERCENTAGE_INVALID);
- } else if (pk_strequal (command, "repo-signature-required")) {
-
-- if (size != 9+99) {
-- pk_error ("invalid command '%s'", command);
-+ if (size != 9) {
-+ pk_warning ("invalid command '%s'", command);
- ret = FALSE;
- goto out;
- }
-diff --git a/src/pk-backend.c b/src/pk-backend.c
-index 37ed024..f0f245f 100644
---- a/src/pk-backend.c
-+++ b/src/pk-backend.c
-@@ -1484,8 +1484,7 @@ pk_backend_finished (PkBackend *backend)
- backend->priv->role == PK_ROLE_ENUM_REMOVE_PACKAGES ||
- backend->priv->role == PK_ROLE_ENUM_UPDATE_PACKAGES)) {
- pk_backend_message (backend, PK_MESSAGE_ENUM_DAEMON,
-- "Backends need to send a Package() for this role!");
-- return FALSE;
-+ "Backends should send a Package() for this role!");
- }
-
- /* if we set an error code notifier, clear */
-diff --git a/src/pk-backend.h b/src/pk-backend.h
-index fb17e3c..a7ba754 100644
---- a/src/pk-backend.h
-+++ b/src/pk-backend.h
-@@ -256,7 +256,7 @@ typedef struct {
- void (*update_system) (PkBackend *backend);
- void (*what_provides) (PkBackend *backend,
- PkFilterEnum filters,
-- PkProvidesEnum provide,
-+ PkProvidesEnum provides,
- const gchar *search);
- gpointer padding[10];
- } PkBackendDesc;
-diff --git a/src/pk-engine.c b/src/pk-engine.c
-index 028a0d0..14ecf41 100644
---- a/src/pk-engine.c
-+++ b/src/pk-engine.c
-@@ -154,6 +154,8 @@ pk_engine_error_get_type (void)
- static const GEnumValue values[] =
- {
- ENUM_ENTRY (PK_ENGINE_ERROR_INVALID_STATE, "InvalidState"),
-+ ENUM_ENTRY (PK_ENGINE_ERROR_REFUSED_BY_POLICY, "RefusedByPolicy"),
-+ ENUM_ENTRY (PK_ENGINE_ERROR_CANNOT_SET_PROXY, "CannotSetProxy"),
- { 0, NULL, NULL }
- };
- etype = g_enum_register_static ("PkEngineError", values);
-@@ -502,6 +504,47 @@ pk_engine_suggest_daemon_quit (PkEngine *engine, GError **error)
- }
-
- /**
-+ * pk_engine_set_proxy:
-+ **/
-+void
-+pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *proxy_ftp, DBusGMethodInvocation *context)
-+{
-+ gboolean ret;
-+ GError *error;
-+ gchar *sender = NULL;
-+ gchar *error_detail = NULL;
-+
-+ g_return_if_fail (PK_IS_ENGINE (engine));
-+
-+ pk_debug ("SetProxy method called: %s, %s", proxy_http, proxy_ftp);
-+
-+ /* check if the action is allowed from this client - if not, set an error */
-+ sender = dbus_g_method_get_sender (context);
-+
-+ /* use security model to get auth */
-+ ret = pk_security_action_is_allowed (engine->priv->security, sender, FALSE, PK__ROLE_ENUM_SET_PROXY, &error_detail);
-+ if (!ret) {
-+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_REFUSED_BY_POLICY, "%s", error_detail);
-+ dbus_g_method_return_error (context, error);
-+ goto out;
-+ }
-+
-+ /* try to set the new proxy */
-+ ret = pk_backend_set_proxy (engine->priv->backend, proxy_http, proxy_ftp);
-+ if (!ret) {
-+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "setting the proxy failed");
-+ dbus_g_method_return_error (context, error);
-+ goto out;
-+ }
-+
-+ /* all okay */
-+ dbus_g_method_return (context);
-+out:
-+ g_free (sender);
-+ g_free (error_detail);
-+}
-+
-+/**
- * pk_engine_class_init:
- * @klass: The PkEngineClass
- **/
-diff --git a/src/pk-engine.h b/src/pk-engine.h
-index c59b1f3..668451f 100644
---- a/src/pk-engine.h
-+++ b/src/pk-engine.h
-@@ -57,9 +57,12 @@ typedef enum
- {
- PK_ENGINE_ERROR_DENIED,
- PK_ENGINE_ERROR_INVALID_STATE,
-+ PK_ENGINE_ERROR_REFUSED_BY_POLICY,
-+ PK_ENGINE_ERROR_CANNOT_SET_PROXY,
- PK_ENGINE_ERROR_LAST
- } PkEngineError;
-
-+
- GQuark pk_engine_error_quark (void);
- GType pk_engine_error_get_type (void) G_GNUC_CONST;
- GType pk_engine_get_type (void) G_GNUC_CONST;
-@@ -100,6 +103,10 @@ gboolean pk_engine_state_has_changed (PkEngine *engine,
- GError **error);
- gboolean pk_engine_suggest_daemon_quit (PkEngine *engine,
- GError **error);
-+void pk_engine_set_proxy (PkEngine *engine,
-+ const gchar *proxy_http,
-+ const gchar *proxy_ftp,
-+ DBusGMethodInvocation *context);
-
- G_END_DECLS
-
-diff --git a/src/pk-interface.xml b/src/pk-interface.xml
-index e9e74e1..7290bbe 100644
---- a/src/pk-interface.xml
-+++ b/src/pk-interface.xml
-@@ -33,6 +33,11 @@
- <method name="GetNetworkState">
- <arg type="s" name="state" direction="out"/>
- </method>
-+ <method name="SetProxy">
-+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-+ <arg type="s" name="proxy_http" direction="in"/>
-+ <arg type="s" name="proxy_ftp" direction="in"/>
-+ </method>
-
- <signal name="TransactionListChanged">
- <arg type="as" name="transactions" direction="out"/>
-diff --git a/src/pk-security-polkit.c b/src/pk-security-polkit.c
-index 9abf992..81332d0 100644
---- a/src/pk-security-polkit.c
-+++ b/src/pk-security-polkit.c
-@@ -128,6 +128,9 @@ pk_security_role_to_action (PkSecurity *security, gboolean trusted, PkRoleEnum r
- policy = "org.freedesktop.packagekit.repo-change";
- } else if (role == PK_ROLE_ENUM_REFRESH_CACHE) {
- policy = "org.freedesktop.packagekit.refresh-cache";
-+ /* PRIVATE: not actually roles */
-+ } else if (role == PK__ROLE_ENUM_SET_PROXY) {
-+ policy = "org.freedesktop.packagekit.refresh-cache";
- }
- return policy;
- }
-diff --git a/src/pk-security.h b/src/pk-security.h
-index 3432095..eb55932 100644
---- a/src/pk-security.h
-+++ b/src/pk-security.h
-@@ -34,6 +34,9 @@ G_BEGIN_DECLS
- #define PK_IS_SECURITY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_SECURITY))
- #define PK_SECURITY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_SECURITY, PkSecurityClass))
-
-+/* FIXME: not actually a role */
-+#define PK__ROLE_ENUM_SET_PROXY 1 << 31
-+
- typedef struct PkSecurityPrivate PkSecurityPrivate;
-
- typedef struct
-diff --git a/src/pk-transaction-db.c b/src/pk-transaction-db.c
-index 7aa183f..d42bc7a 100644
---- a/src/pk-transaction-db.c
-+++ b/src/pk-transaction-db.c
-@@ -46,7 +46,12 @@ static void pk_transaction_db_init (PkTransactionDb *tdb);
- static void pk_transaction_db_finalize (GObject *object);
-
- #define PK_TRANSACTION_DB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_TRANSACTION_DB, PkTransactionDbPrivate))
-+
-+#if PK_BUILD_LOCAL
-+#define PK_TRANSACTION_DB_FILE "./transactions.db"
-+#else
- #define PK_TRANSACTION_DB_FILE PK_DB_DIR "/transactions.db"
-+#endif
-
- struct PkTransactionDbPrivate
- {
-diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
-index 0921c7c..f325f94 100644
---- a/src/pk-transaction-list.c
-+++ b/src/pk-transaction-list.c
-@@ -89,7 +89,6 @@ pk_transaction_list_get_from_transaction (PkTransactionList *tlist, PkTransactio
-
- /* find the runner with the transaction ID */
- length = tlist->priv->array->len;
-- pk_debug ("length = %i", length);
- for (i=0; i<length; i++) {
- item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
- if (item->transaction == transaction) {
-@@ -352,28 +351,29 @@ gchar **
- pk_transaction_list_get_array (PkTransactionList *tlist)
- {
- guint i;
-- guint count = 0;
- guint length;
-+ GPtrArray *parray;
- gchar **array;
- PkTransactionItem *item;
-
- g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), NULL);
-
-+ /* use a temp array, as not all are in progress */
-+ parray = g_ptr_array_new ();
-+
- /* find all the transactions in progress */
- length = tlist->priv->array->len;
--
-- /* create new strv list */
-- array = g_new0 (gchar *, length + 1);
--
-- pk_debug ("%i active transactions", length);
- for (i=0; i<length; i++) {
- item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
-- /* only return in the list if it worked */
-- if (item->committed && item->finished == FALSE) {
-- array[count] = g_strdup (item->tid);
-- count++;
-+ /* only return in the list if its committed and not finished */
-+ if (item->committed && !item->finished) {
-+ g_ptr_array_add (parray, g_strdup (item->tid));
- }
- }
-+ pk_debug ("%i transactions in list, %i active", length, parray->len);
-+ array = pk_ptr_array_to_argv (parray);
-+ g_ptr_array_free (parray, TRUE);
-+
- return array;
- }
-
-diff --git a/src/pk-transaction.c b/src/pk-transaction.c
-index 07ffdee..15faed3 100644
---- a/src/pk-transaction.c
-+++ b/src/pk-transaction.c
-@@ -71,6 +71,7 @@ struct PkTransactionPrivate
- PkStatusEnum status;
- gboolean finished;
- gboolean running;
-+ gboolean has_been_run;
- gboolean allow_cancel;
- gboolean emit_eula_required;
- gboolean emit_signature_required;
-@@ -798,6 +799,7 @@ pk_transaction_set_running (PkTransaction *transaction)
-
- /* mark running */
- transaction->priv->running = TRUE;
-+ transaction->priv->has_been_run = TRUE;
-
- /* set all possible arguments for backend */
- pk_backend_set_bool (priv->backend, "force", priv->cached_force);
-@@ -1152,11 +1154,17 @@ pk_transaction_cancel (PkTransaction *transaction, GError **error)
- g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
-
- pk_debug ("Cancel method called");
-- /* check to see if we are trying to cancel a non-running task */
-- if (!transaction->priv->running) {
-- g_set_error (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_RUNNING,
-- "cancelling a non-running transaction");
-- return FALSE;
-+
-+ /* if it's never been run, just remove this transaction from the list */
-+ if (!transaction->priv->has_been_run) {
-+ pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
-+ return TRUE;
-+ }
-+
-+ /* if it's finished, cancelling will have no action */
-+ if (transaction->priv->finished) {
-+ pk_warning ("No point trying to cancel a finished transaction, ignoring");
-+ return TRUE;
- }
-
- /* not implemented yet */
-@@ -2871,7 +2879,7 @@ pk_transaction_what_provides (PkTransaction *transaction, const gchar *filter, c
- return;
- }
-
-- provides = pk_role_enum_from_text (type);
-+ provides = pk_provides_enum_from_text (type);
- if (provides == PK_PROVIDES_ENUM_UNKNOWN) {
- error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INVALID_PROVIDE,
- "provide type '%s' not found", type);
-@@ -3011,6 +3019,7 @@ pk_transaction_init (PkTransaction *transaction)
- transaction->priv = PK_TRANSACTION_GET_PRIVATE (transaction);
- transaction->priv->finished = FALSE;
- transaction->priv->running = FALSE;
-+ transaction->priv->has_been_run = FALSE;
- transaction->priv->allow_cancel = FALSE;
- transaction->priv->emit_eula_required = FALSE;
- transaction->priv->emit_signature_required = FALSE;
-diff --git a/tools/add-error-enum.sh b/tools/add-error-enum.sh
-index f78c891..6521e69 100755
---- a/tools/add-error-enum.sh
-+++ b/tools/add-error-enum.sh
-@@ -7,5 +7,5 @@
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
-
--$EDITOR docs/spec/pk-introduction.xml libpackagekit/pk-enum.h libpackagekit/pk-enum.c ../gnome-packagekit/src/gpk-common.c
-+$EDITOR docs/spec/pk-concepts.xml libpackagekit/pk-enum.h libpackagekit/pk-enum.c ../gnome-packagekit/src/gpk-common.c
-
-diff --git a/tools/rpmbuild.sh b/tools/rpmbuild.sh
-deleted file mode 100755
-index ebbd8f7..0000000
---- a/tools/rpmbuild.sh
-+++ /dev/null
-@@ -1,19 +0,0 @@
--#!/bin/sh
--# Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
--#
--# Licensed under the GNU General Public License Version 2
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--
--sudo echo "Build!"
--#autobuild.sh all PolicyKit
--#sudo auto_refresh_from_repo.sh
--#autobuild.sh all PolicyKit-gnome
--#sudo auto_refresh_from_repo.sh
--autobuild.sh all PackageKit force
--sudo auto_refresh_from_repo.sh
--autobuild.sh all gnome-packagekit force
--sudo auto_refresh_from_repo.sh
--
diff --git a/packages/packagekit/files/03_group_infomation.patch b/packages/packagekit/files/03_group_infomation.patch
deleted file mode 100644
index 55872cd6ce..0000000000
--- a/packages/packagekit/files/03_group_infomation.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
-index 2d70108..02966c9 100644
---- a/backends/opkg/pk-backend-opkg.c
-+++ b/backends/opkg/pk-backend-opkg.c
-@@ -656,6 +656,8 @@ backend_get_details_thread (PkBackend *backend)
- {
- PkPackageId *pi;
- const gchar *package_id;
-+ int group_index;
-+ PkGroupEnum group = 0;
- opkg_package_t *pkg;
- gchar *newid;
-
-@@ -681,8 +683,16 @@ backend_get_details_thread (PkBackend *backend)
-
- newid = g_strdup_printf ("%s;%s;%s;%s", pkg->name, pkg->version, pkg->architecture, pkg->repository);
-
-- pk_backend_details (backend, newid, NULL, 0, pkg->description, pkg->url, pkg->size);
-+ if (pkg->tags) {
-+ for (group_index = 0; group < PK_GROUP_ENUM_UNKNOWN; group_index++) {
-+ group = 1 << group_index;
-+ if (!(group & backend_get_groups(backend))) continue;
-+ if (opkg_check_tag(pkg, (gchar *)pk_group_enum_to_text(group)))
-+ break;
-+ }
-+ }
-
-+ pk_backend_details (backend, newid, NULL, group, pkg->description, pkg->url, pkg->size);
- g_free (newid);
- pk_backend_finished (backend);
- return TRUE;
diff --git a/packages/packagekit/files/modify_summary_and_adding_reposi_info.patch b/packages/packagekit/files/modify_summary_and_adding_reposi_info.patch
new file mode 100644
index 0000000000..43da548d8e
--- /dev/null
+++ b/packages/packagekit/files/modify_summary_and_adding_reposi_info.patch
@@ -0,0 +1,69 @@
+diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
+index 9e71b90..92da8b0 100644
+--- a/backends/opkg/pk-backend-opkg.c
++++ b/backends/opkg/pk-backend-opkg.c
+@@ -281,6 +281,7 @@ pk_opkg_package_list_cb (opkg_t *opkg, opkg_package_t *pkg, void *data)
+ {
+ SearchParams *params;
+ gchar *uid;
++ gchar *summary;
+ gchar *haystack;
+ gint status, match;
+ PkFilterEnum filters;
+@@ -327,8 +328,14 @@ pk_opkg_package_list_cb (opkg_t *opkg, opkg_package_t *pkg, void *data)
+ break;
+ }
+
+- uid = g_strdup_printf ("%s;%s;%s;",
+- pkg->name, pkg->version, pkg->architecture);
++ uid = g_strdup_printf ("%s;%s;%s;%s",
++ pkg->name, pkg->version, pkg->architecture, pkg->repository);
++
++ if (!pkg->tags)
++ summary = g_strdup_printf("%s", pkg->description);
++ else
++ summary = g_strdup_printf("%s ;; %s", pkg->tags, pkg->description);
++
+
+ if (pkg->installed)
+ status = PK_INFO_ENUM_INSTALLED;
+@@ -350,10 +357,11 @@ pk_opkg_package_list_cb (opkg_t *opkg, opkg_package_t *pkg, void *data)
+ if ((filters & PK_FILTER_ENUM_NOT_INSTALLED) && (pkg->installed))
+ goto end_handle;
+
+- pk_backend_package (params->backend, status, uid, pkg->description);
++ pk_backend_package (params->backend, status, uid, summary);
+
+ end_handle:
+ g_free(uid);
++ g_free(summary);
+ }
+
+ static gboolean
+@@ -713,6 +721,7 @@ backend_get_details_thread (PkBackend *backend)
+ int group_index;
+ PkGroupEnum group = 0;
+ opkg_package_t *pkg;
++ gchar *summary;
+ gchar *newid;
+
+ package_id = pk_backend_get_string (backend, "package_id");
+@@ -746,13 +755,17 @@ backend_get_details_thread (PkBackend *backend)
+ if (opkg_check_tag(pkg, (gchar *)pk_group_enum_to_text(group)))
+ break;
+ }
++ summary = g_strdup_printf("%s ;; %s", pkg->tags, pkg->description);
+ }
++ else
++ summary = g_strdup_printf("%s", pkg->description);
+
+- pk_backend_details (backend, newid, NULL, group, pkg->description, pkg->url, pkg->size);
++ pk_backend_details (backend, newid, NULL, group, summary, pkg->url, pkg->size);
+ pk_backend_finished (backend);
+ opkg_thread_unlock();
+
+ g_free (newid);
++ g_free (summary);
+ opkg_package_free(pkg);
+ return TRUE;
+ }
diff --git a/packages/packagekit/files/pk-nodocs.patch b/packages/packagekit/files/pk-nodocs.patch
deleted file mode 100644
index c775128867..0000000000
--- a/packages/packagekit/files/pk-nodocs.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- /tmp/Makefile.am 2008-05-31 12:17:08.492193028 +0200
-+++ git/Makefile.am 2008-05-31 12:17:18.884499290 +0200
-@@ -16,7 +16,6 @@
- client \
- backends \
- python \
-- docs \
- $(NULL)
-
- clean-local :
diff --git a/packages/packagekit/packagekit_git.bb b/packages/packagekit/packagekit_git.bb
index 8e86bc8596..3dde9c9aa9 100644
--- a/packages/packagekit/packagekit_git.bb
+++ b/packages/packagekit/packagekit_git.bb
@@ -5,7 +5,7 @@ LICENSE = "GPL"
DEPENDS = "dbus (>= 1.1.1) dbus-glib glib-2.0 sqlite3 opkg intltool intltool-native (>= 0.37.1)"
RDEPENDS_${PN} = "opkg"
PV = "0.2.3+gitr${SRCREV}"
-PR = "r16"
+PR = "r17"
PE = "1"
SRC_URI = "git://anongit.freedesktop.org/git/packagekit;protocol=git \
@@ -14,6 +14,7 @@ SRC_URI = "git://anongit.freedesktop.org/git/packagekit;protocol=git \
file://force_depends.patch;patch=1 \
file://remove_search_memory_leak.patch;patch=1 \
file://racing_condition.patch;patch=1 \
+ file://modify_summary_and_adding_reposi_info.patch;patch=1 \
"