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:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r181:5c6f0b732e70 - - 2 files changed: 6 inserted, 6 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 "Record not found"
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 + begin
39 # TODO: will have to create real exception for this
40 # TODO: will have to create real exception for this
40 if user==nil or problem == nil
41 if user==nil or problem == nil
41 @reporter.report_error(submission,"Grading error: problem with submission")
42 @reporter.report_error(submission,"Grading error: problem with submission")
42 - #raise "engine: user or problem is nil"
43 + raise "engine: user or problem is nil"
43 end
44 end
44
45
45 # TODO: this is another hack so that output only task can be judged
46 # TODO: this is another hack so that output only task can be judged
46 if submission.language!=nil
47 if submission.language!=nil
47 language = submission.language.name
48 language = submission.language.name
48 lang_ext = submission.language.ext
49 lang_ext = submission.language.ext
49 else
50 else
50 language = 'c'
51 language = 'c'
51 lang_ext = 'c'
52 lang_ext = 'c'
52 end
53 end
53
54
54 # This is needed because older version of std-scripts/compile
55 # This is needed because older version of std-scripts/compile
55 # only look for c++.
56 # only look for c++.
56 if language == 'cpp'
57 if language == 'cpp'
57 language = 'c++'
58 language = 'c++'
58 end
59 end
59
60
60 # COMMENT: should it be only source.ext?
61 # COMMENT: should it be only source.ext?
61 if problem!=nil
62 if problem!=nil
62 source_name = "#{problem.name}.#{lang_ext}"
63 source_name = "#{problem.name}.#{lang_ext}"
63 else
64 else
64 source_name = "source.#{lang_ext}"
65 source_name = "source.#{lang_ext}"
65 end
66 end
66
67
67 - begin
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 - puts "No test data. (check problem dir)"
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