Packages functions remade with alpm library

pull/47/head
parent b4b6245a46
commit 00f358b38e
No known key found for this signature in database
GPG Key ID: FF1D842BF4DDE92B

@ -14,6 +14,11 @@ include_directories(${VTE291_INCLUDE_DIRS})
link_directories(${VTE291_LIBRARY_DIRS}) link_directories(${VTE291_LIBRARY_DIRS})
add_definitions(${VTE291_CFLAGS_OTHER}) 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) find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
option(WEBKIT_FOUND "No" OFF) option(WEBKIT_FOUND "No" OFF)
@ -52,6 +57,8 @@ pthread)
add_definitions(-DVTE_INCLUDE) add_definitions(-DVTE_INCLUDE)
list(APPEND LIBRARIES ${VTE291_LIBRARIES}) list(APPEND LIBRARIES ${VTE291_LIBRARIES})
list(APPEND LIBRARIES ${ALPM_LIBRARIES})
if (WEBKIT_LIBRARIES_FOUND) if (WEBKIT_LIBRARIES_FOUND)
list(APPEND LIBRARIES ${WEBKIT_LIBRARIES}) list(APPEND LIBRARIES ${WEBKIT_LIBRARIES})
add_definitions(-DWEBKIT_INCLUDE) add_definitions(-DWEBKIT_INCLUDE)

@ -1,5 +1,7 @@
#include "libublsettings-gtk3.h" #include "libublsettings-gtk3.h"
#include <alpm.h>
#ifdef __GTK_H__ #ifdef __GTK_H__
// GtkEntry section // GtkEntry section
@ -41,171 +43,137 @@
// } // }
struct packages { struct packages {
GHashTable *all_list; alpm_handle_t *packages_handle;
GHashTable *installed_list;
GHashTable *updates_list;
int init_status; int init_status;
} packages_struct; } packages_struct = {};
GThread *packages_thread = NULL;
int _yon_packages_get_db(){
void *_yon_packages_init(void){ const char *root = "/";
if (getuid()){ const char *dbpath = "/var/lib/pacman";
packages_struct.init_status = 0; const char *config_path = "/etc/pacman.conf";
g_thread_exit(NULL); packages_struct.packages_handle = alpm_initialize(root,dbpath,NULL);
} if (!packages_struct.packages_handle){
packages_struct.all_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); packages_struct.init_status=0;
packages_struct.installed_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); return 0;
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;i<size;i++){
while(gtk_events_pending()) gtk_main_iteration();
yon_char_remove_last_symbol(package_list[i],'\n');
g_hash_table_add(packages_struct.all_list,package_list[i]);
} }
int size = 0;
config_str pacman_config = yon_file_open((char*)config_path,&size);
char *pacman_config_full = yon_char_parsed_to_string(pacman_config,size,"");
for (int i=0;i<installed_size;i++){ GRegex *regex = g_regex_new("^\\[.*\\]$",G_REGEX_MULTILINE,0,NULL);
while(gtk_events_pending()) gtk_main_iteration(); GMatchInfo *match = NULL;
yon_char_remove_last_symbol(installed[i],'\n'); g_regex_match(regex,pacman_config_full,G_REGEX_MATCH_DEFAULT,&match);
g_hash_table_add(packages_struct.installed_list,installed[i]);
} while (g_match_info_matches(match)){
char *iter = g_match_info_fetch(match,0);
for (int i=0;i<updates_size;i++){ if (iter[0]=='['){
while(gtk_events_pending()) gtk_main_iteration(); free(yon_char_divide(iter,0));
yon_char_remove_last_symbol(updates[i],'\n'); yon_char_remove_last_symbol(iter,']');
g_hash_table_add(packages_struct.updates_list,updates[i]); }
if (strcmp(iter,"options")){
alpm_register_syncdb(packages_struct.packages_handle,iter,ALPM_SIG_USE_DEFAULT);
}
g_match_info_next(match,NULL);
} }
free(package_list);
free(installed);
free(updates);
if (g_hash_table_size(packages_struct.all_list)&&g_hash_table_size(packages_struct.installed_list)){ return 1;
packages_struct.init_status = 1;
} else {
packages_struct.init_status = 0;
}
g_thread_exit(NULL);
} }
void yon_packages_init(){ int yon_packages_init(){
packages_thread = g_thread_new("packages_thread",(GThreadFunc)_yon_packages_init,NULL); if (packages_struct.packages_handle) return 0;
}
int status = _yon_packages_get_db();
if (!status) return 0;
int yon_packages_finalize(){ return 1;
g_thread_join(packages_thread);
return packages_struct.init_status;
} }
#define install_package_command(target) yon_char_unite("pacman -S ",target,NULL)
#define remove_package_command(target) yon_char_unite("pacman -R ",target,NULL)
#define update_package_installed_command(target) yon_char_append("pacman -Qq ",target)
#define update_package_updated_command(target) yon_char_append("pacman -Qqu ",target)
int yon_packages_check_exist(char *package){ int yon_packages_check_exist(const char *package_name){
if (!packages_struct.init_status) return 0; alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle);
return g_hash_table_contains(packages_struct.all_list,package); 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) return 1;
}
return 0;
} }
int yon_packages_check_installed(char *package){ int yon_packages_check_installed(char *package_name){
if (!packages_struct.init_status) return 0; alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle);
return g_hash_table_contains(packages_struct.installed_list,package); alpm_pkg_t *package = alpm_db_get_pkg(database,package_name);
if (package) return 1;
return 0;
} }
int yon_packages_check_updates(char *package){ int yon_packages_check_updates(char *package_name){
if (!packages_struct.init_status) return 0; alpm_pkg_t *sync_db_package = NULL;
return g_hash_table_contains(packages_struct.updates_list,package); alpm_pkg_t *local_db_package = NULL;
}
void yon_packages_update_package_is_installed(char *package){ alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle);
if (!packages_struct.init_status) return; for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){
char *command = update_package_installed_command(package); alpm_db_t *database = iter->data;
if (!system(command)){ alpm_pkg_t *package = alpm_db_get_pkg(database,package_name);
if (!g_hash_table_contains(packages_struct.installed_list,package)){ if (package) sync_db_package = 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);
}
} }
free(command); {
} alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle);
alpm_pkg_t *package = alpm_db_get_pkg(database,package_name);
void yon_packages_update_package_is_updated(char *package){ if (package) local_db_package = 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);
}
} }
free(command);
}
void yon_packages_update_package(char *package){ if (sync_db_package && local_db_package){
if (!packages_struct.init_status) return; const char *sync_db_package_version = alpm_pkg_get_version(sync_db_package);
char *command = update_package_installed_command(package); const char *local_db_package_version = alpm_pkg_get_version(sync_db_package);
if (!system(command)){ if (strcmp(sync_db_package_version,local_db_package_version)) return 1;
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);
}
} }
free(command); return 0;
}
command = update_package_updated_command(package); void yon_packages_update(){
if (!system(command)){ if (packages_struct.packages_handle) alpm_release(packages_struct.packages_handle);
if (!g_hash_table_contains(packages_struct.updates_list,package)){ _yon_packages_get_db();
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);
} }
int yon_packages_install(char *package){ int yon_packages_install(char *package){
if (!packages_struct.init_status) return 0; if (!packages_struct.init_status) return 0;
char *command = install_package_command(package); // char *command = install_package_command(package);
yon_terminal_window_launch(NULL,command,"",""); // yon_terminal_window_launch(NULL,command,"","");
yon_packages_update_package(package); yon_packages_update();
free(command); // free(command);
} }
int yon_packages_remove(char *package){ int yon_packages_remove(char *package){
if (!packages_struct.init_status) return 0; if (!packages_struct.init_status) return 0;
char *command = remove_package_command(package); // char *command = remove_package_command(package);
yon_terminal_window_launch(NULL,command,"",""); // yon_terminal_window_launch(NULL,command,"","");
yon_packages_update_package(package); yon_packages_update();
free(command); // free(command);
} }
void yon_packages_finish(){ void yon_packages_finish(){
if (!packages_struct.init_status) return; if (!packages_struct.init_status) return;
g_hash_table_unref(packages_struct.all_list); alpm_release(packages_struct.packages_handle);
g_hash_table_unref(packages_struct.installed_list);
} }
GList *yon_packages_get_all(){ GList *yon_packages_get_all(){
if (!packages_struct.init_status) return NULL; 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; return list;
} }

@ -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_finalize()
* Завершает инициирование системы пакетов из yon_packages_init(). * Завершает инициирование системы пакетов из yon_packages_init().
@ -577,16 +577,15 @@ void yon_packages_init();
int yon_packages_finalize(); 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_installed(char *package);
int yon_packages_check_updates(char *package); int yon_packages_check_updates(char *package);
void yon_packages_finish(); void yon_packages_finish();
GList *yon_packages_get_all(); 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_install(char *package);
int yon_packages_remove(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*)); void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*));
Loading…
Cancel
Save