lib/vfs/entries/dir.rb in vfs-0.1.0 vs lib/vfs/entries/dir.rb in vfs-0.1.1
- old
+ new
@@ -95,11 +95,11 @@
def entries options = {}, &block
options[:bang] = true unless options.include? :bang
storage.open_fs do |fs|
begin
list = []
- fs.each path do |name, type|
+ fs.each_entry path do |name, type|
next if options[:filter] and options[:filter] != type
entry = if type == :dir
dir(name)
elsif type == :file
file(name)
@@ -138,11 +138,15 @@
def include? name
entry[name].exist?
end
alias_method :has?, :include?
+ def empty?
+ entries.empty?
+ end
+
#
# Transfers
#
def copy_to to, options = {}
options[:bang] = true unless options.include? :bang
@@ -160,57 +164,11 @@
to.dir #.create
else
raise "can't copy to unknown Entry!"
end
- storage.open_fs do |fs|
- try = 0
- begin
- try += 1
- self.class.efficient_dir_copy(self, target) || self.class.unefficient_dir_copy(self, target)
- rescue StandardError => error
- unknown_errors = 0
-
- attrs = get
- if attrs[:file]
- raise Error, "can't copy File as a Dir ('#{self}')!"
- elsif attrs[:dir]
- # some unknown error (but it also maybe caused by to be fixed error in 'target')
- unknown_errors += 1
- else
- raise Error, "'#{self}' not exist!" if options[:bang]
- return target
- end
-
- attrs = target.get
- if attrs[:file]
- if options[:override]
- to.destroy
- else
- raise Vfs::Error, "entry #{target} already exist!"
- end
- elsif attrs[:dir]
- if options[:override]
- to.destroy
- else
- raise Vfs::Error, "entry #{target} already exist!"
- end
- else
- parent = to.parent
- if parent.exist?
- # some unknown error (but it also maybe caused by already fixed error in 'from')
- unknown_errors += 1
- else
- parent.create(options)
- end
- end
-
- raise error if unknown_errors > 1
-
- retry if try < 2
- end
- end
+ efficient_dir_copy(target, options) || unefficient_dir_copy(target, options)
target
end
def copy_to! to, options = {}
options[:override] = true
@@ -226,47 +184,79 @@
options[:override] = true
move_to to, options
end
protected
- def self.unefficient_dir_copy from, to
- from.storage.open_fs do |from_fs|
- to.storage.open_fs do |to_fs|
- to_fs.create_dir to.path
- from_fs.each from.path do |name, type|
- if type == :dir
- unefficient_dir_copy from.dir(name), to.dir(name)
- elsif type == :file
- to_fs.write_file to.file(name).path, false do |writer|
- from_fs.read_file from.file(name).path do |buff|
- writer.call buff
- end
- end
+ def unefficient_dir_copy to, options
+ to.create options
+ entries options do |e|
+ if e.is_a? Dir
+ e.copy_to to.dir(e.name), options
+ elsif e.is_a? File
+ e.copy_to to.file(e.name), options
+ else
+ raise 'internal error'
+ end
+ end
+ end
+
+ def efficient_dir_copy to, options
+ storage.open_fs do |fs|
+ try = 0
+ begin
+ try += 1
+ self.class.efficient_dir_copy(self, to, options[:override])
+ rescue StandardError => error
+ unknown_errors = 0
+
+ attrs = get
+ if attrs[:file]
+ raise Error, "can't copy File as a Dir ('#{self}')!"
+ elsif attrs[:dir]
+ # some unknown error (but it also maybe caused by to be fixed error in 'to')
+ unknown_errors += 1
+ else
+ raise Error, "'#{self}' not exist!" if options[:bang]
+ return true
+ end
+
+ attrs = to.get
+ if attrs[:file]
+ if options[:override]
+ to.destroy
else
- raise 'invalid entry type!'
+ raise Vfs::Error, "entry #{to} already exist!"
end
+ elsif attrs[:dir]
+ unknown_errors += 1
+ # if options[:override]
+ # to.destroy
+ # else
+ # dir_already_exist = true
+ # # raise Vfs::Error, "entry #{to} already exist!"
+ # end
+ else # parent not exist
+ parent = to.parent
+ if parent.exist?
+ # some unknown error (but it also maybe caused by already fixed error in 'from')
+ unknown_errors += 1
+ else
+ parent.create(options)
+ end
end
+
+ raise error if unknown_errors > 1
+ try < 2 ? retry : raise(error)
end
end
-
- # target.create options
- # entries do |e|
- # if e.is_a? Dir
- # e.copy_to target.dir(e.name), options
- # elsif e.is_a? File
- # e.copy_to target.file(e.name), options
- # else
- # raise 'internal error'
- # end
- # end
end
- def self.efficient_dir_copy from, to
+ def self.efficient_dir_copy from, to, override
from.storage.open_fs{|fs|
- fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to)
+ fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to, override)
} or
to.storage.open_fs{|fs|
- fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to)
+ fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to, override)
}
end
end
end
\ No newline at end of file