Description:
autonew skips submissions with bad problems, forbids getch, better compiler msg when preprocessing fails, reports compile error when the executable is too large (100MB)
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r132:ca6ce454fda9 - - 2 files changed: 24 inserted, 10 deleted

@@ -228,48 +228,51
228 228 grader_proc.report_active if grader_proc!=nil
229 229
230 230 latest_submitted_at = nil
231 231 graded_submission_ids = {}
232 232
233 233 while true
234 234
235 235 if check_stopfile # created by calling grader stop
236 236 clear_stopfile
237 237 log "stopped (with stop file)"
238 238 break
239 239 end
240 240
241 241 if latest_submitted_at==nil
242 242 submissions = Submission.all
243 243 else
244 244 submissions = Submission.all(:conditions => ["submitted_at >= :latest",
245 245 {:latest => latest_submitted_at}])
246 246 end
247 247
248 248 graded_any = false
249 249
250 250 if submissions.length != 0
251 251 submissions.each do |submission|
252 + if (submission.problem == nil) or (!submission.problem.available)
253 + next
254 + end
252 255 if ! graded_submission_ids[submission.id]
253 256 runner.grade_submission(submission)
254 257 graded_submission_ids[submission.id] = true
255 258 if (!latest_submitted_at or
256 259 latest_submitted_at < submission.submitted_at)
257 260 latest_submitted_at = submission.submitted_at
258 261 end
259 262 puts "graded: #{submission.id}"
260 263 puts "latest: #{latest_submitted_at}"
261 264 graded_any = true
262 265 end
263 266 end
264 267 end
265 268
266 269 if ! graded_any
267 270 sleep(1)
268 271 end
269 272 end
270 273 end
271 274
272 275 def grader_grade_problems(grader_proc, options)
273 276 if options[:report]
274 277 result_collector = ResultCollector.new
275 278 else
@@ -61,70 +61,81
61 61 talk "#{param_name}: #{params[param_name]}"
62 62 end
63 63
64 64 # Remove any remaining output files or message files.
65 65 if FileTest.exists? params[:output_file]
66 66 FileUtils.rm(params[:output_file])
67 67 end
68 68 if FileTest.exists? params[:message_file]
69 69 FileUtils.rm(params[:message_file])
70 70 end
71 71
72 72 # Check if the source file exists before attempt compiling.
73 73 if !FileTest.exists? params[:source_file]
74 74 talk("ERROR: The source file does not exist!")
75 75 open(params[:message_file],"w") do |f|
76 76 f.puts "ERROR: The source file did not exist."
77 77 end
78 78 exit(127)
79 79 end
80 80
81 81 if params[:prog_lang]=='cpp':
82 82 params[:prog_lang] = 'c++'
83 83 end
84 84
85 - forbidden_functions = ['system', 'fopen', 'freopen', 'open', 'remove', 'rename']
85 + forbidden_functions = ['system', 'fopen', 'freopen', 'open', 'remove', 'rename', 'getch']
86 86 redefine_list = []
87 87 forbidden_count = 0
88 88 forbidden_key = (rand(8999) + 1000).to_s
89 89 forbidden_functions.each do |f|
90 90 redefine_list << "-D#{f}=forbidden#{forbidden_key}#{forbidden_count}"
91 91 forbidden_count += 1
92 92 end
93 93 redefine_str = redefine_list.join ' '
94 94 puts redefine_str
95 95
96 96 # Compile.
97 97 case params[:prog_lang]
98 98
99 99 when "c"
100 - command = "#{C_COMPILER} -E #{params[:source_file]} -o source_prep.c"
100 + command = "#{C_COMPILER} -E #{params[:source_file]} -o source_prep.c 2> #{params[:message_file]}"
101 101 system(command)
102 - command = "#{C_COMPILER} source_prep.c #{redefine_str} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
103 - puts command
104 - system(command)
102 + if FileTest.exist? "source_prep.c"
103 + command = "#{C_COMPILER} source_prep.c #{redefine_str} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
104 + system(command)
105 + end
105 106
106 107 when "c++"
107 - command = "#{CPLUSPLUS_COMPILER} -E #{params[:source_file]} -o source_prep.cpp"
108 + command = "#{CPLUSPLUS_COMPILER} -E #{params[:source_file]} -o source_prep.cpp 2> #{params[:message_file]}"
108 109 system(command)
109 - command = "#{CPLUSPLUS_COMPILER} #{redefine_str} source_prep.cpp -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
110 - system(command)
111 -
110 + if FileTest.exist? "source_prep.cpp"
111 + command = "#{CPLUSPLUS_COMPILER} #{redefine_str} source_prep.cpp -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
112 + system(command)
113 + end
114 +
112 115 when "pas"
113 116 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
114 117 system(command)
115 118 FileUtils.mv("output", params[:output_file])
116 119
117 120 else
118 121 talk("ERROR: Invalid language specified!")
119 122 open(params[:message_file],"w") do |f|
120 123 f.puts "ERROR: Invalid language specified!"
121 124 end
122 125 exit(127)
123 126 end
124 127
125 128 # Report success or failure.
126 129 if FileTest.exists? params[:output_file]
127 - talk "Compilation was successful!"
130 + talk "Compilation was successful!"
131 +
132 + if File.size(params[:output_file]) > 100000000
133 + talk "But the executable is too big."
134 + open(params[:message_file],"w+") do |f|
135 + f.puts "Executable is too large."
136 + end
137 + File.delete(params[:output_file])
138 + end
128 139 else
129 140 talk "ERROR: Something was wrong during the compilation!"
130 141 end
You need to be logged in to leave comments. Login now