diff -ur tar2rubyscript-0.4.2.tar.gz/tar2rubyscript/ev/ftools.rb tar2rubyscript-0.4.3.tar.gz/tar2rubyscript/ev/ftools.rb
--- tar2rubyscript-0.4.2.tar.gz/tar2rubyscript/ev/ftools.rb 2005-01-13 23:06:41.000000000 +0100
+++ tar2rubyscript-0.4.3.tar.gz/tar2rubyscript/ev/ftools.rb 2005-01-13 23:06:37.000000000 +0100
@@ -0,0 +1,172 @@
+require "ftools"
+
+class Dir
+ def self.copy(from, to)
+ if File.directory?(from)
+ pdir = Dir.pwd
+ todir = File.expand_path(to)
+
+ File.mkpath(todir)
+
+ Dir.chdir(from)
+ Dir.new(".").each do |e|
+ Dir.copy(e, todir+"/"+e) if not [".", ".."].include?(e)
+ end
+ Dir.chdir(pdir)
+ else
+ todir = File.dirname(File.expand_path(to))
+
+ File.mkpath(todir)
+
+ File.copy(from, to)
+ end
+ end
+
+ def self.move(from, to)
+ Dir.copy(from, to)
+ Dir.rm_rf(from)
+ end
+
+ def self.rm_rf(entry)
+ if File.ftype(entry) == "directory"
+ pdir = Dir.pwd
+
+ Dir.chdir(entry)
+ Dir.new(".").each do |e|
+ Dir.rm_rf(e) if not [".", ".."].include?(e)
+ end
+ Dir.chdir(pdir)
+
+ begin
+ Dir.delete(entry)
+ rescue => e
+ $stderr.puts e.message
+ end
+ else
+ begin
+ File.delete(entry)
+ rescue => e
+ $stderr.puts e.message
+ end
+ end
+ end
+
+ def self.find(entry=nil, mask=nil)
+ entry = "." if entry.nil?
+
+ entry = entry.gsub(/[\/\\]*$/, "") unless entry.nil?
+
+ mask = /^#{mask}$/i if mask.kind_of?(String)
+
+ res = []
+
+ if File.directory?(entry)
+ pdir = Dir.pwd
+
+ res += ["%s/" % entry] if mask.nil? or entry =~ mask
+
+ begin
+ Dir.chdir(entry)
+
+ begin
+ Dir.new(".").each do |e|
+ res += Dir.find(e, mask).collect{|e| entry+"/"+e} unless [".", ".."].include?(e)
+ end
+ ensure
+ Dir.chdir(pdir)
+ end
+ rescue Errno::EACCES => e
+ $stderr.puts e.message
+ end
+ else
+ res += [entry] if mask.nil? or entry =~ mask
+ end
+
+ res
+ end
+end
+
+class File
+ def self.rollbackup(file, mode=nil)
+ backupfile = file + ".RB.BACKUP"
+ controlfile = file + ".RB.CONTROL"
+ res = nil
+
+ File.touch(file) unless File.file?(file)
+
+ # Rollback
+
+ if File.file?(backupfile) and File.file?(controlfile)
+ $stderr.puts "Restoring #{file}..."
+
+ File.copy(backupfile, file) # Rollback from phase 3
+ end
+
+ # Reset
+
+ File.delete(backupfile) if File.file?(backupfile) # Reset from phase 2 or 3
+ File.delete(controlfile) if File.file?(controlfile) # Reset from phase 3 or 4
+
+ # Backup
+
+ File.copy(file, backupfile) # Enter phase 2
+ File.touch(controlfile) # Enter phase 3
+
+ # The real thing
+
+ if block_given?
+ if mode.nil?
+ res = yield
+ else
+ File.open(file, mode) do |f|
+ res = yield(f)
+ end
+ end
+ end
+
+ # Cleanup
+
+ File.delete(backupfile) # Enter phase 4
+ File.delete(controlfile) # Enter phase 5
+
+ # Return, like File.open
+
+ res = File.open(file, (mode or "r")) unless block_given?
+
+ res
+ end
+
+ def self.touch(file)
+ if File.exists?(file)
+ File.utime(Time.now, File.mtime(file), file)
+ else
+ File.open(file, "a"){|f|}
+ end
+ end
+
+ def self.which(file)
+ res = nil
+
+ if windows?
+ file = file.gsub(/\.exe$/i, "") + ".exe"
+ sep = ";"
+ else
+ sep = ":"
+ end
+
+ catch :stop do
+ ENV["PATH"].split(/#{sep}/).reverse.each do |d|
+ if File.directory?(d)
+ Dir.new(d).each do |e|
+ if e.downcase == file.downcase
+ res = File.expand_path(e, d)
+ throw :stop
+ end
+ end
+ end
+ end
+ end
+
+ res
+ end
+end
diff -ur tar2rubyscript-0.4.2.tar.gz/tar2rubyscript/init.rb tar2rubyscript-0.4.3.tar.gz/tar2rubyscript/init.rb
--- tar2rubyscript-0.4.2.tar.gz/tar2rubyscript/init.rb 2004-12-27 11:16:27.000000000 +0100
+++ tar2rubyscript-0.4.3.tar.gz/tar2rubyscript/init.rb 2005-01-11 18:03:37.000000000 +0100
@@ -1,7 +1,36 @@
+$: << File.dirname(File.expand_path(__FILE__))
+
require "ev/oldandnewlocation"
+require "ev/ftools"
+require "rbconfig"
exit if ARGV.include?("--tar2rubyscript-exit")
+def backslashes(s)
+ s = s.gsub(/^\.\//, "").gsub(/\//, "\\\\") if windows?
+ s
+end
+
+def linux?
+ not windows? and not cygwin? # Hack ???
+end
+
+def windows?
+ not (target_os.downcase =~ /32/).nil? # Hack ???
+end
+
+def cygwin?
+ not (target_os.downcase =~ /cyg/).nil? # Hack ???
+end
+
+def target_os
+ Config::CONFIG["target_os"] or ""
+end
+
+PRESERVE = ARGV.include?("--tar2rubyscript-preserve")
+
+ARGV.delete_if{|arg| arg =~ /^--tar2rubyscript-/}
+
scriptfile = newlocation("tarrubyscript.rb")
tarfile = oldlocation(ARGV.shift)
rbfile = oldlocation(ARGV.shift)
@@ -27,7 +56,8 @@
exit 1
end
-tarfile.dup.gsub!(/[\/\\]$/, "")
+TARMODE = File.file?(tarfile)
+DIRMODE = File.directory?(tarfile)
if not File.exist?(tarfile)
$stderr.puts "#{tarfile} doesn´t exist."
@@ -41,43 +71,68 @@
script = File.open(scriptfile){|f| f.read}
-if File.file?(tarfile)
- $stderr.puts "Found archive..."
+pdir = Dir.pwd
- archive = File.open(tarfile, "rb"){|f| [f.read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")}
-end
+tmpdir = tmplocation(File.basename(tarfile))
+
+File.mkpath(tmpdir)
-if File.directory?(tarfile)
- pdir = Dir.pwd
+Dir.chdir(tmpdir)
- Dir.chdir(tarfile)
+ if TARMODE and not PRESERVE
+ begin
+ tar = "tar"
+ system(backslashes("#{tar} xf #{tarfile}"))
+ rescue
+ tar = backslashes(newlocation("tar.exe"))
+ system(backslashes("#{tar} xf #{tarfile}"))
+ end
+ end
+
+ if DIRMODE
+ Dir.copy(tarfile, ".")
+ end
- if File.file?("tar2rubyscript.bat")
+ entries = Dir.entries(".")
+ entries.delete(".")
+ entries.delete("..")
+
+ if entries.length == 1
+ entry = entries.shift.dup
+ if File.directory?(entry)
+ Dir.chdir(entry)
+ end
+ end
+
+ if File.file?("tar2rubyscript.bat") and windows?
$stderr.puts "Running tar2rubyscript.bat ..."
system(".\\tar2rubyscript.bat")
end
- if File.file?("tar2rubyscript.sh")
+ if File.file?("tar2rubyscript.sh") and (linux? or cygwin?)
$stderr.puts "Running tar2rubyscript.sh ..."
system("sh -c \". ./tar2rubyscript.sh\"")
end
- $stderr.puts "Creating archive..."
+Dir.chdir("..")
- Dir.chdir("..")
+ $stderr.puts "Creating archive..."
- begin
- tar = "tar"
- archive = IO.popen("#{tar} ch #{tarfile.sub(/.*[\/\\]/, "")}", "rb"){|f| [f.read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")}
- rescue
- tar = newlocation("tar.exe")
- archive = IO.popen("#{tar} ch #{tarfile.sub(/.*[\/\\]/, "")}", "rb"){|f| [f.read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")}
+ if TARMODE and PRESERVE
+ archive = File.open(tarfile, "rb"){|f| [f.read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")}
+ else
+ begin
+ tar = "tar"
+ archive = IO.popen("#{tar} ch *", "rb"){|f| [f.read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")}
+ rescue
+ tar = backslashes(newlocation("tar.exe"))
+ archive = IO.popen("#{tar} ch *", "rb"){|f| [f.read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")}
+ end
end
- Dir.chdir(pdir)
-end
+Dir.chdir(pdir)
if not licensefile.nil? and not licensefile.empty?
$stderr.puts "Adding license..."
diff -ur tar2rubyscript-0.4.2.tar.gz/tar2rubyscript/tarrubyscript.rb tar2rubyscript-0.4.3.tar.gz/tar2rubyscript/tarrubyscript.rb
--- tar2rubyscript-0.4.2.tar.gz/tar2rubyscript/tarrubyscript.rb 2004-12-26 22:15:10.000000000 +0100
+++ tar2rubyscript-0.4.3.tar.gz/tar2rubyscript/tarrubyscript.rb 2005-01-11 21:33:08.000000000 +0100
@@ -25,46 +25,55 @@
ShowContent = ARGV.include?("--tar2rubyscript-list")
JustExtract = ARGV.include?("--tar2rubyscript-justextract")
ToTar = ARGV.include?("--tar2rubyscript-totar")
+ Preserve = ARGV.include?("--tar2rubyscript-preserve")
end
ARGV.concat []
-ARGV.delete_if do |arg|
- arg =~ /^--tar2rubyscript-/
-end
+ARGV.delete_if{|arg| arg =~ /^--tar2rubyscript-/}
+
+ARGV << "--tar2rubyscript-preserve" if Preserve
# Tar constants
unless defined?(BLOCKSIZE)
- BLOCKSIZE = 512
+ BLOCKSIZE = 512
NAMELEN = 100
MODELEN = 8
UIDLEN = 8
GIDLEN = 8
- CHKSUMLEN = 8
+ CHKSUMLEN = 8
SIZELEN = 12
- MAGICLEN = 8
- MODTIMELEN = 12
- UNAMELEN = 32
- GNAMELEN = 32
+ MAGICLEN = 8
+ MODTIMELEN = 12
+ UNAMELEN = 32
+ GNAMELEN = 32
DEVLEN = 8
TMAGIC = "ustar"
- GNU_TMAGIC = "ustar "
+ GNU_TMAGIC = "ustar "
SOLARIS_TMAGIC = "ustar\00000"
MAGICS = [TMAGIC, GNU_TMAGIC, SOLARIS_TMAGIC]
- LF_OLDFILE = ´\0´
+ LF_OLDFILE = ´\0´
LF_FILE = ´0´
LF_LINK = ´1´
- LF_SYMLINK = ´2´
+ LF_SYMLINK = ´2´
LF_CHAR = ´3´
- LF_BLOCK = ´4´
+ LF_BLOCK = ´4´
LF_DIR = ´5´
LF_FIFO = ´6´
- LF_CONTIG = ´7´
+ LF_CONTIG = ´7´
+
+ GNUTYPE_DUMPDIR = ´D´
+ GNUTYPE_LONGLINK = ´K´ # Identifies the *next* file on the tape as having a long linkname.
+ GNUTYPE_LONGNAME = ´L´ # Identifies the *next* file on the tape as having a long name.
+ GNUTYPE_MULTIVOL = ´M´ # This is the continuation of a file that began on another volume.
+ GNUTYPE_NAMES = ´N´ # For storing filenames that do not fit into the main header.
+ GNUTYPE_SPARSE = ´S´ # This is for sparse files.
+ GNUTYPE_VOLHDR = ´V´ # This file is a tape/volume header. Ignore it on extraction.
end
class Dir
@@ -78,9 +87,17 @@
end
Dir.chdir(pdir)
- Dir.delete(entry)
+ begin
+ Dir.delete(entry)
+ rescue => e
+ $stderr.puts e.message
+ end
else
- File.delete(entry)
+ begin
+ File.delete(entry)
+ rescue => e
+ $stderr.puts e.message
+ end
end
end
end
@@ -129,12 +146,24 @@
def initialize(header, fp)
@header = Header.new(header)
- if @header.file?
- padding = (BLOCKSIZE - (@header.size % BLOCKSIZE)) % BLOCKSIZE
-
- @data = fp.read(@header.size) if @header.size > 0
+ readdata =
+ lambda do |header|
+ padding = (BLOCKSIZE - (header.size % BLOCKSIZE)) % BLOCKSIZE
+ @data = fp.read(header.size) if header.size > 0
dummy = fp.read(padding) if padding > 0
end
+
+ readdata.call(@header)
+
+ if @header.longname?
+ gnuname = @data[0..-2]
+
+ header = fp.read(BLOCKSIZE)
+ @header = Header.new(header)
+ @header.name = gnuname
+
+ readdata.call(@header)
+ end
end
def extract
@@ -143,21 +172,19 @@
begin
Dir.mkdir(@header.name, @header.mode)
rescue SystemCallError => e
- puts "Couldn´t create dir #{@header.name}: " + e.message
+ $stderr.puts "Couldn´t create dir #{@header.name}: " + e.message
end
- else
- if @header.file?
- begin
- File.open(@header.name, "wb") do |fp|
- fp.write(@data)
- fp.chmod(@header.mode)
- end
- rescue => e
- puts "Couldn´t create file #{@header.name}: " + e.message
+ elsif @header.file?
+ begin
+ File.open(@header.name, "wb") do |fp|
+ fp.write(@data)
+ fp.chmod(@header.mode)
end
- else
- puts "Couldn´t handle entry #{@header.name}"
+ rescue => e
+ $stderr.puts "Couldn´t create file #{@header.name}: " + e.message
end
+ else
+ $stderr.puts "Couldn´t handle entry #{@header.name} (flag=#{@header.linkflag.inspect})."
end
#File.chown(@header.uid, @header.gid, @header.name)
@@ -168,18 +195,19 @@
def list
if not @header.name.empty?
if @header.dir?
- puts "d %s" % [@header.name]
+ $stderr.puts "d %s" % [@header.name]
elsif @header.file?
- puts "f %s (%s)" % [@header.name, @data.length]
+ $stderr.puts "f %s (%s)" % [@header.name, @header.size]
else
- puts "Couldn´t handle entry #{@header.name}"
+ $stderr.puts "Couldn´t handle entry #{@header.name} (flag=#{@header.linkflag.inspect})."
end
end
end
end
class Header
- attr_reader(:name, :uid, :gid, :size, :mtime, :uname, :gname, :mode)
+ attr_reader(:name, :uid, :gid, :size, :mtime, :uname, :gname, :mode, :linkflag)
+ attr_writer(:name)
def initialize(header)
fields = header.unpack(´A100 A8 A8 A8 A12 A12 A8 A1 A100 A8 A32 A32 A8 A8´)
@@ -222,6 +250,10 @@
def dir?
@linkflag == LF_DIR
end
+
+ def longname?
+ @linkflag == GNUTYPE_LONGNAME
+ end
end
class Content
@@ -279,7 +311,8 @@
end
def extract
- Dir.mkdir(@tempdir) if not File.exists?(@tempdir)
+ Dir.rm_rf(@tempdir) if File.exists?(@tempdir)
+ Dir.mkdir(@tempdir)
newlocation do
@@ -354,7 +387,7 @@
Dir.chdir(pdir)
end
rescue Errno::EACCES => error
- puts error
+ $stderr.puts error
end
else
File.utime(Time.now, File.mtime(entry), entry)
@@ -481,18 +514,28 @@
$:.unshift(newlocation)
$:.push(oldlocation)
+ s = ENV["PATH"].dup
+ if Dir.pwd[1..2] == ":/" # Hack ???
+ s << ";#{newlocation.gsub(/\//, "\\")}"
+ s << ";#{oldlocation.gsub(/\//, "\\")}"
+ else
+ s << ":#{newlocation}"
+ s << ":#{oldlocation}"
+ end
+ ENV["PATH"] = s
+
newlocation do
if __FILE__ == $0
- $0.replace("./init.rb")
+ $0.replace(File.expand_path("./init.rb"))
if File.file?("./init.rb")
- load "./init.rb"
+ load File.expand_path("./init.rb")
else
$stderr.puts "%s doesn´t contain an init.rb ." % __FILE__
end
else
if File.file?("./init.rb")
- load "./init.rb"
+ load File.expand_path("./init.rb")
end
end
end