|
|
require 'tmpdir'
|
|
|
|
|
|
class TestdataImporter
|
|
|
|
|
|
attr :log_msg
|
|
|
|
|
|
def import_from_file(problem_name,
|
|
|
tempfile,
|
|
|
time_limit,
|
|
|
memory_limit)
|
|
|
|
|
|
dirname = TestdataImporter.extract(problem_name, tempfile)
|
|
|
return false if not dirname
|
|
|
@log_msg = GraderScript.call_import_problem(problem_name,
|
|
|
dirname,
|
|
|
time_limit,
|
|
|
memory_limit)
|
|
|
return true
|
|
|
end
|
|
|
|
|
|
protected
|
|
|
|
|
|
def self.long_ext(filename)
|
|
|
i = filename.index('.')
|
|
|
len = filename.length
|
|
|
return filename.slice(i..len)
|
|
|
end
|
|
|
|
|
|
def self.extract(problem_name, tempfile)
|
|
|
testdata_filename = TestdataImporter.save_testdata_file(problem_name,
|
|
|
tempfile)
|
|
|
ext = TestdataImporter.long_ext(tempfile.original_filename)
|
|
|
|
|
|
extract_dir = File.join(GraderScript.raw_dir, problem_name)
|
|
|
begin
|
|
|
Dir.mkdir extract_dir
|
|
|
rescue Errno::EEXIST
|
|
|
end
|
|
|
|
|
|
if ext=='.tar.gz' or ext=='.tgz'
|
|
|
cmd = "tar -zxvf #{testdata_filename} -C #{extract_dir}"
|
|
|
elsif ext=='.tar'
|
|
|
cmd = "tar -xvf #{testdata_filename} -C #{extract_dir}"
|
|
|
elsif ext=='.zip'
|
|
|
cmd = "unzip -o #{testdata_filename} -d #{extract_dir}"
|
|
|
else
|
|
|
return nil
|
|
|
end
|
|
|
|
|
|
system(cmd)
|
|
|
|
|
|
files = Dir["#{extract_dir}/**/1*.in"]
|
|
|
return nil if files.length==0
|
|
|
|
|
|
return File.dirname(files[0])
|
|
|
end
|
|
|
|
|
|
def self.save_testdata_file(problem_name, tempfile)
|
|
|
ext = TestdataImporter.long_ext(tempfile.original_filename)
|
|
|
testdata_filename = File.join(Dir.tmpdir,"#{problem_name}#{ext}")
|
|
|
|
|
|
return nil if tempfile==""
|
|
|
|
|
|
if tempfile.instance_of?(Tempfile)
|
|
|
tempfile.close
|
|
|
FileUtils.move(tempfile.path,testdata_filename)
|
|
|
else
|
|
|
File.open(testdata_filename, "wb") do |f|
|
|
|
f.write(tempfile.read)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
return testdata_filename
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|