diff -ur tar2rubyscript-0.1.2.tar.gz/tar2rubyscript/tarrubyscript.rb tar2rubyscript-0.1.3.tar.gz/tar2rubyscript/tarrubyscript.rb --- tar2rubyscript-0.1.2.tar.gz/tar2rubyscript/tarrubyscript.rb 2003-08-27 23:12:20.000000000 +0200 +++ tar2rubyscript-0.1.3.tar.gz/tar2rubyscript/tarrubyscript.rb 2003-08-29 00:57:09.000000000 +0200 @@ -162,97 +162,103 @@ end end -class Jail - def initialize(ldir) - @ldir = ldir +class TempSpace + def initialize + @archive = File.new($0, "rb").read.split(/\n/, LINES+1)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift + @orgdir = Dir.pwd + @workdir = "/tmp" + @workdir = "c:/tmp" if FileTest.exists?("c:/") + @tempdir = "#{@workdir}/tar2rubyscript.d.#{Process.pid}" + @tempfile = "#{@workdir}/tar2rubyscript.f.#{Process.pid}" end def eval - File.open("init.rb") do |f| - instance_eval(f.read) - end + begin - ObjectSpace::each_object(IO) do |obj| - obj.close rescue nil - end - end + # Create the temp environment. - def oldlocation(file) - if not file.nil? - res = @ldir + "/" + file - res = file if file =~ /^\// - res = file if file =~ /^.:/ - end + Dir.mkdir(@workdir) if not FileTest.exists?(@workdir) + Dir.mkdir(@tempdir) if not FileTest.exists?(@tempdir) - res - end -end + Dir.chdir(@tempdir) -def rm(entry) - if FileTest.file?(entry) - File.delete(entry) - end + File.open(@tempfile, "wb") {|f| f.write @archive} + File.open(@tempfile, "rb") {|f| Reader.new(f).extract} - if FileTest.directory?(entry) - ldir = Dir.pwd + # Eventually look for a subdirectory. - Dir.chdir(entry) - Dir.new(".").each do |e| - rm(e) if not [".", ".."].include?(e) + entries = Dir.entries(".") + entries.delete(".") + entries.delete("..") + + if entries.length == 1 + entry = entries.shift + if FileTest.directory?(entry) + Dir.chdir(entry) + end end - Dir.chdir(ldir) - Dir.rmdir(entry) - end -end + # Remember all IO objects. -if FileTest.exists?("c:/") - WD = "c:/tmp" -else - WD = "/tmp" -end + ioobjects = [] + ObjectSpace::each_object(IO) do |obj| + ioobjects << obj.id + end -MF = "#{WD}/tar2rubyscript.f.#{Process.pid}" -MP = "#{WD}/tar2rubyscript.d.#{Process.pid}" + # Execute init.rb . -Dir.mkdir(WD) if not FileTest.exists?(WD) -Dir.mkdir(MP) if not FileTest.exists?(MP) + File.open("init.rb") do |f| + instance_eval(f.read) + end -LDIR = Dir.pwd + ensure -begin + # Close all IO objects, opened in init.rb . - archive = nil + ObjectSpace::each_object(IO) do |obj| + obj.close rescue nil if not ioobjects.include?(obj.id) + end - File.open($0, "rb"){|f| archive = f.read.split(/\n/, LINES+1)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift} + # Remove the temp environment. - File.open(MF, "wb"){|f| f.write archive} + Dir.chdir(@orgdir) - Dir.chdir(MP) + recursivedelete(@tempfile) + recursivedelete(@tempdir) - File.open(MF, "rb") do |fp| - Reader.new(fp).extract end + end - entries = Dir.entries(".") - entries.delete(".") - entries.delete("..") - - if entries.length == 1 - entry = entries.shift - if FileTest.directory?(entry) - Dir.chdir(entry) - end + def recursivedelete(entry) + if FileTest.file?(entry) + File.delete(entry) end - Jail.new(LDIR).eval + if FileTest.directory?(entry) + pdir = Dir.pwd + + Dir.chdir(entry) + Dir.new(".").each do |e| + recursivedelete(e) if not [".", ".."].include?(e) + end + Dir.chdir(pdir) -ensure + Dir.rmdir(entry) + end + end - Dir.chdir(LDIR) + def oldlocation(file) + res = file - rm(MF) - rm(MP) + if not file.nil? + res = @orgdir + "/" + file + res = file if file =~ /^\// + res = file if file =~ /^.:/ + end + res + end end +TempSpace.new.eval +