From bc7eb468176623299b8b65c51f8a03ee52639426 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 17 May 2024 18:06:16 +0600 Subject: [PATCH] Add pakcage window fixes --- source/ubl-settings-repomanager.c | 126 ++++++++++++++++++----------- source/ubl-settings-repomanager.h | 5 ++ ubl-settings-repomanager-add.glade | 2 + 3 files changed, 88 insertions(+), 45 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 4979239..34f92e3 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -71,7 +71,7 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ } yon_char_parsed_free(repos_list,repos_size); } else { - yon_window_config_add_custom_parameter(path,"storage_info","",YON_TYPE_STRING); + yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); } } } @@ -93,7 +93,7 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); - yon_window_config_add_custom_parameter(path,"storage_info","",YON_TYPE_STRING); + yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); } } yon_storage_config_update(window); @@ -166,7 +166,7 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ if (yon_char_parsed_check_exist(old_repos_parsed,old_repos_size,child_path)==-1){ yon_char_parsed_add_or_create_if_exists(old_repos_parsed,&old_repos_size,child_path); } - yon_window_config_add_custom_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); + yon_window_config_add_instant_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); yon_char_parsed_free(old_repos_parsed,old_repos_size); yon_launch(create_storage_command(path, new_repo)); int size; @@ -191,7 +191,7 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ } } closedir(current_dir); - yon_window_config_add_custom_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); + yon_window_config_add_instant_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); } } yon_char_parsed_free(dirs,size); @@ -264,6 +264,9 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_show(window->MainWindow); } +//repo-move window + + //repo-add window section gboolean yon_storage_filter_func(GtkTreeModel *model, GtkTreeIter *iter, @@ -275,6 +278,7 @@ gboolean yon_storage_filter_func(GtkTreeModel *model, } config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level){ + (*size)=0; config_str final = NULL; GtkTreePath *path=NULL, *parent_path=NULL; GtkTreeIter iter; @@ -348,19 +352,17 @@ void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window * if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ char *curpath; gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&curpath,-1); - char *packages; - yon_window_config_get_parameter("package_info",curpath,&packages,YON_TYPE_STRING); - if (!yon_char_is_empty(packages)){ int size; - config_str parsed = yon_char_parse(packages,&size,","); + config_str parsed = yon_file_ls(curpath,&size); for (int i=0;iPackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,1,parsed[i],2,full_path_package,-1); - free(full_path_package); + if (strstr(parsed[i],".tar.")&&!strstr(parsed[i],".files.")&&!strstr(parsed[i],".db.")&&!strstr(parsed[i],".sig")){ + char *full_path_package = yon_char_unite(curpath,"/",parsed[i],NULL); + char *name = yon_char_new(parsed[i]); + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,parsed[i],2,full_path_package,3,0,-1); + free(full_path_package); + } } - } } } } @@ -376,7 +378,7 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ if (responce == GTK_RESPONSE_ACCEPT){ char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); char *path; - GtkTreeIter iter,itar; + GtkTreeIter iter,itar,itor; gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&path,-1); char *packages; @@ -389,17 +391,45 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ char *name = yon_char_new(current); free(yon_char_divide(name,yon_char_find_last(name,'/'))); if (yon_char_parsed_check_exist(parsed,size,current)==-1){ - gtk_list_store_append(window->PackagesList,&itar); - gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,-1); + char *repo_store_path = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,repo_store_path); + char *repo_name; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&repo_name,-1); + char *repo_pack = yon_char_divide(repo_name,yon_char_find_last(repo_name,'/')); + yon_debug_output("%s\n",add_packages_command(repo_pack,repo_name,current)); + if (!system(add_packages_command(repo_pack,repo_name,current))){ + gtk_list_store_append(window->PackagesList,&itar); + gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,3,1,-1); + yon_char_parsed_add_or_create_if_exists(parsed,&size,name); + yon_window_config_add_instant_parameter(path,"package_info",yon_char_parsed_to_string(parsed,size,","),YON_TYPE_STRING); + } } } } gtk_widget_destroy(dialog); } -void on_remove_package(){ +void on_remove_package(GtkWidget *self, repo_add_window *window){ + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + char *arch = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + char *repo; + char *path; + GtkTreeModel *model; + GtkTreeIter iter,itar,itor; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,arch); + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&arch,-1); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&repo,3,&path,-1); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&itar)){ + char *cur_name, *cur_path; + gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&itar,1,&cur_name,2,&cur_path,-1); + char *command = remove_packages_command(arch,repo,cur_name); + yon_debug_output("%s\n",command); + yon_launch(command); + on_add_target_package_selection_changed(window->ArchitectureCombo,window); + } } void on_add_selection_changed(GtkWidget *self, repo_add_window *window){ @@ -436,13 +466,15 @@ repo_add_window *yon_repo_add_window_new(){ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); - window->tree_copy = gtk_tree_store_new(6,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING); + window->tree_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT); yon_gtk_tree_store_copy_full(main_config.tree_store,window->tree_copy); window->storage_filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->repo_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->arch_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->package_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->tree_copy)); + window->added_packages_archs = NULL; + window->removed_packages_archs = NULL; g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); @@ -477,6 +509,15 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_show(window->MoveSourceFrame); gtk_widget_show(window->MoveTargetFrame); gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + GtkTreeIter iter; + for_iter (window->tree_copy,&iter){ + char *current; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1); + if (!yon_char_is_empty(current)){ + char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current); + } + } gtk_widget_show(window->MainWindow); } @@ -520,32 +561,16 @@ void yon_config_load_update(main_window *widgets){ free(yon_char_divide(nm,yon_char_find_last(nm,'/'))); gtk_tree_store_append(widgets->RepoList,&itar,&iter); gtk_tree_store_set(widgets->RepoList,&itar,3,name_parsed[j],2,nm,-1); - free(nm); int size; config_str dirs = yon_file_list_dirs(name_parsed[j],&size); for (int k=0;kRepoList,&iter,&itar); - gtk_tree_store_set(widgets->RepoList,&iter,2,dirs[k],3,arch_path,-1); - - if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){ - config_str final = NULL; - int final_size=0; - DIR *current_dir = opendir(arch_path); - struct dirent* cur_dir; - while ((cur_dir=readdir(current_dir))){ - if (strlen(cur_dir->d_name)>8){ - char *extension = yon_char_new(cur_dir->d_name); - free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4)); - if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){ - yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name); - } - } - } - closedir(current_dir); - yon_window_config_add_custom_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); + if (strcmp(dirs[k],"pool")&&strcmp(dirs[k],nm)){ + char *arch_path = yon_char_unite(name_parsed[j],"/",dirs[k],NULL); + gtk_tree_store_append(widgets->RepoList,&iter,&itar); + gtk_tree_store_set(widgets->RepoList,&iter,2,dirs[k],3,arch_path,-1); } } + free(nm); } yon_char_parsed_free(name_parsed,parsed_size); } @@ -566,29 +591,40 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ gtk_tree_model_get(model, &iter,3,&target,-1); switch (depth){ case 1:{ + int lvlsize; + config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,2); + for (int i=0;iRepoFileList,&itar); + gtk_list_store_set(widgets->RepoFileList,&itar,1,level[i],-1); + } } break; case 2:{ + int lvlsize; + config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,3); + for (int i=0;iRepoFileList,&itar); + gtk_list_store_set(widgets->RepoFileList,&itar,1,level[i],-1); + } } break; case 3:{ char *packages; int size; - yon_window_config_get_parameter("package_info",target,&packages,YON_TYPE_STRING); - if (!yon_char_is_empty(packages)){ - config_str parsed = yon_char_parse(packages,&size,","); + config_str parsed = yon_file_ls(target,&size); for (int i=0;iRepoFileList,&itar); char *name = yon_char_new(parsed[i]); - char *temp = yon_char_divide_search(name,"-",-1); + char *temp = yon_char_divide_search(name,".",-1); free(name); name=temp; gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); + } } } - } break; } } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index e778b0c..0fe750a 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -45,6 +45,8 @@ typedef char* string; #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) #define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL) +#define add_packages_command(path,name,packages_path) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"' ",packages_path,NULL) +#define remove_packages_command(path,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -d '", path,"' ",packages_path,NULL) string version_application; @@ -104,6 +106,9 @@ typedef struct { GtkTreeModel *repo_filter; GtkTreeModel *arch_filter; GtkTreeModel *package_filter; + + dictionary *added_packages_archs; + dictionary *removed_packages_archs; } repo_add_window; typedef struct { diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 17c0833..97caa61 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -11,6 +11,8 @@ + +