module BuildsHelper
def builds_except_last(project, n)
project.builds.reverse[n..-1]
end
def select_builds(builds)
return "" if !builds || builds.empty?
first = ""
options = builds.map do |build|
selected = build.label == @build.label ? " selected='selected'" : nil
first = nil if selected
""
end
options.unshift first if first
select_tag "build", options, :onChange => "this.form.submit();"
end
def format_build_log(log)
link_to_code(h(log).gsub(/(\d+ tests, \d+ assertions, \d+ failures, \d+ errors)/,
'
\1
'))
end
def link_to_code(log)
@work_path ||= File.expand_path(@project.path + '/work')
log.gsub(/(\#\{RAILS_ROOT\}\/)?([\w\.-]*\/[ \w\/\.-]+)\:(\d+)/) do |match|
path = File.expand_path($2, @work_path)
line = $3
if path.index(@work_path) == 0
path = path[@work_path.size..-1]
link_to match, "/projects/code/#{h @project.name}#{path}?line=#{line}##{line}"
else
match
end
end
end
def format_project_settings(settings)
settings = settings.strip
if settings.empty?
"This project has no custom configuration. Maybe it doesn't need it. " +
"Otherwise, #{link_to('the manual', document_url('manual'))} can tell you how."
else
h(settings)
end
end
def get_test_failures_and_errors_if_any(log)
errors = TestFailureParser.new.get_test_failures(log) + TestErrorParser.new.get_test_errors(log)
return nil if errors.empty?
link_to_code(errors.collect{|error| format_test_error_output(error)}.join)
end
def format_test_error_output(test_error)
message = test_error.message.gsub(/\\n/, "\n");
"Name: #{test_error.test_name}\n" +
"Type: #{test_error.type}\n" +
"Message: #{h message}\n\n" +
"#{h test_error.stacktrace}\n\n\n"
end
def display_build_time
elapsed_time_text = elapsed_time(@build, :precise)
build_time_text = format_time(@build.time, :verbose)
elapsed_time_text.empty? ? "finished at #{build_time_text}" : "finished at #{build_time_text} taking #{elapsed_time_text}"
end
end