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