lib/buildmaster/cotta/cotta_file.rb in BuildMaster-1.0.6 vs lib/buildmaster/cotta/cotta_file.rb in BuildMaster-1.0.9

- old
+ new

@@ -1,43 +1,57 @@ require 'fileutils' +require 'rubygems/package' +$:.unshift File.dirname(__FILE__) +require 'io_chain' + module BuildMaster class CottaFile + include IoChain attr_reader :system, :path def initialize(system, path) @path = path @system = system end - + def cotta - return Cotta.new(system) + Cotta.new(@system) end - + def name return @path.basename.to_s end - def parent - return CottaDir.new(@system, @path.parent) - end - def extname return @path.extname end def basename return @path.basename(extname).to_s end + def stat + @system.file_stat(@path) + end + def exists? return @system.file_exists?(@path) end + + def relative_path_from(file_or_dir) + path.relative_path_from(file_or_dir.path) + end + def parent + return CottaDir.new(@system, @path.parent) + end + def copy_to(target_file) target_file.parent.mkdirs @system.copy_file(path, target_file.path) + target_file end def copy_to_path(target_path) copy_to(cotta.file(target_path)) end @@ -53,35 +67,142 @@ def save(content = '') write {|file| file.printf content.to_s} end +# Calls open with 'w' argument and makes sure that the +# parent directory of the file exists def write(&block) parent.mkdirs open('w', &block) end - + +# Calls open with 'a' argument and make sure that the +# parent directory of the file exists + def append(&block) + parent.mkdirs + open('a', &block) + end + +# Calls open with 'wb' argument, sets the io to binmode +# and make sure that the parent directory of the file exists + def write_binary(&block) + parent.mkdirs + if (block_given?) + open('wb') do |io| + io.binmode + yield io + end + else + io = open('wb') + io.binmode + io + end + end + +=begin rdoc +Loading the file full total. This is used generally for loading +an ascii file content. It does not work with binary file on +windows system because it does no put the system on binary mode +=end def load content = nil - read {|file| content = file.read} + size = stat.size + read do |io| + content = io.read + end return content end +# calls open with 'r' as argument. def read(&block) open('r', &block) end + +# Calls open with 'r' as argument and sets the io to binary mode + def read_binary + if block_given? + open('r') do |io| + io.binmode + yield io + end + else + io = open('r') + io.binmode + io + end + end + def foreach() open('r') do |file| file.each {|line| yield line} end end + def open(*args) + result = f = @system.io(@path, *args) + if block_given? + begin + result = yield f + ensure + f.close unless f.closed? + end + end + result + end + def delete @system.delete_file(@path) end + def extract(directory = nil) + directory = parent.dir(basename) unless directory + read_binary do |io| + reader = Gem::Package::TarReader.new(io) + reader.each do |entry| + full_name = entry.full_name + if (entry.is_file?) + directory.file(full_name).write_binary do |output| + copy_io(entry, output) + end + elsif (entry.is_directory?) + directory.dir(full_name).mkdirs + end + end + end + directory + end + + def zip(target = nil) + target = parent.file("#{name}.zip") unless target + read_binary do |read_io| + target.write_binary do |write_io| + gz = Zlib::GzipWriter.new(write_io) + copy_io(read_io, gz) + gz.close + end + end + target + end + + def unzip + name = basename + if (extname.length == 0) + name = "#{name}.unzip" + end + target = parent.file(name) + read_binary do |read_io| + target.write_binary do |write_io| + gz = Zlib::GzipReader.new(read_io) + copy_io(gz, write_io) + gz.close + end + end + target + end + def ==(other) return false unless other.kind_of? CottaFile return @system == other.system && @path == other.path end @@ -89,23 +210,9 @@ @path end def inspect return "#{self.class}:#{self.object_id}-#{@system.inspect}-#@path" - end - - private - - def open(*args) - result = f = @system.io(@path, *args) - if block_given? - begin - result = yield f - ensure - f.close - end - end - return result end end end \ No newline at end of file