diff --git a/app.rb b/app.rb
index 2ff660f..fa3965b 100644
--- a/app.rb
+++ b/app.rb
@@ -721,12 +721,14 @@ post "/prjaddrepo/:id" do
else
if params["disableLinks"].nil?
list_id = params["prjlst"]
- current_list = prj.get_related_projects_list(params["id"])
- current_list_id = current_list.map { |item| item[:proj_id_repository] }
- new_ids = list_id - current_list_id
- removed_ids = current_list_id - list_id
- prj.save_linked_projects(params["id"], new_ids, removed_ids)
- prj.regenerate_linked_repos(params["id"])
+ unless list_id.nil?
+ current_list = prj.get_related_projects_list(params["id"])
+ current_list_id = current_list.map { |item| item[:proj_id_repository] }
+ new_ids = list_id - current_list_id
+ removed_ids = current_list_id - list_id
+ prj.save_linked_projects(params["id"], new_ids, removed_ids)
+ prj.regenerate_linked_repos(params["id"])
+ end
redirect "/prjedit/#{params["id"]}"
else
prj.delete_linked_projects(params["id"])
@@ -800,11 +802,7 @@ get "/buildinforaw/:build_id" do
info = db.get_build_task_process_log(build_id)
unless info.nil?
if File.exist?(info[:errlogpath])
- output = ""
- File.readlines(info[:errlogpath]).each do |line|
- output << line
- end
- output
+ send_file info[:errlogpath]
else
"Файла для чтения сборки уже не существует #{info[:errlogpath]}"
end
@@ -943,6 +941,250 @@ get "/buildinfof/:build_id" do
end
end
+get "/buildinfofraw" do
+ if params["file"].nil? || !File.exist?(params["file"])
+ print_error_page(503, "Файл не найден")
+ else
+ if !File.binary?(params["file"]) && params["file"].start_with?(File.join(Dir.pwd(), cfg.get_projects_path))
+ send_file params["file"]
+ else
+ print_error_page(503, "Файл не может быть скачан")
+ end
+ end
+end
+
+get "/prjbuilds/: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"])
+ @prj = prj_info
+ @page_name = "Список всех сборок для проекта #{prj_info[:projname]}"
+ builds_lst = db.get_builds_for_project(params["id"])
+ if params["p"].nil?
+ @page = 1
+ else
+ @page = params["p"].to_i
+ if @page < 1
+ @page = 1
+ else
+ @page = @page + 1
+ end
+ end
+ if builds_lst.nil?
+ builds_lst = []
+ end
+ items_per_page = cfg.get_items_per_page
+ @builds_list = builds_lst[(@page - 1) * items_per_page, items_per_page]
+ @max_pages = builds_lst.length / items_per_page
+ if (@max_pages * items_per_page) != builds_lst.length
+ @max_pages = @max_pages + 1
+ end
+ erb :prjbuildslist
+ end
+end
+
+get "/prjrpm/:id" do
+ @raw = nil
+ 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 params["p"].nil?
+ filepath = ""
+ else
+ filepath = params["p"]
+ end
+ proj_path = prj.get_project_repo(params["id"])
+ f_path = File.join(proj_path, filepath)
+ if File.exist?(f_path)
+ if File.directory?(f_path)
+ @file_content = []
+ @files_list = Dir[File.join(f_path, "*")].reject do |item|
+ item =~ /repodata$/
+ end.map do |item|
+ if File.directory?(item)
+ { :file => item.delete_prefix(proj_path + "/"), :isdir => true }
+ else
+ { :file => item.delete_prefix(proj_path + "/"), :isdir => false }
+ end
+ end
+ else
+ if File.binary?(f_path)
+ if f_path =~ /\.rpm$/
+ rpm_rd = RPMReader.new
+ rpm_info = rpm_rd.get_rpm_info(f_path)
+ if rpm_info[:error].nil?
+ @raw = f_path
+ rpm_info = rpm_info[:pkginfo]
+ @file_content = []
+ @file_content << "Имя пакета: #{rpm_info.name}"
+ @file_content << "Версия пакета: #{rpm_info.version}"
+ @file_content << ""
+ @file_content << "Changelog:"
+ rpm_info.changelog.first(10).each do |entry|
+ @file_content << "#{entry.time} #{entry.name}"
+ @file_content << "#{entry.text}"
+ @file_content << "---------------"
+ end
+ @file_content << "---------------"
+ @file_content << "Файлы:"
+ rpm_info.files.each do |file|
+ @file_content << "#{file.path} (#{file.size})"
+ end
+ @file_content << "---------------"
+ @file_content << "Зависимости:"
+ rpm_info.provides.each do |item|
+ @file_content << "Provides: #{item.name}"
+ end
+ rpm_info.requires.each do |item|
+ @file_content << "Requires: #{item.name}"
+ end
+ rpm_info.obsoletes.each do |item|
+ @file_content << "Obsoletes: #{item.name}"
+ end
+ rpm_info.conflicts.each do |item|
+ @file_content << "Conflicts: #{item.name}"
+ end
+ else
+ @file_content = ["Двоичный файл"]
+ end
+ else
+ @file_content = ["Двоичный файл"]
+ end
+ else
+ @file_content = File.readlines(f_path)
+ end
+ @files_list = Dir[File.join(File.dirname(f_path), "*")].map do |item|
+ if File.directory?(item)
+ { :file => item.delete_prefix(proj_path + "/"), :isdir => true }
+ else
+ { :file => item.delete_prefix(proj_path + "/"), :isdir => false }
+ end
+ end
+ end
+ if filepath != ""
+ if File.dirname(f_path) == proj_path
+ fn = ""
+ else
+ if File.directory?(f_path)
+ fn = File.dirname(f_path).delete_prefix(proj_path + "/")
+ else
+ f_path = File.dirname(f_path)
+ if File.dirname(f_path) == proj_path
+ fn = ""
+ else
+ fn = File.dirname(f_path).delete_prefix(proj_path + "/")
+ end
+ end
+ end
+ @files_list = [{ :file => "..", :isdir => true, :fname => fn }] + @files_list
+ end
+ @page_name = "Список пакетов для репозитория #{prj_info[:projname]}"
+ @proj_info = prj_info
+ @file_name = filepath
+ erb :repoinfo
+ else
+ print_error_page(503, "Файл не существует")
+ end
+ end
+end
+
+get "/prjdgit/:id/:git_id" do
+ prj = ProjectsActions.new(cfg.get_projects_path, db)
+ if prj.path.nil?
+ print_error_page(503, "Путь к проектам не существует")
+ else
+ repo = GitRepo.new(cfg.get_repo, db)
+ if repo.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)
+ @page_name = "Удалить репозиторий #{git_info[:reponame]} из проекта #{prj_info[:projname]} "
+ @proj_name = prj_info[:projname]
+ @git_name = git_info[:reponame]
+ @proj_id = params["id"]
+ @git_id = params["git_id"]
+
+ erb :deletegitprj
+ end
+ end
+ end
+end
+
+post "/prjdgit/:id/:git_id" do
+ prj = ProjectsActions.new(cfg.get_projects_path, db)
+ if prj.path.nil?
+ print_error_page(503, "Путь к проектам не существует")
+ else
+ repo = GitRepo.new(cfg.get_repo, db)
+ if repo.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_git_from_project(params["id"], params["git_id"])
+ unless err.nil?
+ session[:prj_modal_info] = "Ошибка удаления git репозитория из проекта"
+ session[:prj_modal_text] = err
+ end
+ end
+
+ redirect "/prjedit/#{params["id"]}"
+ end
+ end
+ end
+end
+
+get "/prjgitbld/:id/:git_id" do
+ prj = ProjectsActions.new(cfg.get_projects_path, db)
+ if prj.path.nil?
+ print_error_page(503, "Путь к проектам не существует")
+ else
+ repo = GitRepo.new(cfg.get_repo, db)
+ if repo.path.nil?
+ print_error_page(503, "Путь к репозиториям не существует")
+ else
+ prj_info = prj.get_project(params["id"])
+ git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
+ @git_data = git_info
+ @prj = prj_info
+ @page_name = "Список всех сборок для проекта #{prj_info[:projname]} и репозитория #{git_info[:reponame]}"
+ builds_lst = db.get_builds_for_project_git(params["id"], params["git_id"])
+ if params["p"].nil?
+ @page = 1
+ else
+ @page = params["p"].to_i
+ if @page < 1
+ @page = 1
+ else
+ @page = @page + 1
+ end
+ end
+ if builds_lst.nil?
+ builds_lst = []
+ end
+ items_per_page = cfg.get_items_per_page
+ @builds_list = builds_lst[(@page - 1) * items_per_page, items_per_page]
+ @max_pages = builds_lst.length / items_per_page
+ if (@max_pages * items_per_page) != builds_lst.length
+ @max_pages = @max_pages + 1
+ end
+ erb :prjbuildslistgit
+ end
+ end
+end
+
not_found do
status 404
@page_name = "Кто-то потерялся"
diff --git a/classes/db.rb b/classes/db.rb
index bd2f1fc..10dda12 100644
--- a/classes/db.rb
+++ b/classes/db.rb
@@ -326,4 +326,21 @@ class DBase
def get_rpms()
Rpms.order(:id).all
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
+ 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
+ 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
end
diff --git a/classes/mock.rb b/classes/mock.rb
index 2dfa801..f1ece0a 100644
--- a/classes/mock.rb
+++ b/classes/mock.rb
@@ -211,8 +211,8 @@ class MockManager
FileUtils.cp_r(item[:src], item[:dst], verbose: true, remove_destination: true)
@db.save_rpm(@build_id, item[:dst], item[:name], @git_id)
@log.info("Копируется пакет #{item[:src]} в репозиторий #{item[:dst]}")
+ repo.create_repo
end
- repo.create_repo
end
end
end
diff --git a/classes/projects.rb b/classes/projects.rb
index 121a89f..2c2ea56 100644
--- a/classes/projects.rb
+++ b/classes/projects.rb
@@ -65,6 +65,11 @@ class ProjectsActions
fname
end
+ def get_project_repo(id)
+ proj_path = get_project_path(id)
+ File.join(proj_path, PROJECTS_STRUCTURE[:REPO])
+ end
+
def get_project_path_git(id, gitname)
proj_path = get_project_path(id)
File.join(proj_path, PROJECTS_STRUCTURE[:SRC], gitname)
@@ -314,4 +319,25 @@ class ProjectsActions
end
bld_id
end
+
+ def delete_git_from_project(prj_id, git_id)
+ @error = nil
+ builds_lst = db.get_builds_for_project_git(prj_id, git_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
+ 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)
+ @db.delete_git_from_project(prj_id, git_id)
+ end
+ @error
+ end
end
diff --git a/views/buildinfo.erb b/views/buildinfo.erb
index 29379a8..4f52846 100644
--- a/views/buildinfo.erb
+++ b/views/buildinfo.erb
@@ -24,7 +24,7 @@
-
Содержимое отчета <%= @file_disp %>
+
Содержимое отчета <%= @file_disp %>