diff --git a/.gitignore b/.gitignore index 767f93e..aa381cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .vscode/ *# ubl-settings-repomanager +ubl-settings-TEMPLATE ubl-settings-repo-back/ubl-settings-repo-back *~ build/ @@ -8,4 +9,6 @@ compile/ terminal-commands/ source/ubl-cmake.h .BUILD.md -.updatebuild.sh \ No newline at end of file +.updatebuild.sh +.install.sh +*vgcore* \ No newline at end of file diff --git a/Makefile b/Makefile index 9c63112..b869cb7 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ DEPENDS = /bin/cmake PREFIX ?= /usr/local PKGNAME = $(MAKEFILE_DIR) FILE_VER = source/${PKGNAME}.h +PKGIDENT=$(subst /,-,${PREFIX}) default_target: all @@ -74,7 +75,7 @@ uninstall: @for FILE_PO in $(wildcard *.po); do \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ - PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ $(RM) "$${PATH_FILE_MO}"; \ done @for SIZE in 16x16 32x32 48x48 scalable; do \ @@ -89,7 +90,7 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" - @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ @@ -101,9 +102,9 @@ install: check uninstall @echo "Install ..." @for FILE_PO in $(wildcard *.po); do \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ - install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ + install -dm755 "${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES"; \ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ - PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ echo "$${FILE_PO}"; \ msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ done @@ -112,9 +113,8 @@ install: check uninstall rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ done @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @cp ./com.ublinux.${PKGNAME}.policy ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy + @sed -e 's+/usr/bin+${PREFIX}/bin+' -e 's+.run+${PKGIDENT}.run+g' ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy -i @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" @@ -122,10 +122,12 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-symbolic.svg" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-green-symbolic.svg" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-red-symbolic.svg" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-symbolic.svg" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-symbolic.svg" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-green-symbolic.svg" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ diff --git a/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg new file mode 100644 index 0000000..a11cbf1 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg index 9373086..935dacf 100644 --- a/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg +++ b/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg @@ -1 +1,48 @@ - \ No newline at end of file + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg index 9373086..ad9da41 100644 --- a/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg +++ b/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg @@ -1 +1,48 @@ - \ No newline at end of file + + + + + + + + + diff --git a/gresource.xml b/gresource.xml index 7b4904a..58afa6e 100644 --- a/gresource.xml +++ b/gresource.xml @@ -3,6 +3,7 @@ ubl-settings-repomanager.glade ubl-settings-repomanager-windows.glade + ubl-settings-repomanager-sign.glade ubl-settings-repomanager.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index d62565a..4eb002d 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -32,6 +32,7 @@ add_custom_target(GLADE ubl-settings-repomanager.glade) set(DEPENDFILES ../ubl-settings-repomanager.glade ../ubl-settings-repomanager-windows.glade + ../ubl-settings-repomanager-sign.glade ../gresource.xml ../ubl-settings-repomanager-banner.png ../ubl-settings-repomanager.css diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 64665e2..c6bf903 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -98,43 +98,205 @@ void on_about(){ gtk_widget_show(window); } +void on_load(){ + gsize size=0; + config_str repos = yon_window_config_get_section("repos",&size); + gtk_tree_store_clear(main_config.tree_store); + for (int i=0;i",-1); + + if (repostatus == 1) gtk_tree_store_set(main_config.tree_store,&iter,0,folder_no_edits,3,0,-1); + else if (repostatus == -1){ + system(yon_char_unite("rm -rfd ",origin_flagged,NULL)); + yon_window_config_erase_custom_parameter(origin_flagged,"repos"); + GtkTreeIter *deleteIter = gtk_tree_iter_copy(&iter); + if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ + gtk_tree_iter_free(deleteIter); + deleteIter = gtk_tree_iter_copy(&iter); + if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ + gtk_tree_iter_free(deleteIter); + deleteIter = gtk_tree_iter_copy(&iter); + gtk_tree_store_remove(main_config.tree_store,deleteIter); + break; + } else { + gtk_tree_store_remove(main_config.tree_store,&iter); + } + } else { + gtk_tree_store_remove(main_config.tree_store,&iter); + + } + continue; + } + gboolean valid_child=gtk_tree_model_iter_children(GTK_TREE_MODEL(main_config.tree_store),&childIter,&iter); for (;valid_child;valid_child=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&childIter)){ - int status = 0,deleted = 0; - char *path=NULL; - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,3,&path,4,&status,5,&deleted,-1); - gtk_tree_store_set(main_config.tree_store,&childIter,4,0,5,0,-1); - if (status==-1) { remove_flagged = yon_char_unite(remove_flagged ? yon_char_append(remove_flagged,",") : " -p ",path,NULL); /*gtk_tree_store_remove(main_config.tree_store,&childIter);*/} - else if (status == 1&&deleted==0) { add_flagged = yon_char_unite(add_flagged ? yon_char_append(add_flagged,",") : " -p ",path,NULL);gtk_tree_store_set(main_config.tree_store,&childIter,0,"com.ublinux.ubl-settings-repomanager.document-symbolic",-1); } + char *pack_name, *pack_path; + char *pack_old_repo, *pack_new_repo; + char *pack_code_name, *pack_version, *pack_arch, *pack_depends; + int pack_status=0; + gboolean moved=0; + char *pack_sign; + gboolean pack_signed=0; + + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,1,&pack_name,2,&pack_path,3,&pack_status,4,&pack_old_repo,5,&pack_new_repo,6,&moved,9,&pack_code_name,10,&pack_version,11,&pack_arch,12,&pack_depends,13,&pack_sign,14,&pack_signed,-1); + if (!pack_path) continue; + char *pack_sign_paths; + pack_sign_paths = yon_char_new(pack_path); + yon_char_divide(pack_sign_paths,yon_char_find_last(pack_sign_paths,'/')); + packnames = yon_char_unite(packnames ? yon_char_append(packnames," "):"",pack_sign_paths,NULL); + if (pack_sign&&pack_signed==1){ + yon_char_divide_search(pack_sign,"<",-1); + pack_sign=yon_char_divide_search(pack_sign,">",-1); + if (!pack_groups||!(yon_dictionary_get(&pack_groups,pack_sign))){ + dictionary *dict = yon_dictionary_new(); + dict->key = pack_sign_paths; + yon_dictionary_add_or_create_if_exists_with_data(pack_groups,yon_char_new(pack_sign),dict); + } else { + dictionary *dict = yon_dictionary_new(); + dict->key = pack_sign_paths; + yon_dictionary_add_or_create_if_exists_with_data(pack_groups->data,yon_char_new(pack_sign),dict); + } + } + if (pack_status==1){ + add_packages = yon_char_unite(add_packages ? yon_char_append(add_packages,",") : "",pack_path,NULL); + pack_path = yon_char_unite(origin_flagged,"/pool/overlay/",yon_char_divide(pack_path,yon_char_find_last(pack_path,'/'))); + gtk_tree_store_set(main_config.tree_store,&childIter,2,pack_path,-1); + } else if (pack_status==-1){ + remove_packages = yon_char_unite(remove_packages ? yon_char_append(remove_packages,",") : "",pack_code_name,NULL); + } + if (pack_status==1) gtk_tree_store_set(main_config.tree_store,&childIter,0,document_no_edits,3,0,-1); + if (pack_status == -1){ + GtkTreeIter *deleteIter = gtk_tree_iter_copy(&childIter); + if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ + gtk_tree_iter_free(deleteIter); + deleteIter = gtk_tree_iter_copy(&childIter); + if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ + gtk_tree_iter_free(deleteIter); + deleteIter = gtk_tree_iter_copy(&childIter); + gtk_tree_store_remove(main_config.tree_store,deleteIter); + break; + } else { + gtk_tree_store_remove(main_config.tree_store,&childIter); + } + } else { + gtk_tree_store_remove(main_config.tree_store,&childIter); + } + } + } + if (origin_flagged&&name_flagged){ + if (add_packages){ + char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL; + repo_sign_flagged=NULL; + add_command = yon_char_unite(command, " add -d \"",origin_flagged,"\" -r \"",name_flagged, sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" ," -p ", add_packages,NULL); + } + if (remove_packages){ + char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL; + repo_sign_flagged=NULL; + remove_command = yon_char_unite(command, " remove -d \"",origin_flagged,"\" -r \"",name_flagged, sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" , " -p ", remove_packages,NULL); + } + if (repostatus == 1){ + yon_window_config_add_custom_parameter(yon_char_unite(origin_flagged,NULL),"repos",packnames,YON_TYPE_STRING); + } + if (!add_packages&&!signed_packages&&!remove_packages&&repostatus==1) + add_command = yon_char_unite(command, " add -d \"",origin_flagged,"\" -r \"",name_flagged,sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" ,NULL); + if (add_signed_command){/*printf("%s\n",add_signed_command);*/ system(add_signed_command); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);} + if (add_command) {/*printf("%s\n",add_command);*/system(add_command); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);} + if (remove_command) {/*printf("%s\n",remove_command);*/system(remove_command); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);} + if (pack_groups){ + dictionary *dct; + for_dictionaries(dct,pack_groups){ + char *signed_packs=NULL; + dictionary *pck; + for_dictionaries(pck,yon_dictionary_get_data(dct,dictionary*)){ + signed_packs=yon_char_unite(signed_packs ? yon_char_append(signed_packs,","): "" ,pck->key,NULL); + } char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL; + repo_sign_flagged=NULL; + char *sign_command = yon_char_unite(command, " add -f -d ",origin_flagged," -r ",name_flagged," --sign-pkg ", dct->key," -p $(find ",origin_flagged,"/pool/overlay -name ", signed_packs,")",NULL); + printf("%s\n",sign_command); + system(sign_command); + } + } } - if (origin_flagged) - remove_command = remove_flagged ? yon_char_unite(remove_command,remove_flagged,NULL) : NULL; - add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : add_command; - printf("%s\n%s\n",remove_command,add_command); - if (remove_command) system(remove_command); - if (add_command) system(add_command); } } @@ -160,28 +322,50 @@ void on_search(GtkCellEditable *self, main_window *widgets){ } gtk_tree_view_expand_row(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),&iter),0); } + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - char *codeName=NULL,*version=NULL,*architecture=NULL; + char *codeName=NULL,*version=NULL,*architecture=NULL, *dependeces=NULL, *signature=NULL; int serverType=0,trusted=0,published=0; - gtk_tree_model_get(model,&iter,11,&codeName,12,&version,13,&architecture,-1); + gtk_tree_model_get(model,&iter,9,&codeName,10,&version,11,&architecture,12,&dependeces,13,&signature,-1); gtk_label_set_text(GTK_LABEL(widgets->CodeNameInfoLabel),codeName ? codeName : ""); gtk_label_set_text(GTK_LABEL(widgets->VersionInfoLabel),version ? version : ""); gtk_label_set_text(GTK_LABEL(widgets->ArchitectureInfoLabel),architecture ? architecture : ""); + gtk_label_set_text(GTK_LABEL(widgets->DependencesInfoLabel),dependeces ? dependeces : ""); + gtk_label_set_text(GTK_LABEL(widgets->SignatureInfoLabel),signature ? signature : ABSENT_LABEL); + int depth = gtk_tree_store_iter_depth(main_config.tree_store,&iter); + if (depth == 0){ + gtk_widget_set_sensitive(widgets->CreateButton,1); + gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1); + gtk_widget_set_sensitive(widgets->ConfigureButton,1); + gtk_widget_set_sensitive(widgets->DeleteButton,1); + gtk_widget_set_sensitive(widgets->AddPackageButton,1); + gtk_widget_set_sensitive(widgets->RemovePackageButton,0); + gtk_widget_set_visible(widgets->NameBox,1); + gtk_widget_set_visible(widgets->DependenceBox,0); + gtk_widget_set_visible(widgets->VersionBox,0); + gtk_widget_set_visible(widgets->ArchitectureBox,0); + gtk_widget_set_visible(widgets->SignatureBox,1); + } else if (depth == 1){ + gtk_widget_set_sensitive(widgets->CreateButton,1); + gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1); + gtk_widget_set_sensitive(widgets->ConfigureButton,0); + gtk_widget_set_sensitive(widgets->DeleteButton,0); + gtk_widget_set_sensitive(widgets->AddPackageButton,1); + gtk_widget_set_sensitive(widgets->RemovePackageButton,1); + gtk_widget_set_visible(widgets->NameBox,1); + gtk_widget_set_visible(widgets->DependenceBox,1); + gtk_widget_set_visible(widgets->VersionBox,1); + gtk_widget_set_visible(widgets->ArchitectureBox,1); + gtk_widget_set_visible(widgets->SignatureBox,1); + } } } -int yon_char_find_last(char *source, char find){ - int size = strlen(source); - int i=size; - for (;source[i]!=find&&i>0;i--); - return i; -} - void on_repo_add_new(GtkWidget *self, dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); repo_create_window *window = yon_dictionary_get_data(dict->first->next,repo_create_window*); @@ -189,35 +373,18 @@ void on_repo_add_new(GtkWidget *self, dictionary *dict){ char *name=NULL; name = window->path; - window->path = yon_char_divide(name,yon_char_find_last(window->path, '/')); if (!name||strcmp(name,"")!=0){ GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); - gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.folder-green-symbolic",2,window->BranchesListStore,3,window->path,-1); + gtk_tree_store_set(main_config.tree_store,iter,0,folder_added,2,window->path,3,1,-1); yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } else { yon_ubl_status_box_render(EMPTY_NAME_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } } -void on_branch_add(GtkCellRendererText *self, char*path,char *new_text, repo_create_window *window){ - if (new_text&&strcmp(new_text,"")!=0){ - GtkTreeIter iter; - gboolean used, use=1; - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->BranchesListStore),&iter,path); - gtk_tree_model_get(GTK_TREE_MODEL(window->BranchesListStore),&iter,1,&used,-1); - used; - gtk_list_store_set(window->BranchesListStore,&iter,0,new_text,1,&use,-1); - if (used==0) - gtk_list_store_append(window->BranchesListStore,&iter); - - } -} - char *on_choose_repo_folder(GtkWidget *self,repo_create_window *window){ - GtkFileFilter *file_filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(file_filter,"*db.tar.gz"); - GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); + GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + gtk_window_set_icon_name(GTK_WINDOW(chooser),icon_path); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ @@ -234,6 +401,7 @@ void on_repo_new (GtkWidget *self, main_window *widgets){ dictionary *dict = yon_dictionary_new_with_data("",widgets); dict = yon_dictionary_append_with_data(dict,"",window); on_repo_add_new(self,dict); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } void on_repo_add_file(GtkWidget *self, main_window *widgets){ @@ -248,6 +416,54 @@ void on_repo_remove(GtkWidget *self, main_window *widgets){ yon_repo_remove(widgets); } +void on_sign_save(GtkWidget *self, dictionary *dict){ + GtkTreeIter iter; + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + repo_sign_window *window = yon_dictionary_get_data(dict->first->next,repo_sign_window*); + GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ + char *key = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->KeysCombo)); + gtk_tree_store_set(main_config.tree_store,&iter,13,key,14,1,-1); + } + on_tree_selection_changed(self,widgets); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + on_close_subwindow(self); +} + +void on_repo_sign(GtkWidget *self, main_window *widgets){ + repo_sign_window *window = g_malloc(sizeof(repo_sign_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_sign_path); + window->Window = yon_gtk_builder_get_widget(builder,"repoSignWindow"); + window->HeaderLabel = yon_gtk_builder_get_widget(builder,"signHeaderNameLabel"); + window->KeysCombo = yon_gtk_builder_get_widget(builder,"repoSignKeysCombo"); + + window->SaveButton = yon_gtk_builder_get_widget(builder,"repoSignSaveButton"); + window->CloseButton = yon_gtk_builder_get_widget(builder,"repoSignCancelButton"); + GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ + if (gtk_tree_store_iter_depth(main_config.tree_store,&iter)==1) + gtk_label_set_text(GTK_LABEL( window->HeaderLabel),yon_char_unite(DIGITAL_SIGNATURE_LABEL," - ",PACKAGE_LABEL,NULL)); + else + gtk_label_set_text(GTK_LABEL( window->HeaderLabel),yon_char_unite(DIGITAL_SIGNATURE_LABEL," - ",REPOSITORY_LABEL,NULL)); + int size=0; + config_str ret = yon_config_load(get_gpg_keys_command,&size); + for (int i=0;iKeysCombo),ret[i]); + } + dictionary *dict = yon_dictionary_new_with_data("",widgets); + dict = yon_dictionary_append_with_data(dict,"",window); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_sign_save),dict); + g_signal_connect(G_OBJECT(window->CloseButton),"clicked", G_CALLBACK(on_close_subwindow),NULL); + + gtk_widget_show(window->Window); + } else { + yon_ubl_status_box_render(SIGN_CHOOSE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } +} + void on_repo_configure(GtkWidget *self, main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); GtkTreeIter iter; @@ -280,19 +496,21 @@ void on_repo_configure_done(GtkWidget *self, dictionary *dict){ char *oldname=NULL; int status=0; char *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); - gtk_tree_model_get(model,&iter,1,&oldname,4,&status,-1); + gtk_tree_model_get(model,&iter,1,&oldname,3,&status,-1); if (status==0) - gtk_tree_store_set(main_config.tree_store,&iter,1,name,6,oldname,7,1,-1); + gtk_tree_store_set(main_config.tree_store,&iter,1,name,4,oldname,6,1,-1); else if (status==1) gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1); } + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); on_close_subwindow(self); } void on_repo_load_local(GtkWidget *self, main_window *widgets){ GtkFileFilter *file_filter = gtk_file_filter_new(); + GtkWidget *chooser = gtk_file_chooser_dialog_new(LOAD_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); gtk_file_filter_add_pattern(file_filter,"*db.tar.gz"); - GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + gtk_file_filter_set_name(file_filter, "*db.tar.gz"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ @@ -310,7 +528,6 @@ void on_repo_load_local(GtkWidget *self, main_window *widgets){ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYPE type){ GtkTreeIter *retIter=g_malloc0(sizeof(GtkTreeIter)); GtkTreeIter iter,parentIter; - GdkPixbuf *icon = NULL; GtkIconTheme *theme = gtk_icon_theme_get_default(); char *name_short = yon_char_new(name); gboolean fls = 0; @@ -321,23 +538,21 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&parentIter)){ if (type==YON_REPO_LINE_REPO_TYPE){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, folder_no_edits, 1, name_short,2,name,3,1,4,fls,-1); retIter = gtk_tree_iter_copy(&iter); } else if (type==YON_REPO_LINE_FILE_TYPE){ GtkTreeIter branch; - icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.follder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){ GtkTreeIter repo; gtk_tree_store_append(main_config.tree_store,&iter,&branch); - gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, document_no_edits, 1, name_short,2,name,3,1,4,fls,-1); retIter = gtk_tree_iter_copy(&iter); } else { gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, document_no_edits, 1, name_short,2,name,3,1,4,fls,-1); retIter = gtk_tree_iter_copy(&iter); } yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); @@ -345,9 +560,8 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else if (type==YON_REPO_LINE_REPO_TYPE){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, folder_no_edits, 1, name_short,2,name,3,1,4,fls,-1); retIter = gtk_tree_iter_copy(&iter); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else { @@ -362,12 +576,11 @@ void yon_repo_remove_package(main_window *widgets){ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ GtkTreeIter iterparent; if (gtk_tree_model_iter_parent(model,&iterparent,&iter)){ - // gtk_tree_store_remove(main_config.tree_store,&iter); int status = 0; - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,4,&status,-1); + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&status,-1); if (status != 1){ - gtk_tree_store_set(main_config.tree_store,&iter,4,-1,-1); - gtk_tree_store_set(main_config.tree_store,&iter,0,"com.ublinux.ubl-settings-repomanager.document-red-symbolic",-1); + gtk_tree_store_set(main_config.tree_store,&iter,3,-1,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0,document_deleted,-1); } else gtk_tree_store_remove(main_config.tree_store,&iter); yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); }else yon_ubl_status_box_render(CHOOSE_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -375,41 +588,67 @@ void yon_repo_remove_package(main_window *widgets){ } void yon_repo_remove(main_window *widgets){ - GtkTreeIter iter; + GtkTreeIter iter, childIter, *deletecopy; GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ if(gtk_tree_store_iter_depth(main_config.tree_store,&iter)==0){ - gtk_tree_store_set(main_config.tree_store,&iter,4,-1,0,"com.ublinux.ubl-settings-repomanager.folder-red-symbolic",-1); + int repostatus=0; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&repostatus,-1); + if (repostatus ==0){ + gtk_tree_store_set(main_config.tree_store,&iter,3,-1,0,folder_deleted,-1); + int valid=gtk_tree_model_iter_children(model,&childIter,&iter); + for (;valid;valid=gtk_tree_model_iter_next(model,&childIter)){ + int status=5; + gtk_tree_model_get(model,&childIter,3,&status,-1); + if (status==1){ + deletecopy = gtk_tree_iter_copy(&childIter); + gtk_tree_model_iter_previous(model,&childIter); + gtk_tree_store_remove(main_config.tree_store,deletecopy); + } else if (status == 0){ + gtk_tree_store_set(main_config.tree_store,&childIter, 0,document_deleted,3,-1,-1); + } + } + } else if (repostatus == 1) { + gtk_tree_store_remove(main_config.tree_store,&iter); + } }else yon_ubl_status_box_render(CHOOSE_REPO_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } void yon_add_file(main_window *widgets){ - + GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); GtkFileFilter *file_filter = gtk_file_filter_new(); + file_filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(file_filter,"*.pkg.tar.*"); - gtk_file_filter_set_name(file_filter,"*.pkg.tar.*"); - GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + gtk_file_filter_set_name(file_filter,".pkg.tar.*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); + file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*"); + gtk_file_filter_set_name(file_filter,"All"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ - char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); FILE *file = popen(get_package_info_command(filename),"r"); char *cur_string=g_malloc0(sizeof(char)*4096); - char *packname=NULL, *packver=NULL, *packarch=NULL; + char *packname=NULL, *packver=NULL, *packarch=NULL, *packdepends=NULL; while (fgets(cur_string,4096,file)){ - cur_string = yon_char_divide_search(cur_string,"\n",-1); - char *p = yon_char_divide_search(cur_string,":",-1); - if (strstr(p,"Name")) packname = yon_char_new(cur_string); - else if (strstr(p,"Version")) packver = yon_char_new(cur_string); - else if (strstr(p,"Architecture")) packarch = yon_char_new(cur_string); + char *stringe = yon_char_divide_search(cur_string,"\n",-1); + char *p = yon_char_divide_search(stringe,":",-1); + if (strstr(p,"Name")) packname = yon_char_new(stringe); + else if (strstr(p,"Version")) packver = yon_char_new(stringe); + else if (strstr(p,"Architecture")) packarch = yon_char_new(stringe); + else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe); + else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe); } GtkTreeIter *iter = yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); - gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.document-green-symbolic",11,packname,12,packver,13,packarch,-1); + gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),iter)); + gtk_tree_store_set(main_config.tree_store,iter,0,document_added,1,yon_char_unite(packname,"-",packver,"-",packarch,NULL),2,filename,9,packname,10,packver,11,packarch,12,packdepends,-1); } - on_close_subwindow(chooser); + on_tree_selection_changed(NULL,widgets); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + on_close_subwindow(chooser); } @@ -440,6 +679,7 @@ main_window *setup_window(){ widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic"); widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox"); + widgets->MovePaned = yon_gtk_builder_get_widget(builder,"MovePaned"); widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay"); widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage"); @@ -462,9 +702,6 @@ main_window *setup_window(){ widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); - // widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); - // widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem"); - widgets->GeneralTabLabel = yon_gtk_builder_get_widget(builder,"GeneralTabLabel"); widgets->PublicationTabLabel = yon_gtk_builder_get_widget(builder,"PublicationTabLabel"); widgets->CreateButton = yon_gtk_builder_get_widget(builder,"CreateButton"); @@ -497,15 +734,20 @@ main_window *setup_window(){ widgets->ArchitectureLabel = yon_gtk_builder_get_widget(builder,"ArchitectureLabel"); widgets->ArchitectureInfoLabel = yon_gtk_builder_get_widget(builder,"ArchitectureInfoLabel"); widgets->ComponentsLabel = yon_gtk_builder_get_widget(builder,"ComponentsLabel"); - widgets->ComponentsInfoLabel = yon_gtk_builder_get_widget(builder,"ComponentsInfoLabel"); + widgets->DependencesInfoLabel = yon_gtk_builder_get_widget(builder,"DependencesInfoLabel"); widgets->SignatureLabel = yon_gtk_builder_get_widget(builder,"SignatureLabel"); widgets->SignatureInfoLabel = yon_gtk_builder_get_widget(builder,"SignatureInfoLabel"); widgets->Finder = yon_gtk_builder_get_widget(builder,"RepoFinder"); + widgets->NameBox = yon_gtk_builder_get_widget(builder,"nameBox"); + widgets->VersionBox = yon_gtk_builder_get_widget(builder,"versionBox"); + widgets->ArchitectureBox = yon_gtk_builder_get_widget(builder,"archBox"); + widgets->DependenceBox = yon_gtk_builder_get_widget(builder,"dependBox"); + widgets->SignatureBox = yon_gtk_builder_get_widget(builder,"signatureBox"); widgets->SaveButton = yon_gtk_builder_get_widget(builder,"mainSaveButton"); main_config.tree_store = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); - widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); // yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); - widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); // yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); + widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); @@ -529,6 +771,10 @@ main_window *setup_window(){ } } + + /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ + yon_window_config_add_listener(widgets->MovePaned,"pane_position","position",YON_TYPE_INT); + /* Signal connection | Присоединение сигналов */ g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); @@ -539,6 +785,7 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->DeleteButton),"clicked",G_CALLBACK(on_repo_remove),widgets); g_signal_connect(G_OBJECT(widgets->LoadFromLocalButton),"clicked",G_CALLBACK(on_repo_load_local),widgets); g_signal_connect(G_OBJECT(widgets->ConfigureButton),"clicked",G_CALLBACK(on_repo_configure),widgets); + g_signal_connect(G_OBJECT(widgets->SignButton),"clicked",G_CALLBACK(on_repo_sign),widgets); g_signal_connect(G_OBJECT(widgets->SaveButton),"clicked",G_CALLBACK(on_save),widgets); g_signal_connect(G_OBJECT(widgets->RepoTree),"cursor-changed",G_CALLBACK(on_tree_selection_changed),widgets); g_signal_connect(G_OBJECT(widgets->Finder),"changed",G_CALLBACK(on_search),widgets); @@ -623,18 +870,30 @@ int main(int argc, char *argv[]){ main_config.lock_load_global=1; main_config.lock_save_global=1; main_config.lock_save_local=1; + main_config.lock_root=1; } gtk_init(&argc,&argv); main_window *widgets = setup_window(); yon_ubl_header_setup_resource(widgets->HeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); - yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); - yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_render(LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); yon_window_config_setup(GTK_WINDOW(widgets->Window)); yon_window_config_load(config_path); + + /*Check for null config parameter | Проверка на отсутствующий в конфигурации параметр */ + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(widgets->MovePaned),"position",val); + int paned_size = g_value_get_int(val); + if (paned_size<100) + gtk_paned_set_position(GTK_PANED(widgets->MovePaned),400); + + on_load(); + GtkTreeIter *iter = g_malloc0(sizeof(GtkTreeIter)); + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.tree_store),iter)) + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),iter); GtkCssProvider *css=gtk_css_provider_new(); gtk_css_provider_load_from_resource(css,CssPath); gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 77b1942..5b94dc4 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -22,15 +22,28 @@ #define glade_path "/com/ublinux/ui/ubl-settings-repomanager.glade" #define glade_repo_path "/com/ublinux/ui/ubl-settings-repomanager-windows.glade" +#define glade_sign_path "/com/ublinux/ui/ubl-settings-repomanager-sign.glade" #define banner_path "/com/ublinux/images/ubl-settings-repomanager-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-repomanager.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) +#define icon_path "com.ublinux.ubl-settings-repomanager" + +#define folder_no_edits "com.ublinux.ubl-settings-repomanager.folder-symbolic" +#define folder_deleted "com.ublinux.ubl-settings-repomanager.folder-red-symbolic" +#define folder_added "com.ublinux.ubl-settings-repomanager.folder-green-symbolic" +#define document_no_edits "com.ublinux.ubl-settings-repomanager.document-symbolic" +#define document_deleted "com.ublinux.ubl-settings-repomanager.document-red-symbolic" +#define document_added "com.ublinux.ubl-settings-repomanager.document-green-symbolic" #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-repomanager" typedef char* string; -#define get_package_info_command(filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |grep -E \"Name|Version|Architecture\" |sed -e 's/ *//g'",NULL) +#define get_package_info_command(filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," ||sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL) +#define get_saved_package_info_command(path,filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file $(find \"",path,"\" -name *",filename,"* -not -name *.sig |head -n 1)|sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL) + +#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) + string version_application; char *local; @@ -51,6 +64,7 @@ typedef struct { int lock_save_local; int lock_save_global; int lock_load_global; + int lock_root; } config; typedef struct { @@ -58,6 +72,8 @@ typedef struct { GtkWidget *HatLabel; GtkWidget *PlugBox; + GtkWidget *MovePaned; + GtkWidget *HeadOverlay; GtkWidget *HeadImage; GtkWidget *HeadBox; @@ -114,11 +130,16 @@ typedef struct { GtkWidget *ArchitectureLabel; GtkWidget *ArchitectureInfoLabel; GtkWidget *ComponentsLabel; - GtkWidget *ComponentsInfoLabel; + GtkWidget *DependencesInfoLabel; GtkWidget *SignatureLabel; GtkWidget *SignatureInfoLabel; GtkWidget *Finder; GtkWidget *SaveButton; + GtkWidget *NameBox; + GtkWidget *VersionBox; + GtkWidget *ArchitectureBox; + GtkWidget *DependenceBox; + GtkWidget *SignatureBox; } main_window; typedef struct { @@ -135,6 +156,15 @@ typedef struct { char *path; } repo_create_window; +typedef struct { + GtkWidget *Window; + GtkWidget *HeaderLabel; + GtkWidget *KeysCombo; + + GtkWidget *CloseButton; + GtkWidget *SaveButton; +} repo_sign_window; + typedef struct { GtkWidget *Window; diff --git a/source/ubl-strings.h b/source/ubl-strings.h index f516e5f..b7cd232 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,6 +1,8 @@ #define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) #define HELP_LABEL yon_char_unite(_("ubl-settings-repomanager version:")," ", version_application,"\n",TITLE_LABEL,"\n",_("Usage:"), " ubl-settings-repomanager ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL) +#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") + #define TITLE_LABEL _("Repository manager") #define TITLE_INFO_LABEL _("Repository management and configuring") #define SUCCESS_LABEL _("Operation succeeded") @@ -26,20 +28,9 @@ #define PROJECT_HOME_LABEL _("Project Home Page") #define NOTHING_CHOSEN_LABEL _("Nothing were chosen") -#define GLOBAL_LOAD_SUCCESS_LABEL _("Global configuration loading succseeded.") -#define LOCAL_LOAD_SUCCESS_LABEL _("Local configuration loading succseeded.") -#define LOAD_FAILED_LABEL _("Config loading failed") - -#define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.") -#define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.") -#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.") -#define SAVE_FAILED_LABEL -#define GLOBAL_LOAD_SUCCESS _("Global configuration loading succseeded.") -#define LOCAL_LOAD_SUCCESS _("Local configuration loading succseeded.") +#define LOAD_SUCCESS_LABEL _("Repository data has been loaded successfully") -#define GLOBAL_LOCAL_SAVE_SUCCESS _("Local and global configuration saving succseeded.") -#define GLOBAL_SAVE_SUCCESS _("Global configuration saving succseeded.") -#define LOCAL_SAVE_SUCCESS _("Local configuration saving succseeded.") +#define SAVE_SUCCESS_LABEL _("Saving has succseeded") #define GENERAL_TAB_LABEL _("General") #define PUBLICATION_TAB_LABEL _("Publication") @@ -53,6 +44,7 @@ #define ARCHITECRURE_LABEL _("Architecture:") #define COMPONENTS_LABEL _("Components:") #define SIGNATURE_LABEL _("Signature:") +#define SIGN_LABEL _("Sign") #define CREATE_REPO_LABEL _("Create repository") #define OPEN_REPO_LABEL _("Open existing repository") @@ -72,9 +64,20 @@ #define CHOOSE_REPO_BRANCH_LABEL _("Choose repository or branch!") #define CHOOSE_PACK_LABEL _("Choose pack to delete!") #define CHOOSE_REPO_LABEL _("Choose repository to delete!") +#define SIGN_CHOOSE_LABEL _("Choose repository or package to sign") #define NAME_LABEL _("Name:") #define BRANCHES_LABEL _("Branches:") #define TYPE_BRANCH_NAME_LABEL _("< Type branch name >") #define EMPTY_NAME_LABEL _("Name must be filled!") -#define CHOOSE_PATH_LABEL _("Choose path for new repository") \ No newline at end of file +#define CHOOSE_PATH_LABEL _("Choose path for new repository") + +#define ADD_REPO_LABEL _("Choose repository folder") +#define LOAD_REPO_LABEL _("Choose repository") + +#define ABSENT_LABEL _("Absent") +#define DEPENDENCE_LABEL _("Dependences:") +#define DIGITAL_SIGNATURE_LABEL _("Digital signature") + +#define PACKAGE_LABEL _("package") +#define REPOSITORY_LABEL _("repository") \ No newline at end of file diff --git a/source/ubl-utils.c b/source/ubl-utils.c index 482d1e8..2403ef2 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -2,7 +2,7 @@ // dictionary functions -/**yon_dictionary_create_empty(): +/**yon_dictionary_new(): * [EN] * Creates and returns empty dictionary * [RU] @@ -29,6 +29,7 @@ dictionary *yon_dictionary_new() dictionary *yon_dictinoary_copy(dictionary *dict){ dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); dct->data_type= dict->data_type; + return dct; } /**yon_dictionary_copy_deep(dictionary *dict) @@ -65,6 +66,7 @@ int yon_dictionary_set_data(dictionary *dict, void *data){ */ int yon_dictionary_set_key(dictionary *dict, char *key){ dict->key=key; + return 1; } /** int yon_dictionary_set(dictionary *dict, char *key, void *data) @@ -76,6 +78,7 @@ int yon_dictionary_set_key(dictionary *dict, char *key){ int yon_dictionary_set(dictionary *dict, char *key, void *data){ dict->key=key; dict->data=data; + return 1; } /**int yon_dictionary_empty(dictionary *dict) @@ -87,6 +90,7 @@ int yon_dictionary_set(dictionary *dict, char *key, void *data){ int yon_dictionary_empty(dictionary *dict){ dict->data=NULL; dict->data_type=DICTIONARY_OTHER_TYPE; + return 1; } /**yon_dictionary_switch_to_last(dictionary **dict) @@ -433,6 +437,13 @@ dictionary *yon_dictionary_get_nth(dictionary *dict, int place) // char functions +int yon_char_find_last(char *source, char find){ + int size = strlen(source); + int i=size; + for (;source[i]!=find&&i>0;i--); + return i; +} + /**[EN] * * creates new char string by combining two char strings. @@ -570,9 +581,8 @@ char *yon_char_divide_search(char *source, char *dividepos, int delete_divider) cut = yon_char_divide(source, leng); return cut; } - else - return source; } + return source; } /**yon_char_from_int(int int_to_convert) @@ -603,19 +613,24 @@ char *yon_char_from_int(int int_to_convert) * [RU] * Заменяет в строке [source] все вхождения строки [find] на [replace] */ -char *yon_char_replace(char *source, char *find, char*replace){ - char *final=NULL; - char *temp=NULL; - if(!strstr(replace,find)){ - while ((final=strstr(source,find))){ - temp=malloc(strlen(source)-strlen(final)); - memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); - memcpy(temp,source,strlen(source)-strlen(final)); - temp=yon_char_append(temp,replace); - source=yon_char_append(temp,final+1); +char *yon_char_replace(char *source, char *find, char*replace){ + if (!strstr(replace,find)){ + + + char *final=NULL; + char *temp=NULL; + if(!strstr(replace,find)){ + while ((final=strstr(source,find))){ + temp=malloc(strlen(source)-strlen(final)); + memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); + memcpy(temp,source,strlen(source)-strlen(final)); + temp=yon_char_append(temp,replace); + source=yon_char_append(temp,final+1); + } + } - return source; } + return source; } /**yon_char_parse(char *parameters, int *size, char *divider) @@ -630,19 +645,18 @@ char **yon_char_parse(char *parameters, int *size, char *divider){ string=malloc(sizeof(char*)); char *paramline=yon_char_new(parameters); char *param; + if (!strstr(parameters,divider)) return NULL; while ((param=yon_char_divide_search(paramline,divider,1))){ + if (strcmp(param,paramline)==0||param[0]=='\0') break; string=realloc(string,sizeof(char*)*i); string[i-1]=yon_char_new(param); i++; - if (strcmp(param,paramline)==0) break; } string=realloc(string,sizeof(char*)*i); string[i-1]=yon_char_new(paramline); i++; - // printf("%d\n",i); *size=i-1; return string; - } /**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete) @@ -802,7 +816,11 @@ char *yon_ubl_root_user_get(){ } char *yon_ubl_user_get_home_directory(){ - return getenv("HOME"); + FILE *path = popen(get_home_dir_command,"r"); + char *ret = g_malloc(4096); + fgets(ret,4096,path); + ret=yon_char_divide_search(ret,"\n",-1); + return ret; } // parsing functions @@ -1370,12 +1388,29 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end #define check_window_config_setup if(__yon_window_config_target_window) + typedef struct { + char *parameter_name; + enum YON_TYPE containing_type; + GtkWidget *track_widget; + char *property_name; + } __yon_listener_parameter; + + typedef struct { + char *parameter_name; + char *section; + enum YON_TYPE containing_type; + void *property; + } __yon_custom_parameter; + struct { int x; int y; int width; int height; int fullscreen; + dictionary *custom_listeners; + dictionary *custom_parameters; + dictionary *deleted_parameters; } __yon_main_window_config; static GtkWindow *__yon_window_config_target_window = NULL; @@ -1388,6 +1423,47 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width); g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height); g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen); + dictionary *dict=NULL; + if (__yon_main_window_config.custom_listeners) + for_dictionaries(dict,__yon_main_window_config.custom_listeners){ + __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); + switch(param->containing_type){ + case YON_TYPE_STRING: + g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val)); + break; + case YON_TYPE_INT: + g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val)); + break; + case YON_TYPE_BOOLEAN: + g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val)); + break; + case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; + } + } + if (__yon_main_window_config.custom_parameters) + for_dictionaries(dict,__yon_main_window_config.custom_parameters){ + __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); + switch (param->containing_type){ + case YON_TYPE_STRING: + g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property); + break; + case YON_TYPE_INT: + g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property); + break; + case YON_TYPE_BOOLEAN: + g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property); + break; + default: + break; + } + } + if (__yon_main_window_config.deleted_parameters) + for_dictionaries(dict,__yon_main_window_config.deleted_parameters){ + __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); + g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL); + } g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL); } @@ -1449,8 +1525,7 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ struct stat st; int size; - config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); - char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); + char *path = yon_char_divide(yon_char_new(__yon_window_config_path),yon_char_find_last(__yon_window_config_path,'/')); if (stat(path, &st) == -1) { mkdir(path, 0777); } @@ -1464,6 +1539,27 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL); __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL); __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL); + dictionary *dict=NULL; + if (__yon_main_window_config.custom_listeners) + for_dictionaries(dict,__yon_main_window_config.custom_listeners){ + __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); + switch(param->containing_type){ + case YON_TYPE_STRING: + g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_INT: + g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_BOOLEAN: + gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL); + g_value_set_boolean(val,res); + break; + default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; + } + g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val); + } if (__yon_main_window_config.width==0) __yon_main_window_config.width=800; if (__yon_main_window_config.height==0) __yon_main_window_config.height=600; gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); @@ -1479,6 +1575,70 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); } + config_str yon_window_config_get_section(char *section, gsize *size){ + config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL); + return key; + } + + /**yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type) + * [EN] + * + * [RU] + * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name]. + */ + void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){ + __yon_listener_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_listener_parameter)); + param->parameter_name = yon_char_new(param_name); + param->track_widget = widget; + param->property_name = yon_char_new(widget_property); + param->containing_type = val_type; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param); + } + + void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){ + __yon_custom_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_custom_parameter)); + param->parameter_name = yon_char_new(param_name); + param->section=section; + param->property = tracked_value; + param->containing_type = val_type; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param); + } + + void yon_window_config_erase_custom_parameter(char *param_name, char *section){ + __yon_custom_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_custom_parameter)); + param->parameter_name=param_name; + param->section=section; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param); + } + + int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){ + GError *err=NULL; + switch (type){ + case YON_TYPE_BOOLEAN: + *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_INT: + *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_STRING: + *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_STRING_LIST: + gsize size=0; + *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err); + *((char***)return_value)=yon_remalloc(return_value,size+1); + *((char***)return_value)[size]=NULL; + if (err) return 0; else return 1; + break; + } + } + GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ GtkWidget *menu_item = gtk_menu_item_new(); gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); diff --git a/source/ubl-utils.h b/source/ubl-utils.h index a7394ea..6ef2559 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include #include @@ -24,6 +26,7 @@ #define new(type) malloc(sizeof(type)) #define new_arr(type,size) malloc(sizeof(type)*size) +#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL) typedef enum { @@ -121,6 +124,8 @@ void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(vo // char functions +int yon_char_find_last(char *source, char find); + char *yon_char_append(char *source, char *append); char *yon_char_new(char *chr); @@ -211,6 +216,14 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end #endif +enum YON_TYPE{ + YON_TYPE_STRING, + YON_TYPE_STRING_LIST, + YON_TYPE_INT, + YON_TYPE_BOOLEAN, + YON_TYPE_OTHER +}; + GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); @@ -234,6 +247,16 @@ void yon_window_config_setup(GtkWindow *window); int yon_window_config_load(char *path); +config_str yon_window_config_get_section(char *section, gsize *size); + +void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type); + +void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type); + +void yon_window_config_erase_custom_parameter(char *param_name, char *section); + +int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type); + int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find); diff --git a/ubl-settings-repomanager-sign.glade b/ubl-settings-repomanager-sign.glade new file mode 100644 index 0000000..491c267 --- /dev/null +++ b/ubl-settings-repomanager-sign.glade @@ -0,0 +1,132 @@ + + + + + + True + False + process-stop-symbolic + + + True + False + emblem-ok-symbolic + + + 450 + False + True + com.ublinux.ubl-settings-repomanager + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + 10 + + + True + False + vertical + 5 + + + True + False + + + False + True + 0 + + + + + True + True + 0 + + + + + True + False + end + 5 + True + + + Cancel + True + True + True + image16 + + + + True + True + 0 + + + + + Save + True + True + True + image17 + + + + True + True + 1 + + + + + False + True + 1 + + + + + + + True + False + True + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + + diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css index 547dcda..7f91a20 100644 --- a/ubl-settings-repomanager.css +++ b/ubl-settings-repomanager.css @@ -117,4 +117,21 @@ background:transparent; .boxInfoMessOK{ background-color: #f3f0ac; +} +.invisprogress { + background-color:transparent; + color:transparent; + +} +.invisprogress.osd { + background:transparent; + color:transparent; +} +.invisprogress.trough * { + background:transparent; + color:transparent; +} +.invisprogress.trough.empty { + background:transparent; + color:transparent; } \ No newline at end of file diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 8043960..97bde26 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -196,14 +196,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - - - @@ -220,6 +216,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + + + + @@ -262,6 +264,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False user-trash-symbolic + + True + False + com.ublinux.ubl-settings-repomanager.document-sign-symbolic + True False @@ -684,7 +691,7 @@ translated and supported by community. - + True True 395 @@ -749,7 +756,6 @@ translated and supported by community. - True True True Configure repository @@ -792,6 +798,34 @@ translated and supported by community. 5 + + + True + True + True + Sign + image5 + + + + False + True + 6 + + + + + True + False + + + False + True + 7 + + True @@ -944,14 +978,14 @@ translated and supported by community. vertical 5 - - True + False - 20 + 5 True False + start Code name: 0 @@ -968,6 +1002,8 @@ translated and supported by community. True False + True + 0 False @@ -983,13 +1019,14 @@ translated and supported by community. - + False - 20 + 5 True False + start Branch: 0 @@ -1006,6 +1043,8 @@ translated and supported by community. True False + True + 0 False @@ -1021,14 +1060,14 @@ translated and supported by community. - - True + False - 20 + 5 True False + start Version: 0 @@ -1045,6 +1084,8 @@ translated and supported by community. True False + True + 0 False @@ -1060,14 +1101,14 @@ translated and supported by community. - - True + False - 20 + 5 True False + start Architecture: 0 @@ -1084,6 +1125,8 @@ translated and supported by community. True False + True + 0 False @@ -1099,14 +1142,15 @@ translated and supported by community. - + False - 20 + 5 True False - Components: + start + Dependences: 0 @@ -1119,9 +1163,11 @@ translated and supported by community. - + True False + True + 0 False @@ -1137,13 +1183,14 @@ translated and supported by community. - + False - 20 + 5 True False + start Signature: 0 @@ -1160,6 +1207,8 @@ translated and supported by community. True False + True + 0 False @@ -1633,4 +1682,14 @@ translated and supported by community. + + + + + + + + + + diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot index 96993f6..059b661 100644 --- a/ubl-settings-repomanager.pot +++ b/ubl-settings-repomanager.pot @@ -66,237 +66,263 @@ msgid "Lock global configration loading" msgstr "" #: source/ubl-strings.h:4 +msgid "" +"Warning! Application was launched without root - root-dependent actions are " +"locked" +msgstr "" + +#: source/ubl-strings.h:6 msgid "Repository manager" msgstr "" -#: source/ubl-strings.h:5 +#: source/ubl-strings.h:7 msgid "Repository management and configuring" msgstr "" -#: source/ubl-strings.h:6 +#: source/ubl-strings.h:8 msgid "Operation succeeded" msgstr "" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:10 msgid "About" msgstr "" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:11 msgid "Documentation" msgstr "" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:13 msgid "Save to local configuration" msgstr "" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:14 msgid "Save to global configuration" msgstr "" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:15 msgid "Save configuration" msgstr "" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:16 msgid "Save" msgstr "" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:18 msgid "Load local configuration" msgstr "" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:19 msgid "Load global configuration" msgstr "" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:20 msgid "Load" msgstr "" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:22 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:24 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:25 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:26 msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:27 msgid "Open documentation" msgstr "" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:28 msgid "Project Home Page" msgstr "" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:29 msgid "Nothing were chosen" msgstr "" -#: source/ubl-strings.h:30 source/ubl-strings.h:38 -msgid "Global configuration loading succseeded." +#: source/ubl-strings.h:31 +msgid "Repository data has been loaded successfully" msgstr "" -#: source/ubl-strings.h:31 source/ubl-strings.h:39 -msgid "Local configuration loading succseeded." +#: source/ubl-strings.h:33 +msgid "Saving has succseeded" msgstr "" -#: source/ubl-strings.h:32 -msgid "Config loading failed" -msgstr "" - -#: source/ubl-strings.h:34 source/ubl-strings.h:41 -msgid "Local and global configuration saving succseeded." -msgstr "" - -#: source/ubl-strings.h:35 source/ubl-strings.h:42 -msgid "Global configuration saving succseeded." -msgstr "" - -#: source/ubl-strings.h:36 source/ubl-strings.h:43 -msgid "Local configuration saving succseeded." -msgstr "" - -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:35 msgid "General" msgstr "" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:36 msgid "Publication" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:37 msgid "Trusted repository" msgstr "" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:38 msgid "Server type:" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:39 msgid "IP adress:" msgstr "" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:40 msgid "Port:" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:41 msgid "Publish" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:42 msgid "Code name:" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:43 msgid "Branch:" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:44 msgid "Architecture:" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:45 msgid "Components:" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:46 msgid "Signature:" msgstr "" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:47 +msgid "Sign" +msgstr "" + +#: source/ubl-strings.h:49 msgid "Create repository" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:50 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:51 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:52 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:53 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:54 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:55 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:56 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:57 msgid "Add package" msgstr "" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:58 msgid "Remove package" msgstr "" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:59 msgid "Open" msgstr "" -#: source/ubl-strings.h:70 +#: source/ubl-strings.h:61 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:63 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:73 +#: source/ubl-strings.h:64 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:65 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:66 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:67 +msgid "Choose repository or package to sign" +msgstr "" + +#: source/ubl-strings.h:69 msgid "Name:" msgstr "" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:70 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:71 msgid "< Type branch name >" msgstr "" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:72 msgid "Name must be filled!" msgstr "" -#: source/ubl-strings.h:81 +#: source/ubl-strings.h:73 msgid "Choose path for new repository" msgstr "" + +#: source/ubl-strings.h:75 +msgid "Choose repository folder" +msgstr "" + +#: source/ubl-strings.h:76 +msgid "Choose repository" +msgstr "" + +#: source/ubl-strings.h:78 +msgid "Absent" +msgstr "" + +#: source/ubl-strings.h:79 +msgid "Dependences:" +msgstr "" + +#: source/ubl-strings.h:80 +msgid "Digital signature" +msgstr "" + +#: source/ubl-strings.h:82 +msgid "package" +msgstr "" + +#: source/ubl-strings.h:83 +msgid "repository" +msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index 9143c52..3ef037e 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -50,7 +50,6 @@ msgid "Lock this help menu" msgstr "Блокировка вызова справки" #: source/ubl-strings.h:2 -#, fuzzy msgid "Lock configuration saving" msgstr "Блокировка сохранения локальной и глобальной конфигурации" @@ -67,63 +66,70 @@ msgid "Lock global configration loading" msgstr "Блокировка загрузки глобальной конфигурации" #: source/ubl-strings.h:4 +msgid "" +"Warning! Application was launched without root - root-dependent actions are " +"locked" +msgstr "" +"Внимание! Приложение было запущено без прав суперпользователя - действия, " +"требующие их наличия заблокированы" + +#: source/ubl-strings.h:6 msgid "Repository manager" msgstr "Менеджер репозиториев" -#: source/ubl-strings.h:5 +#: source/ubl-strings.h:7 msgid "Repository management and configuring" msgstr "Настройка параметров и управление репозиториями системы" -#: source/ubl-strings.h:6 -#, fuzzy +#: source/ubl-strings.h:8 msgid "Operation succeeded" msgstr "Операция завершена" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:10 msgid "About" msgstr "О программе" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:11 msgid "Documentation" msgstr "Справка" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:13 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:14 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:15 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:16 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:18 msgid "Load local configuration" msgstr "Загрузить локальную конфигуруцию" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:19 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:20 msgid "Load" msgstr "Загрузить" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:22 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:24 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:25 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -131,111 +137,100 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:26 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:27 msgid "Open documentation" msgstr "Прочитать справку" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:28 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:29 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/ubl-strings.h:30 source/ubl-strings.h:38 -msgid "Global configuration loading succseeded." -msgstr "Успешно загружена глобальная конфигурация" - -#: source/ubl-strings.h:31 source/ubl-strings.h:39 -msgid "Local configuration loading succseeded." -msgstr "Успешно загружена локальная конфигурация" - -#: source/ubl-strings.h:32 -msgid "Config loading failed" -msgstr "" - -#: source/ubl-strings.h:34 source/ubl-strings.h:41 -msgid "Local and global configuration saving succseeded." -msgstr "Успешно записаны локальная и глобальная конфигурация" - -#: source/ubl-strings.h:35 source/ubl-strings.h:42 -msgid "Global configuration saving succseeded." -msgstr "Успешно записана глобальная конфигурация" +#: source/ubl-strings.h:31 +msgid "Repository data has been loaded successfully" +msgstr "Информация о пакетах успешно загружена" -#: source/ubl-strings.h:36 source/ubl-strings.h:43 -msgid "Local configuration saving succseeded." -msgstr "Успешно записана локальная конфигурация" +#: source/ubl-strings.h:33 +#, fuzzy +msgid "Saving has succseeded" +msgstr "Успешно сохранено" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:35 msgid "General" msgstr "Общие" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:36 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:37 msgid "Trusted repository" msgstr "Доверенный репозиторий" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:38 msgid "Server type:" msgstr "Тип сервера:" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:39 msgid "IP adress:" msgstr "IP-адрес:" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:40 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:41 msgid "Publish" msgstr "Опубликовать" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:42 msgid "Code name:" msgstr "Кодовое имя:" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:43 msgid "Branch:" msgstr "Ветка:" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:44 msgid "Architecture:" msgstr "Архитектура:" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:45 msgid "Components:" msgstr "Компоненты" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:46 msgid "Signature:" -msgstr "Подпись" +msgstr "Подпись:" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:47 +msgid "Sign" +msgstr "Подписать" + +#: source/ubl-strings.h:49 msgid "Create repository" msgstr "Создать репозиторий" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:50 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:51 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:52 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:53 msgid "" "Add/Remove repository from\n" "local package sources" @@ -243,68 +238,98 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:54 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:55 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:56 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:57 msgid "Add package" msgstr "Добавить пакет" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:58 msgid "Remove package" msgstr "Удалить пакет" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:59 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:70 +#: source/ubl-strings.h:61 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:63 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:73 +#: source/ubl-strings.h:64 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:65 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:66 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:67 +msgid "Choose repository or package to sign" +msgstr "Выберите репозиторий или пакет для подписи" + +#: source/ubl-strings.h:69 msgid "Name:" msgstr "Название:" -#: source/ubl-strings.h:78 -#, fuzzy +#: source/ubl-strings.h:70 msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:71 msgid "< Type branch name >" msgstr "< Введите название ветки >" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:72 msgid "Name must be filled!" msgstr "Введите название!" -#: source/ubl-strings.h:81 -#, fuzzy +#: source/ubl-strings.h:73 msgid "Choose path for new repository" msgstr "Выбрать расположение нового репозитория" + +#: source/ubl-strings.h:75 +msgid "Choose repository folder" +msgstr "Выбрать директорию для репозитория" + +#: source/ubl-strings.h:76 +msgid "Choose repository" +msgstr "Выбрать репозиторий" + +#: source/ubl-strings.h:78 +msgid "Absent" +msgstr "Отсутствует" + +#: source/ubl-strings.h:79 +msgid "Dependences:" +msgstr "Зависит от:" + +#: source/ubl-strings.h:80 +msgid "Digital signature" +msgstr "Цифровая подпись" + +#: source/ubl-strings.h:82 +msgid "package" +msgstr "пакет" + +#: source/ubl-strings.h:83 +msgid "repository" +msgstr "репозиторий" \ No newline at end of file