From 00f358b38ecb6bb6fac3a7f3b264532cf0915a68 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 24 Jul 2025 11:32:30 +0600 Subject: [PATCH] Packages functions remade with alpm library --- source/CMakeLists.txt | 7 ++ source/libublsettings-gtk3.c | 220 +++++++++++++++-------------------- source/libublsettings-gtk3.h | 9 +- 3 files changed, 105 insertions(+), 131 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index bc56209..1a88396 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -14,6 +14,11 @@ include_directories(${VTE291_INCLUDE_DIRS}) link_directories(${VTE291_LIBRARY_DIRS}) add_definitions(${VTE291_CFLAGS_OTHER}) +pkg_check_modules(ALPM REQUIRED libalpm) +include_directories(${ALPM_INCLUDE_DIRS}) +link_directories(${ALPM_LIBRARY_DIRS}) +add_definitions(${ALPM_CFLAGS_OTHER}) + find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) option(WEBKIT_FOUND "No" OFF) @@ -52,6 +57,8 @@ pthread) add_definitions(-DVTE_INCLUDE) list(APPEND LIBRARIES ${VTE291_LIBRARIES}) +list(APPEND LIBRARIES ${ALPM_LIBRARIES}) + if (WEBKIT_LIBRARIES_FOUND) list(APPEND LIBRARIES ${WEBKIT_LIBRARIES}) add_definitions(-DWEBKIT_INCLUDE) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index c615b6a..2823ee7 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -1,5 +1,7 @@ #include "libublsettings-gtk3.h" +#include + #ifdef __GTK_H__ // GtkEntry section @@ -41,171 +43,137 @@ // } struct packages { - GHashTable *all_list; - GHashTable *installed_list; - GHashTable *updates_list; + alpm_handle_t *packages_handle; int init_status; -} packages_struct; -GThread *packages_thread = NULL; - -void *_yon_packages_init(void){ - if (getuid()){ - packages_struct.init_status = 0; - g_thread_exit(NULL); - } - packages_struct.all_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); - packages_struct.installed_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); - packages_struct.updates_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); - - int size; - int installed_size; - int updates_size; - config_str package_list = yon_config_load("pacman -Slq",&size); - config_str installed = yon_config_load("pacman -Qq",&installed_size); - config_str updates = yon_config_load("pacman -Qqu",&updates_size); - - for (int i=0;idata; + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) return 1; + } + return 0; } -int yon_packages_check_installed(char *package){ - if (!packages_struct.init_status) return 0; - return g_hash_table_contains(packages_struct.installed_list,package); +int yon_packages_check_installed(char *package_name){ + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) return 1; + return 0; } -int yon_packages_check_updates(char *package){ - if (!packages_struct.init_status) return 0; - return g_hash_table_contains(packages_struct.updates_list,package); -} +int yon_packages_check_updates(char *package_name){ + alpm_pkg_t *sync_db_package = NULL; + alpm_pkg_t *local_db_package = NULL; -void yon_packages_update_package_is_installed(char *package){ - if (!packages_struct.init_status) return; - char *command = update_package_installed_command(package); - if (!system(command)){ - if (!g_hash_table_contains(packages_struct.installed_list,package)){ - g_hash_table_add(packages_struct.installed_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.installed_list,package)){ - g_hash_table_remove(packages_struct.installed_list,package); - } + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) sync_db_package = package; } - free(command); -} - -void yon_packages_update_package_is_updated(char *package){ - if (!packages_struct.init_status) return; - char *command = update_package_updated_command(package); - if (!system(command)){ - if (!g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_add(packages_struct.updates_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_remove(packages_struct.updates_list,package); - } + { + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) local_db_package = package; } - free(command); -} -void yon_packages_update_package(char *package){ - if (!packages_struct.init_status) return; - char *command = update_package_installed_command(package); - if (!system(command)){ - if (!g_hash_table_contains(packages_struct.installed_list,package)){ - g_hash_table_add(packages_struct.installed_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.installed_list,package)){ - g_hash_table_remove(packages_struct.installed_list,package); - } + if (sync_db_package && local_db_package){ + const char *sync_db_package_version = alpm_pkg_get_version(sync_db_package); + const char *local_db_package_version = alpm_pkg_get_version(sync_db_package); + if (strcmp(sync_db_package_version,local_db_package_version)) return 1; } - free(command); + return 0; +} - command = update_package_updated_command(package); - if (!system(command)){ - if (!g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_add(packages_struct.updates_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_remove(packages_struct.updates_list,package); - } - } - free(command); +void yon_packages_update(){ + if (packages_struct.packages_handle) alpm_release(packages_struct.packages_handle); + _yon_packages_get_db(); } int yon_packages_install(char *package){ if (!packages_struct.init_status) return 0; - char *command = install_package_command(package); - yon_terminal_window_launch(NULL,command,"",""); + // char *command = install_package_command(package); + // yon_terminal_window_launch(NULL,command,"",""); - yon_packages_update_package(package); - free(command); + yon_packages_update(); + // free(command); } int yon_packages_remove(char *package){ if (!packages_struct.init_status) return 0; - char *command = remove_package_command(package); - yon_terminal_window_launch(NULL,command,"",""); + // char *command = remove_package_command(package); + // yon_terminal_window_launch(NULL,command,"",""); - yon_packages_update_package(package); - free(command); + yon_packages_update(); + // free(command); } void yon_packages_finish(){ if (!packages_struct.init_status) return; - g_hash_table_unref(packages_struct.all_list); - g_hash_table_unref(packages_struct.installed_list); + alpm_release(packages_struct.packages_handle); } GList *yon_packages_get_all(){ if (!packages_struct.init_status) return NULL; - GList *list = g_hash_table_get_keys(packages_struct.all_list); + + GList *list = NULL; + + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_list_t *package_list = alpm_db_get_pkgcache(database); + for (alpm_list_t *iter = package_list;iter;iter=iter->next){ + const char *cur_name = alpm_pkg_get_name(iter->data); + if (!list) list = g_list_append(list,yon_char_new(cur_name)); + else if (g_list_append(list,yon_char_new(cur_name))){}; + } + } + return list; } diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index a24d01e..890b66b 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -568,7 +568,7 @@ void yon_gtk_window_set_shrinking_from_revealer_resizing(GtkWindow *window, GtkR * Инициализация системы пакетов. Инициализация происходит долго, * рекомендуется вызывать как можно ближе к началу работы кода. */ -void yon_packages_init(); +int yon_packages_init(); /**yon_packages_finalize() * Завершает инициирование системы пакетов из yon_packages_init(). @@ -577,16 +577,15 @@ void yon_packages_init(); int yon_packages_finalize(); /*Проверить существовует ли пакет в репозиториях*/ -int yon_packages_check_exist(char *package); +int yon_packages_check_exist(const char *package); /*Проверить установлен ли пакет*/ int yon_packages_check_installed(char *package); int yon_packages_check_updates(char *package); void yon_packages_finish(); GList *yon_packages_get_all(); -void yon_packages_update_package(char *package); +void yon_packages_update(); int yon_packages_install(char *package); int yon_packages_remove(char *package); -void yon_packages_update_package_is_installed(char *package); -void yon_packages_update_package_is_updated(char *package); + void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*)); \ No newline at end of file