Compare commits
18 Commits
482a586b6e
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8f1e8d4a0b | ||
|
|
0828293f36 | ||
|
|
6139670677 | ||
|
|
cbe4505d1e | ||
|
|
97b6db5b31 | ||
|
|
46b2bc0d8e | ||
|
|
77ee51c606 | ||
|
|
e0aedae6e0 | ||
|
|
4d0b237127 | ||
|
|
d098ffd3d0 | ||
|
|
4eb58fc8ad | ||
|
|
40f8a546f5 | ||
|
|
5dd481a81c | ||
|
|
8b4410eee7 | ||
|
|
bacea404e2 | ||
|
|
5e59ea319f | ||
|
|
5f784270e2 | ||
|
|
97ee27fe79 |
@@ -8,7 +8,6 @@
|
||||
|
||||
ПО может быть установлено на следующих ОС:
|
||||
|
||||
* MSVSphere 9
|
||||
* Almalinux 9
|
||||
* RockyLinux 9
|
||||
* Centos 9 Stream
|
||||
|
||||
10
VERSION
10
VERSION
@@ -1,3 +1,13 @@
|
||||
0.4-3
|
||||
* Исправлена ошибка при обнаружении некорректного Changelog
|
||||
|
||||
0.4-2
|
||||
* Добавлена возможность создания снимков неподписанного репозитория
|
||||
* Добавлена возможность управлять снимками репозитория
|
||||
* Добавлена возможность очистки старых пакетов репозитория
|
||||
* Добавленана возможность очищать закешированные билдруты
|
||||
* Окружение сборке по умолчанию переключено на AlmaLinux
|
||||
|
||||
0.3-1
|
||||
* Добавлена возможность добавлять сборки в состоянии ожидания
|
||||
* Изменена сортировка пакетов в repoview
|
||||
|
||||
653
app.rb
653
app.rb
@@ -419,6 +419,177 @@ 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"].nil? && 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
|
||||
prj.recreate_repo(@proj_id)
|
||||
@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?
|
||||
@@ -613,7 +784,6 @@ post "/prjcfg/:id" do
|
||||
if prj_info.nil?
|
||||
print_error_page(503, "Путь к проектам не существует")
|
||||
else
|
||||
pp params
|
||||
unless params["cancel"].nil?
|
||||
redirect "/prjedit/#{params["id"]}"
|
||||
else
|
||||
@@ -980,7 +1150,7 @@ 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))
|
||||
if !File.binary?(params["file"]) && params["file"].start_with?(File.join(Dir.pwd(), cfg.get_projects_path))
|
||||
f_name = File.basename(params["file"])
|
||||
send_file(params["file"], :filename => f_name, :type => "application/octet-stream", :disposition => 'attachment')
|
||||
else
|
||||
@@ -1061,10 +1231,15 @@ get "/prjrpm/:id" do
|
||||
@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 << "---------------"
|
||||
begin
|
||||
rpm_info.changelog.first(10).each do |entry|
|
||||
@file_content << "#{entry.time} #{entry.name}"
|
||||
@file_content << "#{entry.text}"
|
||||
@file_content << "---------------"
|
||||
end
|
||||
rescue
|
||||
# Если есть ошибка с undefined local variable or method, пропускаем changelog
|
||||
@file_content << "Changelog недоступен"
|
||||
end
|
||||
@file_content << "---------------"
|
||||
@file_content << "Файлы:"
|
||||
@@ -1320,7 +1495,7 @@ get "/prjremoteaddr/:id" do
|
||||
if prj_info.nil?
|
||||
print_error_page(503, "Путь к проектам не существует")
|
||||
else
|
||||
@page_name = "Подписать проект #{prj_info[:projname]}"
|
||||
@page_name = "Установить адрес для репозитория проекта #{prj_info[:projname]}"
|
||||
@proj_name = prj_info[:projname]
|
||||
@proj_id = params["id"]
|
||||
@addres = prj_info[:remote_address]
|
||||
@@ -1357,6 +1532,53 @@ post "/prjremoteaddr/:id" do
|
||||
end
|
||||
end
|
||||
|
||||
get "/prjaddrpm/: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 = "Добавить rpm пакет в репозиторий #{prj_info[:projname]}"
|
||||
@proj_name = prj_info[:projname]
|
||||
@proj_id = params["id"]
|
||||
@proj_dir_list = prj.get_repo_dirs_list(params["id"])
|
||||
erb :projaddrpm
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
post "/prjaddrpm/: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["add"] == "add"
|
||||
direct = if params["newdir"].strip == ""
|
||||
params["directory"]
|
||||
else
|
||||
params["newdir"]
|
||||
end
|
||||
puts params
|
||||
err = prj.add_rpm(params["id"], direct, params["rpm_file"])
|
||||
unless err.nil?
|
||||
session[:prj_modal_info] = "Ошибка установки адреса проекта"
|
||||
session[:prj_modal_text] = err
|
||||
else
|
||||
prj.recreate_repo(params["id"])
|
||||
end
|
||||
end
|
||||
redirect "/prjedit/#{params["id"]}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
get "/prjsignview/:id" do
|
||||
prj = ProjectsActions.new(cfg.get_projects_path, db)
|
||||
if prj.path.nil?
|
||||
@@ -1379,7 +1601,6 @@ end
|
||||
|
||||
get "/prjsignview/:id/*" do
|
||||
data_path = params[:splat]
|
||||
pp data_path
|
||||
if data_path.nil? || data_path.first.strip == ""
|
||||
data_path = "index.html"
|
||||
end
|
||||
@@ -1408,6 +1629,422 @@ 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)
|
||||
@rpms_list = []
|
||||
if File.exist?(f_path)
|
||||
@snap_list = prj.get_snap_list(prj_info[:id])
|
||||
unless params["snap"].nil?
|
||||
snap_shot = prj.get_project_snap(@proj_id, params["snap"])
|
||||
if File.exist?(snap_shot)
|
||||
@rpms_list = get_rpms_list(snap_shot)
|
||||
end
|
||||
end
|
||||
@rpms_list = [ "Снимок не выбран" ] if @rpms_list.length == 0
|
||||
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 "/prjsnap_restore/: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 :prjsnap_restore
|
||||
else
|
||||
print_error_page(503, "Снимок не существует")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
post "/prjsnap_restore/: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["restore"] == "restore" && !params["yes"].nil?
|
||||
prj.restore_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 "/prjuplrpm/: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 = []
|
||||
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:"
|
||||
begin
|
||||
rpm_info.changelog.first(10).each do |entry|
|
||||
@file_content << "#{entry.time} #{entry.name}"
|
||||
@file_content << "#{entry.text}"
|
||||
@file_content << "---------------"
|
||||
end
|
||||
rescue
|
||||
# Если есть ошибка с undefined local variable or method, пропускаем changelog
|
||||
@file_content << "Changelog недоступен"
|
||||
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
|
||||
end
|
||||
|
||||
@files_list = prj.get_project_uploaded_rpms(params["id"]).map do |item|
|
||||
{ :file => item[:rpm_path].delete_prefix(proj_path + "/"), :isdir => false, :create_time => item[:create_at] }
|
||||
end
|
||||
|
||||
@page_name = "Список загруженных rpm пакетов для проекта #{prj_info[:projname]}"
|
||||
@proj_info = prj_info
|
||||
@file_name = filepath
|
||||
erb :rpmuploadinfo
|
||||
else
|
||||
print_error_page(503, "Файл не существует")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
get "/prjcstmbld/: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 = "#{prj_info[:projname]} задать скрипт сборки git проекта #{git_info[:reponame]}"
|
||||
@proj_name = prj_info[:projname]
|
||||
@proj_descr = prj_info[:descr]
|
||||
@git_name = git_info[:reponame]
|
||||
@proj_id = prj_info[:id]
|
||||
@git_id = git_info[:id]
|
||||
cust_bld = prj.get_project_custom_build(prj_info[:id], git_info[:id])
|
||||
if session[:errora_data].nil?
|
||||
@old_filepath = cust_bld[:script_name]
|
||||
else
|
||||
@old_filepath = session[:old_filepath]
|
||||
end
|
||||
if session[:old_content].nil?
|
||||
@old_content = cust_bld[:content]
|
||||
else
|
||||
@old_content = session[:old_content]
|
||||
end
|
||||
if session[:old_descr].nil?
|
||||
@old_descr = cust_bld[:description]
|
||||
else
|
||||
@old_descr = session[:old_descr]
|
||||
end
|
||||
@error_data = session[:errora_data]
|
||||
session[:errora_data] = nil
|
||||
session[:old_filepath] = nil
|
||||
session[:old_descr] = nil
|
||||
session[:old_content] = nil
|
||||
erb :prjcustombld
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
post "/prjcstmbld/:id/:git_id" do
|
||||
unless params["cancel"].nil?
|
||||
session[:old_filepath] = nil
|
||||
session[:old_descr] = nil
|
||||
session[:old_content] = nil
|
||||
redirect "/prjedit/#{params["id"]}"
|
||||
else
|
||||
session[:old_filepath] = params["filepath"]
|
||||
session[:old_descr] = params["description"]
|
||||
session[:old_content] = params["codedata"]
|
||||
if params["filepath"].nil? || params["description"].nil? || params["filepath"].strip == "" || params["description"].strip == ""
|
||||
session[:errora_data] = "Имя рецепта и описание не должны быть пустыми"
|
||||
redirect "/prjcstmbld/#{params["id"]}/#{params["git_id"]}"
|
||||
else
|
||||
if params["filepath"] =~ /^[0-9a-zA-Z_\.]+$/
|
||||
# Valid filepath
|
||||
# Proceed with further processing
|
||||
codedata = params["codedata"].gsub(/\r$/, "")
|
||||
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
|
||||
unless params["save"].nil?
|
||||
prj.set_project_custom_build(params["id"], params["git_id"], params["filepath"], params["description"], codedata)
|
||||
redirect "/prjedit/#{params["id"]}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
# Invalid filepath
|
||||
session[:errora_data] = "Недопустимые символы в имени файла"
|
||||
redirect "/prjcstmbld/#{params["id"]}/#{params["git_id"]}"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
post "/prjcstmblddel/: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)
|
||||
input_name = params["rcpnamedup"]
|
||||
info = prj.get_project_custom_build(prj_info[:id], git_info[:id])
|
||||
if info.nil?
|
||||
print_error_page(404, "Скрипта не существует")
|
||||
else
|
||||
puts input_name
|
||||
puts info
|
||||
if info[:script_name] == input_name
|
||||
prj.del_project_custom_build(params["id"], params["git_id"])
|
||||
end
|
||||
redirect "/prjedit/#{params["id"]}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
get "/sanitize" do
|
||||
#Подчистим гит проекты, которые есть в базе, но нет в файловой системе
|
||||
all_gits = db.get_gits
|
||||
|
||||
@@ -120,4 +120,12 @@ class IniConfig
|
||||
"repoview"
|
||||
end
|
||||
end
|
||||
|
||||
def get_time_zone
|
||||
unless @config["timezone"]["zone"].nil?
|
||||
@config["timezone"]["zone"].to_s
|
||||
else
|
||||
"Europe/Moscow"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
require "sequel"
|
||||
|
||||
cfg_internal = IniConfig.new()
|
||||
|
||||
# Настройте Sequel для использования нужного часового пояса
|
||||
Sequel.extension :named_timezones
|
||||
Sequel.database_timezone = :utc
|
||||
Sequel.application_timezone = cfg_internal.get_time_zone
|
||||
|
||||
$DDB = Sequel.connect(cfg_internal.get_db)
|
||||
|
||||
class Repos < Sequel::Model(:repos)
|
||||
@@ -33,6 +39,12 @@ end
|
||||
class BuildRpms < Sequel::Model(:build_rpm)
|
||||
end
|
||||
|
||||
class RpmUploaded < Sequel::Model(:rpm_uploaded)
|
||||
end
|
||||
|
||||
class CustomBuildScript < Sequel::Model(:custom_build_script)
|
||||
end
|
||||
|
||||
class DBase
|
||||
attr :error, :last_id, :cfg
|
||||
|
||||
@@ -70,6 +82,7 @@ class DBase
|
||||
rep_id = Repos.where(reponame: repo_name).first
|
||||
unless rep_id[:id].nil?
|
||||
id = rep_id[:id]
|
||||
CustomBuildScript.where(repo_id: id).delete
|
||||
RepocRecips.where(repo_id: id).delete
|
||||
ReposProjects.where(repo_id: id).delete
|
||||
Repos.where(reponame: repo_name).delete
|
||||
@@ -354,15 +367,29 @@ class DBase
|
||||
end
|
||||
|
||||
def delete_project(prj_id)
|
||||
result = ProjectsProjects.where(proj_id_repository: prj_id.to_i)
|
||||
count = 0
|
||||
result.each do |item|
|
||||
count = count + 1
|
||||
end
|
||||
return 1 if count > 0
|
||||
CustomBuildScript.where(proj_id: proj_id.to_i).delete
|
||||
RpmUploaded.where(proj_id: prj_id.to_i).delete
|
||||
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)
|
||||
builds.each do |item|
|
||||
rpms = BuildRpms.where(build_id: item[:id])
|
||||
Rpms.where(id: rpms[:rpm_id]).delete
|
||||
rpms.each do |rpm|
|
||||
rpm_id_t = rpm[:rpm_id]
|
||||
BuildRpms.where(build_id: item[:id], rpm_id: rpm_id_t).delete
|
||||
Rpms.where(id: rpm_id_t).delete
|
||||
end
|
||||
end
|
||||
BuildTask.where(proj_id: prj_id.to_i).delete
|
||||
ProjectsProjects.where(proj_id: prj_id.to_i).delete
|
||||
Projects.where(id: prj_id.to_i).delete
|
||||
0
|
||||
end
|
||||
|
||||
def projects_with_current_as_link(prj_id)
|
||||
@@ -400,4 +427,31 @@ class DBase
|
||||
def update_build_task_end_time(build_id)
|
||||
BuildTask.where(id: build_id.to_i).update(buildstop: DateTime.now)
|
||||
end
|
||||
|
||||
def add_custom_rpm_to_proj(proj_id, rpm_name, rpm_path)
|
||||
id = RpmUploaded.insert(rpm: rpm_name, rpm_path: rpm_path, proj_id: proj_id.to_i)
|
||||
@last_id = id
|
||||
end
|
||||
|
||||
def get_project_uploaded_rpms(proj_id)
|
||||
RpmUploaded.where(proj_id: proj_id.to_i)
|
||||
end
|
||||
|
||||
def get_project_custom_build(proj_id, git_id)
|
||||
CustomBuildScript.where(proj_id: proj_id.to_i, repo_id: git_id.to_i)
|
||||
end
|
||||
|
||||
def set_project_custom_build(id, repo_id, script_name, descr, content)
|
||||
result = get_project_custom_build(id, repo_id).first
|
||||
unless result.nil?
|
||||
CustomBuildScript.where(id: result[:id]).update(:content => content, :filepath => script_name, :descr => descr)
|
||||
else
|
||||
id = CustomBuildScript.insert(:content => content, :filepath => script_name, :descr => descr, :proj_id => id.to_i, :repo_id => repo_id.to_i)
|
||||
@last_id = id
|
||||
end
|
||||
end
|
||||
|
||||
def del_project_custom_build(id, repo_id)
|
||||
CustomBuildScript.where(proj_id: id.to_i, repo_id: repo_id.to_i).delete
|
||||
end
|
||||
end
|
||||
|
||||
@@ -72,6 +72,24 @@ class GitRepo
|
||||
repos_data
|
||||
end
|
||||
|
||||
def git_walker(repo, tree, dir_name, result)
|
||||
tree.each_tree do |entry|
|
||||
new_tree = repo.lookup(entry[:oid])
|
||||
result = git_walker(repo, new_tree, "#{dir_name}/#{entry[:name]}", result)
|
||||
end
|
||||
tree.each_blob { |entry| result << "#{dir_name}/#{entry[:name]}" }
|
||||
result
|
||||
end
|
||||
|
||||
|
||||
def get_git_tree(repo, ref, result)
|
||||
|
||||
tree = ref.target.tree
|
||||
|
||||
result = git_walker(repo, tree, "", result)
|
||||
|
||||
end
|
||||
|
||||
def repo_info(reponame, branch = nil)
|
||||
info = {}
|
||||
result = ""
|
||||
@@ -97,6 +115,7 @@ class GitRepo
|
||||
info[:commits] = []
|
||||
info[:branches] = []
|
||||
info[:tags] = []
|
||||
info[:files] = []
|
||||
else
|
||||
ref = repo.head
|
||||
unless branch.nil?
|
||||
@@ -104,6 +123,7 @@ class GitRepo
|
||||
ref = repo.references[ref_name]
|
||||
end
|
||||
commits = []
|
||||
files = []
|
||||
unless ref.nil?
|
||||
walker = Rugged::Walker.new(repo)
|
||||
walker.sorting(Rugged::SORT_DATE)
|
||||
@@ -111,10 +131,15 @@ class GitRepo
|
||||
commits = walker.map do |commit|
|
||||
{ :message => commit.message, :author => commit.author, :time => commit.time, :sha => commit.oid }
|
||||
end.first(10)
|
||||
unless ref.target.nil? && ref.target.tree.nil?
|
||||
files = get_git_tree(repo, ref, files)
|
||||
end
|
||||
end
|
||||
|
||||
info[:commits] = commits
|
||||
info[:branches] = repo.branches.each_name(:local).sort
|
||||
info[:tags] = repo.tags.map { |tag| tag.name }
|
||||
info[:files] = files
|
||||
end
|
||||
else
|
||||
@error = result
|
||||
|
||||
@@ -117,12 +117,20 @@ class MockManager
|
||||
bld_id = @build_id.to_i
|
||||
bld_str = "%010d" % bld_id
|
||||
dt_str = dt.strftime("%Y%m%d_#{bld_str}")
|
||||
cmd_args = %Q(/usr/bin/rpm -q --specfile #{spec_file} --queryformat "%{RELEASE}")
|
||||
cmd_args = %Q(/usr/bin/rpm -q --specfile #{spec_file} --queryformat "%{RELEASE}\n" 2>/dev/null)
|
||||
@log.debug(cmd_args)
|
||||
cmd = Runner.new(cmd_args, @log)
|
||||
cmd.run
|
||||
if cmd.exit_status == 0
|
||||
res = "#{cmd.stdout}.#{dt_str}"
|
||||
versions = "#{cmd.stdout}".split("\n")
|
||||
if versions.length()>0
|
||||
res = versions[0].strip
|
||||
res = "#{res}.#{dt_str}"
|
||||
else
|
||||
res = cmd.stdout.strip
|
||||
res = "#{res}.#{dt_str}"
|
||||
end
|
||||
line_array = []
|
||||
File.readlines(spec_file).each do |line|
|
||||
if line =~ /^[\t ]*[Rr]elease:/
|
||||
|
||||
@@ -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)
|
||||
@@ -367,7 +373,9 @@ class ProjectsActions
|
||||
if linked.nil? || linked.length == 0
|
||||
proj_path = get_project_path(prj_id)
|
||||
FileUtils.rm_rf(proj_path, secure: true)
|
||||
@db.delete_project(prj_id)
|
||||
if @db.delete_project(prj_id) != 0
|
||||
@error = "На текущий проект ссылаются другие проекты. Удаление запрещено"
|
||||
end
|
||||
else
|
||||
@error = "На текущий проект ссылаются другие проекты. Удаление запрещено"
|
||||
end
|
||||
@@ -405,6 +413,12 @@ class ProjectsActions
|
||||
end
|
||||
end
|
||||
rpm_signed_list = get_rpms_list(sign_repo_path)
|
||||
if rpm_signed_list.length > rpm_list.length
|
||||
rpms_for_delete = get_rpms_list_full(sign_repo_path)
|
||||
rpms_for_delete.each do |item|
|
||||
File.unlink(item)
|
||||
end
|
||||
end
|
||||
rpm_list = rpm_list.select do |item|
|
||||
sign_repo_path_rpm = File.join(sign_repo_path, item)
|
||||
unless File.exist?(sign_repo_path_rpm)
|
||||
@@ -461,4 +475,134 @@ class ProjectsActions
|
||||
path = get_project_path(id)
|
||||
File.join(path, PROJECTS_STRUCTURE[:SIGNED])
|
||||
end
|
||||
|
||||
def recreate_repo(id)
|
||||
proj_path = get_project_path(id)
|
||||
repo_path = File.join(proj_path, PROJECTS_STRUCTURE[:REPO])
|
||||
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)
|
||||
proj_path = get_project_path(id)
|
||||
snap_path = get_project_snap(id, snap)
|
||||
snap_path_base = File.join(proj_path, PROJECTS_STRUCTURE[:SNAP])
|
||||
unless snap_path == snap_path_base || "#{snap_path}/" == snap_path_base || snap_path == "#{snap_path_base}/"
|
||||
if File.exist?(snap_path)
|
||||
FileUtils.rm_rf(snap_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def restore_snapshot(id, snap)
|
||||
repo_path = get_project_repo(id)
|
||||
snap_path = get_project_snap(id, snap)
|
||||
|
||||
if Dir.exist?(repo_path) && Dir.exist?(snap_path)
|
||||
Dir.glob(File.join(repo_path, '*')).each { |file| File.unlink(file) if File.file?(file) || FileUtils.rm_rf(file) }
|
||||
FileUtils.cp_r(Dir.glob(File.join(snap_path, '*')), repo_path)
|
||||
end
|
||||
end
|
||||
|
||||
def get_repo_dirs_list(id)
|
||||
repo_path = get_project_repo(id)
|
||||
dir_list = []
|
||||
if Dir.exist?(repo_path)
|
||||
dir_list = Dir.entries(repo_path).reject { |entry| entry == '.' || entry == '..' || entry == 'repodata' }
|
||||
end
|
||||
dir_list
|
||||
end
|
||||
|
||||
def add_rpm(id, directory, rpm_file)
|
||||
repo_path = get_project_repo(id)
|
||||
if !Dir.exist?(repo_path)
|
||||
return "Репозиторий отсутствует"
|
||||
end
|
||||
|
||||
target_dir = File.join(repo_path, directory)
|
||||
unless Dir.exist?(target_dir)
|
||||
Dir.mkdir(target_dir)
|
||||
end
|
||||
|
||||
target_file = File.join(target_dir, File.basename(rpm_file[:filename]))
|
||||
if File.exist?(target_file)
|
||||
return "Файл #{File.basename(rpm_file[:filename])} уже существует"
|
||||
end
|
||||
|
||||
begin
|
||||
File.open(target_file, "wb") do |file|
|
||||
file.write(rpm_file[:tempfile].read)
|
||||
end
|
||||
rescue => e
|
||||
return "Ошибка при создании файла: #{e.message}"
|
||||
end
|
||||
|
||||
@db.add_custom_rpm_to_proj(id, File.basename(rpm_file[:filename]), target_file)
|
||||
|
||||
nil
|
||||
end
|
||||
|
||||
def get_project_uploaded_rpms(id)
|
||||
list = []
|
||||
rpm_list = @db.get_project_uploaded_rpms(id)
|
||||
rpm_list.each do |item|
|
||||
list << item if File.exist?(item[:rpm_path])
|
||||
end
|
||||
list
|
||||
end
|
||||
|
||||
def get_project_custom_build(id, repo_id)
|
||||
data = {:script_name => nil, :content => nil, :description => nil, :created => nil }
|
||||
result = @db.get_project_custom_build(id, repo_id).first
|
||||
unless result.nil?
|
||||
data[:script_name]=result[:filepath]
|
||||
data[:content]=result[:content]
|
||||
data[:description]=result[:descr]
|
||||
data[:created]=result[:create_at]
|
||||
end
|
||||
data
|
||||
end
|
||||
|
||||
def set_project_custom_build(id, repo_id, script_name, descr, content)
|
||||
@db.set_project_custom_build(id, repo_id, script_name, descr, content)
|
||||
end
|
||||
|
||||
def del_project_custom_build(id, repo_id)
|
||||
@db.del_project_custom_build(id, repo_id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -103,7 +103,11 @@ class RepoManager
|
||||
pkg_info[:stat] = File.stat(full_rpm_path).ctime
|
||||
pkg_info[:pname] = "noname"
|
||||
if info[:error].nil?
|
||||
pkg_info[:chlog] = info[:pkginfo].changelog.first(5)
|
||||
pkg_info[:chlog] = []
|
||||
begin
|
||||
pkg_info[:chlog] << info[:pkginfo].changelog.first
|
||||
rescue
|
||||
end
|
||||
pkg_info[:pname] = info[:pkginfo].name
|
||||
else
|
||||
pkg_info[:chlog] = []
|
||||
@@ -153,8 +157,6 @@ class RepoManager
|
||||
end
|
||||
end
|
||||
|
||||
pp repo_data
|
||||
|
||||
tpl_file = File.join(template_dir, "template.erb")
|
||||
template = File.read(tpl_file)
|
||||
renderer = ERB.new(template)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -27,3 +27,6 @@ path = "keys"
|
||||
|
||||
[repoview]
|
||||
path = "repoview"
|
||||
|
||||
[timezone]
|
||||
zone="Europe/Moscow"
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
require "sequel"
|
||||
|
||||
Sequel.migration do
|
||||
change do
|
||||
end
|
||||
end
|
||||
14
db/migrations/202604170000000_create_uploaded_rpm.rb
Normal file
14
db/migrations/202604170000000_create_uploaded_rpm.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
require "sequel"
|
||||
|
||||
Sequel.migration do
|
||||
change do
|
||||
create_table(:rpm_uploaded) do
|
||||
primary_key :id
|
||||
String :rpm, :null => false
|
||||
String :rpm_path, :null => false
|
||||
Datetime :create_at, default: Sequel.lit("CURRENT_TIMESTAMP")
|
||||
foreign_key :proj_id, :projects, :key => :id
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
17
db/migrations/202604180000000_create_custom_build.rb
Normal file
17
db/migrations/202604180000000_create_custom_build.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
require "sequel"
|
||||
|
||||
Sequel.migration do
|
||||
change do
|
||||
|
||||
create_table(:custom_build_script) do
|
||||
primary_key :id
|
||||
String :content, text: true
|
||||
String :filepath, text: true
|
||||
String :descr, text: true
|
||||
Datetime :create_at, default: Sequel.lit("CURRENT_TIMESTAMP")
|
||||
foreign_key :proj_id, :projects, :key => :id
|
||||
foreign_key :repo_id, :repos, :key => :id
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -9,3 +9,11 @@
|
||||
* Одновременно может запускаться только одна сборка.
|
||||
* Сборка потребляет все доступные ядра процессора
|
||||
* На текущий момент система является alpha сборкой, поэтому подавление ошибок не включено, для детального отслеживания ошибок
|
||||
|
||||
## Особые указания
|
||||
|
||||
Внизу страницы веб интерфейса есть нижняя панель управления. Там имеется два сервисных пункта меню:
|
||||
|
||||
`Сбросить buildroots` - со временем, при большом количестве сборок, кэш mock-билдера может разрастаться, для освобождения кэшей рекомендуется периодически запускать сброс с помощью данного пункта меню.
|
||||
|
||||
`Подчистка` - проводится инвентаризация гит-проектов и если в базе данных нет записи, то она добавляется. Этот пункт дает возможность подложить гит-проекты и одним нажатием добавить их в веб-интерфейс.
|
||||
BIN
docs/mock-gui/docs/img/mockgui_creategit5_1.png
Normal file
BIN
docs/mock-gui/docs/img/mockgui_creategit5_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/mock-gui/docs/img/mockgui_projects20_1.png
Normal file
BIN
docs/mock-gui/docs/img/mockgui_projects20_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/mock-gui/docs/img/mockgui_projects20_2.png
Normal file
BIN
docs/mock-gui/docs/img/mockgui_projects20_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/mock-gui/docs/img/mockgui_projects20_3.png
Normal file
BIN
docs/mock-gui/docs/img/mockgui_projects20_3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 74 KiB |
@@ -25,6 +25,7 @@
|
||||
* Списка тегов
|
||||
* Строки для клонирования репозитория
|
||||
* Описание репозитория
|
||||
* Списка файлов указанной ветки репозитория
|
||||
|
||||
Список тегов и коммитов даст информацию о том, что исходные коды в ветке master находятся в нужно состоянии ис нужными коммитами.
|
||||
Сборочница производит выборку исходных кодов из master ветки git репозитория.
|
||||
@@ -37,6 +38,10 @@
|
||||
|
||||
Для успешного клонирования и наполнения git репозитория, необходимо либо установить публичный ключ для доступа пользователя по ssh или знать пароль к mockgui пользователю по ssh. Вот почему в [инсталляционном руководстве](../install.md) рекомендуется установить пароль для mockgui пользователя.
|
||||
|
||||
Вкладка отображения списка файлов репозитория и указанной ветки или HEAD:
|
||||
|
||||

|
||||
|
||||
## Удаление git репозитория
|
||||
|
||||
Удаление возможно только в том случае, если данный git репозиторий не имеет ни рецептов сборки, а так же не подключен ни к одному проекту и соответственно, не имеет сборок, указывающих на данный git репозиторий.
|
||||
|
||||
@@ -56,6 +56,34 @@
|
||||
|
||||
Отображается структура репозитория, где можно перемещаться по папкам и нажимать на rpm пакеты, получая о них информацию.
|
||||
|
||||
`Управление снимками репозитория` - это ссылка настраницу, где можно создать снимок `неопубликоанного` репозитория, восстановить пакеты из сохраненного писка или удалить ранее созданные снимки или посмотреть содержимое снимков.
|
||||
|
||||
Данная опция полезна при деструктивных изменениях в проекте, например собирается пакет с сомнительным функционалом и лучше перед сборкой создать снимок, чтоб можно было потом откатить изменения обратно.
|
||||
|
||||
Пример создания и управления снимками.
|
||||
|
||||
Так выглядит страница управления снимками:
|
||||
|
||||

|
||||
|
||||
Слева список снимков, справа - содержимое выбранного снимка.
|
||||
|
||||
Пример отображения содержимого:
|
||||
|
||||

|
||||
|
||||
Напротив каждого снимка есть занчок "Корзина" и "Стрелочка". Нажимая на корзинку - можно удалить снимок, а на жимая на стрелочку - восстановить пакеты из снимка. При восстановлении, пакеты из неподписанного репозитория удаляются и заменяются пакетами из снимка. Далее их можно переподписать и они переместятся в репозиторий с подписанными пакетами.
|
||||
|
||||
Для создания снимка необхоимо нажать на знак "+".
|
||||
|
||||
Важно отметить, что для создания, удаления или восстановления снимка открывается дополнительный экран:
|
||||
|
||||

|
||||
|
||||
Для подтвержения действия недостаточно только нажать на кнопку "Создать", "Удалить", "Восстановить". Важно еще сделать активным флажок.
|
||||
|
||||
Этот флажок подтверждает действие окончательно. Если его не установить, то ничего не произойдет и операция не будет выполнена.
|
||||
|
||||
`Список сборок проектов` - отображается список сборок, принадлежащих проекту.
|
||||
|
||||
В данном списке можно получить информацию о каждой сборке. Детальнее о [сборках](builds.md)
|
||||
@@ -101,6 +129,12 @@ gpgcheck=1" > /etc/yum.repos.d/project_test1.repo
|
||||
|
||||
т.е устанавливается корректный url будущего удаленного репозитория.
|
||||
|
||||
`Удалить старые версии пакетов` - позволяет подчистить накопившиеся старые версии пакетов, остаются только заданное число самых свежив версий.
|
||||
При нажатии, так же нужно подтвердить намерение удаления и указать, число версий пакета, которые должны быть оставлены. Но нужно быть аккуратным, например некоторые пакеты требуют наличие более старых версий при сборке.
|
||||
Именно для этого, перед удалением выдается сисок всех пакетов, которые планируются к удалению. И в данном списке можно отменить удаление отдельных пакетов.
|
||||
|
||||
|
||||
|
||||
`Удалить проект` - удаляется весь проект, подписанные и неподписанные репозитории, сборки.
|
||||
|
||||
Но если проект залинкован в другом проекте, то удаление будет невозможным, пока не будет снят линк.
|
||||
|
||||
47
install/docker_install.yml
Normal file
47
install/docker_install.yml
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
- name: Install Docker on AlmaLinux
|
||||
hosts: localhost
|
||||
connection: local
|
||||
become: True
|
||||
become_user: root
|
||||
become_method: su
|
||||
tasks:
|
||||
- name: Remove old Docker packages
|
||||
dnf:
|
||||
name:
|
||||
- docker
|
||||
- docker-client
|
||||
- docker-client-latest
|
||||
- docker-common
|
||||
- docker-latest
|
||||
- docker-latest-logrotate
|
||||
- docker-logrotate
|
||||
- docker-engine
|
||||
- podman
|
||||
- runc
|
||||
state: absent
|
||||
|
||||
- name: Add Docker repository
|
||||
command: sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
||||
|
||||
- name: Install Docker components
|
||||
dnf:
|
||||
name:
|
||||
- docker-ce
|
||||
- docker-ce-cli
|
||||
- containerd.io
|
||||
- docker-buildx-plugin
|
||||
- docker-compose-plugin
|
||||
state: present
|
||||
|
||||
- name: Start and enable Docker service
|
||||
systemd:
|
||||
name: docker
|
||||
state: started
|
||||
enabled: yes
|
||||
|
||||
- name: Add user mockgui to the docker group
|
||||
user:
|
||||
name: mockgui
|
||||
groups: docker
|
||||
append: yes
|
||||
@@ -6,6 +6,7 @@
|
||||
<li class="nav-item" role="presentation"><a class="nav-link" role="tab" data-bs-toggle="tab" href="#tab-2">Список коммитов</a></li>
|
||||
<li class="nav-item" role="presentation"><a class="nav-link" role="tab" data-bs-toggle="tab" href="#tab-3">Список тэгов</a></li>
|
||||
<li class="nav-item" role="presentation"><a class="nav-link" role="tab" data-bs-toggle="tab" href="#tab-4">Клонировать</a></li>
|
||||
<li class="nav-item" role="presentation"><a class="nav-link" role="tab" data-bs-toggle="tab" href="#tab-5">Список файлов</a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" role="tabpanel" id="tab-1">
|
||||
@@ -123,6 +124,34 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" role="tabpanel" id="tab-5">
|
||||
<div class="container">
|
||||
<div class="row align-items-start">
|
||||
<div class="col-10">
|
||||
<p style="font-weight: bold;"><%= @repo_data[:info][:reponame] %></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row align-items-start">
|
||||
<div class="col-4" style="background: #d3e2ff;border-radius: 15px;padding-top: 20px;padding-bottom: 20px;">
|
||||
<p>
|
||||
<% if @repo_data[:info][:descr].nil? || @repo_data[:info][:descr] == "" %>
|
||||
"Нет описания"
|
||||
<% else %>
|
||||
<%= @repo_data[:info][:descr] %>
|
||||
<% end %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p style="color: var(--bs-red);">Список файлов</p>
|
||||
<ul>
|
||||
<% @repo_data[:files].each do |tags| %>
|
||||
<li><%= tags %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
18
views/prjclean1.erb
Normal file
18
views/prjclean1.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<h2 class="text-center">Удаление сатрых версий пакетов проекта <%= @proj_name %></h2>
|
||||
<form action="/prjclean/<%= ERB::Util.url_encode(@proj_id) %>" method="post">
|
||||
<div class="form-check form-switch text-center pb-3">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="isclean" name="isclean">
|
||||
<label class="form-check-label" for="isclean">
|
||||
Вы уверены, что хотите удалить старые версии пакетов?<br />
|
||||
Все старые версии пакетов проекта будут удалены, действие не подлежит отмене.
|
||||
</label>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-danger" name="delete" value="delete">Удалить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
18
views/prjclean2.erb
Normal file
18
views/prjclean2.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<h2 class="text-center">Удаление сатрых версий пакетов проекта <%= @proj_name %></h2>
|
||||
<form action="/prjclean_step2/<%= ERB::Util.url_encode(@proj_id) %>" method="post">
|
||||
<div class="form-check form-switch text-center pb-3">
|
||||
<label for="inputvernum" class="form-label">Число версий</label>
|
||||
<input type="text" id="inputvernum" name="inputvernum" class="form-control" aria-describedby="vernumHelpBlock">
|
||||
<div id="vernumHelpBlock" class="form-text">
|
||||
Укажите число версий каждого пакета, которые должны остаться
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-danger" name="delete" value="delete">Удалить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
41
views/prjclean3.erb
Normal file
41
views/prjclean3.erb
Normal file
@@ -0,0 +1,41 @@
|
||||
<%= erb :header %>
|
||||
<script src="/js/jquery.dropdown.min.js"></script>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<h3 class="bg-secondary-subtle text-center border-bottom border-primary-subtle rounded-1 pb-1 mb-2">
|
||||
<a href="/prjedit/<%= ERB::Util.url_encode(@proj_id) %>"><%= @proj_name %></a>
|
||||
</h3>
|
||||
<div class="pb-2"><%= @proj_descr %></div>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<div class="vstack gap-3">
|
||||
<form action="/prjclean_step3/<%= ERB::Util.url_encode(@proj_id) %>" method="post">
|
||||
<div class="mb-3">
|
||||
<label for="prjrpmlst" class="form-label">Пакеты для удаления (могут быть удалены из списка)</label>
|
||||
<div class="prjrpmlist">
|
||||
<select class="form-control" id="prjrpmlst" name="prjrpmlst[]" multiple>
|
||||
<% @del_list.each do |item| %>
|
||||
<option value="<%= item %>" selected><%= File.basename(item) %></option>
|
||||
<% end %>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div style="padding-top: 45px;"></div>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-danger" name="delete" value="delete">Удалить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$('.prjrpmlist').dropdown({
|
||||
searchNoData: '<li style="color:#ddd">Нет данных</li>',
|
||||
});
|
||||
</script>
|
||||
<%= erb :footer %>
|
||||
22
views/prjclean3_post.erb
Normal file
22
views/prjclean3_post.erb
Normal file
@@ -0,0 +1,22 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<h3 class="bg-secondary-subtle text-center border-bottom border-primary-subtle rounded-1 pb-1 mb-2">
|
||||
<a href="/prjedit/<%= ERB::Util.url_encode(@proj_id) %>"><%= @proj_name %></a>
|
||||
</h3>
|
||||
<div class="pb-2"><%= @proj_descr %></div>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<div class="vstack gap-3">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item active" aria-current="true">Список удаленных пакетов (не забудьте пересоздать repoview)</li>
|
||||
<% @rpm_list.each do |item| %>
|
||||
<li class="list-group-item"><%= item %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
124
views/prjcustombld.erb
Normal file
124
views/prjcustombld.erb
Normal file
@@ -0,0 +1,124 @@
|
||||
<%= erb :header %>
|
||||
<script src="/js/edit_area_full.js"></script>
|
||||
<script language="javascript" type="text/javascript">
|
||||
editAreaLoader.init({
|
||||
id: "codedata",
|
||||
syntax: "bash",
|
||||
start_highlight: true,
|
||||
language: "ru",
|
||||
toolbar: "search, go_to_line, fullscreen, |, undo, redo, |, select_font,|, highlight, reset_highlight, word_wrap, |, syntax_selection"
|
||||
});
|
||||
</script>
|
||||
<% unless @error_data.nil? %>
|
||||
<div class="container">
|
||||
<div class="alert alert-danger alert-dismissible fade show" role="alert"><span><%= @error_data %></span><button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button></div>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<h3 class="bg-secondary-subtle text-center border-bottom border-primary-subtle rounded-1 pb-1 mb-2">
|
||||
<a href="/prjedit/<%= ERB::Util.url_encode(@proj_id) %>"><%= @proj_name %></a>
|
||||
</h3>
|
||||
<div class="pb-2"><%= @proj_descr %></div>
|
||||
<div class="pb-2">git репозиторий <%= @git_name %></div>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<form action="/prjcstmbld/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(@git_id) %>" method="post" id="sndFrm">
|
||||
<div class="mb-3">
|
||||
<label for="filepath" class="form-label">Имя скрипта сценария (англиские буквы, _, .), не должен совпадать с каким нибудь файлом из проекта</label>
|
||||
<input type="text" class="form-control" id="filepath" name="filepath" value="<%= @old_filepath %>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="description" class="form-label">Описание скрипта сборки</label>
|
||||
<textarea class="form-control" id="description" name="description" rows="3"><%= @old_descr %></textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="codedata" class="form-label">Код скрипта сборки. Будьте внимательны, данный скрипт выолняется на сборочной машине,
|
||||
все его изменения затронут хостовую систему, поэтому желательно как можно быстрее выполнение скрипта перенесите в Docker.
|
||||
Так же после выполенения скрипта удалите и остановите все запущенные контейнеры, т.к скрипт сам должен контролировать это.
|
||||
Так же убедитесь, что все log файлы сборки и собранные пакеты положены в каталоги:.
|
||||
Скрипт выполняется из корня git проекта.
|
||||
</label>
|
||||
<textarea class="form-control" id="codedata" name="codedata" rows="15"><%= @old_content %></textarea>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="save" value="1">Сохранить</button>
|
||||
<button type="submit" class="btn btn-secondary" name="cancel" value="3">Отмена</button>
|
||||
<% unless @old_filepath.nil? %>
|
||||
<button type="submit" class="btn btn-danger" id="delete" name="delete" value="2">Удалить</button>
|
||||
<% end %>
|
||||
<div id="winkeeper"></div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/js/jquery-confirm.min.js"></script>
|
||||
<script>
|
||||
$("#delete").confirm({
|
||||
title: 'Подтвердите удаление скрипта, после удаления сборка будет происходить стандартно, через mock!',
|
||||
content: '' +
|
||||
'<div class="container">' +
|
||||
'<form action="/prjcstmblddel/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(@git_id) %>" class="formName" method="post">' +
|
||||
'<div class="text-danger mx-auto p-2">' +
|
||||
'<label>Введите название удаляемого скрипта</label>' +
|
||||
'<input type="text" class="frmchk form-control" required name="rcpnamedup"/>' +
|
||||
'<input type="hidden" class="frmchk form-control" id="rcphid" name="rcphid" value="<%= @old_filepath %>"/>' +
|
||||
'</div>' +
|
||||
'</form>' +
|
||||
'</div>',
|
||||
container: '#winkeeper',
|
||||
theme: 'bootstrap',
|
||||
buttons: {
|
||||
formSubmit: {
|
||||
text: 'Удалить',
|
||||
titleClass: 'text-danger mx-auto p-2',
|
||||
btnClass: 'btn btn-danger',
|
||||
action: function () {
|
||||
var correct_name = this.$content.find("#rcphid").val();
|
||||
var name = this.$content.find('.frmchk').val();
|
||||
if(!name){
|
||||
$.alert({
|
||||
title: 'Предупреждение!',
|
||||
content: 'Название не может быть пустым',
|
||||
container: '#winkeeper',
|
||||
theme: 'bootstrap',
|
||||
buttons: {
|
||||
ok: {
|
||||
text: 'Хорошо',
|
||||
btnClass: 'btn btn-danger',
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
if (name != correct_name){
|
||||
$.alert({
|
||||
title: 'Предупреждение!',
|
||||
content: 'Название задано неверно',
|
||||
container: '#winkeeper',
|
||||
theme: 'bootstrap',
|
||||
buttons: {
|
||||
ok: {
|
||||
text: 'Хорошо',
|
||||
btnClass: 'btn btn-danger',
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
this.$content.find('form').submit();
|
||||
return true;
|
||||
}
|
||||
},
|
||||
cancel: {
|
||||
text: 'Отменить',
|
||||
btnClass: 'btn btn-primary',
|
||||
action: function () {
|
||||
//close
|
||||
}},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<%= erb :footer %>
|
||||
@@ -46,9 +46,15 @@
|
||||
конфигурацию сборки</span></a>
|
||||
<a href="/prjaddrepo/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-archive"></i><span class="ms-2">Добавить внутренний репозиторий из другого проекта</span></a>
|
||||
<a href="/prjaddrpm/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-bag-dash"></i><span class="ms-2">Добавить бинарный пакет в репозиторий</span></a>
|
||||
<a href="/prjuplrpm/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-folder-symlink"></i><span class="ms-2">Посмотреть список загруженных rpm пакетов</span></a>
|
||||
<a href="/prjrpm/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-box"></i><span class="ms-2">Список всех
|
||||
пакетов</span></a>
|
||||
<a href="/prjshot/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-camera-fill"></i><span class="ms-2">Управление снимками репозитория</span></a>
|
||||
<a href="/prjbuilds/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-list"></i><span class="ms-2">Список сборок проекта</span></a>
|
||||
<a href="/prjsign/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
@@ -57,6 +63,8 @@
|
||||
class="bi bi-file-earmark-diff"></i><span class="ms-2">Просмотр подписанного репозитория</span></a>
|
||||
<a href="/prjremoteaddr/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-pin-map-fill"></i><span class="ms-2">Установить адрес подписаннго репозитория</span></a>
|
||||
<a href="/prjclean/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-suitcase"></i><span class="ms-2">Удалить старые версии пакетов</span></a>
|
||||
<a href="/prjdelete/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
|
||||
class="bi bi-trash"></i><span class="ms-2">Удалить проект</span></a>
|
||||
</div>
|
||||
@@ -84,9 +92,9 @@
|
||||
<% @proj_repo.each do |item| %>
|
||||
<div class="row justify-content-between border-bottom border-light-subtle m-2">
|
||||
<% unless item[:is_repo_synced] %>
|
||||
<div class="col-8">
|
||||
<div class="col-5">
|
||||
<% else %>
|
||||
<div class="col-7">
|
||||
<div class="col-6">
|
||||
<% end %>
|
||||
<a href="/prjgitf/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(item[:id]) %>" class="p-2"><%= item[:reponame] %></a>
|
||||
</div>
|
||||
@@ -107,6 +115,9 @@
|
||||
<div class="col-1">
|
||||
<a href="/prjgitbld/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(item[:id]) %>" class="p-2"><i class="bi bi-bricks"></i></a>
|
||||
</div>
|
||||
<div class="col-1">
|
||||
<a href="/prjcstmbld/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(item[:id]) %>" class="p-2"><i class="bi bi-hammer"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
42
views/prjshot1.erb
Normal file
42
views/prjshot1.erb
Normal file
@@ -0,0 +1,42 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<h3 class="bg-secondary-subtle text-center border-bottom border-primary-subtle rounded-1 pb-1 mb-2">
|
||||
<%= @proj_name %>
|
||||
</h3>
|
||||
<div class="pb-2"><%= @proj_descr %></div>
|
||||
<div>
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<% @snap_list.each do |item| %>
|
||||
<tr>
|
||||
<td><a href="/prjshot/<%= ERB::Util.url_encode(@proj_id) %>?snap=<%= ERB::Util.url_encode(item) %>"><%= item %></a></td>
|
||||
<td><a href="/prjsnap_delete/<%= ERB::Util.url_encode(@proj_id) %>?snap=<%= ERB::Util.url_encode(item) %>" class="icon-link"><i
|
||||
class="bi bi-trash3"></i></a></td>
|
||||
<td><a href="/prjsnap_restore/<%= ERB::Util.url_encode(@proj_id) %>?snap=<%= ERB::Util.url_encode(item) %>" class="icon-link"><i
|
||||
class="bi bi-capslock"></i></a></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<div class="vstack gap-3">
|
||||
<div class="p-2">
|
||||
<a href="/prjsnap_add/<%= ERB::Util.url_encode(@proj_id) %>" class="icon-link"><i
|
||||
class="bi bi-plus-circle"></i><span class="ms-2">Создать снимок текущего репозитория</span></a>
|
||||
</div>
|
||||
<div class="p-2">
|
||||
<ul class="list-group">
|
||||
<% @rpms_list.each do |rpm| %>
|
||||
<li class="list-group-item"><%= rpm %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
17
views/prjshot_add.erb
Normal file
17
views/prjshot_add.erb
Normal file
@@ -0,0 +1,17 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<h2 class="text-center">Создание снимка репозитория проекта <%= @proj_name %></h2>
|
||||
<form action="/prjsnap_add/<%= ERB::Util.url_encode(@proj_id) %>" method="post">
|
||||
<div class="form-check form-switch text-center pb-3">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="yes" name="yes">
|
||||
<label class="form-check-label" for="yes">
|
||||
Вы уверены, что хотите создать копию текущего репозитория?
|
||||
</label>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-success" name="create" value="create">Создать</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
18
views/prjshot_delete.erb
Normal file
18
views/prjshot_delete.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<h2 class="text-center">Удаление снимка проекта <%= @proj_name %></h2>
|
||||
<form action="/prjsnap_delete/<%= ERB::Util.url_encode(@proj_id) %>?snap=<%= ERB::Util.url_encode(@snap_name) %>" method="post">
|
||||
<div class="form-check form-switch text-center pb-3">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="yes" name="yes">
|
||||
<label class="form-check-label" for="yes">
|
||||
Вы уверены, что хотите удалить снимок <%= @snap_name %>?<br />
|
||||
Все пакеты из снимка будут удалены, действие не подлежит отмене.
|
||||
</label>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-danger" name="delete" value="delete">Удалить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
18
views/prjsnap_restore.erb
Normal file
18
views/prjsnap_restore.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<h2 class="text-center">Восстановить пакеты репозитория <%= @proj_name %> из снимка</h2>
|
||||
<form action="/prjsnap_restore/<%= ERB::Util.url_encode(@proj_id) %>?snap=<%= ERB::Util.url_encode(@snap_name) %>" method="post">
|
||||
<div class="form-check form-switch text-center pb-3">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="yes" name="yes">
|
||||
<label class="form-check-label" for="yes">
|
||||
Вы уверены, что хотите восстановить пакеты из снимка <%= @snap_name %>?<br />
|
||||
Все пакеты в текущем репозитории будут перезаписаны, действие не подлежит отмене.
|
||||
</label>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-danger" name="restore" value="restore">Восстановить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
33
views/projaddrpm.erb
Normal file
33
views/projaddrpm.erb
Normal file
@@ -0,0 +1,33 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<h2 class="text-center">Установить адрес для репозитория проекта <%= @proj_name %></h2>
|
||||
<form action="/prjaddrpm/<%= ERB::Util.url_encode(@proj_id) %>" method="post" enctype='multipart/form-data'>
|
||||
<div class="text-center pb-3">
|
||||
<label class="form-label" for="newdir">
|
||||
Создать новый каталог с именем (может быть пустым, если уже существует нужный каталог):
|
||||
</label>
|
||||
<input class="form-control" type="text" id="newdir" name="newdir" value="">
|
||||
</div>
|
||||
<div class="text-center pb-3">
|
||||
<label class="form-label" for="directory">
|
||||
Выберите каталог куда будет помещен файл:
|
||||
</label>
|
||||
<select class="form-select" id="directory" name="directory">
|
||||
<% @proj_dir_list.each do |dir| %>
|
||||
<option value="<%= ERB::Util.html_escape(dir) %>"><%= ERB::Util.html_escape(dir) %></option>
|
||||
<% end %>
|
||||
</select>
|
||||
</div>
|
||||
<div class="text-center pb-3">
|
||||
<label class="form-label" for="rpm_file">
|
||||
Укажите rpm файл:
|
||||
</label>
|
||||
<input class="form-control" type="file" id="rpm_file" name="rpm_file" required>
|
||||
</div>
|
||||
<div class="mb-3 text-center">
|
||||
<button type="submit" class="btn btn-primary" name="cancel" value="cancel">Отменить</button>
|
||||
<button type="submit" class="btn btn-danger" name="add" value="add">Добавить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
28
views/rpmuploadinfo.erb
Normal file
28
views/rpmuploadinfo.erb
Normal file
@@ -0,0 +1,28 @@
|
||||
<%= erb :header %>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<h3 class="bg-secondary-subtle text-center border-bottom border-primary-subtle rounded-1 pb-1 mb-2">
|
||||
<a href="/prjedit/<%= ERB::Util.url_encode(@proj_info[:id]) %>"><%= @proj_info[:projname] %></a>
|
||||
</h3>
|
||||
<div class="list-group">
|
||||
<% @files_list.each do |item| %>
|
||||
<a href="/prjuplrpm/<%= ERB::Util.url_encode(@proj_info[:id]) %>?p=<%= ERB::Util.url_encode(item[:file]) %>" class="list-group-item list-group-item-action list-group-item-light"><%= item[:file] %>(<%= item[:create_time] %>)</a>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<div class="mb-2 p-2 bg-success-subtle rounded-2 text-sm-start"><%= @file_name %>
|
||||
<% unless @raw.nil? %>
|
||||
<a href="/buildinfofraw?file=<%= ERB::Util.url_encode(@raw) %>"><i class="bi bi-filetype-raw"></i></a>
|
||||
<% end %>
|
||||
</div>
|
||||
<% @file_content.each do |data| %>
|
||||
<div class="row">
|
||||
<div class="col-12"><%= data %></div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= erb :footer %>
|
||||
Reference in New Issue
Block a user