2017-04-07 10:16:13 +08:00
|
|
|
|
#coding=utf-8
|
|
|
|
|
|
class GamesController < ApplicationController
|
|
|
|
|
|
layout "base_myshixun"
|
|
|
|
|
|
skip_before_filter :verify_authenticity_token, :only => [:file_update]
|
|
|
|
|
|
before_filter :find_myshixun, :only => [:index]
|
|
|
|
|
|
before_filter :find_game, :only => [:show, :game_build, :entry,:next_step, :outputs_show, :file_edit, :file_update, :game_status, :change_status]
|
|
|
|
|
|
before_filter :find_repository, :only => [:show, :entry, :file_edit, :file_update]
|
|
|
|
|
|
before_filter :allowd_manager
|
|
|
|
|
|
before_filter :allowd_view, :only => [:show]
|
|
|
|
|
|
before_filter :find__shixun_language, :only => [:show, :entry]
|
|
|
|
|
|
include ApplicationHelper
|
|
|
|
|
|
|
|
|
|
|
|
def index
|
|
|
|
|
|
@games = @myshixun.games.includes(:challenge)
|
|
|
|
|
|
@games_count = @games.count
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
|
|
format.html
|
|
|
|
|
|
format.js
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# mushixun的版本库必须创建时就创建
|
|
|
|
|
|
# 首次进入版本库自动打开文件
|
|
|
|
|
|
# path:"" && path: @game.path
|
|
|
|
|
|
def show
|
|
|
|
|
|
@game_challenge = @game.challenge
|
|
|
|
|
|
logger.info("test ................#{@game_challenge.id}")
|
|
|
|
|
|
game_path = (@game_challenge.path.blank? ? @path : @game_challenge.path.strip)
|
|
|
|
|
|
logger.info("test game_path ................#{game_path}")
|
|
|
|
|
|
@rev = @rev.nil? ? "master" : @rev
|
|
|
|
|
|
@git_url = git_repository_url(@myshixun, "Myshixun")
|
|
|
|
|
|
@type = params[:type]
|
|
|
|
|
|
logger.info("##########************languae is #{@language}")
|
|
|
|
|
|
logger.info("out is666************#{@path} ")
|
|
|
|
|
|
# 默认打开文件
|
|
|
|
|
|
if @path == "" && !game_path.nil? && !@repository.cat(game_path, @rev).blank? && @type != "root"
|
|
|
|
|
|
@path = game_path
|
|
|
|
|
|
@file_open = true
|
|
|
|
|
|
logger.info("666666666666************languae ")
|
|
|
|
|
|
logger.info("path is666************#{@path} ")
|
|
|
|
|
|
@content = @repository.cat(@path, @rev)
|
|
|
|
|
|
logger.info("666666666666************languae is #{@content}")
|
|
|
|
|
|
else
|
|
|
|
|
|
logger.info("77777************languae ")
|
|
|
|
|
|
@entries = @repository.entries(@path, @rev)
|
|
|
|
|
|
logger.info("7777************#{@entries} ")
|
|
|
|
|
|
end
|
|
|
|
|
|
logger.info("88888************#{@entries} ")
|
2017-04-13 13:45:11 +08:00
|
|
|
|
@test_cases = @game_challenge.test_sets
|
2017-04-14 08:39:09 +08:00
|
|
|
|
@error_position = @test_cases.each_with_index { |test_case, index| test_case.result == 0 }
|
2017-04-13 14:29:33 +08:00
|
|
|
|
@test_cases_count = @test_cases.count
|
2017-04-07 10:16:13 +08:00
|
|
|
|
(@myshixun.games.count == @game_challenge.position && @game.status ==2) ? @had_done = 1 : @had_done = 0
|
|
|
|
|
|
if outputs.count == 0
|
|
|
|
|
|
@results = []
|
|
|
|
|
|
else
|
|
|
|
|
|
@results = outputs.map{|result| [result.code, result.id]}
|
|
|
|
|
|
end
|
|
|
|
|
|
logger.info("##################languae is #{@language}")
|
|
|
|
|
|
logger.info("##################latest_output is #{@latest_output}")
|
|
|
|
|
|
logger.info("##################had_done is #{@had_done}")
|
|
|
|
|
|
logger.info("##################status is #{@game.status}")
|
|
|
|
|
|
logger.info("##################result is #{@results}")
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
|
|
format.html
|
|
|
|
|
|
format.js
|
|
|
|
|
|
end
|
|
|
|
|
|
rescue Exception => e
|
|
|
|
|
|
flash[:error] = e.message
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# 代码预览
|
|
|
|
|
|
def entry
|
|
|
|
|
|
entry_and_raw(false)
|
|
|
|
|
|
@content = @repository.cat(@path, @rev)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def file_edit
|
|
|
|
|
|
# entry_and_raw(false)
|
|
|
|
|
|
# @content = @repository.cat(@path, @rev).strip
|
|
|
|
|
|
# # respond_to do |format|
|
|
|
|
|
|
# # format.js
|
|
|
|
|
|
# end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def file_update
|
|
|
|
|
|
@g = Gitlab.client
|
|
|
|
|
|
content = params[:content].strip
|
|
|
|
|
|
@g.edit_file(@myshixun.gpid, :content => params[:content], :file_path => @path, :branch_name => @rev, :commit_message => "shixun exec")
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
|
|
format.js{redirect_to entry_myshixun_game_path(@game, :myshixun_id => @myshixun, :path => @path)}
|
|
|
|
|
|
end
|
|
|
|
|
|
rescue Exception => e
|
|
|
|
|
|
puts e.message
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# json调用,显示左边的隐藏具体详情@game 字段 msg
|
|
|
|
|
|
# 刷新右边的输出结果 @game out_put
|
|
|
|
|
|
def outputs_show
|
|
|
|
|
|
@output = Output.find(params[:game_output_id])
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
|
|
format.js
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# status 0: 未提交测评或者提交测评失败后报错;1:中间状态还没返回值;2:返回值并成功
|
|
|
|
|
|
def game_build
|
|
|
|
|
|
game_challenge = @game.challenge
|
|
|
|
|
|
gitUrl = git_repository_url(@myshixun, "Myshixun")
|
|
|
|
|
|
gitUrl = Base64.encode64(gitUrl)
|
|
|
|
|
|
taskId = params[:id]
|
|
|
|
|
|
jobName = "myshixun_#{@myshixun.id}"
|
|
|
|
|
|
ActiveRecord::Base.transaction do
|
|
|
|
|
|
@game.update_attributes!(:status => 1)
|
|
|
|
|
|
testCode = {}
|
|
|
|
|
|
test_sets = game_challenge.test_sets
|
|
|
|
|
|
unless test_sets.blank?
|
|
|
|
|
|
test_sets.each_with_index do |test_set, index|
|
|
|
|
|
|
testCode.store("testCode_#{index}",test_set.try(:output))
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
testCode = testCode.to_json
|
|
|
|
|
|
jenkins_shixuns = Redmine::Configuration['jenkins_shixuns']
|
|
|
|
|
|
step = game_challenge.try(:position)
|
|
|
|
|
|
params = {:jobName => "#{jobName}", :taskId => "#{taskId}", :step => "#{step}", :gitUrl => "#{gitUrl}", :testCode => "#{testCode}"}
|
|
|
|
|
|
uri = URI("#{jenkins_shixuns}/jenkins-exec/api/buildJob")
|
|
|
|
|
|
res = uri_exec uri, params
|
|
|
|
|
|
if (res && res['code'] != 0)
|
|
|
|
|
|
raise("Build job failed")
|
|
|
|
|
|
end
|
|
|
|
|
|
render :json => {data:"success"}
|
|
|
|
|
|
end
|
|
|
|
|
|
rescue
|
|
|
|
|
|
raise ActiveRecord::Rollback
|
|
|
|
|
|
redirect_to myshixun_game_path(@game, :myshixun_id => @myshixun)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def game_status
|
|
|
|
|
|
outputs = @game.outputs
|
|
|
|
|
|
game_challenge = @game.challenge
|
|
|
|
|
|
if outputs.count == 0
|
|
|
|
|
|
outputs = ""
|
|
|
|
|
|
else
|
|
|
|
|
|
outputs = outputs.map{|result| [result.code, result.id]}
|
|
|
|
|
|
end
|
|
|
|
|
|
(@myshixun.games.count == game_challenge.position && @game.status ==2) ? had_done = 1 : had_done = 0
|
|
|
|
|
|
|
|
|
|
|
|
# 下一关自动开启
|
|
|
|
|
|
if had_done != 1 && @game.status == 2
|
|
|
|
|
|
@game.next_game.update_attribute(:status, 0)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
latest_output = @game.latest_output.try(:out_put)
|
|
|
|
|
|
render :json => {status: @game.status, output: latest_output, results: outputs, had_done: had_done}
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def change_status
|
|
|
|
|
|
@game.update_attribute(:status, 0)
|
|
|
|
|
|
outputs = @game.outputs
|
|
|
|
|
|
if outputs.count == 0
|
|
|
|
|
|
outputs = ""
|
|
|
|
|
|
else
|
|
|
|
|
|
outputs = outputs.map{|result| [result.code, result.id]}
|
|
|
|
|
|
end
|
|
|
|
|
|
render :json => {status: @game.status, output: "服务器网络异常", results: outputs, had_done: 0}
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# 自动推送下一个任务
|
|
|
|
|
|
def next_step
|
|
|
|
|
|
render_403 if @game.status != 2
|
|
|
|
|
|
next_game = @game.next_game
|
|
|
|
|
|
next_game.update_attribute(:status, 0) if next_game.status == 3
|
|
|
|
|
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
|
|
format.js{redirect_to myshixun_game_path(next_game, :myshixun_id => @myshixun.id)}
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
def entry_and_raw(is_raw)
|
|
|
|
|
|
@entry = @repository.entry(@path, @rev)
|
|
|
|
|
|
(show_error_not_found; return) unless @entry
|
|
|
|
|
|
|
|
|
|
|
|
# If the entry is a dir, show the browser
|
|
|
|
|
|
(show; return) if @entry.is_dir?
|
|
|
|
|
|
|
|
|
|
|
|
@content = @repository.cat(@path, @rev)
|
|
|
|
|
|
(show_error_not_found; return) unless @content
|
|
|
|
|
|
if is_raw || (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) || !is_entry_text_data?(@content, @path)
|
|
|
|
|
|
# Force the download
|
|
|
|
|
|
send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) }
|
|
|
|
|
|
send_type = Redmine::MimeType.of(@path)
|
|
|
|
|
|
send_opt[:type] = send_type.to_s if send_type
|
|
|
|
|
|
send_opt[:disposition] = (Redmine::MimeType.is_type?('image', @path) && !is_raw ? 'inline' : 'attachment')
|
|
|
|
|
|
send_data @content, send_opt
|
|
|
|
|
|
else
|
|
|
|
|
|
# Prevent empty lines when displaying a file with Windows style eol
|
|
|
|
|
|
# TODO: UTF-16
|
|
|
|
|
|
# Is this needs? AttachmentsController reads file simply.
|
|
|
|
|
|
@content.gsub!("\r\n", "\n")
|
|
|
|
|
|
@changeset = @repository.find_changeset_by_name(@rev)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def is_entry_text_data?(ent, path)
|
|
|
|
|
|
# UTF-16 contains "\x00".
|
|
|
|
|
|
# It is very strict that file contains less than 30% of ascii symbols
|
|
|
|
|
|
# in non Western Europe.
|
|
|
|
|
|
return true if Redmine::MimeType.is_type?('text', path)
|
|
|
|
|
|
# Ruby 1.8.6 has a bug of integer divisions.
|
|
|
|
|
|
# http://apidock.com/ruby/v1_8_6_287/String/is_binary_data%3F
|
|
|
|
|
|
return false if ent.is_binary_data?
|
|
|
|
|
|
true
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def find_repository
|
|
|
|
|
|
@repository = @myshixun.repository
|
|
|
|
|
|
render_404 if @myshixun.gpid.nil?
|
|
|
|
|
|
@path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s
|
|
|
|
|
|
@g = Gitlab.client
|
|
|
|
|
|
@g_project = @g.project(@myshixun.gpid)
|
|
|
|
|
|
@g_default_branch = @g_project.default_branch
|
|
|
|
|
|
# gitlab端获取默认分支
|
|
|
|
|
|
@rev = params[:rev].blank? ? @g_default_branch : params[:rev].to_s.strip
|
|
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
|
|
render_404
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def allowd_manager
|
|
|
|
|
|
render_403 unless (User.current.manager_of_myshixun?(@myshixun) || User.current.admin? || User.current.id == @myshixun.shixun.try(:user_id))
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# 判断成员是否允许查看
|
|
|
|
|
|
def allowd_view
|
|
|
|
|
|
render_403 if @game.status == 3
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def find__shixun_language
|
|
|
|
|
|
language = @myshixun.shixun.try(:language)
|
|
|
|
|
|
@language = language_switch(language)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# Find myshixun of id params[:id]
|
|
|
|
|
|
def find_myshixun
|
|
|
|
|
|
myshixun_id = params[:myshixun_id] || (params[:game] && params[:game][:myshixun_id])
|
|
|
|
|
|
@myshixun = Myshixun.find(myshixun_id)
|
|
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
|
|
render_404
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def find_game
|
|
|
|
|
|
@game = Game.find(params[:id])
|
|
|
|
|
|
@myshixun = @game.myshixun
|
|
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
|
|
render_404
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|