diff --git a/app.rb b/app.rb index f830668..ccc1766 100644 --- a/app.rb +++ b/app.rb @@ -16,6 +16,7 @@ require_relative "classes/db" require_relative "classes/systeminfo" require_relative "classes/utilities" require_relative "classes/projects" +require_relative "classes/configs" def print_error_page(error_status, error_meaasge) @page_name = "Ошибка выполнения" @@ -271,11 +272,11 @@ end get "/bldcfg" do @page_name = "Список конфигураций сборки" - hide_list = cfg.get_configs_hide - select_list = cfg.get_configs_selected - @list_global = Dir["/etc/mock/*.cfg"].map { |item| [File.dirname(item), File.basename(item, ".cfg"), item] }.reject { |item| check_partname_in_array(item[1], hide_list) } - @list_local = Dir["~/.config/mock/*.cfg"].map { |item| [File.dirname(item), File.basename(item, ".cfg"), item] } - @list_selected = (@list_global + @list_local).select { |item| check_partname_in_array(item[1], select_list) } + cfgs = ConfigsList.new(cfg) + result = cfgs.get_configs + @list_global = result[:global] + @list_local = result[:local] + @list_selected = result[:selected] erb :cfgslist end @@ -301,6 +302,20 @@ get "/projs" do end end +get "/prjcreate" do + @page_name = "Создать новый проект" + @old_name = session[:prj_old_name] + @old_description = session[:prj_old_description] + @old_list = session[:prj_old_list] + cfgs = ConfigsList.new(cfg) + result = cfgs.get_configs + @global_list = result[:global] + @local_list = result[:local] + @error_data = session[:prjcreate_error] + session[:prjcreate_error] = nil + erb :prjcrt +end + not_found do status 404 @page_name = "Кто-то потерялся" diff --git a/classes/configs.rb b/classes/configs.rb new file mode 100644 index 0000000..670fac4 --- /dev/null +++ b/classes/configs.rb @@ -0,0 +1,27 @@ +require_relative "utilities" + +class ConfigsList + attr :error, :cfg + + def initialize(cfg) + @cfg = cfg + end + + def get_configs + hide_list = @cfg.get_configs_hide + select_list = @cfg.get_configs_selected + list_global = Dir["/etc/mock/*.cfg"].map { |item| [File.dirname(item), File.basename(item, ".cfg"), item] }.reject { |item| check_partname_in_array(item[1], hide_list) } + if list_global.nil? + list_global = [] + end + list_local = Dir["~/.config/mock/*.cfg"].map { |item| [File.dirname(item), File.basename(item, ".cfg"), item] } + if list_local.nil? + list_local = [] + end + list_selected = (list_global + list_local).select { |item| check_partname_in_array(item[1], select_list) } + if list_selected.nil? + list_selected = [] + end + { :global => list_global, :local => list_local, :selected => list_selected } + end +end diff --git a/classes/db.rb b/classes/db.rb index abf2939..c1c463c 100644 --- a/classes/db.rb +++ b/classes/db.rb @@ -118,4 +118,16 @@ class DBase def proj_list Projects.order(:id).all end + + def proj_create(proj_name, proj_descr) + @error = nil + data = Projects.where(projname: project_name).first + if data.nil? + id = Projects.insert(projname: project_name, descr: description, public: 1) + @last_id = id + else + @error = "Данный проект уже существует" + end + @error + end end diff --git a/classes/gitinfo.rb b/classes/gitinfo.rb index 0faff98..a49bf07 100644 --- a/classes/gitinfo.rb +++ b/classes/gitinfo.rb @@ -1,4 +1,3 @@ -require "sqlite3" require "rugged" require "fileutils" require_relative "db" diff --git a/classes/projects.rb b/classes/projects.rb index fa2352e..bdfe153 100644 --- a/classes/projects.rb +++ b/classes/projects.rb @@ -1,5 +1,14 @@ +require "fileutils" require_relative "db" +PROJECTS_STRUCTURE = { + :REPO => "repo", + :LOGS => "logs", + :CONFIGS => "configs", + :SRCPRP => "srcprp", + :SIGNED => "signed", +} + class ProjectsActions attr :path, :error, :db @@ -27,4 +36,40 @@ class ProjectsActions end prj end + + def create_project(name, description, configuration) + @error = nil + ret_val = 0 + project_name = sanitize_rcptname(name) + File.open("locks/prjcreate", "r") do |f| + f.flock(File::LOCK_EX) + fname = File.expand_path("#{project_name}.prj", @path) + if File.exist?(fname) + @error = "Проект с таким именем уже существует: #{project_name}" + ret_val = 1 + else + Dir.mkdir(fname) + created = false + PROJECTS_STRUCTURE.each_pair do |key, value| + new_path = File.join(fname, value) + Dir.mkdir(new_path) + end + if File.exist?(configuration) + conf_path = File.join(@path, PROJECTS_STRUCTURE[:CONFIGS], project_name) + FileUtils.cp(configuration, conf_path) + @error = @db.proj_create(project_name, description) + if @error.nil? + created = true + end + else + ret_val = 1 + @error = "Конфигурация #{configuration} не существует" + end + unless created + FileUtils.rm_rf(fname, secure: true) + end + end + end + ret_val + end end diff --git a/views/prjcrt.erb b/views/prjcrt.erb new file mode 100644 index 0000000..9ae8737 --- /dev/null +++ b/views/prjcrt.erb @@ -0,0 +1,49 @@ +<%= erb :header %> + + <% unless @error_data.nil? %> +