Description:
removed calls to 'pwd', other uses of back quotes
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r102:a3aedb7e3776 - - 4 files changed: 7 inserted, 5 deleted

@@ -1,26 +1,28
1 #!/usr/bin/ruby
1 #!/usr/bin/ruby
2
2
3 + require 'fileutils'
4 +
3 def talk(str)
5 def talk(str)
4 if TALKATIVE
6 if TALKATIVE
5 puts str
7 puts str
6 end
8 end
7 end
9 end
8
10
9 def save_source(submission,dir,fname)
11 def save_source(submission,dir,fname)
10 f = File.open("#{dir}/#{fname}","w")
12 f = File.open("#{dir}/#{fname}","w")
11 f.write(submission.source)
13 f.write(submission.source)
12 f.close
14 f.close
13 end
15 end
14
16
15 def call_judge(problem_home,language,problem_out_dir,fname)
17 def call_judge(problem_home,language,problem_out_dir,fname)
16 ENV['PROBLEM_HOME'] = problem_home
18 ENV['PROBLEM_HOME'] = problem_home
17 Dir.chdir problem_out_dir
19 Dir.chdir problem_out_dir
18 cmd = "#{problem_home}/script/judge #{language} #{fname}"
20 cmd = "#{problem_home}/script/judge #{language} #{fname}"
19 # puts "CMD: #{cmd}"
21 # puts "CMD: #{cmd}"
20 system(cmd)
22 system(cmd)
21 end
23 end
22
24
23 def read_result(test_result_dir)
25 def read_result(test_result_dir)
24 cmp_msg_fname = "#{test_result_dir}/compiler_message"
26 cmp_msg_fname = "#{test_result_dir}/compiler_message"
25 cmp_msg = File.open(cmp_msg_fname).read
27 cmp_msg = File.open(cmp_msg_fname).read
26
28
@@ -64,26 +66,26
64 Dir.mkdir(user_dir) if !FileTest.exist?(user_dir)
66 Dir.mkdir(user_dir) if !FileTest.exist?(user_dir)
65
67
66 problem_out_dir = "#{user_dir}/#{problem.name}"
68 problem_out_dir = "#{user_dir}/#{problem.name}"
67 Dir.mkdir(problem_out_dir) if !FileTest.exist?(problem_out_dir)
69 Dir.mkdir(problem_out_dir) if !FileTest.exist?(problem_out_dir)
68
70
69 problem_home = "#{PROBLEMS_DIR}/#{problem.name}"
71 problem_home = "#{PROBLEMS_DIR}/#{problem.name}"
70 source_name = "#{problem.name}.#{lang_ext}"
72 source_name = "#{problem.name}.#{lang_ext}"
71
73
72 save_source(sub,problem_out_dir,source_name)
74 save_source(sub,problem_out_dir,source_name)
73 call_judge(problem_home,language,problem_out_dir,source_name)
75 call_judge(problem_home,language,problem_out_dir,source_name)
74 save_result(sub,read_result("#{problem_out_dir}/test-result"))
76 save_result(sub,read_result("#{problem_out_dir}/test-result"))
75 end
77 end
76
78
77 # reading environment and options
79 # reading environment and options
78 GRADER_ENV = 'exam'
80 GRADER_ENV = 'exam'
79 puts "environment: #{GRADER_ENV}"
81 puts "environment: #{GRADER_ENV}"
80 require File.dirname(__FILE__) + "/environment.rb"
82 require File.dirname(__FILE__) + "/environment.rb"
81
83
82 #main program
84 #main program
83 talk 'Reading rails environment'
85 talk 'Reading rails environment'
84
86
85 RAILS_ENV = 'development'
87 RAILS_ENV = 'development'
86 require RAILS_APP_DIR + '/config/environment'
88 require RAILS_APP_DIR + '/config/environment'
87
89
88 - current_dir = `pwd`
90 + current_dir = FileUtils.pwd
89 grade(ARGV[0].to_i)
91 grade(ARGV[0].to_i)
@@ -10,49 +10,49
10 #
10 #
11 class Engine
11 class Engine
12
12
13 attr_writer :room_maker
13 attr_writer :room_maker
14 attr_writer :reporter
14 attr_writer :reporter
15
15
16 def initialize(options={})
16 def initialize(options={})
17 # default options
17 # default options
18 if not options.include? :room_maker
18 if not options.include? :room_maker
19 options[:room_maker] = Grader::SubmissionRoomMaker.new
19 options[:room_maker] = Grader::SubmissionRoomMaker.new
20 end
20 end
21 if not options.include? :reporter
21 if not options.include? :reporter
22 options[:reporter] = Grader::SubmissionReporter.new
22 options[:reporter] = Grader::SubmissionReporter.new
23 end
23 end
24
24
25 @config = Grader::Configuration.get_instance
25 @config = Grader::Configuration.get_instance
26
26
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 = `pwd`.chomp
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 # TODO: will have to create real exception for this
40 if user==nil or problem == nil
40 if user==nil or problem == nil
41 @reporter.report_error(submission,"Grading error: problem with submission")
41 @reporter.report_error(submission,"Grading error: problem with submission")
42 #raise "engine: user or problem is nil"
42 #raise "engine: user or problem is nil"
43 end
43 end
44
44
45 # TODO: this is another hack so that output only task can be judged
45 # TODO: this is another hack so that output only task can be judged
46 if submission.language!=nil
46 if submission.language!=nil
47 language = submission.language.name
47 language = submission.language.name
48 lang_ext = submission.language.ext
48 lang_ext = submission.language.ext
49 else
49 else
50 language = 'c'
50 language = 'c'
51 lang_ext = 'c'
51 lang_ext = 'c'
52 end
52 end
53
53
54 # FIX THIS
54 # FIX THIS
55 talk 'some hack on language'
55 talk 'some hack on language'
56 if language == 'cpp'
56 if language == 'cpp'
57 language = 'c++'
57 language = 'c++'
58 end
58 end
@@ -45,82 +45,82
45 # ARGV[3] --- sandbox directory
45 # ARGV[3] --- sandbox directory
46
46
47 if ARGV.length < 2 || ARGV.length > 4
47 if ARGV.length < 2 || ARGV.length > 4
48 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
48 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
49 puts " <sandbox-directory> is defaulted to ./sandbox"
49 puts " <sandbox-directory> is defaulted to ./sandbox"
50 puts " <test-result-directory> is defaulted to ./test-result"
50 puts " <test-result-directory> is defaulted to ./test-result"
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
52 exit(127)
52 exit(127)
53 end
53 end
54
54
55 language = ARGV[0]
55 language = ARGV[0]
56 if language != "c" && language != "c++" && language != "pas"
56 if language != "c" && language != "c++" && language != "pas"
57 log "You specified a language that is not supported: #{language}."
57 log "You specified a language that is not supported: #{language}."
58 exit(127)
58 exit(127)
59 end
59 end
60
60
61 source_file = ARGV[1]
61 source_file = ARGV[1]
62 if File.exist?(source_file) == false
62 if File.exist?(source_file) == false
63 log "The source file does not exist."
63 log "The source file does not exist."
64 exit(127)
64 exit(127)
65 end
65 end
66
66
67 log "Making test result and sandbox directories..."
67 log "Making test result and sandbox directories..."
68
68
69 - current_dir = `pwd`
69 + current_dir = FileUtils.pwd
70 current_dir.strip!
70 current_dir.strip!
71
71
72 if ARGV.length >= 3
72 if ARGV.length >= 3
73 test_result_dir = ARGV[2]
73 test_result_dir = ARGV[2]
74 else
74 else
75 test_result_dir = "#{current_dir}/test-result"
75 test_result_dir = "#{current_dir}/test-result"
76 end
76 end
77
77
78 log "Test result directory: #{test_result_dir}"
78 log "Test result directory: #{test_result_dir}"
79 clear_and_create_empty_dir(test_result_dir)
79 clear_and_create_empty_dir(test_result_dir)
80
80
81 if ARGV.length >= 4
81 if ARGV.length >= 4
82 sandbox_dir = ARGV[3]
82 sandbox_dir = ARGV[3]
83 else
83 else
84 sandbox_dir = "#{current_dir}/sandbox"
84 sandbox_dir = "#{current_dir}/sandbox"
85 end
85 end
86 log "Sandbox directory: #{sandbox_dir}"
86 log "Sandbox directory: #{sandbox_dir}"
87 clear_and_create_empty_dir(sandbox_dir)
87 clear_and_create_empty_dir(sandbox_dir)
88
88
89 # Compile
89 # Compile
90 log
90 log
91 log "Compiling..."
91 log "Compiling..."
92 call_and_log("Cannot copy the source file to #{sandbox_dir}") {
92 call_and_log("Cannot copy the source file to #{sandbox_dir}") {
93 FileUtils.cp(source_file, sandbox_dir)
93 FileUtils.cp(source_file, sandbox_dir)
94 }
94 }
95 begin
95 begin
96 Dir.chdir sandbox_dir
96 Dir.chdir sandbox_dir
97 rescue
97 rescue
98 log "ERROR: Cannot change directory to #{sandbox_dir}."
98 log "ERROR: Cannot change directory to #{sandbox_dir}."
99 exit(127)
99 exit(127)
100 end
100 end
101 execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
101 execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
102 - compile_message = `cat compiler_message`
102 + compile_message = open("compiler_message").read
103 compile_message.strip!
103 compile_message.strip!
104 call_and_log("Cannot move the compiler message to #{test_result_dir}.") {
104 call_and_log("Cannot move the compiler message to #{test_result_dir}.") {
105 FileUtils.mv("compiler_message", test_result_dir)
105 FileUtils.mv("compiler_message", test_result_dir)
106 }
106 }
107 if !FileTest.exist?("a.out")
107 if !FileTest.exist?("a.out")
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
109 exit(127)
109 exit(127)
110 else
110 else
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
112 FileUtils.mv("a.out",test_result_dir)
112 FileUtils.mv("a.out",test_result_dir)
113 }
113 }
114 FileUtils.rm_rf("#{sandbox_dir}/.")
114 FileUtils.rm_rf("#{sandbox_dir}/.")
115 end
115 end
116
116
117 require "#{problem_home}/script/test_dsl.rb"
117 require "#{problem_home}/script/test_dsl.rb"
118 load "#{problem_home}/test_cases/all_tests.cfg"
118 load "#{problem_home}/test_cases/all_tests.cfg"
119 problem = Problem.get_instance
119 problem = Problem.get_instance
120
120
121 if problem.well_formed? == false
121 if problem.well_formed? == false
122 log "The problem specification is not well formed."
122 log "The problem specification is not well formed."
123 exit(127)
123 exit(127)
124 end
124 end
125
125
126 # Doing the testing.
126 # Doing the testing.
@@ -90,49 +90,49
90
90
91 # Restore PROBLEM_HOME
91 # Restore PROBLEM_HOME
92 ENV['PROBLEM_HOME'] = problem_home
92 ENV['PROBLEM_HOME'] = problem_home
93
93
94 # Create the result file.
94 # Create the result file.
95 result_file = File.new("result", "w")
95 result_file = File.new("result", "w")
96 comment_file = File.new("comment", "w")
96 comment_file = File.new("comment", "w")
97
97
98 # Check if the program actually produced any output.
98 # Check if the program actually produced any output.
99 run_result_file = File.new("run_result", "r")
99 run_result_file = File.new("run_result", "r")
100 run_result = run_result_file.readlines
100 run_result = run_result_file.readlines
101 run_result_file.close
101 run_result_file.close
102
102
103 run_stat = run_result[run_result.length-1]
103 run_stat = run_result[run_result.length-1]
104 running_time = extract_time(run_stat)
104 running_time = extract_time(run_stat)
105
105
106 report = lambda{ |status, points, comment|
106 report = lambda{ |status, points, comment|
107 result_file.write status.strip
107 result_file.write status.strip
108 result_file.write "\n"
108 result_file.write "\n"
109 result_file.write points.to_s.strip
109 result_file.write points.to_s.strip
110 result_file.write "\n"
110 result_file.write "\n"
111 result_file.write run_stat.strip
111 result_file.write run_stat.strip
112 result_file.write "\n"
112 result_file.write "\n"
113 result_file.close
113 result_file.close
114 - `rm run_result`
114 + FileUtils.rm "run_result"
115 # `rm output.txt` --- keep the output
115 # `rm output.txt` --- keep the output
116
116
117 comment_file.write comment
117 comment_file.write comment
118
118
119 # added for debuggin --- jittat
119 # added for debuggin --- jittat
120 comment_file.write "--run-result--\n"
120 comment_file.write "--run-result--\n"
121 run_result.each do |l|
121 run_result.each do |l|
122 comment_file.write l
122 comment_file.write l
123 end
123 end
124
124
125 comment_file.close
125 comment_file.close
126
126
127 log "Done!"
127 log "Done!"
128 exit(0)
128 exit(0)
129 }
129 }
130
130
131 if run_result[0][0,2] != "OK"
131 if run_result[0][0,2] != "OK"
132 log "There was a runtime error."
132 log "There was a runtime error."
133 report.call(run_result[0], 0, "No comment.\n")
133 report.call(run_result[0], 0, "No comment.\n")
134 end
134 end
135
135
136 if running_time[:user].to_f + running_time[:sys].to_f > time_limit
136 if running_time[:user].to_f + running_time[:sys].to_f > time_limit
137 log "Time limit exceeded."
137 log "Time limit exceeded."
138 report.call("Time limit exceeded", 0, "No comment.\n")
138 report.call("Time limit exceeded", 0, "No comment.\n")
You need to be logged in to leave comments. Login now