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
+