parent
68c7cbc07d
commit
ac881d131a
@ -0,0 +1,20 @@
|
|||||||
|
class ForksController < ApplicationController
|
||||||
|
before_action :require_login, :find_project_with_id
|
||||||
|
before_action :authenticate_project!, :authenticate_user!
|
||||||
|
|
||||||
|
def create
|
||||||
|
@new_project = Projects::ForkService.new(current_user, @project, params[:organization]).call
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def authenticate_project!
|
||||||
|
return if current_user != @project.owner
|
||||||
|
render_result(1, "自己不能fork自己的项目")
|
||||||
|
end
|
||||||
|
|
||||||
|
def authenticate_user!
|
||||||
|
return if @project.is_public
|
||||||
|
return if @project.member?(current_user) || current_user.admin?
|
||||||
|
render_forbidden('你没有权限操作')
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,2 @@
|
|||||||
|
module ForksHelper
|
||||||
|
end
|
@ -0,0 +1,32 @@
|
|||||||
|
class Gitea::Repository::ForkService < Gitea::ClientService
|
||||||
|
attr_reader :old_owner, :target_owner, :repo_name, :organization
|
||||||
|
|
||||||
|
# old_owner: 被clone的项目(源项目)拥有者
|
||||||
|
# target_owner: clone后的醒目(新项目)的拥有者
|
||||||
|
# body:
|
||||||
|
# {
|
||||||
|
# "organization": "string" #组织名称
|
||||||
|
# }
|
||||||
|
def initialize(old_owner, target_owner, repo_name, organization=nil)
|
||||||
|
@old_owner = old_owner
|
||||||
|
@target_owner = target_owner
|
||||||
|
@repo_name = repo_name
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
post(url, request_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def request_params
|
||||||
|
hash = Hash.new.merge(token: target_owner.gitea_token)
|
||||||
|
hash = hash.merge(data: {organization: organization}) if organization
|
||||||
|
hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
"/repos/#{old_owner.login}/#{repo_name}/forks".freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,38 @@
|
|||||||
|
class Projects::ForkService < ApplicationService
|
||||||
|
attr_reader :target_owner, :project, :organization
|
||||||
|
|
||||||
|
def initialize(target_owner, project, organization=nil)
|
||||||
|
@target_owner = target_owner
|
||||||
|
@project = project
|
||||||
|
@organization = organization
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
ActiveRecord::Base.transaction do
|
||||||
|
clone_project =
|
||||||
|
@project.deep_clone include: :repository,
|
||||||
|
only: [:name, :description,:is_public, :identifier,
|
||||||
|
:rep_identifier, :project_category_id, :project_language_id,
|
||||||
|
:license_id, :ignore_id, {repository: [:identifier, :hidden]}]
|
||||||
|
|
||||||
|
clone_project.owner = @target_owner
|
||||||
|
clone_project.forked_from_project_id = @project.id
|
||||||
|
clone_project.save!
|
||||||
|
|
||||||
|
new_repository = clone_project.repository
|
||||||
|
new_repository.user = @target_owner
|
||||||
|
new_repository.save!
|
||||||
|
|
||||||
|
result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call
|
||||||
|
|
||||||
|
@project.update_column('forked_count', @project.forked_count + 1)
|
||||||
|
new_repository.update_column('url', result['clone_url']) if result
|
||||||
|
|
||||||
|
clone_project
|
||||||
|
end
|
||||||
|
rescue => e
|
||||||
|
puts "clone project service error: #{e.message}"
|
||||||
|
raise Error, e.message
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
if @new_project
|
||||||
|
json.id @new_project.id
|
||||||
|
json.identifier @new_project.identifier
|
||||||
|
else
|
||||||
|
json.nil!
|
||||||
|
end
|
Loading…
Reference in new issue