Description:
fix bugs: paths, check compilation error, all_tests.cfg.erb git-svn-id: http://theory.cpe.ku.ac.th/grader/cli/trunk/scripts@15 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r3:4a517b89268a - - 4 files changed: 19 inserted, 13 deleted

@@ -0,0 +1,13
1 + problem do
2 + num_tests <%= num_testcases %>
3 + full_score <%= num_testcases*10 %>
4 + time_limit_each <%= options[:time_limit] %>
5 + mem_limit_each <%= options[:mem_limit] %>
6 + score_each 10
7 +
8 + <% 1.upto(num_testcase) do |i| %>
9 + run <%= i %>
10 + tests <%= i %>
11 + end
12 + <% end %>
13 + end
@@ -1,109 +1,111
1 1 #!/usr/bin/ruby
2 2
3 3 def talk(str)
4 4 if TALKATIVE
5 5 puts str
6 6 end
7 7 end
8 8
9 9 def execute(command, error_message="")
10 10 if not system(command)
11 11 puts "ERROR: #{error_message}"
12 12 exit(127)
13 13 end
14 14 end
15 15
16 16 def save_source(submission,dir,fname)
17 17 f = File.open("#{dir}/#{fname}","w")
18 18 f.write(submission.source)
19 19 f.close
20 20 end
21 21
22 22 def call_judge(problem_home,language,problem_out_dir,fname)
23 23 ENV['PROBLEM_HOME'] = problem_home
24 24 Dir.chdir problem_out_dir
25 25 cmd = "#{problem_home}/script/judge #{language} #{fname}"
26 26 # puts "CMD: #{cmd}"
27 27 system(cmd)
28 28 end
29 29
30 30 def read_result(test_result_dir)
31 31 cmp_msg_fname = "#{test_result_dir}/compiler_message"
32 32 cmp_msg = File.open(cmp_msg_fname).read
33 33
34 34 result_fname = "#{test_result_dir}/result"
35 35 comment_fname = "#{test_result_dir}/comment"
36 36 if FileTest.exist?(result_fname)
37 37 result = File.open(result_fname).readline.to_i
38 38 comment = File.open(comment_fname).readline.chomp
39 39 return {:points => result,
40 40 :comment => comment,
41 41 :cmp_msg => cmp_msg}
42 42 else
43 43 return {:points => 0,
44 44 :comment => 'compile error',
45 45 :cmp_msg => cmp_msg}
46 46 end
47 47 end
48 48
49 49 def save_result(submission,result)
50 50 submission.graded_at = Time.now
51 51 submission.points = result[:points]
52 52 submission.grader_comment = report_comment(result[:comment])
53 53 submission.compiler_message = result[:cmp_msg]
54 54 submission.save
55 55 end
56 56
57 57 def grade(submission_id)
58 58 sub = Submission.find(submission_id)
59 59 user = sub.user
60 60 problem = sub.problem
61 61
62 62 language = sub.language.name
63 63 lang_ext = sub.language.ext
64 64 # FIX THIS
65 65 talk 'some hack on language'
66 66 if language == 'cpp'
67 67 language = 'c++'
68 68 end
69 69
70 70 user_dir = "#{USER_RESULT_DIR}/#{user.login}"
71 71 Dir.mkdir(user_dir) if !FileTest.exist?(user_dir)
72 72
73 73 problem_out_dir = "#{user_dir}/#{problem.name}"
74 74 Dir.mkdir(problem_out_dir) if !FileTest.exist?(problem_out_dir)
75 75
76 76 problem_home = "#{PROBLEMS_DIR}/#{problem.name}"
77 77 source_name = "#{problem.name}.#{lang_ext}"
78 78
79 79 save_source(sub,problem_out_dir,source_name)
80 80 call_judge(problem_home,language,problem_out_dir,source_name)
81 81 save_result(sub,read_result("#{problem_out_dir}/test-result"))
82 82 end
83 83
84 84 # reading environment
85 85 GRADER_ENV = 'exam'
86 86 if ARGV.length > 1
87 87 GRADER_ENV = ARGV[1]
88 88 end
89 89 require File.dirname(__FILE__) + "/environment.rb"
90 90
91 91 #main program
92 92
93 93 talk 'Reading rails environment'
94 94
95 95 RAILS_ENV = 'development'
96 96 require RAILS_APP_DIR + '/config/environment'
97 97
98 98 current_dir = `pwd`
99 99
100 100 talk 'Grader queue'
101 + while true
101 102 task = Task.find(:first, :order => 'created_at')
102 103 if task!=nil
103 104 grade(task.submission_id)
104 105 task.destroy
105 106 else
106 - puts "No job"
107 + sleep(1)
108 + end
107 109 end
108 110
109 111
@@ -1,89 +1,80
1 1 #!/usr/bin/ruby
2 2
3 3 # import_problem:
4 4 # * creates a directory for a problem in the current directory,
5 5 # * copy standard scripts
6 6 # * copy testdata in the old format and create standard testcase config file
7 7
8 8 require 'erb'
9 9
10 10 def input_filename(dir,i)
11 11 "#{dir}/input-#{i}.txt"
12 12 end
13 13
14 14 def answer_filename(dir,i)
15 15 "#{dir}/answer-#{i}.txt"
16 16 end
17 17
18 18 def copy_testcase(importing_test_dir,dir,i)
19 19 system("cp #{importing_test_dir}/#{i}.in #{input_filename(dir,i)}")
20 20 system("cp #{importing_test_dir}/#{i}.sol #{answer_filename(dir,i)}")
21 21 end
22 22
23 23 def process_options(options)
24 24 i = 3
25 25 while i<ARGV.length
26 26 if ARGV[i]=='-t'
27 27 options[:time_limit] = ARGV[i+1].to_i if ARGV.length>i+1
28 28 i += 1
29 29 end
30 30 if ARGV[i]=='-m'
31 31 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
32 32 i += 1
33 33 end
34 34 i += 1
35 35 end
36 36 end
37 37
38 38 GRADER_DIR = File.dirname(__FILE__)
39 39
40 40 # print usage
41 41 if ARGV.length < 3
42 42 puts "using: import_task problem importing_testcase_dir number_of_testcase [options]"
43 43 exit(127)
44 44 end
45 45
46 46 # processing arguments
47 47 problem = ARGV[0]
48 48 testcase_dir = ARGV[1]
49 49 num_testcases = ARGV[2].to_i
50 50
51 51 options = {:time_limit => 1, :mem_limit => 16}
52 52 process_options(options)
53 53
54 54 # start working
55 55 puts "creating directories"
56 56
57 57 system("mkdir #{problem}")
58 58 system("mkdir #{problem}/script")
59 59 system("mkdir #{problem}/test_cases")
60 60 system("cp #{GRADER_DIR}/std-script/* #{problem}/script")
61 61
62 62 puts "copying testcases"
63 63
64 64 1.upto(num_testcases) do |i|
65 65 system("mkdir #{problem}/test_cases/#{i}")
66 66 copy_testcase("#{testcase_dir}","#{problem}/test_cases/#{i}",i)
67 67 end
68 68
69 69
70 70 # generating all_tests.cfg
71 71 puts "generating testcase config file"
72 72
73 - template = %q{
74 - problem do
75 - num_tests <%= num_testcases %>
76 - full_score <%= num_testcases*10 %>
77 - time_limit_each <%= options[:time_limit] %>
78 - mem_limit_each <%= options[:mem_limit] %>
79 - score_each 10
80 - end
81 - }
82 -
73 + template = File.open("all_tests.cfg.erb").readlines
83 74 all_test_cfg = ERB.new(template)
84 75
85 - cfg_file = File.open("#{problem}/test_cases/all_test.cfg","w")
76 + cfg_file = File.open("#{problem}/test_cases/all_tests.cfg","w")
86 77 cfg_file.puts all_test_cfg.result
87 78 cfg_file.close
88 79
89 80 puts "done"
@@ -1,114 +1,114
1 1 #!/usr/bin/ruby
2 2
3 3 problem_home = ENV['PROBLEM_HOME']
4 4
5 5 def execute(command, error_message="")
6 6 if not system(command)
7 7 puts "ERROR: #{error_message}"
8 8 exit(127)
9 9 end
10 10 end
11 11
12 12 # ARGV[0] --- language
13 13 # ARGV[1] --- program source file
14 14 # ARGV[2] --- test result directory
15 15 # ARGV[3] --- sandbox directory
16 16
17 17 if ARGV.length < 2 || ARGV.length > 4
18 18 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
19 19 puts " <sandbox-directory> is defaulted to ./sandbox"
20 20 puts " <test-result-directory> is defaulted to ./test-result"
21 21 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
22 22 exit(127)
23 23 end
24 24
25 25 language = ARGV[0]
26 26 if language != "c" && language != "c++" && language != "pascal"
27 27 puts "You specified a language that is not supported."
28 28 exit(127)
29 29 end
30 30
31 31 source_file = ARGV[1]
32 32 if File.exist?(source_file) == false
33 33 puts "The source file does not exist."
34 34 exit(127)
35 35 end
36 36
37 37 puts "Making test result and sandbox directories..."
38 38
39 39 current_dir = `pwd`
40 40 current_dir.strip!
41 41
42 42 if ARGV.length >= 3
43 43 test_result_dir = ARGV[2]
44 44 else
45 45 test_result_dir = "#{current_dir}/test-result"
46 46 end
47 47 puts "Test result directory: #{test_result_dir}"
48 48 system("rm -Rf #{test_result_dir}")
49 49 execute("mkdir #{test_result_dir}", "Cannot make directory #{test_result_dir}.")
50 50
51 51 if ARGV.length >= 4
52 52 sandbox_dir = ARGV[3]
53 53 else
54 54 sandbox_dir = "#{current_dir}/sandbox"
55 55 end
56 56 puts "Sandbox directory: #{sandbox_dir}"
57 57 system("rm -Rf #{sandbox_dir}")
58 58 execute("mkdir #{sandbox_dir}", "Cannot make directory #{sandbox_dir}")
59 59
60 60 # Compile
61 61 puts
62 62 puts "Compiling..."
63 63 execute("cp #{source_file} #{sandbox_dir}", "Cannot copy the source file to #{sandbox_dir}")
64 64 begin
65 65 Dir.chdir sandbox_dir
66 66 rescue
67 67 puts "ERROR: Cannot change directory to #{sandbox_dir}."
68 68 exit(127)
69 69 end
70 70 execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
71 71 compile_message = `cat compiler_message`
72 72 compile_message.strip!
73 73 execute("mv compiler_message #{test_result_dir}", "Cannot move the compiler message to #{test_result_dir}.")
74 - if compile_message != ""
74 + if !FileTest.exist?("a.out")
75 75 puts "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
76 76 exit(127)
77 77 else
78 78 execute("mv a.out #{test_result_dir}", "Cannot move the compiled program to #{test_result_dir}")
79 79 system("rm -Rf #{sandbox_dir}/*")
80 80 end
81 81
82 82 require "#{problem_home}/script/test_dsl.rb"
83 83 load "#{problem_home}/test_cases/all_tests.cfg"
84 84 problem = Problem.get_instance
85 85
86 86 if problem.well_formed? == false
87 87 puts "The problem specification is not well formed."
88 88 exit(127)
89 89 end
90 90
91 91 # Doing the testing.
92 92 (1..(problem.num_tests)).each do |test_num|
93 93 puts
94 94 execute("cp #{test_result_dir}/a.out #{sandbox_dir}", "Cannot copy the compiled program into #{sandbox_dir}")
95 95 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
96 96 execute("mkdir #{test_result_dir}/#{test_num}", "Cannot create directory #{test_result_dir}/#{test_num}")
97 97 execute("mv #{sandbox_dir}/result #{test_result_dir}/#{test_num}", "Cannot copy the result file into #{test_result_dir}/#{test_num}")
98 98 execute("mv #{sandbox_dir}/comment #{test_result_dir}/#{test_num}", "Cannot copy the comment file into #{test_result_dir}/#{test_num}")
99 99 execute("rm -Rf #{sandbox_dir}/*", "Cannot clear #{sandbox_dir}")
100 100 end
101 101
102 102 # Grade
103 103 puts
104 104 puts "Grading..."
105 105 begin
106 106 Dir.chdir test_result_dir
107 107 rescue
108 108 puts "ERROR: Cannot change directory to #{test_result_dir}."
109 109 exit(127)
110 110 end
111 111 execute("#{problem_home}/script/grade", "An error occured during grading!")
112 112
113 113 puts
114 114 puts "All done!"
You need to be logged in to leave comments. Login now