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 @@
+
+
+
+
+
+
+
+
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