Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading)
(mercurial grafted from d233105d3965c5368c9b33125f390e39b25f910e)
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r181:5c6f0b732e70 - - 2 files changed: 30 inserted, 30 deleted
@@ -349,25 +349,25 | |||||
|
349 |
|
349 | ||
|
350 | def grader_grade_submissions(grader_proc, options) |
|
350 | def grader_grade_submissions(grader_proc, options) |
|
351 | engine = Grader::Engine.new |
|
351 | engine = Grader::Engine.new |
|
352 | runner = Grader::Runner.new(engine, grader_proc) |
|
352 | runner = Grader::Runner.new(engine, grader_proc) |
|
353 |
|
353 | ||
|
354 | grader_proc.report_active if grader_proc!=nil |
|
354 | grader_proc.report_active if grader_proc!=nil |
|
355 |
|
355 | ||
|
356 | ARGV.each do |sub_id| |
|
356 | ARGV.each do |sub_id| |
|
357 | puts "Grading #{sub_id}" |
|
357 | puts "Grading #{sub_id}" |
|
358 | begin |
|
358 | begin |
|
359 | submission = Submission.find(sub_id.to_i) |
|
359 | submission = Submission.find(sub_id.to_i) |
|
360 | rescue ActiveRecord::RecordNotFound |
|
360 | rescue ActiveRecord::RecordNotFound |
|
361 |
- puts " |
|
361 | + puts "Submission #{sub_id} not found" |
|
362 | submission = nil |
|
362 | submission = nil |
|
363 | end |
|
363 | end |
|
364 |
|
364 | ||
|
365 | if submission!=nil |
|
365 | if submission!=nil |
|
366 | runner.grade_submission(submission) |
|
366 | runner.grade_submission(submission) |
|
367 | end |
|
367 | end |
|
368 | end |
|
368 | end |
|
369 | end |
|
369 | end |
|
370 |
|
370 | ||
|
371 | ######################################### |
|
371 | ######################################### |
|
372 | # main program |
|
372 | # main program |
|
373 | ######################################### |
|
373 | ######################################### |
@@ -27,85 +27,85 | |||||
|
27 | @room_maker = options[:room_maker] |
|
27 | @room_maker = options[:room_maker] |
|
28 | @reporter = options[:reporter] |
|
28 | @reporter = options[:reporter] |
|
29 | end |
|
29 | end |
|
30 |
|
30 | ||
|
31 | # takes a submission, asks room_maker to produce grading directories, |
|
31 | # takes a submission, asks room_maker to produce grading directories, |
|
32 | # calls grader scripts, and asks reporter to save the result |
|
32 | # calls grader scripts, and asks reporter to save the result |
|
33 | def grade(submission) |
|
33 | def grade(submission) |
|
34 | current_dir = FileUtils.pwd |
|
34 | current_dir = FileUtils.pwd |
|
35 |
|
35 | ||
|
36 | user = submission.user |
|
36 | user = submission.user |
|
37 | problem = submission.problem |
|
37 | problem = submission.problem |
|
38 |
|
38 | ||
|
39 | - # TODO: will have to create real exception for this |
|
39 | + begin |
|
40 | - if user==nil or problem == nil |
|
40 | + # TODO: will have to create real exception for this |
|
41 | - @reporter.report_error(submission,"Grading error: problem with submission") |
|
41 | + if user==nil or problem == nil |
|
42 | - #raise "engine: user or problem is nil" |
|
42 | + @reporter.report_error(submission,"Grading error: problem with submission") |
|
43 | - end |
|
43 | + raise "engine: user or problem is nil" |
|
44 | - |
|
44 | + end |
|
45 | - # TODO: this is another hack so that output only task can be judged |
|
||
|
46 | - if submission.language!=nil |
|
||
|
47 | - language = submission.language.name |
|
||
|
48 | - lang_ext = submission.language.ext |
|
||
|
49 | - else |
|
||
|
50 | - language = 'c' |
|
||
|
51 | - lang_ext = 'c' |
|
||
|
52 | - end |
|
||
|
53 |
|
45 | ||
|
54 | - # This is needed because older version of std-scripts/compile |
|
46 | + # TODO: this is another hack so that output only task can be judged |
|
55 | - # only look for c++. |
|
47 | + if submission.language!=nil |
|
56 | - if language == 'cpp' |
|
48 | + language = submission.language.name |
|
57 | - language = 'c++' |
|
49 | + lang_ext = submission.language.ext |
|
58 |
- |
|
50 | + else |
|
|
51 | + language = 'c' | ||
|
|
52 | + lang_ext = 'c' | ||
|
|
53 | + end | ||
|
59 |
|
54 | ||
|
60 | - # COMMENT: should it be only source.ext? |
|
55 | + # This is needed because older version of std-scripts/compile |
|
61 | - if problem!=nil |
|
56 | + # only look for c++. |
|
62 | - source_name = "#{problem.name}.#{lang_ext}" |
|
57 | + if language == 'cpp' |
|
63 | - else |
|
58 | + language = 'c++' |
|
64 | - source_name = "source.#{lang_ext}" |
|
59 | + end |
|
65 | - end |
|
||
|
66 |
|
60 | ||
|
67 | - begin |
|
61 | + # COMMENT: should it be only source.ext? |
|
|
62 | + if problem!=nil | ||
|
|
63 | + source_name = "#{problem.name}.#{lang_ext}" | ||
|
|
64 | + else | ||
|
|
65 | + source_name = "source.#{lang_ext}" | ||
|
|
66 | + end | ||
|
|
67 | + | ||
|
68 | grading_dir = @room_maker.produce_grading_room(submission) |
|
68 | grading_dir = @room_maker.produce_grading_room(submission) |
|
69 | @room_maker.save_source(submission,source_name) |
|
69 | @room_maker.save_source(submission,source_name) |
|
70 | problem_home = @room_maker.find_problem_home(submission) |
|
70 | problem_home = @room_maker.find_problem_home(submission) |
|
71 |
|
71 | ||
|
72 | # puts "GRADING DIR: #{grading_dir}" |
|
72 | # puts "GRADING DIR: #{grading_dir}" |
|
73 | # puts "PROBLEM DIR: #{problem_home}" |
|
73 | # puts "PROBLEM DIR: #{problem_home}" |
|
74 |
|
74 | ||
|
75 | if !FileTest.exist?(problem_home) |
|
75 | if !FileTest.exist?(problem_home) |
|
76 | puts "PROBLEM DIR: #{problem_home}" |
|
76 | puts "PROBLEM DIR: #{problem_home}" |
|
77 |
- |
|
77 | + raise "engine: No test data." |
|
78 | - raise "No test data." |
|
||
|
79 | end |
|
78 | end |
|
80 |
|
79 | ||
|
81 | dinit = DirInit::Manager.new(problem_home) |
|
80 | dinit = DirInit::Manager.new(problem_home) |
|
82 |
|
81 | ||
|
83 | dinit.setup do |
|
82 | dinit.setup do |
|
84 | copy_log = copy_script(problem_home) |
|
83 | copy_log = copy_script(problem_home) |
|
85 | save_copy_log(problem_home,copy_log) |
|
84 | save_copy_log(problem_home,copy_log) |
|
86 | end |
|
85 | end |
|
87 |
|
86 | ||
|
88 | call_judge(problem_home,language,grading_dir,source_name) |
|
87 | call_judge(problem_home,language,grading_dir,source_name) |
|
89 |
|
88 | ||
|
90 | @reporter.report(submission,"#{grading_dir}/test-result") |
|
89 | @reporter.report(submission,"#{grading_dir}/test-result") |
|
91 |
|
90 | ||
|
92 | dinit.teardown do |
|
91 | dinit.teardown do |
|
93 | copy_log = load_copy_log(problem_home) |
|
92 | copy_log = load_copy_log(problem_home) |
|
94 | clear_copy_log(problem_home) |
|
93 | clear_copy_log(problem_home) |
|
95 | clear_script(copy_log,problem_home) |
|
94 | clear_script(copy_log,problem_home) |
|
96 | end |
|
95 | end |
|
97 |
|
96 | ||
|
98 | rescue RuntimeError => msg |
|
97 | rescue RuntimeError => msg |
|
99 | @reporter.report_error(submission, msg) |
|
98 | @reporter.report_error(submission, msg) |
|
|
99 | + puts "ERROR: #{msg}" | ||
|
100 |
|
100 | ||
|
101 | ensure |
|
101 | ensure |
|
102 | @room_maker.clean_up(submission) |
|
102 | @room_maker.clean_up(submission) |
|
103 | Dir.chdir(current_dir) # this is really important |
|
103 | Dir.chdir(current_dir) # this is really important |
|
104 | end |
|
104 | end |
|
105 | end |
|
105 | end |
|
106 |
|
106 | ||
|
107 | protected |
|
107 | protected |
|
108 |
|
108 | ||
|
109 | def talk(str) |
|
109 | def talk(str) |
|
110 | if @config.talkative |
|
110 | if @config.talkative |
|
111 | puts str |
|
111 | puts str |
@@ -122,25 +122,25 | |||||
|
122 | talk "CMD: #{cmd}" |
|
122 | talk "CMD: #{cmd}" |
|
123 | system(cmd) |
|
123 | system(cmd) |
|
124 | end |
|
124 | end |
|
125 |
|
125 | ||
|
126 | def get_std_script_dir |
|
126 | def get_std_script_dir |
|
127 | GRADER_ROOT + '/std-script' |
|
127 | GRADER_ROOT + '/std-script' |
|
128 | end |
|
128 | end |
|
129 |
|
129 | ||
|
130 | def copy_script(problem_home) |
|
130 | def copy_script(problem_home) |
|
131 | script_dir = "#{problem_home}/script" |
|
131 | script_dir = "#{problem_home}/script" |
|
132 | std_script_dir = get_std_script_dir |
|
132 | std_script_dir = get_std_script_dir |
|
133 |
|
133 | ||
|
134 | - raise "std-script directory not found" if !FileTest.exist?(std_script_dir) |
|
134 | + raise "engine: std-script directory not found" if !FileTest.exist?(std_script_dir) |
|
135 |
|
135 | ||
|
136 | scripts = Dir[std_script_dir + '/*'] |
|
136 | scripts = Dir[std_script_dir + '/*'] |
|
137 |
|
137 | ||
|
138 | copied = [] |
|
138 | copied = [] |
|
139 |
|
139 | ||
|
140 | scripts.each do |s| |
|
140 | scripts.each do |s| |
|
141 | fname = File.basename(s) |
|
141 | fname = File.basename(s) |
|
142 | next if FileTest.directory?(s) |
|
142 | next if FileTest.directory?(s) |
|
143 | if !FileTest.exist?("#{script_dir}/#{fname}") |
|
143 | if !FileTest.exist?("#{script_dir}/#{fname}") |
|
144 | copied << fname |
|
144 | copied << fname |
|
145 | FileUtils.cp(s, "#{script_dir}", :preserve => true) |
|
145 | FileUtils.cp(s, "#{script_dir}", :preserve => true) |
|
146 | end |
|
146 | end |
You need to be logged in to leave comments.
Login now