|
|
|
@ -34,7 +34,7 @@ class RepositoriesController < ApplicationController
|
|
|
|
|
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_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
|
|
|
|
|
# hidden repositories filter // 隐藏代码过滤器
|
|
|
|
|
before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ]
|
|
|
|
@ -42,7 +42,7 @@ class RepositoriesController < ApplicationController
|
|
|
|
|
include RepositoriesHelper
|
|
|
|
|
helper :project_score
|
|
|
|
|
#@root_path = RepositoriesHelper::ROOT_PATH
|
|
|
|
|
|
|
|
|
|
$g=Gitlab.client
|
|
|
|
|
|
|
|
|
|
rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed
|
|
|
|
|
def new
|
|
|
|
@ -63,6 +63,78 @@ 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
|
|
|
|
|
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
|
|
|
|
|
scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first
|
|
|
|
@ -115,21 +187,27 @@ update
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def create
|
|
|
|
|
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)
|
|
|
|
|
# 判断版本库创建者是否有同名版本库,避免版本库路径一致问题
|
|
|
|
|
unless is_sigle_identifier?(@project.user_id, params[:repository].first[1])
|
|
|
|
|
flash[:notice] = l(:project_gitlab_create_double_message)
|
|
|
|
|
redirect_to settings_project_url(@project, :tab => 'repositories')
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
@ -237,14 +315,34 @@ update
|
|
|
|
|
#Modified by young
|
|
|
|
|
# (show_error_not_found; return) unless @entries
|
|
|
|
|
g = Gitlab.client
|
|
|
|
|
count = 0
|
|
|
|
|
(0..100).each do |page|
|
|
|
|
|
if g.commits(@project.gpid,:page => page).count == 0
|
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
count = count + g.commits(@project.gpid,:page => page).count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# count = 0
|
|
|
|
|
# (0..100).each do |page|
|
|
|
|
|
# if g.commits(@project.gpid,:page => page).count == 0
|
|
|
|
|
# break
|
|
|
|
|
# else
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
|
|
@changesets = g.commits(@project.gpid)
|
|
|
|
|
# @changesets = @repository.latest_changesets(@path, @rev)
|
|
|
|
|
# @changesets_count = @repository.latest_changesets(@path, @rev).count
|
|
|
|
@ -271,11 +369,30 @@ update
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
@entry = @repository.entry(@path, @rev)
|
|
|
|
|
(show_error_not_found; return) unless @entry
|
|
|
|
|
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)
|
|
|
|
|
# @changesets = g.get ("/projects/#{@project.gpid}/repository/commits?#{@rev}")
|
|
|
|
|
#@changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
|
|
|
|
@ -284,6 +401,7 @@ update
|
|
|
|
|
render :layout => 'base_projects'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def revisions
|
|
|
|
|
@changeset_count = @repository.changesets.count
|
|
|
|
|
@changeset_pages = Paginator.new @changeset_count,
|
|
|
|
@ -467,8 +585,8 @@ update
|
|
|
|
|
def find_repository
|
|
|
|
|
@repository = Repository.find(params[:id])
|
|
|
|
|
@project = @repository.project
|
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
|
render_404
|
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
|
render_404
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i
|
|
|
|
|