File 0004-zypp-use-the-right-functions-to-get-solvables.patch of Package PackageKit.openSUSE_12.3_Update
From 3d07320cd618f4a6edb7bf806d144f39a31c8245 Mon Sep 17 00:00:00 2001
From: Stephan Kulow <coolo@suse.de>
Date: Fri, 18 Jan 2013 11:25:14 +0100
Subject: [PATCH] zypp: use the right functions to get solvables
package_ids are unique in the system, so there is no need to have
special logic to find the pool items matching in most threads.
Smaller fixes here and there too.
---
backends/zypp/pk-backend-zypp.cpp | 450 ++++++++++----------------------------
backends/zypp/zypp-events.h | 48 ++--
backends/zypp/zypp-utils.cpp | 118 +++++-----
backends/zypp/zypp-utils.h | 20 +-
4 files changed, 220 insertions(+), 416 deletions(-)
diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index 493ca6c..05a3662 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -129,12 +129,6 @@ pk_backend_initialize (PkBackend *backend)
priv->currentJob = 0;
zypp_logging ();
- /* BACKEND MAINTAINER: feel free to remove this when you've
- * added support for ONLY_DOWNLOAD and merged the simulate
- * methods as specified in backends/PORTING.txt */
- /*g_error ("Backend needs to be ported to 0.8.x -- "
- "see backends/PORTING.txt for details"); */
-
g_debug ("zypp_backend_initialize");
//_updating_self = FALSE;
}
@@ -152,6 +146,13 @@ pk_backend_destroy (PkBackend *backend)
delete priv;
}
+
+static bool
+zypp_is_no_solvable (const sat::Solvable &solv)
+{
+ return solv.id() == sat::detail::noSolvableId;
+}
+
/**
* backend_get_requires_thread:
*/
@@ -162,13 +163,11 @@ backend_get_requires_thread (PkBackendJob *job, GVariant *params, gpointer user_
PkBitfield _filters;
gchar **package_ids;
- bool recursive;
+ gboolean recursive;
g_variant_get(params, "(t^a&sb)",
- &_filters,
- &package_ids,
- &recursive);
-
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
+ &_filters,
+ &package_ids,
+ &recursive);
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -178,57 +177,29 @@ backend_get_requires_thread (PkBackendJob *job, GVariant *params, gpointer user_
return;
}
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
- return;
- }
-
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
- //TODO repair percentages
- //pk_backend_job_set_percentage (job, 0);
+ pk_backend_job_set_percentage (job, 10);
PoolStatusSaver saver;
ResPool pool = zypp_build_pool (zypp, true);
for (uint i = 0; package_ids[i]; i++) {
- sat::Solvable solvable = zypp_get_package_by_id (backend, package_ids[i]);
- PoolItem package;
-
- if (solvable.isSystem ()) {
- gboolean found = FALSE;
- gchar **id_parts = pk_package_id_split (package_ids[i]);
-
- for (ResPool::byIdent_iterator it = pool.byIdentBegin (ResKind::package, id_parts[PK_PACKAGE_ID_NAME]);
- it != pool.byIdentEnd (ResKind::package, id_parts[PK_PACKAGE_ID_NAME]); ++it) {
- if (it->status ().isInstalled ()) {
- package = (*it);
- found = TRUE;
- }
- }
- g_strfreev (id_parts);
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
- if (!found) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED,
- "Package is not installed");
- return;
- }
+ if (zypp_is_no_solvable(solvable)) {
+ zypp_backend_finished_error (job, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+ "Package couldn't be found");
+ return;
+ }
- // set Package as to be uninstalled
- package.status ().setToBeUninstalled (ResStatus::USER);
- } else {
- if (solvable == sat::Solvable::noSolvable) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
- "Package couldn't be found");
- return;
- }
+ PoolItem package = PoolItem(solvable);
- package = PoolItem(solvable);
- //set Package as to be installed
- package.status ().setToBeInstalled (ResStatus::USER);
- }
+ // get-requires only works for installed packages. It's meaningless for stuff in the repo
+ // same with yum backend
+ if (!solvable.isSystem ())
+ continue;
+ // set Package as to be uninstalled
+ package.status ().setToBeUninstalled (ResStatus::USER);
// solver run
ResPool pool = ResPool::instance ();
@@ -238,13 +209,14 @@ backend_get_requires_thread (PkBackendJob *job, GVariant *params, gpointer user_
solver.setIgnoreAlreadyRecommended (TRUE);
if (!solver.resolvePool ()) {
+ string problem = "Resolution failed: ";
list<ResolverProblem_Ptr> problems = solver.problems ();
for (list<ResolverProblem_Ptr>::iterator it = problems.begin (); it != problems.end (); ++it){
- g_warning("Solver problem (This should never happen): '%s'", (*it)->description ().c_str ());
+ problem += (*it)->description ();
}
zypp_backend_finished_error (
job, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
- "Resolution failed");
+ problem.c_str());
return;
}
@@ -313,12 +285,6 @@ pk_backend_get_filters (PkBackend *backend)
-1);
}
-static bool
-zypp_is_no_solvable (const sat::Solvable &solv)
-{
- return solv.id() == sat::detail::noSolvableId;
-}
-
/*
* This method is a bit of a travesty of the complexity of
* solving dependencies. We try to give a simple answer to
@@ -328,8 +294,6 @@ zypp_is_no_solvable (const sat::Solvable &solv)
static void
backend_get_depends_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
{
- MIL << endl;
-
PkBitfield _filters;
gchar **package_ids;
gboolean recursive;
@@ -341,13 +305,6 @@ backend_get_depends_thread (PkBackendJob *job, GVariant *params, gpointer user_d
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
pk_backend_job_set_percentage (job, 0);
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID,
- "invalid package id");
- return;
- }
-
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -355,42 +312,16 @@ backend_get_depends_thread (PkBackendJob *job, GVariant *params, gpointer user_d
pk_backend_job_finished (job);
return;
}
-
- g_debug ("get_depends with filter '%s'", pk_filter_bitfield_to_string (_filters));
+
+ MIL << pk_filter_bitfield_to_string (_filters) << endl;
try
{
- gchar **id_parts = pk_package_id_split (package_ids[0]);
+ sat::Solvable solvable = zypp_get_package_by_id(package_ids[0]);
+
pk_backend_job_set_percentage (job, 20);
- // Load resolvables from all the enabled repositories
- ResPool pool = zypp_build_pool (zypp, true);
-
- PoolItem pool_item;
- gboolean pool_item_found = FALSE;
- // Iterate over the resolvables and mark the one we want to check its dependencies
- for (ResPool::byIdent_iterator it = pool.byIdentBegin (ResKind::package, id_parts[PK_PACKAGE_ID_NAME]);
- it != pool.byIdentEnd (ResKind::package, id_parts[PK_PACKAGE_ID_NAME]); ++it) {
- PoolItem selectable = *it;
- if (strcmp (selectable->name().c_str(), id_parts[PK_PACKAGE_ID_NAME]) == 0) {
- // This package matches the name we're looking
- char *edition_str = g_strdup (selectable->edition ().asString ().c_str());
-
- if (strcmp (edition_str, id_parts[PK_PACKAGE_ID_VERSION]) == 0) {
- g_free (edition_str);
- // this is the one, mark it to be installed
- pool_item = selectable;
- pool_item_found = TRUE;
- pk_backend_job_set_percentage (job, 20);
- break; // Found it, get out of the for loop
- }
- g_free (edition_str);
- }
- }
- g_strfreev (id_parts);
- pk_backend_job_set_percentage (job, 40);
-
- if (!pool_item_found) {
+ if (zypp_is_no_solvable(solvable)) {
zypp_backend_finished_error (
job, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
"Did not find the specified package.");
@@ -402,8 +333,6 @@ backend_get_depends_thread (PkBackendJob *job, GVariant *params, gpointer user_d
pk_backend_job_set_percentage (job, 60);
// get dependencies
-
- sat::Solvable solvable = pool_item.satSolvable ();
Capabilities req = solvable[Dep::REQUIRES];
// which package each capability
@@ -518,8 +447,6 @@ backend_get_details_thread (PkBackendJob *job, GVariant *params, gpointer user_d
g_variant_get (params, "(^a&s)",
&package_ids);
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
-
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -528,36 +455,11 @@ backend_get_details_thread (PkBackendJob *job, GVariant *params, gpointer user_d
return;
}
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
- return;
- }
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
for (uint i = 0; package_ids[i]; i++) {
- gchar **id_parts = pk_package_id_split (package_ids[i]);
-
- vector<sat::Solvable> v;
- vector<sat::Solvable> v2;
- vector<sat::Solvable> v3;
- zypp_get_packages_by_name (backend, (const gchar *)id_parts[PK_PACKAGE_ID_NAME], ResKind::package, v);
- zypp_get_packages_by_name (backend, (const gchar *)id_parts[PK_PACKAGE_ID_NAME], ResKind::patch, v2);
- zypp_get_packages_by_name (backend, (const gchar *)id_parts[PK_PACKAGE_ID_NAME], ResKind::srcpackage, v3);
- v.insert (v.end (), v2.begin (), v2.end ());
- v.insert (v.end (), v3.begin (), v3.end ());
-
- sat::Solvable solv;
- for (vector<sat::Solvable>::iterator it = v.begin ();
- it != v.end (); ++it) {
- if (zypp_ver_and_arch_equal (*it, id_parts[PK_PACKAGE_ID_VERSION],
- id_parts[PK_PACKAGE_ID_ARCH])) {
- solv = *it;
- break;
- }
- }
- g_strfreev (id_parts);
+ sat::Solvable solv = zypp_get_package_by_id( package_ids[i] );
ResObject::constPtr obj = make<ResObject>( solv );
if (obj == NULL) {
@@ -924,8 +826,6 @@ backend_get_update_detail_thread (PkBackendJob *job, GVariant *params, gpointer
g_variant_get (params, "(^a&s)",
&package_ids);
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
-
if (zypp == NULL){
pk_backend_job_finished (job);
return;
@@ -939,7 +839,8 @@ backend_get_update_detail_thread (PkBackendJob *job, GVariant *params, gpointer
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
for (uint i = 0; package_ids[i]; i++) {
- sat::Solvable solvable = zypp_get_package_by_id (backend, package_ids[i]);
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
+ MIL << package_ids[i] << " " << solvable << endl;
Capabilities obs = solvable.obsoletes ();
@@ -1018,10 +919,10 @@ backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointer u
PkBitfield transaction_flags = 0;
gchar **package_ids;
-
+
g_variant_get(params, "(t^a&s)",
- &transaction_flags,
- &package_ids);
+ &transaction_flags,
+ &package_ids);
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -1039,12 +940,6 @@ backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointer u
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
pk_backend_job_set_percentage (job, 0);
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
- return;
- }
-
try
{
ResPool pool = zypp_build_pool (zypp, TRUE);
@@ -1053,58 +948,17 @@ backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointer u
guint to_install = 0;
for (guint i = 0; package_ids[i]; i++) {
- gchar **id_parts = pk_package_id_split (package_ids[i]);
-
- // Iterate over the selectables and mark the one with the right name
- ui::Selectable::constPtr selectable;
- string name = id_parts[PK_PACKAGE_ID_NAME];
-
- // Do we have this installed ?
- gboolean system = false;
- for (ResPool::byName_iterator it = pool.byNameBegin (name);
- it != pool.byNameEnd (name); ++it) {
-
- g_debug ("PoolItem '%s'", it->satSolvable().asString().c_str());
-
- if (!it->satSolvable().isSystem())
- continue;
-
- if (zypp_ver_and_arch_equal (it->satSolvable(), id_parts[PK_PACKAGE_ID_VERSION],
- id_parts[PK_PACKAGE_ID_ARCH])) {
- system = true;
- break;
- }
- }
-
- if (!system) {
- gboolean hit = false;
-
- // Choose the PoolItem with the right architecture and version
- for (ResPool::byName_iterator it = pool.byNameBegin (name);
- it != pool.byNameEnd (name); ++it) {
-
- if (zypp_ver_and_arch_equal (it->satSolvable(), id_parts[PK_PACKAGE_ID_VERSION],
- id_parts[PK_PACKAGE_ID_ARCH])) {
- hit = true;
- to_install++;
- // set status to ToBeInstalled
- it->status ().setToBeInstalled (ResStatus::USER);
- items->push_back (*it);
- break;
- }
- }
- if (!hit) {
- g_strfreev (id_parts);
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
- "Couldn't find the package '%s'.", package_ids[i]);
- return;
- }
-
- }
- g_strfreev (id_parts);
+ MIL << package_ids[i] << endl;
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
+
+ to_install++;
+ PoolItem item(solvable);
+ // set status to ToBeInstalled
+ item.status ().setToBeInstalled (ResStatus::USER);
+ items->push_back (item);
+
}
-
+
pk_backend_job_set_percentage (job, 40);
if (!to_install) {
@@ -1187,10 +1041,10 @@ backend_remove_packages_thread (PkBackendJob *job, GVariant *params, gpointer us
vector<PoolItem> *items = new vector<PoolItem> ();
g_variant_get(params, "(t^a&sbb)",
- &transaction_flags,
- &package_ids,
- &allow_deps,
- &autoremove);
+ &transaction_flags,
+ &package_ids,
+ &allow_deps,
+ &autoremove);
pk_backend_job_set_status (job, PK_STATUS_ENUM_REMOVE);
pk_backend_job_set_percentage (job, 0);
@@ -1211,27 +1065,21 @@ backend_remove_packages_thread (PkBackendJob *job, GVariant *params, gpointer us
target->load ();
pk_backend_job_set_percentage (job, 10);
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
- return;
- }
for (guint i = 0; package_ids[i]; i++) {
- gchar **id_parts = pk_package_id_split (package_ids[i]);
-
- // Iterate over the resolvables and mark the ones we want to remove
- ResPool pool = ResPool::instance ();
- for (ResPool::byIdent_iterator it = pool.byIdentBegin (ResKind::package, id_parts[PK_PACKAGE_ID_NAME]);
- it != pool.byIdentEnd (ResKind::package, id_parts[PK_PACKAGE_ID_NAME]); ++it) {
- if ((*it)->isSystem ()) {
- it->status ().setToBeUninstalled (ResStatus::USER);
- items->push_back (*it);
- break;
- } else {
- it->status ().resetTransact (ResStatus::USER);
- }
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
+
+ if (zypp_is_no_solvable(solvable)) {
+ zypp_backend_finished_error (job, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+ "couldn't find package");
+ return;
+ }
+ PoolItem item(solvable);
+ if (solvable.isSystem ()) {
+ item.status ().setToBeUninstalled (ResStatus::USER);
+ items->push_back (item);
+ } else {
+ item.status ().resetTransact (ResStatus::USER);
}
- g_strfreev (id_parts);
}
pk_backend_job_set_percentage (job, 40);
@@ -1280,14 +1128,12 @@ static void
backend_resolve_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
{
MIL << endl;
- gchar **package_ids;
+ gchar **search;
PkBitfield _filters;
g_variant_get(params, "(t^a&s)",
&_filters,
- &package_ids);
-
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
+ &search);
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -1296,27 +1142,31 @@ backend_resolve_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
pk_backend_job_finished (job);
return;
}
-
+
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
zypp_build_pool (zypp, TRUE);
- for (uint i = 0; package_ids[i]; i++) {
+ for (uint i = 0; search[i]; i++) {
vector<sat::Solvable> v;
-
+
/* build a list of packages with this name */
- zypp_get_packages_by_name (backend, package_ids[i], ResKind::package, v);
+ zypp_get_packages_by_name (search[i], ResKind::package, v);
/* add source packages */
if (!pk_bitfield_contain (_filters, PK_FILTER_ENUM_NOT_SOURCE)) {
vector<sat::Solvable> src;
- zypp_get_packages_by_name (backend, package_ids[i], ResKind::srcpackage, src);
+ zypp_get_packages_by_name (search[i], ResKind::srcpackage, src);
v.insert (v.end (), src.begin (), src.end ());
}
/* include patches too */
vector<sat::Solvable> v2;
- zypp_get_packages_by_name (backend, package_ids[i], ResKind::patch, v2);
+ zypp_get_packages_by_name (search[i], ResKind::patch, v2);
+ v.insert (v.end (), v2.begin (), v2.end ());
+
+ /* include patterns too */
+ zypp_get_packages_by_name (search[i], ResKind::pattern, v2);
v.insert (v.end (), v2.begin (), v2.end ());
sat::Solvable newest;
@@ -1326,19 +1176,19 @@ backend_resolve_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
for (vector<sat::Solvable>::iterator it = v.begin (); it != v.end (); ++it) {
if (zypp_filter_solvable (_filters, *it) ||
- *it == sat::Solvable::noSolvable)
+ zypp_is_no_solvable(*it))
continue;
-
- if (newest == sat::Solvable::noSolvable) {
+
+ if (zypp_is_no_solvable(newest)) {
newest = *it;
} else if (it->edition() > newest.edition() || Arch::compare(it->arch(), newest.arch()) > 0) {
newest = *it;
}
pkgs.push_back (*it);
}
-
- if (newest != sat::Solvable::noSolvable) {
-
+
+ if (!zypp_is_no_solvable(newest)) {
+
/* 'newest' filter support */
if (pk_bitfield_contain (_filters, PK_FILTER_ENUM_NEWEST)) {
pkgs.clear();
@@ -1568,7 +1418,7 @@ pk_backend_get_repo_list (PkBackend *backend, PkBackendJob *job, PkBitfield filt
}
for (list <RepoInfo>::iterator it = repos.begin(); it != repos.end(); ++it) {
- if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_DEVELOPMENT) && zypp_is_development_repo (backend, *it))
+ if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_DEVELOPMENT) && zypp_is_development_repo (*it))
continue;
// RepoInfo::alias - Unique identifier for this source.
// RepoInfo::name - Short label or description of the
@@ -1635,9 +1485,7 @@ backend_get_files_thread (PkBackendJob *job, GVariant *params, gpointer user_dat
gchar **package_ids;
g_variant_get(params, "(^a&s)",
- &package_ids);
-
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
+ &package_ids);
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -1647,40 +1495,11 @@ backend_get_files_thread (PkBackendJob *job, GVariant *params, gpointer user_dat
return;
}
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
- return;
- }
-
for (uint i = 0; package_ids[i]; i++) {
- gchar **id_parts = pk_package_id_split (package_ids[i]);
pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
-
- vector<sat::Solvable> v;
- vector<sat::Solvable> v2;
- vector<sat::Solvable> v3;
- zypp_get_packages_by_name (backend, (const gchar *)id_parts[PK_PACKAGE_ID_NAME], ResKind::package, v);
- zypp_get_packages_by_name (backend, (const gchar *)id_parts[PK_PACKAGE_ID_NAME], ResKind::srcpackage, v2);
- zypp_get_packages_by_name (backend, (const gchar *)id_parts[PK_PACKAGE_ID_NAME], ResKind::patch, v3);
-
- v.insert (v.end (), v2.begin (), v2.end ());
- v.insert (v.end (), v3.begin (), v3.end ());
-
- sat::Solvable package;
- for (vector<sat::Solvable>::iterator it = v.begin ();
- it != v.end (); ++it) {
- char *version = g_strdup (it->edition ().asString ().c_str ());
- if (strcmp (id_parts[PK_PACKAGE_ID_VERSION], version) == 0) {
- g_free (version);
- package = *it;
- break;
- }
- g_free (version);
- }
- g_strfreev (id_parts);
-
- if (package == NULL) {
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
+
+ if (zypp_is_no_solvable(solvable)) {
zypp_backend_finished_error (
job, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
"couldn't find package");
@@ -1688,9 +1507,9 @@ backend_get_files_thread (PkBackendJob *job, GVariant *params, gpointer user_dat
}
string temp;
- if (package.isSystem ()){
+ if (solvable.isSystem ()){
try {
- target::rpm::RpmHeader::constPtr rpmHeader = zypp_get_rpmHeader (package.name (), package.edition ());
+ target::rpm::RpmHeader::constPtr rpmHeader = zypp_get_rpmHeader (solvable.name (), solvable.edition ());
list<string> files = rpmHeader->tag_filenames ();
for (list<string>::iterator it = files.begin (); it != files.end (); ++it) {
@@ -1699,10 +1518,9 @@ backend_get_files_thread (PkBackendJob *job, GVariant *params, gpointer user_dat
}
} catch (const target::rpm::RpmException &ex) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_REPO_NOT_FOUND,
- "Couldn't open rpm-database");
- return;
+ zypp_backend_finished_error (job, PK_ERROR_ENUM_REPO_NOT_FOUND,
+ "Couldn't open rpm-database");
+ return;
}
} else {
temp = "Only available for installed packages";
@@ -1771,11 +1589,9 @@ backend_update_packages_thread (PkBackendJob *job, GVariant *params, gpointer us
PkBitfield transaction_flags = 0;
gchar **package_ids;
g_variant_get(params, "(t^a&s)",
- &transaction_flags,
- &package_ids);
-
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
-
+ &transaction_flags,
+ &package_ids);
+
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -1787,24 +1603,7 @@ backend_update_packages_thread (PkBackendJob *job, GVariant *params, gpointer us
PkRestartEnum restart = PK_RESTART_ENUM_NONE;
for (guint i = 0; package_ids[i]; i++) {
- gchar **id_parts = pk_package_id_split (package_ids[i]);
- string name = id_parts[PK_PACKAGE_ID_NAME];
-
- // Do we have already the latest version.
- gboolean system = false;
- for (ResPool::byName_iterator it = pool.byNameBegin (name);
- it != pool.byNameEnd (name); ++it) {
- if (!it->satSolvable().isSystem())
- continue;
- if (zypp_ver_and_arch_equal (it->satSolvable(), id_parts[PK_PACKAGE_ID_VERSION],
- id_parts[PK_PACKAGE_ID_ARCH])) {
- system = true;
- break;
- }
- }
- if (system == true)
- continue;
- sat::Solvable solvable = zypp_get_package_by_id (backend, package_ids[i]);
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
PoolItem item(solvable);
item.status ().setToBeInstalled (ResStatus::USER);
Patch::constPtr patch = asKind<Patch>(item.resolvable ());
@@ -2065,8 +1864,8 @@ backend_download_packages_thread (PkBackendJob *job, GVariant *params, gpointer
const gchar *tmpDir;
g_variant_get(params, "(^a&ss)",
- &package_ids,
- &tmpDir);
+ &package_ids,
+ &tmpDir);
ZyppJob zjob(job);
ZYpp::Ptr zypp = zjob.get_zypp();
@@ -2081,63 +1880,52 @@ backend_download_packages_thread (PkBackendJob *job, GVariant *params, gpointer
return;
}
- if (!pk_package_ids_check (package_ids)) {
- zypp_backend_finished_error (
- job, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
- return;
- }
-
try
{
ResPool pool = zypp_build_pool (zypp, FALSE);
- PoolItem item;
pk_backend_job_set_status (job, PK_STATUS_ENUM_DOWNLOAD);
for (guint i = 0; package_ids[i]; i++) {
- gchar **id_parts = pk_package_id_split (package_ids[i]);
- string name = id_parts[PK_PACKAGE_ID_NAME];
-
- for (ResPool::byName_iterator it = pool.byNameBegin (name); it != pool.byNameEnd (name); ++it) {
- if (zypp_ver_and_arch_equal (it->satSolvable(), id_parts[PK_PACKAGE_ID_VERSION],
- id_parts[PK_PACKAGE_ID_ARCH])) {
- size += 2 * it->resolvable()->downloadSize();
- item = *it;
- break;
- }
+ sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]);
+
+ if (zypp_is_no_solvable(solvable)) {
+ zypp_backend_finished_error (job, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+ "couldn't find package");
+ return;
}
- sat::Solvable solvable = item.resolvable()->satSolvable();
+ PoolItem item(solvable);
+ size += 2 * make<ResObject>(solvable)->downloadSize();
filesystem::Pathname repo_dir = solvable.repository().info().packagesPath();
struct statfs stat;
statfs(repo_dir.c_str(), &stat);
if (size > stat.f_bavail * 4) {
- g_strfreev (id_parts);
pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_SPACE_ON_DEVICE,
"Insufficient space in download directory '%s'.", repo_dir.c_str());
pk_backend_job_finished (job);
return;
}
- filesystem::Pathname tmp_file;
repo::RepoMediaAccess access;
repo::DeltaCandidates deltas;
- if (strcmp (id_parts[PK_PACKAGE_ID_ARCH], "source") == 0) {
+ ManagedFile tmp_file;
+ if (isKind<SrcPackage>(solvable)) {
SrcPackage::constPtr package = asKind<SrcPackage>(item.resolvable());
repo::SrcPackageProvider pkgProvider(access);
- pkgProvider.provideSrcPackage(package);
- tmp_file = solvable.repository().info().packagesPath()+ package->location().filename();
-
+ tmp_file = pkgProvider.provideSrcPackage(package);
} else {
Package::constPtr package = asKind<Package>(item.resolvable());
repo::PackageProvider pkgProvider(access, package, deltas);
- pkgProvider.providePackage();
- tmp_file = solvable.repository().info().packagesPath()+ package->location().filename();
+ tmp_file = pkgProvider.providePackage();
}
- pk_backend_job_files (job, package_ids[i], tmp_file.c_str());
- zypp_backend_package (job, PK_INFO_ENUM_DOWNLOADING, solvable, item->summary ().c_str());
-
- g_strfreev (id_parts);
+ string target = tmpDir;
+ // be sure it ends with /
+ target += "/";
+ target += tmp_file->basename();
+ filesystem::hardlinkCopy(tmp_file, target);
+ pk_backend_job_files (job, package_ids[i], target.c_str());
+ pk_backend_job_package (job, PK_INFO_ENUM_DOWNLOADING, package_ids[i], item->summary ().c_str());
}
} catch (const Exception &ex) {
zypp_backend_finished_error (
diff --git a/backends/zypp/zypp-events.h b/backends/zypp/zypp-events.h
index 4794783..b18bf94 100644
--- a/backends/zypp/zypp-events.h
+++ b/backends/zypp/zypp-events.h
@@ -84,9 +84,15 @@ public:
// fact that libzypp may skip over a "divisible by ten"
// value (i.e., 28, 29, 31, 32).
+ MIL << percentage << " " << _sub_percentage << std::endl;
if (percentage <= _sub_percentage)
return;
+ if (!_package_id) {
+ MIL << "percentage without package" << std::endl;
+ return;
+ }
+
_sub_percentage = percentage;
pk_backend_job_set_item_progress(_job, _package_id, PK_STATUS_ENUM_UNKNOWN, _sub_percentage);
}
@@ -105,26 +111,40 @@ protected:
struct InstallResolvableReportReceiver : public zypp::callback::ReceiveReport<zypp::target::rpm::InstallResolvableReport>, ZyppBackendReceiver
{
zypp::Resolvable::constPtr _resolvable;
+ bool preparing;
+ int last_value;
virtual void start (zypp::Resolvable::constPtr resolvable)
{
clear_package_id ();
_package_id = zypp_build_package_id_from_resolvable (resolvable->satSolvable ());
+ MIL << resolvable << " " << _package_id << std::endl;
gchar* summary = g_strdup(zypp::asKind<zypp::ResObject>(resolvable)->summary().c_str ());
- g_debug ("InstallResolvableReportReceiver::start(): %s", _package_id == NULL ? "unknown" : _package_id);
if (_package_id != NULL) {
pk_backend_job_set_status (_job, PK_STATUS_ENUM_INSTALL);
pk_backend_job_package (_job, PK_INFO_ENUM_INSTALLING, _package_id, summary);
reset_sub_percentage ();
}
+ // first we prepare then we install
+ preparing = true;
+ last_value = 0;
g_free (summary);
}
virtual bool progress (int value, zypp::Resolvable::constPtr resolvable)
{
- //g_debug ("InstallResolvableReportReceiver::progress(), %s:%d", _package_id == NULL ? "unknown" : _package_id, value);
- if (_package_id != NULL)
- update_sub_percentage (value);
+ // we need to have extra logic here as progress is reported twice
+ // and PackageKit does not like percentages going back
+ if (preparing && value < last_value)
+ preparing = false;
+ last_value = value;
+ MIL << preparing << " " << value << " " << _package_id << std::endl;
+ int perc = 0;
+ if (preparing)
+ perc = value * 30 / 100;
+ else
+ perc = 30 + value * 70 / 100;
+ update_sub_percentage (perc);
return true;
}
@@ -136,7 +156,7 @@ struct InstallResolvableReportReceiver : public zypp::callback::ReceiveReport<zy
virtual void finish (zypp::Resolvable::constPtr resolvable, Error error, const std::string &reason, RpmLevel level)
{
- //g_debug ("InstallResolvableReportReceiver::finish(): %s", _package_id == NULL ? "unknown" : _package_id);
+ MIL << reason << " " << _package_id << " " << resolvable << std::endl;
if (_package_id != NULL) {
//pk_backend_job_package (_backend, PK_INFO_ENUM_INSTALLED, _package_id, "TODO: Put the package summary here if possible");
clear_package_id ();
@@ -161,8 +181,7 @@ struct RemoveResolvableReportReceiver : public zypp::callback::ReceiveReport<zyp
virtual bool progress (int value, zypp::Resolvable::constPtr resolvable)
{
- if (_package_id != NULL)
- update_sub_percentage (value);
+ update_sub_percentage (value);
return true;
}
@@ -227,6 +246,7 @@ struct DownloadProgressReportReceiver : public zypp::callback::ReceiveReport<zyp
{
virtual void start (zypp::Resolvable::constPtr resolvable, const zypp::Url &file)
{
+ MIL << resolvable << " " << file << std::endl;
clear_package_id ();
_package_id = zypp_build_package_id_from_resolvable (resolvable->satSolvable ());
gchar* summary = g_strdup(zypp::asKind<zypp::ResObject>(resolvable)->summary().c_str ());
@@ -243,17 +263,16 @@ struct DownloadProgressReportReceiver : public zypp::callback::ReceiveReport<zyp
virtual bool progress (int value, zypp::Resolvable::constPtr resolvable)
{
- //fprintf (stderr, "\n\n----> DownloadProgressReportReceiver::progress(), %s:%d\n\n", _package_id == NULL ? "unknown" : _package_id, value);
- if (_package_id != NULL) {
- update_sub_percentage (value);
- //pk_backend_job_set_speed (_job, static_cast<guint>(dbps_current));
- }
+ MIL << resolvable << " " << value << " " << _package_id << std::endl;
+ update_sub_percentage (value);
+ //pk_backend_job_set_speed (_job, static_cast<guint>(dbps_current));
return true;
}
virtual void finish (zypp::Resolvable::constPtr resolvable, Error error, const std::string &konreason)
{
- //fprintf (stderr, "\n\n----> DownloadProgressReportReceiver::finish(): %s\n", _package_id == NULL ? "unknown" : _package_id);
+ MIL << resolvable << " " << error << " " << _package_id << std::endl;
+ update_sub_percentage (100);
clear_package_id ();
}
};
@@ -272,17 +291,20 @@ struct ProgressReportReceiver : public zypp::callback::ReceiveReport<zypp::Progr
{
virtual void start (const zypp::ProgressData &progress)
{
+ MIL << std::endl;
reset_sub_percentage ();
}
virtual bool progress (const zypp::ProgressData &progress)
{
+ MIL << progress.val() << std::endl;
update_sub_percentage ((int)progress.val ());
return true;
}
virtual void finish (const zypp::ProgressData &progress)
{
+ MIL << progress.val() << std::endl;
update_sub_percentage ((int)progress.val ());
}
};
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index 0647499..d898f8c 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -147,7 +147,7 @@ zypp_logging ()
}
gboolean
-zypp_is_changeable_media (PkBackend *backend, const Url &url)
+zypp_is_changeable_media (const Url &url)
{
gboolean is_cd = false;
try {
@@ -184,7 +184,7 @@ namespace {
}
gboolean
-zypp_is_development_repo (PkBackend *backend, RepoInfo repo)
+zypp_is_development_repo (RepoInfo repo)
{
return ( name_ends_or_contains( repo.alias(), "-debuginfo" )
|| name_ends_or_contains( repo.alias(), "-debug" )
@@ -354,8 +354,7 @@ get_enum_group (const string &group_)
}
void
-zypp_get_packages_by_name (PkBackend *backend,
- const gchar *package_name,
+zypp_get_packages_by_name (const gchar *package_name,
const ResKind kind,
vector<sat::Solvable> &result,
gboolean include_local)
@@ -402,35 +401,55 @@ zypp_get_packages_by_file (ZYpp::Ptr zypp,
}
}
+// gnome-packagekit;3.6.1-132.1;x86_64;G:F
sat::Solvable
-zypp_get_package_by_id (PkBackend *backend, const gchar *package_id)
+zypp_get_package_by_id (const gchar *package_id)
{
+ MIL << package_id << endl;
if (!pk_package_id_check(package_id)) {
// TODO: Do we need to do something more for this error?
return sat::Solvable::noSolvable;
}
gchar **id_parts = pk_package_id_split(package_id);
- vector<sat::Solvable> v;
- vector<sat::Solvable> v2;
+ const gchar *arch = id_parts[PK_PACKAGE_ID_ARCH];
+ if (!arch)
+ arch = "noarch";
+ bool want_source = !g_strcmp0 (arch, "source");
+
+ sat::Solvable package;
- zypp_get_packages_by_name (backend, id_parts[PK_PACKAGE_ID_NAME], ResKind::package, v);
- zypp_get_packages_by_name (backend, id_parts[PK_PACKAGE_ID_NAME], ResKind::patch, v2);
+ ResPool pool = ResPool::instance();
- v.insert (v.end (), v2.begin (), v2.end ());
+ // Iterate over the resolvables and mark the one we want to check its dependencies
+ for (ResPool::byName_iterator it = pool.byNameBegin (id_parts[PK_PACKAGE_ID_NAME]);
+ it != pool.byNameEnd (id_parts[PK_PACKAGE_ID_NAME]); ++it) {
+
+ sat::Solvable pkg = it->satSolvable();
+ MIL << "match " << package_id << " " << pkg << endl;
- if (v.empty())
- return sat::Solvable::noSolvable;
+ if (want_source && !isKind<SrcPackage>(pkg))
+ continue;
- sat::Solvable package;
+ if (!want_source && (isKind<SrcPackage>(pkg) || g_strcmp0 (pkg.arch().c_str(), arch)))
+ continue;
- for (vector<sat::Solvable>::iterator it = v.begin ();
- it != v.end (); ++it) {
- if (zypp_ver_and_arch_equal (*it, id_parts[PK_PACKAGE_ID_VERSION],
- id_parts[PK_PACKAGE_ID_ARCH])) {
- package = *it;
- break;
- }
+ const string &ver = pkg.edition ().asString();
+ if (g_strcmp0 (ver.c_str (), id_parts[PK_PACKAGE_ID_VERSION]))
+ continue;
+
+ if (!strncmp(id_parts[PK_PACKAGE_ID_DATA], "installed", 9) && !pkg.isSystem())
+ continue;
+
+ if (pkg.isSystem() && strncmp(id_parts[PK_PACKAGE_ID_DATA], "installed", 9))
+ continue;
+
+ if (g_strcmp0(pkg.repository().alias().c_str(), id_parts[PK_PACKAGE_ID_DATA]))
+ continue;
+
+ MIL << "found " << pkg << endl;
+ package = pkg;
+ break;
}
g_strfreev (id_parts);
@@ -476,9 +495,8 @@ gboolean
zypp_refresh_meta_and_cache (RepoManager &manager, RepoInfo &repo, bool force)
{
try {
- if (manager.checkIfToRefreshMetadata (repo, repo.url(),
- RepoManager::RefreshIfNeededIgnoreDelay)
- != RepoManager::REFRESH_NEEDED)
+ if (manager.checkIfToRefreshMetadata (repo, repo.url()) //RepoManager::RefreshIfNeededIgnoreDelay)
+ != RepoManager::REFRESH_NEEDED)
return TRUE;
sat::Pool pool = sat::Pool::instance ();
@@ -506,24 +524,24 @@ zypp_signature_required (PkBackendJob *job, const PublicKey &key)
RepoInfo info = zypp_get_Repository (job, _repoName);
if (info.type () == repo::RepoType::NONE)
pk_backend_job_error_code (job, PK_ERROR_ENUM_INTERNAL_ERROR,
- "Repository unknown");
+ "Repository unknown");
else {
pk_backend_job_repo_signature_required (job,
- "dummy;0.0.1;i386;data",
- _repoName,
- 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);
+ "dummy;0.0.1;i386;data",
+ _repoName,
+ 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_job_error_code (job, PK_ERROR_ENUM_GPG_FAILURE,
- "Signature verification for Repository %s failed", _repoName);
+ "Signature verification for Repository %s failed", _repoName);
}
throw AbortTransactionException();
} else
ok = TRUE;
-
+
return ok;
}
@@ -844,6 +862,7 @@ zypp_check_restart (PkRestartEnum *restart, Patch::constPtr patch)
gboolean
zypp_perform_execution (PkBackendJob *job, ZYpp::Ptr zypp, PerformType type, gboolean force, PkBitfield transaction_flags)
{
+ MIL << force << pk_filter_bitfield_to_string(transaction_flags) << endl;
gboolean ret = FALSE;
PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
@@ -1022,7 +1041,7 @@ zypp_build_package_id_capabilities (Capabilities caps, gboolean terminate)
gboolean
zypp_refresh_cache (PkBackendJob *job, ZYpp::Ptr zypp, gboolean force)
{
- PkBackend *backend = PK_BACKEND(pk_backend_job_get_backend(job));
+ MIL << force << endl;
// This call is needed as it calls initializeTarget which appears to properly setup the keyring
if (zypp == NULL)
@@ -1064,9 +1083,13 @@ zypp_refresh_cache (PkBackendJob *job, ZYpp::Ptr zypp, gboolean force)
if (repo.enabled () == false)
continue;
+ // do as zypper does
+ if (!force && !repo.autorefresh())
+ continue;
+
// skip changeable meda (DVDs and CDs). Without doing this,
// the disc would be required to be physically present.
- if (zypp_is_changeable_media (backend, *repo.baseUrlsBegin ()) == true)
+ if (zypp_is_changeable_media (*repo.baseUrlsBegin ()) == true)
continue;
try {
@@ -1161,29 +1184,14 @@ zypp_build_package_id_from_resolvable (const sat::Solvable &resolvable)
else
arch = resolvable.arch ().asString ().c_str ();
+ string repo = resolvable.repository ().alias();
+ if (resolvable.isSystem())
+ repo = "installed";
package_id = pk_package_id_build (
resolvable.name ().c_str (),
resolvable.edition ().asString ().c_str (),
- arch, resolvable.repository ().alias().c_str ());
+ arch, repo.c_str ());
return package_id;
}
-gboolean
-zypp_ver_and_arch_equal (const sat::Solvable &pkg,
- const char *name, const char *arch)
-{
- const string &ver = pkg.edition ().asString();
- if (g_strcmp0 (ver.c_str (), name))
- return FALSE;
-
- if (arch && !strcmp (arch, "source")) {
- return isKind<SrcPackage>(pkg);
- }
-
- const Arch &parch = pkg.arch();
- if (g_strcmp0 (parch.c_str(), arch))
- return FALSE;
-
- return TRUE;
-}
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index d001733..797ac2e 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -83,9 +83,7 @@ class ZyppJob {
*/
gboolean zypp_logging ();
-gboolean zypp_is_changeable_media (PkBackend *backend, const zypp::Url &url);
-
-gboolean zypp_is_development_repo (PkBackend *backend, zypp::RepoInfo repo);
+gboolean zypp_is_development_repo (zypp::RepoInfo repo);
gboolean zypp_is_valid_repo (PkBackendJob *job, zypp::RepoInfo repo);
/**
@@ -112,7 +110,7 @@ PkGroupEnum get_enum_group (const std::string &group);
/**
* Returns a list of packages that match the specified package_name.
*/
-void zypp_get_packages_by_name (PkBackend *backend, const gchar *package_name,
+void zypp_get_packages_by_name (const gchar *package_name,
const zypp::ResKind kind, std::vector<zypp::sat::Solvable> &result,
gboolean include_local = TRUE);
@@ -124,7 +122,7 @@ void zypp_get_packages_by_file (zypp::ZYpp::Ptr zypp, const gchar *search_file,
/**
* Returns the Resolvable for the specified package_id.
*/
-zypp::sat::Solvable zypp_get_package_by_id (PkBackend *backend, const gchar *package_id);
+zypp::sat::Solvable zypp_get_package_by_id (const gchar *package_id);
/**
* Build a package_id from the specified resolvable. The returned
@@ -133,12 +131,6 @@ zypp::sat::Solvable zypp_get_package_by_id (PkBackend *backend, const gchar *pac
gchar * zypp_build_package_id_from_resolvable (const 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 (PkBackendJob *job, const zypp::PublicKey &key);
@@ -216,12 +208,6 @@ gboolean zypp_backend_pool_item_notify (PkBackendJob *job,
gboolean sanity_check = FALSE);
/**
- * helper to compare a version + architecture, with source arch mangling.
- */
-gboolean zypp_ver_and_arch_equal (const zypp::sat::Solvable &pkg,
- const char *name, const char *arch);
-
-/**
* helper to refresh a repo's metadata and cache, catching signature
* exceptions in a safe way.
*/
--
1.8.1