WIP storage window saving

pull/108/head
parent e9df273e48
commit c87ddd0dfb
No known key found for this signature in database
GPG Key ID: FF1D842BF4DDE92B

@ -68,7 +68,7 @@ repo_struct *yon_repo_struct_new(){
storage->path=NULL;
storage->storage_path=NULL;
storage->archs = g_hash_table_new(g_str_hash,g_str_equal);
storage->sign_status=0;
storage->sign_status=NULL;
return storage;
}
@ -120,7 +120,7 @@ void yon_package_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha
arch_struct *yon_arch_copy_full(arch_struct *repo){
arch_struct *copy = yon_arch_struct_new();
copy->name=yon_char_new(repo->name);
copy->path=yon_char_new(repo->name);
copy->path=yon_char_new(repo->path);
copy->storage_path=yon_char_new(repo->storage_path);
copy->repo_name=yon_char_new(repo->repo_name);
yon_package_hash_table_clone(repo->packages,copy->packages);
@ -140,7 +140,7 @@ void yon_arch_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash)
repo_struct *yon_repo_copy_full(repo_struct *repo){
repo_struct *copy = yon_repo_struct_new();
copy->name=yon_char_new(repo->name);
copy->path=yon_char_new(repo->name);
copy->path=yon_char_new(repo->path);
copy->storage_path=yon_char_new(repo->storage_path);
copy->sign_status=repo->sign_status;
yon_arch_hash_table_clone(repo->archs,copy->archs);
@ -160,7 +160,7 @@ void yon_repo_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash)
storage_struct *yon_storage_copy_full(storage_struct *storage){
storage_struct *copy = yon_storage_struct_new();
copy->name=yon_char_new(storage->name);
copy->path=yon_char_new(storage->name);
copy->path=yon_char_new(storage->path);
copy->sign_status=storage->sign_status;
yon_repo_hash_table_clone(storage->repos,copy->repos);
return copy;
@ -174,4 +174,171 @@ void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha
storage_struct *storage_copy = yon_storage_copy_full(storage);
g_hash_table_insert(target_hash,storage_copy->path,storage_copy);
}
}
void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct){
char *changes = config(STORAGE(target_struct->path));
if (!yon_char_is_empty(changes)){
int size;
config_str parsed = yon_char_parse(changes,&size,";");
if (size>0&&!yon_char_is_empty(parsed[0])){
int removed_size;
config_str removed = yon_char_parse(parsed[0],&removed_size,",");
for (int i=0;i<removed_size;i++){
repo_struct *repo = g_hash_table_lookup(target_struct->repos,removed[i]);
g_hash_table_remove(target_struct->repos,removed[i]);
yon_repo_sturct_free_full(repo);
}
yon_char_parsed_free(removed,removed_size);
}
if (size>1&&!yon_char_is_empty(parsed[1])){
int added_size;
config_str added = yon_char_parse(parsed[1],&added_size,",");
for (int i=0;i<added_size;i++){
repo_struct *repo = g_hash_table_lookup(source_struct->repos,added[i]);
if (repo){
repo_struct *copy = yon_repo_copy_full(repo);
g_hash_table_insert(target_struct->repos,copy->path,copy);
}
char *command = create_storage_command(repo->storage_path,repo->name);
yon_launch(yon_debug_output("%s\n",command));
free(command);
}
yon_char_parsed_free(added,added_size);
}
if (size>2&&!yon_char_is_empty(parsed[2])){
int sign_size;
config_str sign = yon_char_parse(parsed[2],&sign_size, ",");
for (int i=0;i<sign_size;i++){
char *sign_key = yon_char_new(sign[i]);
char *key = yon_char_divide_search(sign_key,":",-1);
repo_struct *repo = g_hash_table_lookup(target_struct->repos,key);
char *command = repo_sign_command(repo->storage_path,repo->name,sign_key);
yon_launch(yon_debug_output("%s\n",command));
free(command);
free(sign_key);
free(key);
}
yon_char_parsed_free(sign,sign_size);
}
}
GList *list = g_hash_table_get_values(source_struct->repos);
GList *iter;
char *parameter=NULL;
yon_window_config_get_parameter("storage_info",source_struct->path,&parameter,YON_TYPE_STRING);
for (iter=list;iter;iter=iter->next){
repo_struct *repo = (repo_struct*)iter->data;
char *temp = yon_char_append_element(parameter,repo->path,",");
if (!yon_char_is_empty(parameter)) free(parameter);
parameter = temp;
}
g_list_free(list);
yon_window_config_add_instant_parameter(source_struct->path,"storage_info",parameter,YON_TYPE_STRING);
}
void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo){
char *str = config(STORAGE(storage->path));
if (!yon_char_is_empty(str)){
int size;
config_str parsed = yon_char_parse(str,&size,";");
if (size>1&&!yon_char_is_empty(parsed[1])){
int added_size;
config_str added = yon_char_parse(parsed[1],&added_size,",");
if (yon_char_parsed_check_exist(added,added_size,repo->name)==-1){
yon_char_parsed_add_or_create_if_exists(added,&added_size,repo->name);
} else {
yon_char_parsed_free(added,added_size);
return;
}
if (!yon_char_is_empty(parsed[1])) free(parsed[1]);
parsed[1] = yon_char_parsed_to_string(parsed,size,",");
} else if (size>0){
yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name);
} else {
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name);
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
}
char *final = yon_char_parsed_to_string_full(parsed,size,";");
yon_config_register(STORAGE(storage->path),STORAGE_command,final);
free(final);
if (parsed&&size) yon_char_parsed_free(parsed,size);
} else {
char *final = yon_char_unite(";",repo->name,";",NULL);
yon_config_register(STORAGE(storage->path),STORAGE_command,final);
free(final);
}
}
void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo){
char *str = config(STORAGE(storage->path));
if (!yon_char_is_empty(str)){
int size;
config_str parsed = yon_char_parse(str,&size,";");
if (size>0&&!yon_char_is_empty(parsed[0])){
int removed_size;
config_str removed = yon_char_parse(parsed[0],&removed_size,",");
if (yon_char_parsed_check_exist(removed,removed_size,repo->name)==-1){
yon_char_parsed_add_or_create_if_exists(removed,&removed_size,repo->name);
} else {
yon_char_parsed_free(removed,removed_size);
return;
}
if (!yon_char_is_empty(parsed[1])) free(parsed[1]);
parsed[1] = yon_char_parsed_to_string_full(parsed,size,",");
} else {
yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name);
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
}
char *final = yon_char_parsed_to_string_full(parsed,size,";");
yon_config_register(STORAGE(storage->path),STORAGE_command,final);
free(final);
if (parsed&&size) yon_char_parsed_free(parsed,size);
} else {
char *final = yon_char_unite(repo->name,";;",NULL);
yon_config_register(STORAGE(storage->path),STORAGE_command,final);
free(final);
}
}
void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign){
char *str = config(STORAGE(storage->path));
int size;
config_str parsed = yon_char_parse(str,&size,";");
if (size>2&&!yon_char_is_empty(parsed[2])){
int signs_size;
config_str signs = yon_char_parse(parsed[2],&signs_size,",");
char *final = yon_char_unite(repo->name,":",sign,NULL);
yon_char_parsed_add_or_create_if_exists(signs,&signs_size,final);
free(final);
yon_char_parsed_free(signs,signs_size);
} else if (size>1){
char *final = yon_char_unite(repo->name,":",sign,NULL);
yon_char_parsed_add_or_create_if_exists(parsed,&size,final);
free(final);
} else if (size>0){
char *final = yon_char_unite(repo->name,":",sign,NULL);
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
yon_char_parsed_add_or_create_if_exists(parsed,&size,final);
free(final);
} else if (!size){
char *final = yon_char_unite(repo->name,":",sign,NULL);
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
yon_char_parsed_add_or_create_if_exists(parsed,&size,"");
yon_char_parsed_add_or_create_if_exists(parsed,&size,final);
free(final);
}
char *final = yon_char_parsed_to_string_full(parsed,size,";");
yon_config_register(STORAGE(storage->path),STORAGE_command,final);
free(final);
if (parsed&&size) yon_char_parsed_free(parsed,size);
}

@ -4,6 +4,11 @@
void on_repo_signed(GtkWidget *self, storage_repo_block *block){
storage_config_window *window = g_object_get_data(G_OBJECT(self),"window");
const char *sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(block->SignatureCombo));
const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_id);
repo_struct *repo = g_hash_table_lookup(storage->repos,block->repo_name);
// yon_repo_struct_sign(storage,repo,sign);
yon_config_register(repo->path,STORAGE_command,(char*)sign);
if (!yon_char_is_empty(block->sign_request)) free(block->sign_request);
block->sign_request = yon_char_new(sign);
}
@ -13,6 +18,9 @@ void on_repo_removed(GtkWidget *self,storage_repo_block *block){
const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_id);
if (g_hash_table_lookup(storage->repos,block->repo_name)){
repo_struct *repo = g_hash_table_lookup(storage->repos,block->repo_name);
// yon_storage_struct_remove(storage,repo);
yon_config_remove_element(storage->path,repo->path,",");
g_hash_table_remove(storage->repos,block->repo_name);
gtk_widget_destroy(block->MainBox);
yon_storage_repo_block_destroy(block);

@ -14,6 +14,8 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){
free(yon_char_divide(storage->name,yon_char_find_last(storage->name,'/')));
g_hash_table_insert(window->storages_copy,storage->path,storage);
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path);
while (gtk_events_pending()) gtk_main_iteration();
gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path);
}
}
@ -27,6 +29,8 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){
free(yon_char_divide(storage->name,yon_char_find_last(storage->name,'/')));
g_hash_table_insert(window->storages_copy,storage->path,storage);
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path);
while (gtk_events_pending()) gtk_main_iteration();
gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path);
}
}
@ -45,6 +49,8 @@ void on_storage_remove(GtkWidget *self, storage_config_window *window){
const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target);
if (storage){
const char *path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
yon_config_remove_by_key((char*)path);
gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo)));
gtk_combo_box_set_active(GTK_COMBO_BOX(window->StoragePathCombo),0);
g_hash_table_remove(window->storages_copy,storage_target);
@ -77,9 +83,11 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){
block->repo_name=new_repo;
repo->path = yon_char_unite(storage_target,"/",new_repo,NULL);
repo->storage_path = yon_char_new(storage_target);
yon_config_append_element(storage->path,(char*)repo->path,",");
gtk_entry_set_text(GTK_ENTRY(block->RepoNameEntry),new_repo);
gtk_box_pack_start(GTK_BOX(window->ReposBox),block->MainBox,0,0,0);
g_hash_table_insert(storage->repos,repo->name,repo);
// yon_storage_struct_add_repo(storage,repo);
gtk_entry_set_text(GTK_ENTRY(window->AddEntry),"");
}
@ -112,8 +120,28 @@ void yon_storage_config_update(storage_config_window *window){
}
}
void yon_storage_remove(char *key, storage_struct *storage,void*){
char *parameter = config(key);
yon_window_config_add_instant_parameter(key,"storage_info",parameter,YON_TYPE_STRING);
int size;
config_str parsed = yon_char_parse(parameter,&size,",");
for (int i=0;i<size;i++){
char *repo_name = parsed[i]+yon_char_find_last(parsed[i],'/')+1;
char *command = create_storage_command(key,repo_name);
yon_launch(command);
free(command);
}
yon_storage_sturct_free_full(storage);
}
void on_storage_accept(GtkWidget *self, dictionary *dict){
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*);
gtk_widget_destroy(window->MainWindow);
g_hash_table_foreach_remove(window->storages_copy,(GHRFunc)yon_storage_remove,NULL);
g_hash_table_unref(window->storages_copy);
free(window);
yon_interface_update(widgets);
// main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
// storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*);
// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL);
@ -160,6 +188,21 @@ storage_config_window *yon_storage_config_window_new(){
window->delete_storages_size=0;
yon_storage_hash_table_clone(main_config.storages,window->storages_copy);
GList *list = g_hash_table_get_values(window->storages_copy);
GList *iter;
for (iter=list;iter;iter=iter->next){
storage_struct *storage = (storage_struct*)iter->data;
int repos_size;
config_str paths = NULL;
GList *repos = g_hash_table_get_values(storage->repos);
GList *iter2;
for (iter2=repos;iter2;iter2=iter2->next){
repo_struct *repo = (repo_struct*)iter2->data;
yon_char_parsed_add_or_create_if_exists(paths,&repos_size,repo->path);
}
yon_config_register(storage->path,STORAGE_command,yon_char_parsed_to_string(paths,repos_size,","));
}
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window);
g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window);
@ -180,11 +223,11 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){
GList *listiter;
for (listiter = storages;listiter;listiter=listiter->next){
storage_struct *cur_storage = (storage_struct*)listiter->data;
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),cur_storage->name,cur_storage->path);
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),cur_storage->path,cur_storage->path);
}
dictionary *dict = NULL;
yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
// g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict);
g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict);
gtk_widget_show(window->MainWindow);
}

@ -65,7 +65,13 @@ char *yon_path_get_name(char *path){
return copy;
}
void yon_remove_config_storages(char *key,storage_struct *storage,void*){
yon_storage_sturct_free_full(storage);
}
int yon_storages_load(main_window *widgets){
// g_hash_table_foreach_remove(main_config.storages,(GHRFunc)yon_remove_config_storages,NULL);
g_hash_table_remove_all(main_config.storages);
gsize size;
config_str storages = yon_window_config_get_section("storage_info",&size);
@ -73,12 +79,12 @@ int yon_storages_load(main_window *widgets){
for(int i=0;i<size;i++){
char *repos = NULL;
if (yon_window_config_get_parameter("storage_info",storages[i],&repos,YON_TYPE_STRING)){
char *storage_name = yon_path_get_name(storages[i]);
char *storage_name = yon_path_get_name(storages[i]);
storage_struct *storage = yon_storage_struct_new();
g_hash_table_insert(main_config.storages,storage_name,storage);
storage->name=storage_name;
storage->path=yon_char_new(storages[i]);
g_hash_table_insert(main_config.storages,storage->path,storage);
int repos_size;
config_str repo_names = yon_char_parse(repos,&repos_size,",");

@ -66,6 +66,8 @@ typedef char* string;
#define add_packages_repo_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",sign,"' ",packages_path,NULL)
#define remove_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL)
#define repo_sign_command(storage_path, repo, sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage_path, "' -S ", sign,NULL)
#define yon_move_packages_command(storage,arch, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -a '",arch,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,NULL)
#define yon_delete_packages_command(storage,arch, target_repo, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' ", packages,NULL)
#define yon_delete_packages_sign_command(storage,arch, target_repo,sign, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' -S '",sign,"' ", packages,NULL)
@ -142,6 +144,11 @@ Expire-Date: ",!yon_char_is_empty(expire)?expire:"0","\n\
%echo done\n\
EOF",NULL)
#define STORAGE_search_macro "STORAGE["
#define STORAGE(target) yon_char_unite("STORAGE[",target,"]",NULL)
#define STORAGE_command "echo \"\""
typedef char* string;
__attribute__((unused)) static \
@ -299,7 +306,7 @@ typedef struct {
char *storage_path;
GHashTable *archs;
char *path;
int sign_status;
char *sign_status;
} repo_struct;
typedef struct {
@ -407,4 +414,9 @@ void yon_sublist_packages_build(char *key, char *file, main_window *widgets);
void yon_sublist_build(char *key, storage_struct *storage, main_window *widgets);
void yon_storage_repo_block_destroy(storage_repo_block *block);
void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash);
void yon_storage_sturct_free_full(storage_struct *storage);
void yon_storage_sturct_free_full(storage_struct *storage);
void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct);
void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo);
void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo);
void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign);
void yon_storage_remove(char *key, storage_struct *storage,void*);
Loading…
Cancel
Save