|
|
|
|
@@ -5,7 +5,6 @@
|
|
|
|
|
*/
|
|
|
|
|
#include <dirent.h>
|
|
|
|
|
#include <glib/gstdio.h>
|
|
|
|
|
#include <packagekit-glib2/pk-debug.h>
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
@@ -23,7 +22,7 @@ using namespace slack;
|
|
|
|
|
|
|
|
|
|
static GSList *repos = nullptr;
|
|
|
|
|
|
|
|
|
|
void pk_backend_initialize(GKeyFile *conf, PkBackend *backend)
|
|
|
|
|
void pk_backend_initialize(GKeyFile *conf)
|
|
|
|
|
{
|
|
|
|
|
char *path, **groups;
|
|
|
|
|
int ret;
|
|
|
|
|
@@ -130,7 +129,7 @@ void pk_backend_initialize(GKeyFile *conf, PkBackend *backend)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_destroy(PkBackend *backend)
|
|
|
|
|
pk_backend_destroy()
|
|
|
|
|
{
|
|
|
|
|
g_debug("backend: destroy");
|
|
|
|
|
|
|
|
|
|
@@ -144,14 +143,11 @@ pk_backend_destroy(PkBackend *backend)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_start_job(PkBackend *backend, PkBackendJob *job)
|
|
|
|
|
pk_backend_start_job(PkBackendJob *job)
|
|
|
|
|
{
|
|
|
|
|
char *db_filename = nullptr;
|
|
|
|
|
JobData *job_data = g_new0(JobData, 1);
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_allow_cancel(job, true);
|
|
|
|
|
pk_backend_job_set_allow_cancel(job, false);
|
|
|
|
|
|
|
|
|
|
db_filename = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "metadata", "metadata.db", nullptr);
|
|
|
|
|
if (sqlite3_open(db_filename, &job_data->db) == SQLITE_OK) { /* Some SQLite settings */
|
|
|
|
|
sqlite3_exec(job_data->db, "PRAGMA foreign_keys = ON", nullptr, nullptr, nullptr);
|
|
|
|
|
@@ -166,14 +162,13 @@ pk_backend_start_job(PkBackend *backend, PkBackendJob *job)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_user_data(job, job_data);
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_RUNNING);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
g_free(db_filename);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_stop_job(PkBackend *backend, PkBackendJob *job)
|
|
|
|
|
pk_backend_stop_job(PkBackendJob *job)
|
|
|
|
|
{
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
@@ -188,19 +183,19 @@ pk_backend_stop_job(PkBackend *backend, PkBackendJob *job)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_search_names(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
|
|
|
|
|
pk_backend_search_names(PkBackendJob *job, char **values)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "name", nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_search_details(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
|
|
|
|
|
pk_backend_search_details(PkBackendJob *job, char **values)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "desc", nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_search_groups(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
|
|
|
|
|
pk_backend_search_groups(PkBackendJob *job, char **values)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "cat", nullptr);
|
|
|
|
|
}
|
|
|
|
|
@@ -211,10 +206,9 @@ pk_backend_search_files_thread(PkBackendJob *job, GVariant *params, void *user_d
|
|
|
|
|
char **vals, *search;
|
|
|
|
|
char *query;
|
|
|
|
|
sqlite3_stmt *stmt;
|
|
|
|
|
PkInfoEnum ret;
|
|
|
|
|
Info ret;
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
|
|
|
|
|
pk_backend_job_set_percentage(job, 0);
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(t^a&s)", nullptr, &vals);
|
|
|
|
|
@@ -230,7 +224,7 @@ pk_backend_search_files_thread(PkBackendJob *job, GVariant *params, void *user_d
|
|
|
|
|
while (sqlite3_step(stmt) == SQLITE_ROW)
|
|
|
|
|
{
|
|
|
|
|
ret = is_installed((char*) sqlite3_column_text(stmt, 2));
|
|
|
|
|
if ((ret == PK_INFO_ENUM_INSTALLED) || (ret == PK_INFO_ENUM_UPDATING))
|
|
|
|
|
if ((ret == Info::installed) || (ret == Info::updating))
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLED,
|
|
|
|
|
(char*) sqlite3_column_text(stmt, 0),
|
|
|
|
|
@@ -256,15 +250,15 @@ pk_backend_search_files_thread(PkBackendJob *job, GVariant *params, void *user_d
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_search_files(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
|
|
|
|
|
pk_backend_search_files(PkBackendJob *job, char **values)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_search_files_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_get_details_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
pk_backend_get_details_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
char **pkg_ids, *homepage = nullptr;
|
|
|
|
|
char *homepage = nullptr;
|
|
|
|
|
char** tokens;
|
|
|
|
|
gsize i;
|
|
|
|
|
GString *desc;
|
|
|
|
|
@@ -274,10 +268,6 @@ pk_backend_get_details_thread(PkBackendJob *job, GVariant *params, void *user_da
|
|
|
|
|
sqlite3_stmt *stmt;
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(^a&s)", &pkg_ids);
|
|
|
|
|
|
|
|
|
|
if ((sqlite3_prepare_v2(job_data->db,
|
|
|
|
|
"SELECT p.desc, p.cat, p.uncompressed FROM pkglist AS p NATURAL JOIN repos AS r "
|
|
|
|
|
"WHERE name LIKE @name AND r.repo LIKE @repo AND ext NOT LIKE 'obsolete'",
|
|
|
|
|
@@ -347,7 +337,7 @@ out:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_get_details(PkBackend *backend, PkBackendJob *job, char **package_ids)
|
|
|
|
|
pk_backend_get_details(PkBackendJob *job, char **package_ids)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_get_details_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
@@ -360,7 +350,6 @@ pk_backend_resolve_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
PkInfoEnum ret;
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
|
|
|
|
|
pk_backend_job_set_percentage(job, 0);
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(t^a&s)", nullptr, &vals);
|
|
|
|
|
@@ -380,8 +369,7 @@ pk_backend_resolve_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
|
|
|
|
|
while (sqlite3_step(stmt) == SQLITE_ROW)
|
|
|
|
|
{
|
|
|
|
|
ret = is_installed((char*) sqlite3_column_text(stmt, 2));
|
|
|
|
|
if ((ret == PK_INFO_ENUM_INSTALLED) || (ret == PK_INFO_ENUM_UPDATING))
|
|
|
|
|
if ((ret == Info::installed) || (ret == Info::updating))
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLED,
|
|
|
|
|
(char*) sqlite3_column_text(stmt, 0),
|
|
|
|
|
@@ -407,7 +395,7 @@ pk_backend_resolve_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_resolve(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **packages)
|
|
|
|
|
pk_backend_resolve(PkBackendJob *job, char **packages)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_resolve_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
@@ -421,7 +409,6 @@ pk_backend_download_packages_thread(PkBackendJob *job, GVariant *params, void *u
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(^a&ss)", &pkg_ids, &dir_path);
|
|
|
|
|
pk_backend_job_set_status (job, PK_STATUS_ENUM_DOWNLOAD);
|
|
|
|
|
|
|
|
|
|
if ((sqlite3_prepare_v2(job_data->db,
|
|
|
|
|
"SELECT summary, (full_name || '.' || ext) FROM pkglist NATURAL JOIN repos "
|
|
|
|
|
@@ -468,27 +455,22 @@ out:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_download_packages(PkBackend *backend, PkBackendJob *job, char **package_ids, const char *directory)
|
|
|
|
|
pk_backend_download_packages(PkBackendJob *job, char **package_ids, const char *directory)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_download_packages_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
pk_backend_install_packages_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
char *dest_dir_name;
|
|
|
|
|
char **pkg_ids;
|
|
|
|
|
unsigned i;
|
|
|
|
|
gdouble percent_step;
|
|
|
|
|
GSList *install_list = nullptr, *l;
|
|
|
|
|
sqlite3_stmt *pkglist_stmt = nullptr, *collection_stmt = nullptr;
|
|
|
|
|
PkBitfield transaction_flags = 0;
|
|
|
|
|
PkInfoEnum ret;
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(t^a&s)", &transaction_flags, &pkg_ids);
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_DEP_RESOLVE);
|
|
|
|
|
|
|
|
|
|
if ((sqlite3_prepare_v2(job_data->db,
|
|
|
|
|
"SELECT summary, cat FROM pkglist NATURAL JOIN repos "
|
|
|
|
|
"WHERE name LIKE @name AND ver LIKE @ver AND arch LIKE @arch AND repo LIKE @repo",
|
|
|
|
|
@@ -522,16 +504,7 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
|
|
|
|
|
/* If it isn't a collection */
|
|
|
|
|
if (g_strcmp0((char *) sqlite3_column_text(pkglist_stmt, 1), "collections"))
|
|
|
|
|
{
|
|
|
|
|
if (pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLING,
|
|
|
|
|
pkg_ids[i],
|
|
|
|
|
(char *) sqlite3_column_text(pkglist_stmt, 0));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
install_list = g_slist_append(install_list, g_strdup(pkg_ids[i]));
|
|
|
|
|
}
|
|
|
|
|
install_list = g_slist_append(install_list, g_strdup(pkg_ids[i]));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
@@ -541,24 +514,10 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
|
|
|
|
|
while (sqlite3_step(collection_stmt) == SQLITE_ROW)
|
|
|
|
|
{
|
|
|
|
|
ret = is_installed((char*) sqlite3_column_text(collection_stmt, 2));
|
|
|
|
|
if ((ret == PK_INFO_ENUM_INSTALLING) || (ret == PK_INFO_ENUM_UPDATING))
|
|
|
|
|
if ((ret == Info::installing) || (ret == Info::updating))
|
|
|
|
|
{
|
|
|
|
|
if ((pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) &&
|
|
|
|
|
!g_strcmp0((char *) sqlite3_column_text(collection_stmt, 3), "obsolete"))
|
|
|
|
|
{
|
|
|
|
|
/* TODO: Don't just skip obsolete packages but remove them */
|
|
|
|
|
}
|
|
|
|
|
else if (pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_package(job, ret,
|
|
|
|
|
(char *) sqlite3_column_text(collection_stmt, 0),
|
|
|
|
|
(char *) sqlite3_column_text(collection_stmt, 1));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
install_list = g_slist_append(install_list,
|
|
|
|
|
g_strdup((char *) sqlite3_column_text(collection_stmt, 0)));
|
|
|
|
|
}
|
|
|
|
|
install_list = g_slist_append(install_list,
|
|
|
|
|
g_strdup((char *) sqlite3_column_text(collection_stmt, 0)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sqlite3_clear_bindings(collection_stmt);
|
|
|
|
|
@@ -571,13 +530,12 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (install_list && !pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
|
|
|
|
|
if (install_list)
|
|
|
|
|
{
|
|
|
|
|
/* / 2 means total percentage for installing and for downloading */
|
|
|
|
|
percent_step = 100.0 / g_slist_length(install_list) / 2;
|
|
|
|
|
|
|
|
|
|
/* Download the packages */
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD);
|
|
|
|
|
dest_dir_name = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "downloads", nullptr);
|
|
|
|
|
for (l = install_list, i = 0; l; l = g_slist_next(l), i++)
|
|
|
|
|
{
|
|
|
|
|
@@ -598,7 +556,6 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
|
|
|
|
|
g_free(dest_dir_name);
|
|
|
|
|
|
|
|
|
|
/* Install the packages */
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_INSTALL);
|
|
|
|
|
for (l = install_list; l; l = g_slist_next(l), i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens;
|
|
|
|
|
@@ -623,76 +580,55 @@ out:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_install_packages(PkBackend *backend,
|
|
|
|
|
PkBackendJob *job,
|
|
|
|
|
PkBitfield transaction_flags,
|
|
|
|
|
char **package_ids)
|
|
|
|
|
pk_backend_install_packages(PkBackendJob *job, char **package_ids)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_install_packages_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_remove_packages_thread(PkBackendJob* job, GVariant* params, void *user_data)
|
|
|
|
|
pk_backend_remove_packages_thread(PkBackendJob* job, char **pkg_ids)
|
|
|
|
|
{
|
|
|
|
|
char **pkg_ids, *cmd_line;
|
|
|
|
|
char *cmd_line;
|
|
|
|
|
unsigned i;
|
|
|
|
|
gdouble percent_step;
|
|
|
|
|
bool allow_deps, autoremove;
|
|
|
|
|
GError *err = nullptr;
|
|
|
|
|
PkBitfield transaction_flags = 0;
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(t^a&sbb)", &transaction_flags, &pkg_ids, &allow_deps, &autoremove);
|
|
|
|
|
/* Add percent_step percents per removed package */
|
|
|
|
|
percent_step = 100.0 / g_strv_length(pkg_ids);
|
|
|
|
|
for (i = 0; pkg_ids[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens;
|
|
|
|
|
|
|
|
|
|
if (pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_DEP_RESOLVE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_REMOVE);
|
|
|
|
|
pk_backend_job_set_percentage(job, percent_step * i);
|
|
|
|
|
tokens = pk_package_id_split(pkg_ids[i]);
|
|
|
|
|
cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
|
|
|
|
|
|
|
|
|
|
/* Add percent_step percents per removed package */
|
|
|
|
|
percent_step = 100.0 / g_strv_length(pkg_ids);
|
|
|
|
|
for (i = 0; pkg_ids[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens;
|
|
|
|
|
/* Pkgtools return always 0 */
|
|
|
|
|
g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, &err);
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_percentage(job, percent_step * i);
|
|
|
|
|
tokens = pk_package_id_split(pkg_ids[i]);
|
|
|
|
|
cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
|
|
|
|
|
g_free(cmd_line);
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
|
|
|
|
|
/* Pkgtools return always 0 */
|
|
|
|
|
g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, &err);
|
|
|
|
|
if (err)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_error_code(job, PK_ERROR_ENUM_PACKAGE_FAILED_TO_REMOVE, "%s", err->message);
|
|
|
|
|
g_error_free(err);
|
|
|
|
|
|
|
|
|
|
g_free(cmd_line);
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_error_code(job, PK_ERROR_ENUM_PACKAGE_FAILED_TO_REMOVE, "%s", err->message);
|
|
|
|
|
g_error_free(err);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_percentage(job, 100);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
pk_backend_job_set_percentage(job, 100);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_remove_packages(PkBackend *backend,
|
|
|
|
|
PkBackendJob *job,
|
|
|
|
|
PkBitfield transaction_flags,
|
|
|
|
|
char **package_ids,
|
|
|
|
|
bool allow_deps,
|
|
|
|
|
bool autoremove)
|
|
|
|
|
pk_backend_remove_packages(PkBackendJob *job, char **package_ids)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_remove_packages_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_get_updates_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
pk_backend_get_updates_thread(PkBackendJob *job, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
char *pkg_id, *full_name, *desc;
|
|
|
|
|
const char *pkg_metadata_filename;
|
|
|
|
|
@@ -703,8 +639,6 @@ pk_backend_get_updates_thread(PkBackendJob *job, GVariant *params, void *user_da
|
|
|
|
|
sqlite3_stmt *stmt;
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
|
|
|
|
|
|
|
|
|
|
if ((sqlite3_prepare_v2(job_data->db,
|
|
|
|
|
"SELECT p1.full_name, p1.name, p1.ver, p1.arch, r.repo, p1.summary, p1.ext "
|
|
|
|
|
"FROM pkglist AS p1 NATURAL JOIN repos AS r "
|
|
|
|
|
@@ -796,88 +730,76 @@ out:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_get_updates(PkBackend *backend, PkBackendJob *job, PkBitfield filters)
|
|
|
|
|
pk_backend_get_updates(PkBackendJob *job)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_get_updates_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_update_packages_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
pk_backend_update_packages_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
char *dest_dir_name, *cmd_line, **pkg_ids;
|
|
|
|
|
char *dest_dir_name, *cmd_line;
|
|
|
|
|
unsigned i;
|
|
|
|
|
PkBitfield transaction_flags = 0;
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(t^a&s)", &transaction_flags, &pkg_ids);
|
|
|
|
|
/* Download the packages */
|
|
|
|
|
dest_dir_name = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "downloads", nullptr);
|
|
|
|
|
for (i = 0; pkg_ids[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens = pk_package_id_split(pkg_ids[i]);
|
|
|
|
|
|
|
|
|
|
if (!pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) {
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD);
|
|
|
|
|
if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
|
|
|
|
|
{
|
|
|
|
|
GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
|
|
|
|
|
|
|
|
|
|
/* Download the packages */
|
|
|
|
|
dest_dir_name = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "downloads", nullptr);
|
|
|
|
|
for (i = 0; pkg_ids[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens = pk_package_id_split(pkg_ids[i]);
|
|
|
|
|
if (repo)
|
|
|
|
|
{
|
|
|
|
|
static_cast<Pkgtools *> (repo->data)->download (job,
|
|
|
|
|
dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
|
|
|
|
|
{
|
|
|
|
|
GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
}
|
|
|
|
|
g_free(dest_dir_name);
|
|
|
|
|
|
|
|
|
|
if (repo)
|
|
|
|
|
{
|
|
|
|
|
static_cast<Pkgtools *> (repo->data)->download (job,
|
|
|
|
|
dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* Install the packages */
|
|
|
|
|
for (i = 0; pkg_ids[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens = pk_package_id_split(pkg_ids[i]);
|
|
|
|
|
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
}
|
|
|
|
|
g_free(dest_dir_name);
|
|
|
|
|
if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
|
|
|
|
|
{
|
|
|
|
|
GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
|
|
|
|
|
|
|
|
|
|
/* Install the packages */
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_UPDATE);
|
|
|
|
|
for (i = 0; pkg_ids[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
char **tokens = pk_package_id_split(pkg_ids[i]);
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
|
|
|
|
|
{
|
|
|
|
|
GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
|
|
|
|
|
|
|
|
|
|
if (repo)
|
|
|
|
|
{
|
|
|
|
|
static_cast<Pkgtools *> (repo->data)->install (job,
|
|
|
|
|
tokens[PK_PACKAGE_ID_NAME]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* Remove obsolete package
|
|
|
|
|
* TODO: Removing should be an independent operation (not during installing updates) */
|
|
|
|
|
cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
|
|
|
|
|
g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, nullptr);
|
|
|
|
|
g_free(cmd_line);
|
|
|
|
|
}
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
}
|
|
|
|
|
if (repo)
|
|
|
|
|
{
|
|
|
|
|
static_cast<Pkgtools *> (repo->data)->install (job,
|
|
|
|
|
tokens[PK_PACKAGE_ID_NAME]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* Remove obsolete package
|
|
|
|
|
* TODO: Removing should be an independent operation (not during installing updates) */
|
|
|
|
|
cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
|
|
|
|
|
g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, nullptr);
|
|
|
|
|
g_free(cmd_line);
|
|
|
|
|
}
|
|
|
|
|
g_strfreev(tokens);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_update_packages(PkBackend *backend,
|
|
|
|
|
PkBackendJob *job,
|
|
|
|
|
PkBitfield transaction_flags,
|
|
|
|
|
char **package_ids)
|
|
|
|
|
pk_backend_update_packages(PkBackendJob *job, char **package_ids)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_update_packages_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
pk_backend_refresh_cache_thread(PkBackendJob *job, bool force, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
char *tmp_dir_name, *db_err, *path = nullptr;
|
|
|
|
|
int ret;
|
|
|
|
|
bool force;
|
|
|
|
|
GSList *file_list = nullptr;
|
|
|
|
|
GFile *db_file = nullptr;
|
|
|
|
|
GFileInfo *file_info = nullptr;
|
|
|
|
|
@@ -885,8 +807,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
|
|
|
|
|
sqlite3_stmt *stmt = nullptr;
|
|
|
|
|
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD_CHANGELOG);
|
|
|
|
|
|
|
|
|
|
/* Create temporary directory */
|
|
|
|
|
tmp_dir_name = g_dir_make_tmp("PackageKit.XXXXXX", &err);
|
|
|
|
|
if (!tmp_dir_name)
|
|
|
|
|
@@ -896,8 +816,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(b)", &force);
|
|
|
|
|
|
|
|
|
|
/* Force the complete cache refresh if the read configuration file is newer than the metadata cache */
|
|
|
|
|
if (!force)
|
|
|
|
|
{
|
|
|
|
|
@@ -947,8 +865,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Download repository */
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD_REPOSITORY);
|
|
|
|
|
|
|
|
|
|
for (GSList *l = file_list; l; l = g_slist_next(l))
|
|
|
|
|
{
|
|
|
|
|
get_file(&job_data->curl, static_cast<char **> (l->data)[0],
|
|
|
|
|
@@ -957,8 +873,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
|
|
|
|
|
g_slist_free_full(file_list, (GDestroyNotify)g_strfreev);
|
|
|
|
|
|
|
|
|
|
/* Refresh cache */
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_REFRESH_CACHE);
|
|
|
|
|
|
|
|
|
|
for (GSList *l = repos; l; l = g_slist_next(l))
|
|
|
|
|
{
|
|
|
|
|
static_cast<Pkgtools *> (l->data)->generate_cache (job, tmp_dir_name);
|
|
|
|
|
@@ -982,20 +896,15 @@ out:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_refresh_cache(PkBackend *backend, PkBackendJob *job, bool force)
|
|
|
|
|
pk_backend_refresh_cache(PkBackendJob *job, bool force)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_refresh_cache_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_backend_get_update_detail_thread(PkBackendJob *job, GVariant *params, void *user_data)
|
|
|
|
|
pk_backend_get_update_detail_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
unsigned i;
|
|
|
|
|
char **pkg_ids;
|
|
|
|
|
|
|
|
|
|
pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
|
|
|
|
|
|
|
|
|
|
g_variant_get(params, "(^a&s)", &pkg_ids);
|
|
|
|
|
|
|
|
|
|
for (i = 0; pkg_ids[i] != nullptr; i++)
|
|
|
|
|
{
|
|
|
|
|
@@ -1016,16 +925,7 @@ pk_backend_get_update_detail_thread(PkBackendJob *job, GVariant *params, void *u
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pk_backend_get_update_detail(PkBackend *backend, PkBackendJob *job, char **package_ids)
|
|
|
|
|
pk_backend_get_update_detail(PkBackendJob *job, char **package_ids)
|
|
|
|
|
{
|
|
|
|
|
pk_backend_job_thread_create(job, pk_backend_get_update_detail_thread, nullptr, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PkBitfield
|
|
|
|
|
pk_backend_get_filters (PkBackend *backend)
|
|
|
|
|
{
|
|
|
|
|
return pk_bitfield_from_enums (
|
|
|
|
|
PK_FILTER_ENUM_INSTALLED, PK_FILTER_ENUM_NOT_INSTALLED,
|
|
|
|
|
PK_FILTER_ENUM_APPLICATION, PK_FILTER_ENUM_NOT_APPLICATION,
|
|
|
|
|
-1);
|
|
|
|
|
}
|
|
|
|
|
|