ADD sync mirror repo api

This commit is contained in:
Jasder 2020-05-18 18:25:50 +08:00
parent d464ab3891
commit 0e390ca912
5 changed files with 53 additions and 21 deletions

View File

@ -1,7 +1,10 @@
class RepositoriesController < ApplicationController class RepositoriesController < ApplicationController
include ApplicationHelper 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_project, :authorizate!
before_action :find_repository, only: %i[sync_mirror]
before_action :authorizate_user_can_edit_project!, only: %i[sync_mirror]
def show def show
@branches_count = Gitea::Repository::BranchesService.new(@project.owner, @project.identifier).call&.size @branches_count = Gitea::Repository::BranchesService.new(@project.owner, @project.identifier).call&.size
@ -125,8 +128,8 @@ class RepositoriesController < ApplicationController
def repo_hook def repo_hook
hook_type = request.headers["X-Gitea-Event"].to_s # 获取推送的方式 hook_type = request.headers["X-Gitea-Event"].to_s # 获取推送的方式
ownername = @project.owner.try(:login) ownername = @project.owner.try(:login)
reponame = @project.identifier reponame = @project.identifier
username = current_user.try(:login) username = current_user.try(:login)
user_params = { user_params = {
"ownername": ownername, "ownername": ownername,
@ -142,6 +145,12 @@ class RepositoriesController < ApplicationController
@project.update_attribute(:token, @project.token + uploadPushInfo[:modificationLines].to_i) @project.update_attribute(:token, @project.token + uploadPushInfo[:modificationLines].to_i)
end end
def sync_mirror
@repo&.mirror.set_status!(Mirror.statuses[:waiting])
SyncMirroredRepositoryJob(@repo, current_user)
render_ok
end
private private
def find_project def find_project
@ -149,6 +158,10 @@ class RepositoriesController < ApplicationController
render_not_found("未找到相关的仓库") unless @project render_not_found("未找到相关的仓库") unless @project
end end
def find_repository
@repo = Repository.find params[:id]
end
def authorizate! def authorizate!
if @project.repository.hidden? && !@project.member?(current_user) if @project.repository.hidden? && !@project.member?(current_user)
render_forbidden render_forbidden
@ -166,13 +179,13 @@ class RepositoriesController < ApplicationController
} }
end end
def hook_params(hook_type, params) def hook_params(hook_type, params)
if hook_type == "push" if hook_type == "push"
# TODO hook返回的记录中暂时没有文件代码数量的增减暂时根据 commits数量来计算 # TODO hook返回的记录中暂时没有文件代码数量的增减暂时根据 commits数量来计算
uploadPushInfo = { 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, "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" #合并请求合并后才会有上链操作 elsif hook_type == "pull_request" && params["action"].to_s == "closed" #合并请求合并后才会有上链操作
uploadPushInfo = { uploadPushInfo = {
@ -183,7 +196,7 @@ class RepositoriesController < ApplicationController
"shas": [params["pull_request"]["merge_commit_sha"], params["pull_request"]["merge_base"]], "shas": [params["pull_request"]["merge_commit_sha"], params["pull_request"]["merge_base"]],
"modificationLines": 1 #pull_request中没有commits数量 "modificationLines": 1 #pull_request中没有commits数量
} }
else else
uploadPushInfo = {} uploadPushInfo = {}
end end

View File

@ -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

13
app/models/mirror.rb Normal file
View File

@ -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

View File

@ -11,9 +11,8 @@ class Repositories::MigrateService < ApplicationService
@repository = Repository.new(repository_params) @repository = Repository.new(repository_params)
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
if @repository.save! if @repository.save!
gitea_repository = Gitea::Repository::MigrateService.new(user.gitea_token, gitea_repository_params).call @repository.set_mirror! if wrapper_mirror
sync_project(gitea_repository) MigrateRemoteRepositoryJob.perform_later(@repository, user.gitea_token, gitea_repository_params)
sync_repository(@repository, gitea_repository)
end end
@repository @repository
end end
@ -23,15 +22,6 @@ class Repositories::MigrateService < ApplicationService
end end
private 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 def repository_params
params.merge(project_id: project.id) params.merge(project_id: project.id)
end end
@ -41,7 +31,14 @@ class Repositories::MigrateService < ApplicationService
clone_addr: params[:mirror_url], clone_addr: params[:mirror_url],
repo_name: params[:identifier], repo_name: params[:identifier],
uid: user.gitea_uid, uid: user.gitea_uid,
private: params[:hidden] private: params[:hidden],
mirror: wrapper_mirror || false,
auth_username: params[:login],
auth_password: params[:password]
} }
end end
def wrapper_mirror
ActiveModel::Type::Boolean.new.cast(params[:is_mirror])
end
end end

View File

@ -193,6 +193,7 @@ Rails.application.routes.draw do
put :update_file put :update_file
delete :delete_file delete :delete_file
post :repo_hook post :repo_hook
post :sync_mirror
end end
end end