Description:
git-svn-id: http://theory.cpe.ku.ac.th/grader/cli/trunk/scripts@20 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

r7:d40f897fb488 - - 3 files changed: 33 inserted, 8 deleted

@@ -12,86 +12,105
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 +
25 + puts problem_out_dir
24 26 Dir.chdir problem_out_dir
25 27 cmd = "#{problem_home}/script/judge #{language} #{fname}"
26 28 # puts "CMD: #{cmd}"
27 29 system(cmd)
28 30 end
29 31
30 32 def read_result(test_result_dir)
31 33 cmp_msg_fname = "#{test_result_dir}/compiler_message"
32 - cmp_msg = File.open(cmp_msg_fname).read
34 + cmp_file = File.open(cmp_msg_fname)
35 + cmp_msg = cmp_file.read
36 + cmp_file.close
33 37
34 38 result_fname = "#{test_result_dir}/result"
35 39 comment_fname = "#{test_result_dir}/comment"
36 40 if FileTest.exist?(result_fname)
37 - result = File.open(result_fname).readline.to_i
38 - comment = File.open(comment_fname).readline.chomp
41 + result_file = File.open(result_fname)
42 + result = result_file.readline.to_i
43 + result_file.close
44 +
45 + comment_file = File.open(comment_fname)
46 + comment = comment_file.readline.chomp
47 + comment_file.close
48 +
39 49 return {:points => result,
40 50 :comment => comment,
41 51 :cmp_msg => cmp_msg}
42 52 else
43 53 return {:points => 0,
44 54 :comment => 'compile error',
45 55 :cmp_msg => cmp_msg}
46 56 end
47 57 end
48 58
49 59 def save_result(submission,result)
60 + problem = Problem.find(submission.problem_id)
50 61 submission.graded_at = Time.now
51 62 submission.points = result[:points]
52 - submission.grader_comment = report_comment(result[:comment])
63 + if submission.points == problem.full_score
64 + submission.grader_comment = 'PASSED: ' + report_comment(result[:comment])
65 + else
66 + submission.grader_comment = 'FAILED: ' + report_comment(result[:comment])
67 + end
53 68 submission.compiler_message = result[:cmp_msg]
54 69 submission.save
55 70 end
56 71
57 72 def grade(submission_id)
73 + current_dir = `pwd`.chomp
74 +
58 75 sub = Submission.find(submission_id)
59 76 user = sub.user
60 77 problem = sub.problem
61 78
62 79 language = sub.language.name
63 80 lang_ext = sub.language.ext
64 81 # FIX THIS
65 82 talk 'some hack on language'
66 83 if language == 'cpp'
67 84 language = 'c++'
68 85 end
69 86
70 87 user_dir = "#{USER_RESULT_DIR}/#{user.login}"
71 88 Dir.mkdir(user_dir) if !FileTest.exist?(user_dir)
72 89
73 90 problem_out_dir = "#{user_dir}/#{problem.name}"
74 91 Dir.mkdir(problem_out_dir) if !FileTest.exist?(problem_out_dir)
75 92
76 93 problem_home = "#{PROBLEMS_DIR}/#{problem.name}"
77 94 source_name = "#{problem.name}.#{lang_ext}"
78 95
79 96 save_source(sub,problem_out_dir,source_name)
80 97 call_judge(problem_home,language,problem_out_dir,source_name)
81 98 save_result(sub,read_result("#{problem_out_dir}/test-result"))
99 +
100 + Dir.chdir(current_dir)
82 101 end
83 102
84 103 def stop_grader
85 - File.open(File.dirname(__FILE__) + '/stop','w')
104 + File.open(File.dirname(__FILE__) + '/stop','w').close
86 105 end
87 106
88 107 def check_stopfile
89 108 FileTest.exist?(File.dirname(__FILE__) + '/stop')
90 109 end
91 110
92 111 def clear_stopfile
93 112 system("rm " + File.dirname(__FILE__) + '/stop')
94 113 end
95 114
96 115 # reading environment and options
97 116 if (ARGV.length >= 1) and (ARGV[0]=='stop')
@@ -112,26 +131,24
112 131 GRADER_ENV = 'exam'
113 132 end
114 133
115 134 puts "environment: #{GRADER_ENV}"
116 135 require File.dirname(__FILE__) + "/environment.rb"
117 136
118 137 #main program
119 138 talk 'Reading rails environment'
120 139
121 140 RAILS_ENV = 'development'
122 141 require RAILS_APP_DIR + '/config/environment'
123 142
124 - current_dir = `pwd`
125 -
126 143 talk 'Grader queue'
127 144 while true
128 145 if check_stopfile # created by calling grader stop
129 146 clear_stopfile
130 147 puts "stopped"
131 148 exit(0)
132 149 end
133 150
134 151 task = Task.find(:first, :order => 'created_at')
135 152 if task!=nil
136 153 grade(task.submission_id)
137 154 task.destroy
@@ -29,25 +29,29
29 29 run_score = 0
30 30 run_comment = ''
31 31 run.tests.each do |test_num|
32 32 result_file_name = "#{test_num}/result"
33 33 if not File.exists?(result_file_name)
34 34 puts "Cannot find the file #{test_num}/result!"
35 35 exit(127)
36 36 end
37 37
38 38 result_file = File.new(result_file_name, "r")
39 39 result_file_lines = result_file.readlines
40 40 run_score = run_score + result_file_lines[1].to_i
41 - run_comment += char_comment(result_file_lines[0])
41 + # run_comment += char_comment(result_file_lines[0])
42 + result_file_lines.each do |l|
43 + run_comment += l
44 + end
45 + run_comment += "----\n"
42 46 result_file.close
43 47 end
44 48
45 49 run_result_file = File.new("result-#{k}", "w")
46 50 run_result_file.write run_score
47 51 run_result_file.write "\n"
48 52 run_result_file.close
49 53
50 54 run_comment_file = File.new("comment-#{k}", "w")
51 55 run_comment_file.write "#{run_comment}\n"
52 56 run_comment_file.close
53 57
@@ -63,24 +63,28
63 63 report = lambda{ |status, points, comment|
64 64 result_file.write status.strip
65 65 result_file.write "\n"
66 66 result_file.write points.to_s.strip
67 67 result_file.write "\n"
68 68 result_file.write time_elapsed.strip
69 69 result_file.write "\n"
70 70 result_file.close
71 71 `rm run_result`
72 72 `rm output.txt`
73 73
74 74 comment_file.write comment
75 + comment_file.write "--run-result--\n"
76 + run_result.each do |l|
77 + comment_file.write l
78 + end
75 79 comment_file.close
76 80
77 81 puts
78 82 puts "Done!"
79 83 exit(0)
80 84 }
81 85
82 86 if run_result[0][0,2] != "OK"
83 87 puts "There was a runtime error."
84 88 report.call(run_result[0], 0, "No comment.\n")
85 89 end
86 90
You need to be logged in to leave comments. Login now