socialforge/app/helpers/repositories_helper.rb

414 lines
15 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# encoding: utf-8
#
# Redmine - project management software
# Copyright (C) 2006-2013 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module RepositoriesHelper
if Rails.env.development?
ROOT_PATH="/private/tmp/"
else
ROOT_PATH="/home/pdl/redmine-2.3.2-0/apache2/"
end
PROJECT_PATH_CUT = 40
REPO_IP_ADDRESS = Setting.host_repository
REPO_GITLAB_ADDRESS = "git.trustie.net"
# 获取某次提交的关联Issue
# REDO:一次关联查询
# type为true则为详情页面全部显示
def get_commit_issues commit_id, project_id, type
commit_issues = CommitIssues.where(:commit_id => commit_id, :project_id => project_id)
unless commit_issues.blank?
if commit_issues.count > 2 && type != 1
result = commit_issues.map{|commit_issue| commit_issue.issue_id}.first(2) << "more"
else
result = commit_issues.map{|commit_issue| commit_issue.issue_id}
end
end
return result unless result.blank?
end
# 因为gitlab的提交总数不是实时同步的说以取总数用两种方法
def choise_commit_count git_count, pro_count
git_count > pro_count ? git_count : pro_count
end
# 某个成员不能拥有同名版本库,不同的成员可以创建同名版本库
def is_sigle_identifier?(user_id, iden)
projects = Project.where("user_id =?",user_id)
identifiers = []
projects.each do |project|
# 只针对gitlab类型的git类型的后期清掉
repository = Repository.where("project_id =? and type =?", project.id, "Repository::Gitlab").first
if repository
identifiers << repository.identifier
end
end
identifiers.include?(iden) ? false :true
end
def quality_analysis login, rep_id
long_rep_id = "#{login}:#{rep_id}"
QualityAnalysis.where(:sonar_name => long_rep_id).first
end
# 获取文件目录的最新动态
def get_trees_last_changes(gpid, rev, ent_name, g)
begin
tree_changes = g.rep_last_changes(gpid, :rev => rev, :path => ent_name)
rescue Exception => e
puts e
end
end
def translate_time time
case time
when time.include("")
end
end
# 获取diff内容行号
def diff_line_num content
content.scan(/@@ -(\d+),\d+ \+\d+,\d+ @@/).first.nil? ? "" : content.scan(/@@ -(\d+),\d+ \+\d+,\d+ @@/).first.join("").to_i
end
# 处理内容
def diff_content content
content.gsub!(/.*@@ -\d+,\d+ \+\d+,\d+ @@\n/m,'')
end
def format_revision(revision)
if revision.respond_to? :format_identifier
revision.format_identifier
else
revision.to_s
end
end
def repository_creater rep
repository_creater = User.find_by_login(rep.login) unless rep.login.nil?
end
def truncate_at_line_break(text, length = 255)
if text
text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...')
end
end
def user_commit_rep(mail)
user = User.find_by_mail(mail)
#user.nil? ? User.find(2) : User.find_by_mail(mail)
end
def render_properties(properties)
unless properties.nil? || properties.empty?
content = ''
properties.keys.sort.each do |property|
content << content_tag('li', "<b>#{h property}</b>: <span>#{h properties[property]}</span>".html_safe)
end
content_tag('ul', content.html_safe, :class => 'properties')
end
end
def render_changeset_changes
changes = @changeset.filechanges.limit(1000).reorder('path').all.collect do |change|
case change.action
when 'A'
# Detects moved/copied files
if !change.from_path.blank?
change.action =
@changeset.filechanges.detect {|c| c.action == 'D' && c.path == change.from_path} ? 'R' : 'C'
end
change
when 'D'
@changeset.filechanges.detect {|c| c.from_path == change.path} ? nil : change
else
change
end
end.compact
tree = { }
changes.each do |change|
p = tree
dirs = change.path.to_s.split('/').select {|d| !d.blank?}
path = ''
dirs.each do |dir|
path += '/' + dir
p[:s] ||= {}
p = p[:s]
p[path] ||= {}
p = p[path]
end
p[:c] = change
end
render_changes_tree(tree[:s])
end
def render_changes_tree(tree)
return '' if tree.nil?
output = ''
output << '<ul>'
tree.keys.sort.each do |file|
style = 'change'
text = File.basename(h(file))
if s = tree[file][:s]
style << ' folder'
path_param = to_path_param(@repository.relative_path(file))
text = link_to(h(text), :controller => 'repositories',
:action => 'show',
:id => @project,
:repository_id => @repository.identifier_param,
:path => path_param,
:rev => @changeset.identifier)
output << "<li class='#{style}'>#{text}"
output << render_changes_tree(s)
output << "</li>"
elsif c = tree[file][:c]
style << " change-#{c.action}"
path_param = to_path_param(@repository.relative_path(c.path))
text = link_to(h(text), :controller => 'repositories',
:action => 'entry',
:id => @project,
:repository_id => @repository.identifier_param,
:path => path_param,
:rev => @changeset.identifier) unless c.action == 'D'
text << " - #{h(c.revision)}" unless c.revision.blank?
text << ' ('.html_safe + link_to(l(:label_diff), :controller => 'repositories',
:action => 'diff',
:id => @project,
:repository_id => @repository.identifier_param,
:path => path_param,
:rev => @changeset.identifier) + ') '.html_safe if c.action == 'M'
text << ' '.html_safe + content_tag('span', h(c.from_path), :class => 'copied-from') unless c.from_path.blank?
output << "<li class='#{style}'>#{text}</li>"
end
end
output << '</ul>'
output.html_safe
end
def repository_field_tags(form, repository)
method = repository.class.name.demodulize.underscore + "_field_tags"
if repository.is_a?(Repository) &&
respond_to?(method) && method != 'repository_field_tags'
send(method, form, repository)
end
end
# by xianbo
def repository_field_tags_new(form, repository)
method = repository.class.name.demodulize.underscore + "_field_tags_new"
if repository.is_a?(Repository) &&
respond_to?(method) && method != 'repository_field_tags_new'
send(method, form, repository)
end
end
def scm_select_tag(repository)
scm_options = [["--- #{l(:actionview_instancetag_blank_option)} ---", '']]
#Modified by tanxianbo
Redmine::Scm::Base.all.each do |scm|
if Setting.enabled_scm.include?(scm) ||
(repository && repository.class.name.demodulize == scm)
scm_options << ["Repository::#{scm}".constantize.scm_name, scm]
end
end
# Ended by tanxianbo
select_tag('repository_scm',
options_for_select(scm_options, repository.class.name.demodulize),
:disabled => (repository && !repository.new_record?),
:data => {:remote => true, :method => 'get'})
end
def with_leading_slash(path)
path.to_s.starts_with?('/') ? path : "/#{path}"
end
def without_leading_slash(path)
path.gsub(%r{^/+}, '')
end
def subversion_field_tags(form, repository)
content_tag('p', form.text_field(:url, :size => 60, :required => true,
:disabled => !repository.safe_attribute?('url')) +
'<br />'.html_safe +
"<em class='info'>".html_safe+"#{l(:label_exist_repository_path)}"+"</em>".html_safe) +
content_tag('p', form.text_field(:login, :size => 30))+
content_tag('p', form.password_field(
:password, :size => 30, :name => 'ignore',
:value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
:onfocus => "this.value=''; this.name='repository[password]';",
:onchange => "this.name='repository[password]';"))
end
# by xianbo
def subversion_field_tags_new(form, repository)
end
# def darcs_field_tags(form, repository)
# content_tag('p', form.text_field(
# :url, :label => l(:field_path_to_repository),
# :size => 60, :required => true,
# :disabled => !repository.safe_attribute?('url'))) +
# content_tag('p', form.select(
# :log_encoding, [nil] + Setting::ENCODINGS,
# :label => l(:field_commit_logs_encoding), :required => true))
# end
# def mercurial_field_tags(form, repository)
# content_tag('p', form.text_field(
# :url, :label => l(:field_path_to_repository),
# :size => 60, :required => true,
# :disabled => !repository.safe_attribute?('url')
# ) +
# '<br />'.html_safe + l(:text_mercurial_repository_note)) +
# content_tag('p', form.select(
# :path_encoding, [nil] + Setting::ENCODINGS,
# :label => l(:field_scm_path_encoding)
# ) +
# '<br />'.html_safe + l(:text_scm_path_encoding_note))
# end
def git_field_tags(form, repository)
# content_tag('p', form.text_field(
# :url, :label => l(:field_path_to_repository),
# :size => 60, :required => true,
# :disabled => !repository.safe_attribute?('url')
# ) +
# '<br />'.html_safe +
# l(:text_git_repository_note)) +
content_tag('p', form.select(
:path_encoding, [nil] + Setting::ENCODINGS,
:label => l(:field_scm_path_encoding)
) +
'<br />'.html_safe + l(:text_scm_path_encoding_note)) +
content_tag('p', form.check_box(
:extra_report_last_commit,
:label => l(:label_git_report_last_commit)
))
end
# by xianbo
def git_field_tags_new(form, repository)
content_tag('p', form.check_box(
:extra_report_last_commit,
:label => l(:label_git_report_last_commit)
))
end
# 判断项目是否有主版本库
def judge_main_repository(pro)
if pro.repositories.blank?
status = false
else
pro.repositories.each do |rep|
status = true and break if rep.is_default?
status = false
end
end
status
end
# def cvs_field_tags(form, repository)
# content_tag('p', form.text_field(
# :root_url,
# :label => l(:field_cvsroot),
# :size => 60, :required => true,
# :disabled => !repository.safe_attribute?('root_url'))) +
# content_tag('p', form.text_field(
# :url,
# :label => l(:field_cvs_module),
# :size => 30, :required => true,
# :disabled => !repository.safe_attribute?('url'))) +
# content_tag('p', form.select(
# :log_encoding, [nil] + Setting::ENCODINGS,
# :label => l(:field_commit_logs_encoding), :required => true)) +
# content_tag('p', form.select(
# :path_encoding, [nil] + Setting::ENCODINGS,
# :label => l(:field_scm_path_encoding)
# ) +
# '<br />'.html_safe + l(:text_scm_path_encoding_note))
# end
# def bazaar_field_tags(form, repository)
# content_tag('p', form.text_field(
# :url, :label => l(:field_path_to_repository),
# :size => 60, :required => true,
# :disabled => !repository.safe_attribute?('url'))) +
# content_tag('p', form.select(
# :log_encoding, [nil] + Setting::ENCODINGS,
# :label => l(:field_commit_logs_encoding), :required => true))
# end
def filesystem_field_tags(form, repository)
content_tag('p', form.text_field(
:url, :label => l(:field_root_directory),
:size => 60, :required => true,
:disabled => !repository.safe_attribute?('url'))) +
content_tag('p', form.select(
:path_encoding, [nil] + Setting::ENCODINGS,
:label => l(:field_scm_path_encoding)
) +
'<br />'.html_safe + l(:text_scm_path_encoding_note))
end
def index_commits(commits, heads)
return nil if commits.nil? or commits.first.parents.nil?
refs_map = {}
heads.each do |head|
refs_map[head.scmid] ||= []
refs_map[head.scmid] << head
end
commits_by_scmid = {}
commits.reverse.each_with_index do |commit, commit_index|
commits_by_scmid[commit.scmid] = {
:parent_scmids => commit.parents.collect { |parent| parent.scmid },
:rdmid => commit_index,
:refs => refs_map.include?(commit.scmid) ? refs_map[commit.scmid].join(" ") : nil,
:scmid => commit.scmid,
:href => block_given? ? yield(commit.scmid) : commit.scmid
}
end
heads.sort! { |head1, head2| head1.to_s <=> head2.to_s }
space = nil
heads.each do |head|
if commits_by_scmid.include? head.scmid
space = index_head((space || -1) + 1, head, commits_by_scmid)
end
end
# when no head matched anything use first commit
space ||= index_head(0, commits.first, commits_by_scmid)
return commits_by_scmid, space
end
def index_head(space, commit, commits_by_scmid)
stack = [[space, commits_by_scmid[commit.scmid]]]
max_space = space
until stack.empty?
space, commit = stack.pop
commit[:space] = space if commit[:space].nil?
space -= 1
commit[:parent_scmids].each_with_index do |parent_scmid, parent_index|
parent_commit = commits_by_scmid[parent_scmid]
if parent_commit and parent_commit[:space].nil?
stack.unshift [space += 1, parent_commit]
end
end
max_space = space if max_space < space
end
max_space
end
end