|
|
|
@ -64,32 +64,53 @@ class RepositoriesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def forked
|
|
|
|
|
# 被forked的标识如果不满足单个用户唯一性,则不执行fork
|
|
|
|
|
if is_sigle_identifier?(User.current, @repository.identifier)
|
|
|
|
|
# REDO: 那些人有权限forked项目
|
|
|
|
|
g = Gitlab.client
|
|
|
|
|
gproject = g.post ("/projects/fork/#{@project.gpid}?user_id=#{User.current.gid}")
|
|
|
|
|
if gproject
|
|
|
|
|
copy_project(@project, gproject)
|
|
|
|
|
end
|
|
|
|
|
# 如果当前用户已经fork过该项目,不会新fork项目,则跳至已fork的项
|
|
|
|
|
unless has_forked?(@project, User.current)
|
|
|
|
|
project = project_from_current_project(@project.id, User.current.id)
|
|
|
|
|
redirect_to project_path(project)
|
|
|
|
|
else
|
|
|
|
|
flash[:notice] = l(:project_gitlab_fork_double_message)
|
|
|
|
|
redirect_to settings_project_url(@project, :tab => 'repositories')
|
|
|
|
|
# 单个用户只能拥有一个名字一样的版本库,否则不能fork
|
|
|
|
|
# if is_sigle_identifier?(User.current, @repository.identifier)
|
|
|
|
|
# REDO: 那些人有权限forked项目
|
|
|
|
|
g = Gitlab.client
|
|
|
|
|
gproject = g.fork(@project.gpid, User.current.gid)
|
|
|
|
|
if gproject
|
|
|
|
|
copy_project(@project, gproject)
|
|
|
|
|
forked_count = @project.forked_count.to_i + 1
|
|
|
|
|
@project.update_attributes(:forked_count => forked_count)
|
|
|
|
|
end
|
|
|
|
|
# else
|
|
|
|
|
# flash[:notice] = l(:project_gitlab_fork_double_message)
|
|
|
|
|
# redirect_to settings_project_url(@project, :tab => 'repositories')
|
|
|
|
|
# end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# 判断用户是否已经fork过该项目
|
|
|
|
|
def has_forked?(project, user)
|
|
|
|
|
projects = Project.where("user_id =?", user)
|
|
|
|
|
projects.map(&:forked_from_project_id).detect{|s| s == @project.id}.nil? ? true : false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# 获取当前用户fork过的项目
|
|
|
|
|
def project_from_current_project(project, user)
|
|
|
|
|
project = Project.where("user_id =? and forked_from_project_id =?",user, project).first
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# copy a project for fork
|
|
|
|
|
def copy_project(project, gproject)
|
|
|
|
|
def copy_project(tproject, gproject)
|
|
|
|
|
project = Project.new
|
|
|
|
|
project.name = @project.name
|
|
|
|
|
project.is_public = @project.is_public
|
|
|
|
|
project.status = @project.status
|
|
|
|
|
project.description = @project.description
|
|
|
|
|
project.hidden_repo = @project.hidden_repo
|
|
|
|
|
project.name = tproject.name
|
|
|
|
|
project.is_public = tproject.is_public
|
|
|
|
|
project.status = tproject.status
|
|
|
|
|
project.description = tproject.description
|
|
|
|
|
project.hidden_repo = tproject.hidden_repo
|
|
|
|
|
project.user_id = User.current.id
|
|
|
|
|
project.project_type = 0
|
|
|
|
|
project.project_new_type = @project.project_new_type
|
|
|
|
|
project.project_new_type = tproject.project_new_type
|
|
|
|
|
project.gpid = gproject.id
|
|
|
|
|
project.forked_from_project_id = tproject.id
|
|
|
|
|
if project.save
|
|
|
|
|
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
|
|
|
|
|
m = Member.new(:user => User.current, :roles => [r])
|
|
|
|
@ -124,16 +145,16 @@ class RepositoriesController < ApplicationController
|
|
|
|
|
|
|
|
|
|
def copy_repository(project, gproject)
|
|
|
|
|
# 避免
|
|
|
|
|
if is_sigle_identifier?(project.user_id, gproject.name)
|
|
|
|
|
# if is_sigle_identifier?(project.user_id, gproject.name)
|
|
|
|
|
repository = Repository.factory('Git')
|
|
|
|
|
repository.project_id = project.id
|
|
|
|
|
repository.type = 'Repository::Gitlab'
|
|
|
|
|
repository.url = gproject.name
|
|
|
|
|
repository.identifier = gproject.name
|
|
|
|
|
repository = repository.save
|
|
|
|
|
else
|
|
|
|
|
flash[:notice] = l(:project_gitlab_create_double_message)
|
|
|
|
|
end
|
|
|
|
|
# else
|
|
|
|
|
# flash[:notice] = l(:project_gitlab_create_double_message)
|
|
|
|
|
# end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def newrepo
|
|
|
|
|