@ -34,7 +34,7 @@ class RepositoriesController < ApplicationController
before_filter :find_repository , :only = > [ :edit , :update , :destroy , :committers ]
before_filter :find_repository , :only = > [ :edit , :update , :destroy , :committers ]
before_filter :find_project_repository , :except = > [ :new , :create , :newcreate , :edit , :update , :destroy , :committers , :newrepo , :to_gitlab ]
before_filter :find_project_repository , :except = > [ :new , :create , :newcreate , :edit , :update , :destroy , :committers , :newrepo , :to_gitlab ]
before_filter :find_changeset , :only = > [ :revision , :add_related_issue , :remove_related_issue ]
before_filter :find_changeset , :only = > [ :revision , :add_related_issue , :remove_related_issue ]
before_filter :authorize , :except = > [ :newrepo , :newcreate , :fork , :to_gitlab ]
before_filter :authorize , :except = > [ :newrepo , :newcreate , :fork , :to_gitlab , :forked ]
accept_rss_auth :revisions
accept_rss_auth :revisions
# hidden repositories filter // 隐藏代码过滤器
# hidden repositories filter // 隐藏代码过滤器
before_filter :check_hidden_repo , :only = > [ :show , :stats , :revisions , :revision , :diff ]
before_filter :check_hidden_repo , :only = > [ :show , :stats , :revisions , :revision , :diff ]
@ -42,7 +42,7 @@ class RepositoriesController < ApplicationController
include RepositoriesHelper
include RepositoriesHelper
helper :project_score
helper :project_score
#@root_path = RepositoriesHelper::ROOT_PATH
#@root_path = RepositoriesHelper::ROOT_PATH
$g = Gitlab . client
rescue_from Redmine :: Scm :: Adapters :: CommandFailed , :with = > :show_error_command_failed
rescue_from Redmine :: Scm :: Adapters :: CommandFailed , :with = > :show_error_command_failed
def new
def new
@ -63,6 +63,78 @@ class RepositoriesController < ApplicationController
end
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
else
flash [ :notice ] = l ( :project_gitlab_fork_double_message )
redirect_to settings_project_url ( @project , :tab = > 'repositories' )
end
end
# copy a project for fork
def copy_project ( project , 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 . user_id = User . current . id
project . project_type = 0
project . project_new_type = @project . project_new_type
project . gpid = gproject . 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 ] )
project_info = ProjectInfo . new ( :user_id = > User . current . id , :project_id = > project . id )
user_grades = UserGrade . create ( :user_id = > User . current . id , :project_id = > project . id )
Rails . logger . debug " UserGrade created: #{ user_grades . to_json } "
project_status = ProjectStatus . create ( :project_id = > @project . id , :watchers_count = > 0 , :changesets_count = > 0 , :project_type = > @project . project_type , :grade = > 0 )
Rails . logger . debug " ProjectStatus created: #{ project_status . to_json } "
project . members << m
project . project_infos << project_info
copy_repository ( project , gproject )
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_create )
if params [ :continue ]
attrs = { :parent_id = > project . parent_id } . reject { | k , v | v . nil? }
redirect_to new_project_url ( attrs , :course = > '0' )
else
redirect_to settings_project_url ( project )
end
}
format . api { render :action = > 'show' , :status = > :created , :location = > url_for ( :controller = > 'projects' , :action = > 'show' , :id = > project . id ) }
format . js
end
else
respond_to do | format |
format . html { render :action = > 'forked' , :layout = > 'base_projects' }
format . api { render_validation_errors ( @project ) }
end
end
end
def copy_repository ( project , gproject )
# 避免
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
end
def newrepo
def newrepo
scm = params [ :repository_scm ] || ( Redmine :: Scm :: Base . all & Setting . enabled_scm ) . first
scm = params [ :repository_scm ] || ( Redmine :: Scm :: Base . all & Setting . enabled_scm ) . first
@ -115,21 +187,27 @@ update
}
}
def create
def create
attrs = pickup_extra_info
# 判断版本库创建者是否有同名版本库,避免版本库路径一致问题
@repository = Repository . factory ( 'Git' )
unless is_sigle_identifier? ( @project . user_id , params [ :repository ] . first [ 1 ] )
@repository . safe_attributes = params [ :repository ]
flash [ :notice ] = l ( :project_gitlab_create_double_message )
if attrs [ :attrs_extra ] . keys . any?
@repository . merge_extra_info ( attrs [ :attrs_extra ] )
end
@repository . project = @project
@repository . type = 'Repository::Gitlab'
@repository . url = @repository . identifier
if request . post? && @repository . save
s = Trustie :: Gitlab :: Sync . new
s . create_project ( @project , @repository )
redirect_to settings_project_url ( @project , :tab = > 'repositories' )
redirect_to settings_project_url ( @project , :tab = > 'repositories' )
else
else
redirect_to settings_project_url ( @project , :tab = > 'repositories' , :repository_error_message = > @repository . errors . full_messages )
attrs = pickup_extra_info
@repository = Repository . factory ( 'Git' )
@repository . safe_attributes = params [ :repository ]
if attrs [ :attrs_extra ] . keys . any?
@repository . merge_extra_info ( attrs [ :attrs_extra ] )
end
@repository . project = @project
@repository . type = 'Repository::Gitlab'
@repository . url = @repository . identifier
if request . post? && @repository . save
s = Trustie :: Gitlab :: Sync . new
s . create_project ( @project , @repository )
redirect_to settings_project_url ( @project , :tab = > 'repositories' )
else
redirect_to settings_project_url ( @project , :tab = > 'repositories' , :repository_error_message = > @repository . errors . full_messages )
end
end
end
end
end
@ -237,14 +315,34 @@ update
#Modified by young
#Modified by young
# (show_error_not_found; return) unless @entries
# (show_error_not_found; return) unless @entries
g = Gitlab . client
g = Gitlab . client
count = 0
( 0 .. 100 ) . each do | page |
# count = 0
if g . commits ( @project . gpid , :page = > page ) . count == 0
# (0..100).each do |page|
break
# if g.commits(@project.gpid,:page => page).count == 0
else
# break
count = count + g . commits ( @project . gpid , :page = > page ) . count
# else
end
# count = count + g.commits(@project.gpid,:page => page).count
# end
# end
#add by hx
if g . commits ( @project . gpid , :page = > 25 ) . count == 0
count = count_commits ( @project . gpid , 0 , 25 )
elsif g . commits ( @project . gpid , :page = > 50 ) . count == 0
count = count_commits ( @project . gpid , 25 , 50 ) + 25 * 20
elsif g . commits ( @project . gpid , :page = > 75 ) . count == 0
count = count_commits ( @project . gpid , 50 , 75 ) + 50 * 20
elsif g . commits ( @project . gpid , :page = > 100 ) . count == 0
count = count_commits ( @project . gpid , 75 , 100 ) + 75 * 20
elsif g . commits ( @project . gpid , :page = > 125 ) . count == 0
count = count_commits ( @project . gpid , 100 , 125 ) + 100 * 20
elsif g . commits ( @project . gpid , :page = > 150 ) . count == 0
count = count_commits ( @project . gpid , 125 , 150 ) + 125 * 20
else
count = count_commits ( @project . gpid , 150 , 200 ) + 150 * 20
end
end
@changesets = g . commits ( @project . gpid )
@changesets = g . commits ( @project . gpid )
# @changesets = @repository.latest_changesets(@path, @rev)
# @changesets = @repository.latest_changesets(@path, @rev)
# @changesets_count = @repository.latest_changesets(@path, @rev).count
# @changesets_count = @repository.latest_changesets(@path, @rev).count
@ -271,11 +369,30 @@ update
alias_method :browse , :show
alias_method :browse , :show
#add by hx
def count_commits ( project_id , left , right )
count = 0
( left .. right ) . each do | page |
if $g . commits ( project_id , :page = > page ) . count == 0
break
else
count = count + $g . commits ( project_id , :page = > page ) . count
end
end
return count
end
def changes
def changes
@entry = @repository . entry ( @path , @rev )
@entry = @repository . entry ( @path , @rev )
( show_error_not_found ; return ) unless @entry
( show_error_not_found ; return ) unless @entry
g = Gitlab . client
g = Gitlab . client
@commits = g . commits ( @project . gpid , page : params [ :pamge ] )
limit = 20
#每次页面的换回值从1开始,但是gitlab的页面查询是从0开始,所以先改变page的类型减一在改回来
@commits = g . commits ( @project . gpid , page : ( params [ :page ] . to_i - 1 ) . to_s )
#页面传递必须要str类型,但是Paginator的初始化必须要num类型,需要类型转化
@commits_count = params [ :commit_count ] . to_i
@commits_pages = Redmine :: Pagination :: Paginator . new @commits_count , limit , params [ :page ]
@commit = g . commit ( @project . gpid , @rev )
@commit = g . commit ( @project . gpid , @rev )
# @changesets = g.get ("/projects/#{@project.gpid}/repository/commits?#{@rev}")
# @changesets = g.get ("/projects/#{@project.gpid}/repository/commits?#{@rev}")
#@changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
#@changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
@ -284,6 +401,7 @@ update
render :layout = > 'base_projects'
render :layout = > 'base_projects'
end
end
def revisions
def revisions
@changeset_count = @repository . changesets . count
@changeset_count = @repository . changesets . count
@changeset_pages = Paginator . new @changeset_count ,
@changeset_pages = Paginator . new @changeset_count ,
@ -467,8 +585,8 @@ update
def find_repository
def find_repository
@repository = Repository . find ( params [ :id ] )
@repository = Repository . find ( params [ :id ] )
@project = @repository . project
@project = @repository . project
rescue ActiveRecord :: RecordNotFound
rescue ActiveRecord :: RecordNotFound
render_404
render_404
end
end
REV_PARAM_RE = %r{ \ A[a-f0-9]* \ Z }i
REV_PARAM_RE = %r{ \ A[a-f0-9]* \ Z }i