diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c3a750cb3..7a049ee35 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -16,7 +16,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do Projects::CreateForm.new(project_params).validate! @project = Projects::CreateService.new(current_user, project_params).call - + end rescue Exception => e uid_logger_error(e.message) @@ -88,7 +88,7 @@ class ProjectsController < ApplicationController end def mirror_params - params.permit(:user_id, :name, :description, :repository_name, - :project_category_id, :project_language_id, :clone_addr, :private) + params.permit(:user_id, :name, :description, :repository_name, :is_mirror, :auth_username, + :auth_password, :project_category_id, :project_language_id, :clone_addr, :private) end end diff --git a/app/forms/projects/migrate_form.rb b/app/forms/projects/migrate_form.rb index 1c0b25493..f17b75a5a 100644 --- a/app/forms/projects/migrate_form.rb +++ b/app/forms/projects/migrate_form.rb @@ -2,7 +2,7 @@ class Projects::MigrateForm < BaseForm REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 URL_REGEX = /\A(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\z/i - attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private + attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private, :is_mirror, :auth_username, :auth_password validates :user_id, :name, :description,:repository_name, :project_category_id, :project_language_id, presence: true validates :repository_name, format: { with: REPOSITORY_NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } diff --git a/app/jobs/migrate_remote_repository_job.rb b/app/jobs/migrate_remote_repository_job.rb new file mode 100644 index 000000000..bc17718ad --- /dev/null +++ b/app/jobs/migrate_remote_repository_job.rb @@ -0,0 +1,18 @@ +class MigrateRemoteRepositoryJob < ApplicationJob + queue_as :default + + def perform(repo, token, params) + gitea_repository = Gitea::Repository::MigrateService.new(token, params).call + sync_project(repo, gitea_repository) + sync_repository(repo, gitea_repository) + end + + private + def sync_project(repo, gitea_repository) + repo&.project.update_columns(gpid: gitea_repository["id"], identifier: gitea_repository["name"]) if gitea_repository + end + + def sync_repository(repository, gitea_repository) + repository.mirror.update_columns(statuses: Mirror.statuses[:succeeded]) if gitea_repository + end +end diff --git a/app/models/project.rb b/app/models/project.rb index b02b89e81..737320aa6 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -4,7 +4,11 @@ class Project < ApplicationRecord include Watchable include ProjectOperable - enum project_type: { mirror: 1, common: 0 } # common:开源托管项目, mirror:开源镜像项目 + # common:开源托管项目 + # mirror:普通镜像项目,没有定时同步功能 + # sync_mirror:同步镜像项目,有系统定时同步功能,且用户可手动同步操作 + # + enum project_type: { sync_mirror: 2, mirror: 1, common: 0 } belongs_to :ignore, optional: true belongs_to :license, optional: true @@ -122,8 +126,8 @@ class Project < ApplicationRecord def releases_size(current_user_id, type) if current_user_id == self.user_id && type.to_s == "all" - self.repository.version_releases_count - else + self.repository.version_releases_count + else self.repository.version_releases.releases_size end end diff --git a/app/models/repository.rb b/app/models/repository.rb index a1e30f785..0cd5ed511 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -2,6 +2,7 @@ class Repository < ApplicationRecord self.inheritance_column = nil # FIX The single-table inheritance mechanism failed belongs_to :project, :touch => true belongs_to :user + has_one :mirror, foreign_key: :repo_id has_many :version_releases, dependent: :destroy validates :identifier, presence: true @@ -9,4 +10,9 @@ class Repository < ApplicationRecord def to_param self.identifier.parameterize end + + # with repository is mirror + def set_mirror! + self.build_mirror(status: Mirror.statuses[:waiting]).save + end end diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb index aea0607d2..eb24bdc41 100644 --- a/app/services/projects/migrate_service.rb +++ b/app/services/projects/migrate_service.rb @@ -31,17 +31,23 @@ class Projects::MigrateService < ApplicationService project_category_id: params[:project_category_id], project_language_id: params[:project_language_id], is_public: project_secretion[:public], - project_type: Project.project_types[:mirror] + project_type: set_project_type } end + def set_project_type + ActiveModel::Type::Boolean.new.cast(params[:is_mirror]) == true ? Project.project_types[:sync_mirror] : Project.project_types[:mirror] + end + def repository_params { hidden: project_secretion[:hidden], identifier: params[:repository_name], mirror_url: params[:clone_addr], user_id: user.id, - login: user.login + login: params[:auth_username], + password: params[:auth_password], + is_mirror: params[:is_mirror] } end