From 5f784270e299c109b263bbcaf7c3b0598d166f45 Mon Sep 17 00:00:00 2001 From: Alexey Berezhok Date: Tue, 23 Dec 2025 23:33:01 +0300 Subject: [PATCH] Added deletion rpms --- app.rb | 170 +++++++++++++++++++++++++++++++++++++++ classes/utilities.rb | 3 + config.ini | 4 +- views/prjclean1.erb | 18 +++++ views/prjclean2.erb | 18 +++++ views/prjclean3.erb | 41 ++++++++++ views/prjclean3_post.erb | 22 +++++ views/prjinfo.erb | 2 + 8 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 views/prjclean1.erb create mode 100644 views/prjclean2.erb create mode 100644 views/prjclean3.erb create mode 100644 views/prjclean3_post.erb diff --git a/app.rb b/app.rb index e2adb52..4f1ec7b 100644 --- a/app.rb +++ b/app.rb @@ -419,6 +419,176 @@ get "/prjedit/:id" do end end +get "/prjclean/:id" do + prj = ProjectsActions.new(cfg.get_projects_path, db) + if prj.path.nil? + print_error_page(503, "Путь к проектам не существует") + else + prj_info = prj.get_project(params["id"]) + if prj_info.nil? + print_error_page(503, "Путь к проектам не существует") + else + @page_name = prj_info[:projname] + @proj_name = prj_info[:projname] + @proj_descr = prj_info[:descr] + @proj_id = prj_info[:id] + @proj_public = prj_info[:public] + @proj_tmpbuild = prj_info[:tmpstpbuild] + + erb :prjclean1 + end + end +end + +post "/prjclean/:id" do + prj = ProjectsActions.new(cfg.get_projects_path, db) + if prj.path.nil? + print_error_page(503, "Путь к проектам не существует") + else + prj_info = prj.get_project(params["id"]) + if prj_info.nil? + print_error_page(503, "Путь к проектам не существует") + else + if params["cancel"].nil? && params["delete"] == "delete" && !params["isclean"].nil? + redirect "/prjclean_step2/#{params["id"]}" + end + redirect "/prjedit/#{params["id"]}" + end + end +end + +get "/prjclean_step2/:id" do + prj = ProjectsActions.new(cfg.get_projects_path, db) + if prj.path.nil? + print_error_page(503, "Путь к проектам не существует") + else + prj_info = prj.get_project(params["id"]) + @page_name = prj_info[:projname] + @proj_name = prj_info[:projname] + @proj_id = prj_info[:id] + filepath = "" + proj_path = prj.get_project_repo(params["id"]) + f_path = File.join(proj_path, filepath) + if File.exist?(f_path) + erb :prjclean2 + else + print_error_page(503, "Файл не существует") + end + end +end + +post "/prjclean_step2/:id" do + prj = ProjectsActions.new(cfg.get_projects_path, db) + if prj.path.nil? + print_error_page(503, "Путь к проектам не существует") + else + prj_info = prj.get_project(params["id"]) + if prj_info.nil? + print_error_page(503, "Путь к проектам не существует") + else + if params["cancel"].nil? && params["delete"] == "delete" && params["inputvernum"].to_i > 0 + numb = params["inputvernum"] + redirect "/prjclean_step3/#{params["id"]}?numb=#{numb}" + end + redirect "/prjedit/#{params["id"]}" + end + end +end + +get "/prjclean_step3/:id" do + prj = ProjectsActions.new(cfg.get_projects_path, db) + if prj.path.nil? + print_error_page(503, "Путь к проектам не существует") + else + if params["numb"].to_i > 0 + prj_info = prj.get_project(params["id"]) + @page_name = prj_info[:projname] + @proj_name = prj_info[:projname] + @proj_descr = prj_info[:descr] + @proj_id = prj_info[:id] + filepath = "" + proj_path = prj.get_project_repo(params["id"]) + f_path = File.join(proj_path, filepath) + rpm_list_stay = [] + if File.exist?(f_path) + rpm_list = get_rpms_list_full(f_path) + repo = RepoManager.new(f_path) + rpm_result_list = {} + numb = params["numb"].to_i + rpm_list.each do |item| + f_name = File.basename item + rpm_info = repo.get_rpm_info(item) + if rpm_info[:error].nil? + p_name = "#{rpm_info[:pkginfo].name}" + if f_name =~ /\.src\.rpm$/ + p_name = "#{rpm_info[:pkginfo].name}_src" + end + if rpm_result_list[p_name].nil? + rpm_result_list[p_name] = [[rpm_info[:pkginfo], item, rpm_info[:pkginfo].version]] + else + rpm_result_list[p_name] << [rpm_info[:pkginfo], item, rpm_info[:pkginfo].version] + rpm_result_list[p_name].sort! do |a, b| + if a[2] < b[2] + 1 + elsif a[2] > b[2] + -1 + else + a[2] <=> b[2] + end + end + if rpm_result_list[p_name].length > numb + rpm_result_list[p_name].pop + end + end + else + rpm_list_stay << item + end + + end + rpm_result_list.each_pair do |k, v| + v.each do |item| + rpm_list_stay << item[1] + end + end + + delete_rpm_list = rpm_list - rpm_list_stay + @del_list = delete_rpm_list + erb :prjclean3 + else + print_error_page(503, "Файл не существует") + end + else + print_error_page(503, "Число оставшихся пакетов должно быть более 0") + end + end +end + +post "/prjclean_step3/:id" do + prj = ProjectsActions.new(cfg.get_projects_path, db) + if prj.path.nil? + print_error_page(503, "Путь к проектам не существует") + else + prj_info = prj.get_project(params["id"]) + if prj_info.nil? + print_error_page(503, "Путь к проектам не существует") + else + if params["cancel"].nil? && params["delete"] == "delete" && params["prjrpmlst"].length > 0 + @page_name = prj_info[:projname] + @proj_name = prj_info[:projname] + @proj_descr = prj_info[:descr] + @proj_id = prj_info[:id] + params["prjrpmlst"].each do |item| + File.unlink(item) + end + @rpm_list = params["prjrpmlst"] + erb :prjclean3_post + else + redirect "/prjedit/#{params["id"]}" + end + end + end +end + post "/prjagit/:id" do prj = ProjectsActions.new(cfg.get_projects_path, db) if prj.path.nil? diff --git a/classes/utilities.rb b/classes/utilities.rb index 18ec825..0b2f66d 100644 --- a/classes/utilities.rb +++ b/classes/utilities.rb @@ -59,3 +59,6 @@ def get_dirs_in_mock_cache(dir_path) Dir.glob(File.join(dir_path, "*")).select { |f| File.directory?(f) }.map{ |f| File.basename(f) } end +def get_rpms_list_full(directory) + Dir.glob(File.join(directory, "**", "*.rpm")).reject { |f| File.directory?(f) || f =~ /repodata\// } +end diff --git a/config.ini b/config.ini index 3ece03e..94e36f9 100644 --- a/config.ini +++ b/config.ini @@ -16,8 +16,8 @@ path = "locks/counter" path = "locks/build" [configs] -hide=open,amazon,anolis,circle,custom,euro,fedora,mageia,navy,alma,rocky -selected=msvsphere +hide=open,amazon,anolis,circle,custom,euro,fedora,mageia,navy,rocky +selected=alma [pages] items_per_page = 30 diff --git a/views/prjclean1.erb b/views/prjclean1.erb new file mode 100644 index 0000000..9d80bc0 --- /dev/null +++ b/views/prjclean1.erb @@ -0,0 +1,18 @@ +<%= erb :header %> +
+

Удаление сатрых версий пакетов проекта <%= @proj_name %>

+
+
+ + +
+
+ + +
+
+
+<%= erb :footer %> \ No newline at end of file diff --git a/views/prjclean2.erb b/views/prjclean2.erb new file mode 100644 index 0000000..af9ab1f --- /dev/null +++ b/views/prjclean2.erb @@ -0,0 +1,18 @@ +<%= erb :header %> +
+

Удаление сатрых версий пакетов проекта <%= @proj_name %>

+
+
+ + +
+ Укажите число версий каждого пакета, которые должны остаться +
+
+
+ + +
+
+
+<%= erb :footer %> \ No newline at end of file diff --git a/views/prjclean3.erb b/views/prjclean3.erb new file mode 100644 index 0000000..d8d3be0 --- /dev/null +++ b/views/prjclean3.erb @@ -0,0 +1,41 @@ +<%= erb :header %> + +
+
+
+

+ <%= @proj_name %> +

+
<%= @proj_descr %>
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +<%= erb :footer %> \ No newline at end of file diff --git a/views/prjclean3_post.erb b/views/prjclean3_post.erb new file mode 100644 index 0000000..b967924 --- /dev/null +++ b/views/prjclean3_post.erb @@ -0,0 +1,22 @@ +<%= erb :header %> +
+
+
+

+ <%= @proj_name %> +

+
<%= @proj_descr %>
+
+
+
+
    +
  • Список удаленных пакетов (не забудьте пересоздать repoview)
  • + <% @rpm_list.each do |item| %> +
  • <%= item %>
  • + <% end %> +
+
+
+
+
+<%= erb :footer %> \ No newline at end of file diff --git a/views/prjinfo.erb b/views/prjinfo.erb index 2ed5a63..bfd8aaf 100644 --- a/views/prjinfo.erb +++ b/views/prjinfo.erb @@ -57,6 +57,8 @@ class="bi bi-file-earmark-diff">Просмотр подписанного репозитория Установить адрес подписаннго репозитория + Удалить старые версии пакетов Удалить проект