From 8b4410eee7ac4f5bed9da32cd5b4bf27cf875662 Mon Sep 17 00:00:00 2001 From: Alexey Berezhok Date: Wed, 24 Dec 2025 23:01:50 +0300 Subject: [PATCH] Added snapshot --- app.rb | 128 +++++++++++++++++++++++++++++++++++++++ classes/projects.rb | 49 +++++++++++++++ views/prjinfo.erb | 2 + views/prjshot1.erb | 40 ++++++++++++ views/prjshot_add.erb | 17 ++++++ views/prjshot_delete.erb | 18 ++++++ 6 files changed, 254 insertions(+) create mode 100644 views/prjshot1.erb create mode 100644 views/prjshot_add.erb create mode 100644 views/prjshot_delete.erb diff --git a/app.rb b/app.rb index bfaee4b..533418f 100644 --- a/app.rb +++ b/app.rb @@ -1577,6 +1577,134 @@ get "/prjsignview/:id/*" do end end +get "/prjshot/: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_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) + if File.exist?(f_path) + @snap_list = prj.get_snap_list(prj_info[:id]) + @rpms_list = [ "Снимок не выбран" ] + erb :prjshot1 + else + print_error_page(503, "Репозиторий не существует") + end + end +end + +get "/prjsnap_add/: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_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) + if File.exist?(f_path) + erb :prjshot_add + else + print_error_page(503, "Репозиторий не существует") + end + end +end + +post "/prjsnap_add/: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["create"] == "create" && !params["yes"].nil? + prj.create_snapshot(prj_info[:id]) + end + redirect "/prjshot/#{params["id"]}" + end + end +end + +get "/prjsnap_delete/: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_descr = prj_info[:descr] + @proj_id = prj_info[:id] + @snap_name = params["snap"] + if @snap_name.nil? + print_error_page(503, "Не указано имя снимка") + else + filepath = "" + proj_path = prj.get_project_snap(params["id"], params["snap"]) + f_path = File.join(proj_path, filepath) + if File.exist?(f_path) + erb :prjshot_delete + else + print_error_page(503, "Снимок не существует") + end + end + end +end + +post "/prjsnap_delete/: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_descr = prj_info[:descr] + @proj_id = prj_info[:id] + @snap_name = params["snap"] + if @snap_name.nil? + print_error_page(503, "Не указано имя снимка") + else + filepath = "" + proj_path = prj.get_project_snap(params["id"], params["snap"]) + f_path = File.join(proj_path, filepath) + if File.exist?(f_path) + if params["cancel"].nil? && params["delete"] == "delete" && !params["yes"].nil? + prj.delete_snapshot(prj_info[:id], @snap_name) + end + redirect "/prjshot/#{params["id"]}" + else + print_error_page(503, "Снимок не существует") + end + end + end + + 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 + + end + end +end + get "/sanitize" do #Подчистим гит проекты, которые есть в базе, но нет в файловой системе all_gits = db.get_gits diff --git a/classes/projects.rb b/classes/projects.rb index a33e19e..95f3084 100644 --- a/classes/projects.rb +++ b/classes/projects.rb @@ -12,6 +12,7 @@ PROJECTS_STRUCTURE = { :SRCPRP => "srcprp", :SIGNED => "signed", :SRC => "src", + :SNAP => "snapshot", } class ProjectsActions @@ -71,6 +72,11 @@ class ProjectsActions File.join(proj_path, PROJECTS_STRUCTURE[:REPO]) end + def get_project_snap(id, snap) + proj_path = get_project_path(id) + File.join(proj_path, PROJECTS_STRUCTURE[:SNAP], snap) + end + def get_project_path_git(id, gitname) proj_path = get_project_path(id) File.join(proj_path, PROJECTS_STRUCTURE[:SRC], gitname) @@ -474,4 +480,47 @@ class ProjectsActions repoman = RepoManager.new(repo_path) repoman.create_repo end + + def get_snap_list(id) + proj_path = get_project_path(id) + snap_path = File.join(proj_path, PROJECTS_STRUCTURE[:SNAP]) + + unless Dir.exist?(snap_path) + FileUtils.mkdir_p(snap_path) + end + + snap_list = Dir.glob(File.join(snap_path, "*")).select { |path| File.directory?(path) }.map { |dir| File.basename(dir) } + + return snap_list + end + + def create_snapshot(id) + proj_path = get_project_path(id) + snap_path = File.join(proj_path, PROJECTS_STRUCTURE[:SNAP]) + repo_path = File.join(proj_path, PROJECTS_STRUCTURE[:REPO]) + + unless Dir.exist?(snap_path) + FileUtils.mkdir_p(snap_path) + end + + date_str = Time.now.strftime("%Y-%m-%d") + snapshot_dir = "#{date_str}_0" + + while Dir.exist?(File.join(snap_path, snapshot_dir)) + num = snapshot_dir.split("_").last.to_i + num += 1 + snapshot_dir = "#{date_str}_#{num}" + end + + snapshot_full_path = File.join(snap_path, snapshot_dir) + FileUtils.cp_r(repo_path, snapshot_full_path) + end + + def delete_snapshot(id, snap) + snap_path = get_project_snap(id, snap) + + if File.exist?(snap_path) + FileUtils.rm_rf(snap_path) + end + end end diff --git a/views/prjinfo.erb b/views/prjinfo.erb index bfd8aaf..ee67b2d 100644 --- a/views/prjinfo.erb +++ b/views/prjinfo.erb @@ -49,6 +49,8 @@ Список всех пакетов + Управление снимками репозитория Список сборок проекта + +<%= erb :footer %> \ No newline at end of file diff --git a/views/prjshot_add.erb b/views/prjshot_add.erb new file mode 100644 index 0000000..f851be9 --- /dev/null +++ b/views/prjshot_add.erb @@ -0,0 +1,17 @@ +<%= erb :header %> +
+

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

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

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

+
+
+ + +
+
+ + +
+
+
+<%= erb :footer %> \ No newline at end of file