diff --git a/app.rb b/app.rb index fa3965b..74124a6 100644 --- a/app.rb +++ b/app.rb @@ -1185,6 +1185,49 @@ get "/prjgitbld/:id/:git_id" do end end +get "/prjdelete/: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_id = params["id"] + + erb :deleteprj + end + end +end + +post "/prjdelete/: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 + git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i) + if params["cancel"].nil? && params["delete"] == "delete" && !params["isdelete"].nil? + err = prj.delete_project(params["id"]) + unless err.nil? + session[:prj_modal_info] = "Ошибка удаления git репозитория из проекта" + session[:prj_modal_text] = err + redirect "/prjedit/#{params["id"]}" + else + redirect "/projs" + end + end + redirect "/prjedit/#{params["id"]}" + end + end +end + not_found do status 404 @page_name = "Кто-то потерялся" diff --git a/classes/db.rb b/classes/db.rb index 10dda12..a41fd38 100644 --- a/classes/db.rb +++ b/classes/db.rb @@ -307,7 +307,7 @@ class DBase end def get_builds() - $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id join build_rpm as t4 on t4.build_id = t1.id group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id"].all + $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id left join build_rpm as t4 on t4.build_id = t1.id group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id"].all end def get_build_info(build_id) @@ -328,19 +328,30 @@ class DBase end def get_builds_for_project(prj_id) - $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id join build_rpm as t4 on t4.build_id = t1.id where t1.proj_id = ? group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id", prj_id.to_i].all + $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id left join build_rpm as t4 on t4.build_id = t1.id where t1.proj_id = ? group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id", prj_id.to_i].all end def get_builds_for_project_git(prj_id, git_id) - $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id join build_rpm as t4 on t4.build_id = t1.id where t1.proj_id = ? and t1.repo_id = ? group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id", prj_id.to_i, git_id.to_i].all - end - - def get_builds_for_project_git_rpm(prj_id, git_id) - $DDB["select t3.savepath, t3.signpath, t3.sign from buildtask as t1 join build_rpm as t2 on t2.build_id = t1.id join rpms as t3 on t3.id = t2.rpm_id where t1.proj_id = ? and t1.repo_id = ?", prj_id.to_i, git_id.to_i].all + $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id left join build_rpm as t4 on t4.build_id = t1.id where t1.proj_id = ? and t1.repo_id = ? group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id", prj_id.to_i, git_id.to_i].all end def delete_git_from_project(prj_id, git_id) ReposProjects.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).delete ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).delete end + + def delete_project(prj_id) + ReposProjects.where(proj_id: prj_id.to_i).delete + ProjectsReposSpec.where(proj_id: prj_id.to_i).delete + builds = BuildTask.where(proj_id: prj_id.to_i) + build.each do |item| + rpms = BuildRpms.where(build_id: item[:id]) + Rpms.where(id: rpms[:rpm_id]).delete + end + BuildTask.where(proj_id: prj_id.to_i).delete + end + + def projects_with_current_as_link(prj_id) + ProjectsProjects.where(proj_id_repository: prj_id.to_i).all + end end diff --git a/classes/projects.rb b/classes/projects.rb index 2c2ea56..3f86cf6 100644 --- a/classes/projects.rb +++ b/classes/projects.rb @@ -333,6 +333,7 @@ class ProjectsActions if active_build @error = "Нельзя удалить git репозиторий с незавершенными сборками" else + proj_path = get_project_path(prj_id) git_name = @db.get_repo_info_by_id(git_id) git_source = File.join(proj_path, PROJECTS_STRUCTURE[:SRC], git_name[:reponame]) FileUtils.rm_rf(git_source, secure: true) @@ -340,4 +341,29 @@ class ProjectsActions end @error end + + def delete_project(prj_id) + @error = nil + builds_lst = db.get_builds_for_project(prj_id) + active_build = false + builds_lst.each do |item| + if item[:state] == 0 + active_build = true + break + end + end + if active_build + @error = "Нельзя удалить git репозиторий с незавершенными сборками" + else + linked = @db.projects_with_current_as_link(prj_id) + if linked.nil? + proj_path = get_project_path(prj_id) + FileUtils.rm_rf(proj_path, secure: true) + @db.delete_project(prj_id, git_id) + else + @error = "На текущий проект ссылаются другие проекты. Удаление запрещено" + end + end + @error + end end diff --git a/views/deleteprj.erb b/views/deleteprj.erb new file mode 100644 index 0000000..d58b6bb --- /dev/null +++ b/views/deleteprj.erb @@ -0,0 +1,18 @@ +<%= erb :header %> +