diff options
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> </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"> </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"> </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 \ " |