From 0e390ca91259c6607192e29cd22f8a343787911a Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 18 May 2020 18:25:50 +0800 Subject: [PATCH] ADD sync mirror repo api --- app/controllers/repositories_controller.rb | 29 ++++++++++++++------ app/jobs/sync_mirrored_repository_job.rb | 8 ++++++ app/models/mirror.rb | 13 +++++++++ app/services/repositories/migrate_service.rb | 23 +++++++--------- config/routes.rb | 1 + 5 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 app/jobs/sync_mirrored_repository_job.rb create mode 100644 app/models/mirror.rb diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 49e095c8e..b834935b8 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -1,7 +1,10 @@ class RepositoriesController < ApplicationController include ApplicationHelper - before_action :require_login, only: %i[edit update create_file update_file delete_file] + include OperateProjectAbilityAble + before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror] before_action :find_project, :authorizate! + before_action :find_repository, only: %i[sync_mirror] + before_action :authorizate_user_can_edit_project!, only: %i[sync_mirror] def show @branches_count = Gitea::Repository::BranchesService.new(@project.owner, @project.identifier).call&.size @@ -125,8 +128,8 @@ class RepositoriesController < ApplicationController def repo_hook hook_type = request.headers["X-Gitea-Event"].to_s # 获取推送的方式 - ownername = @project.owner.try(:login) - reponame = @project.identifier + ownername = @project.owner.try(:login) + reponame = @project.identifier username = current_user.try(:login) user_params = { "ownername": ownername, @@ -142,6 +145,12 @@ class RepositoriesController < ApplicationController @project.update_attribute(:token, @project.token + uploadPushInfo[:modificationLines].to_i) end + def sync_mirror + @repo&.mirror.set_status!(Mirror.statuses[:waiting]) + SyncMirroredRepositoryJob(@repo, current_user) + render_ok + end + private def find_project @@ -149,6 +158,10 @@ class RepositoriesController < ApplicationController render_not_found("未找到相关的仓库") unless @project end + def find_repository + @repo = Repository.find params[:id] + end + def authorizate! if @project.repository.hidden? && !@project.member?(current_user) render_forbidden @@ -166,13 +179,13 @@ class RepositoriesController < ApplicationController } end - def hook_params(hook_type, params) + def hook_params(hook_type, params) if hook_type == "push" - # TODO hook返回的记录中,暂时没有文件代码数量的增减,暂时根据 commits数量来计算 + # TODO hook返回的记录中,暂时没有文件代码数量的增减,暂时根据 commits数量来计算 uploadPushInfo = { - "shas": params["commits"].present? ? params["commits"].map{|c| c["id"]} : "", + "shas": params["commits"].present? ? params["commits"].map{|c| c["id"]} : "", "branch": params["ref"].to_s.split("/").last, - "modificationLines": params["commits"].length + "modificationLines": params["commits"].length } elsif hook_type == "pull_request" && params["action"].to_s == "closed" #合并请求合并后才会有上链操作 uploadPushInfo = { @@ -183,7 +196,7 @@ class RepositoriesController < ApplicationController "shas": [params["pull_request"]["merge_commit_sha"], params["pull_request"]["merge_base"]], "modificationLines": 1 #pull_request中没有commits数量 } - else + else uploadPushInfo = {} end diff --git a/app/jobs/sync_mirrored_repository_job.rb b/app/jobs/sync_mirrored_repository_job.rb new file mode 100644 index 000000000..7230e1195 --- /dev/null +++ b/app/jobs/sync_mirrored_repository_job.rb @@ -0,0 +1,8 @@ +class SyncMirroredRepositoryJob < ApplicationJob + queue_as :default + + def perform(repo, current_user) + result = Gitea::Repository::SyncMirroredService.new(repo.user.login, repo.identifier, token: current_user.gitea_token).call + repo&.mirror.set_status! if result[:status] === 200 + end +end diff --git a/app/models/mirror.rb b/app/models/mirror.rb new file mode 100644 index 000000000..8b7e61b0a --- /dev/null +++ b/app/models/mirror.rb @@ -0,0 +1,13 @@ +class Mirror < ApplicationRecord + + # 0 - succeeded, 1 - waiting, 2 - failed + # 0: 同步镜像成功;1: 正在同步镜像;2: 同步失败,默认值为0 + enum status: { succeeded: 0, waiting: 1, failed: 2 } + + belongs_to :repository + + + def set_status!(status=Mirror.statuses[:succeeded]) + update_column(status: status) + end +end diff --git a/app/services/repositories/migrate_service.rb b/app/services/repositories/migrate_service.rb index 0991a75c8..0e773d54c 100644 --- a/app/services/repositories/migrate_service.rb +++ b/app/services/repositories/migrate_service.rb @@ -11,9 +11,8 @@ class Repositories::MigrateService < ApplicationService @repository = Repository.new(repository_params) ActiveRecord::Base.transaction do if @repository.save! - gitea_repository = Gitea::Repository::MigrateService.new(user.gitea_token, gitea_repository_params).call - sync_project(gitea_repository) - sync_repository(@repository, gitea_repository) + @repository.set_mirror! if wrapper_mirror + MigrateRemoteRepositoryJob.perform_later(@repository, user.gitea_token, gitea_repository_params) end @repository end @@ -23,15 +22,6 @@ class Repositories::MigrateService < ApplicationService end private - - def sync_project(gitea_repository) - project.update_columns(gpid: gitea_repository["id"], identifier: gitea_repository["name"]) if gitea_repository - end - - def sync_repository(repository, gitea_repository) - repository.update_columns(url: gitea_repository["clone_url"]) if gitea_repository - end - def repository_params params.merge(project_id: project.id) end @@ -41,7 +31,14 @@ class Repositories::MigrateService < ApplicationService clone_addr: params[:mirror_url], repo_name: params[:identifier], uid: user.gitea_uid, - private: params[:hidden] + private: params[:hidden], + mirror: wrapper_mirror || false, + auth_username: params[:login], + auth_password: params[:password] } end + + def wrapper_mirror + ActiveModel::Type::Boolean.new.cast(params[:is_mirror]) + end end diff --git a/config/routes.rb b/config/routes.rb index 8c124d658..2008d6734 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -193,6 +193,7 @@ Rails.application.routes.draw do put :update_file delete :delete_file post :repo_hook + post :sync_mirror end end