diff --git a/.gitignore b/.gitignore index ff5ebff..215832a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ vendor repo db/*.sqlite3 +projects .ruby-lsp \ No newline at end of file diff --git a/app.rb b/app.rb index 9da946d..f9a3416 100644 --- a/app.rb +++ b/app.rb @@ -370,7 +370,7 @@ get "/prjedit/:id" do @proj_descr = prj_info[:descr] @proj_id = prj_info[:id] repo_lst = repo.getrepos - proj_repo_list = prj.get_project_gits(prj_info[:id]) + proj_repo_list = prj.get_project_gits(prj_info[:id], repo) @repo_list = repo_lst.reject do |item| fnd = false proj_repo_list.each do |item2| @@ -416,14 +416,54 @@ post "/prjagit/:id" do if fnd session[:prj_modal_info] = "Ошибка" session[:prj_modal_text] = "Данный git-репозиторий уже добавлен к проекту" - redirect back else - prj.add_git_to_project(prj_info[:id], git_info[:id]) + err = prj.add_git_to_project(prj_info[:id], git_info[:id], repo, git_info[:reponame]) + if err.nil? + session[:prj_modal_info] = nil + session[:prj_modal_text] = nil + else + session[:prj_modal_info] = "Ошибка добавления git проекта" + session[:prj_modal_text] = err + end + end + end + end + end + end + redirect back +end + +get "/prjrgit/: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 + proj_repo_list = prj.get_project_gits(prj_info[:id]) + git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i) + if git_info.nil? + print_error_page(503, "Репозиторий исчез") + else + err = prj.renew_git_to_project(prj_info[:id], git_info[:id], repo, git_info[:reponame]) + if err.nil? + session[:prj_modal_info] = nil + session[:prj_modal_text] = nil + else + session[:prj_modal_info] = "Ошибка обновления git проекта" + session[:prj_modal_text] = err end end end end end + redirect back end not_found do diff --git a/classes/gitinfo.rb b/classes/gitinfo.rb index 0d4d86d..8c3c0d6 100644 --- a/classes/gitinfo.rb +++ b/classes/gitinfo.rb @@ -165,7 +165,11 @@ class GitRepo if repo.empty? @error = "Репозиторий пустой, нельзя добавить в проект пустой репозиторий" else - #TODO clone repo + if File.exist?(path) + FileUtils.rm_rf(path, secure: true) + end + Dir.mkdir(path) + Rugged::Repository.clone_at(repo.path, path) end else @error = "Файла репозитория не существует" @@ -176,4 +180,18 @@ class GitRepo end @error end + + def is_repos_sync(repo_name, prj_repo_path) + res = false + repo = Rugged::Repository.new(prj_repo_path) + File.open("locks/gitcreate", "r") do |f| + f.flock(File::LOCK_SH) + git_path = File.join(@path, repo_name + ".git") + bare_repo = Rugged::Repository.new(git_path) + pp bare_repo.head + pp repo.head + res = (bare_repo.head.oid == repo.head.oid) + end + res + end end diff --git a/classes/projects.rb b/classes/projects.rb index 1483456..08d6443 100644 --- a/classes/projects.rb +++ b/classes/projects.rb @@ -7,6 +7,7 @@ PROJECTS_STRUCTURE = { :CONFIGS => "configs", :SRCPRP => "srcprp", :SIGNED => "signed", + :SRC => "src", } class ProjectsActions @@ -46,6 +47,18 @@ class ProjectsActions prj end + def get_project_path(id) + @error = nil + fname = nil + prj = @db.proj(id) + if prj.nil? + @error = "Проекта с id = #{id} не существует" + else + fname = File.expand_path("#{prj[:projname]}.prj", @path) + end + fname + end + def create_project(name, description, configuration) @error = nil ret_val = 0 @@ -87,11 +100,43 @@ class ProjectsActions ret_val end - def get_project_gits(id) - @db.get_gits_for_projects(id) + def get_project_gits(id, repo) + res = [] + File.open("locks/prjcreate", "r") do |f| + f.flock(File::LOCK_EX) + res = @db.get_gits_for_projects(id) + res_sync = res.map do |item| + prj_p = get_project_path(id) + path = File.join(prj_p, PROJECTS_STRUCTURE[:SRC], item[:reponame]) + item[:is_repo_synced] = repo.is_repos_sync(item[:reponame], path) + item + end + end + res + end + + def add_git_to_project(prj_id, git_id, repo, git_name) + path = get_project_path(prj_id) + if @error.nil? + path = File.join(path, PROJECTS_STRUCTURE[:SRC], git_name) + err = repo.clone_repo_master(git_id, path) + if err.nil? + @db.save_git_project(prj_id, git_id) + end + else + err = @error + end + err end - def add_git_to_project(prj_id, git_id) - @db.save_git_project(prj_id, git_id) + def renew_git_to_project(prj_id, git_id, repo, git_name) + path = get_project_path(prj_id) + if @error.nil? + path = File.join(path, PROJECTS_STRUCTURE[:SRC], git_name) + err = repo.clone_repo_master(git_id, path) + else + err = @error + end + err end end diff --git a/views/prjinfo.erb b/views/prjinfo.erb index 3a44b88..932d985 100644 --- a/views/prjinfo.erb +++ b/views/prjinfo.erb @@ -64,13 +64,20 @@