Class: FileUtils::Entry_
Do not use. This class is for internal use only.
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Instance Chain:
self,
StreamUtils_
|
|
| Inherits: | Object |
| Defined in: | lib/fileutils.rb |
Overview
internal use only
Constant Summary
-
DIRECTORY_TERM =
# File 'lib/fileutils.rb', line 2475"(?=/|\\z)" -
S_IF_DOOR =
# File 'lib/fileutils.rb', line 21810xD000
Class Method Summary
- .new(a, b = nil, deref = false) ⇒ Entry_ constructor
Instance Attribute Summary
- #blockdev? ⇒ Boolean readonly
- #chardev? ⇒ Boolean readonly
- #dereference? ⇒ Boolean readonly
- #directory? ⇒ Boolean readonly
- #door? ⇒ Boolean readonly
- #exist? ⇒ Boolean readonly
- #file? ⇒ Boolean readonly
- #pipe? ⇒ Boolean readonly
- #socket? ⇒ Boolean readonly
- #symlink? ⇒ Boolean readonly
- #check_have_lchmod? ⇒ Boolean readonly private
- #check_have_lchown? ⇒ Boolean readonly private
- #have_lchmod? ⇒ Boolean readonly private
- #have_lchown? ⇒ Boolean readonly private
Instance Method Summary
- #chmod(mode)
- #chown(uid, gid)
- #copy(dest)
- #copy_file(dest)
- #copy_metadata(path)
- #entries
- #inspect
- #link(dest)
- #lstat
- #lstat!
- #path
- #platform_support
- #postorder_traverse {|_self| ... }
- #prefix
- #preorder_traverse (also: #traverse)
- #rel
- #remove
- #remove_dir1
- #remove_file
- #stat
- #stat!
-
#traverse
Alias for #preorder_traverse.
- #wrap_traverse(pre, post)
- #descendant_directory?(descendant, ascendant) ⇒ Boolean private
- #join(dir, base) private
StreamUtils_ - Included
Constructor Details
.new(a, b = nil, deref = false) ⇒ Entry_
# File 'lib/fileutils.rb', line 2100
def initialize(a, b = nil, deref = false) @prefix = @rel = @path = nil if b @prefix = a @rel = b else @path = a end @deref = deref @stat = nil @lstat = nil end
Instance Attribute Details
#blockdev? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2166
def blockdev? s = lstat! s and s.blockdev? end
#chardev? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2161
def chardev? s = lstat! s and s.chardev? end
#check_have_lchmod? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/fileutils.rb', line 2434
def check_have_lchmod? return false unless File.respond_to?(:lchmod) File.lchmod 0 return true rescue NotImplementedError return false end
#check_have_lchown? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/fileutils.rb', line 2452
def check_have_lchown? return false unless File.respond_to?(:lchown) File.lchown nil, nil return true rescue NotImplementedError return false end
#dereference? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2133
def dereference? @deref end
#directory? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2151
def directory? s = lstat! s and s.directory? end
#door? ⇒ Boolean (readonly)
[ GitHub ]
#exist? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2137
def exist? begin lstat true rescue Errno::ENOENT false end end
#file? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2146
def file? s = lstat! s and s.file? end
#have_lchmod? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/fileutils.rb', line 2426
def have_lchmod? # This is not MT-safe, but it does not matter. if @@fileutils_rb_have_lchmod == nil @@fileutils_rb_have_lchmod = check_have_lchmod? end @@fileutils_rb_have_lchmod end
#have_lchown? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/fileutils.rb', line 2444
def have_lchown? # This is not MT-safe, but it does not matter. if @@fileutils_rb_have_lchown == nil @@fileutils_rb_have_lchown = check_have_lchown? end @@fileutils_rb_have_lchown end
#pipe? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2176
def pipe? s = lstat! s and s.pipe? end
#socket? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2171
def socket? s = lstat! s and s.socket? end
#symlink? ⇒ Boolean (readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 2156
def symlink? s = lstat! s and s.symlink? end
Instance Method Details
#chmod(mode)
[ GitHub ]# File 'lib/fileutils.rb', line 2234
def chmod(mode) if symlink? File.lchmod mode, path() if have_lchmod? else File.chmod mode, path() end rescue Errno::EOPNOTSUPP end
#chown(uid, gid)
[ GitHub ]# File 'lib/fileutils.rb', line 2243
def chown(uid, gid) if symlink? File.lchown uid, gid, path() if have_lchown? else File.chown uid, gid, path() end end
#copy(dest)
[ GitHub ]# File 'lib/fileutils.rb', line 2267
def copy(dest) lstat case when file? copy_file dest when directory? if !File.exist?(dest) and descendant_directory?(dest, path) raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest] end begin Dir.mkdir dest rescue raise unless File.directory?(dest) end when symlink? File.symlink File.readlink(path()), dest when chardev?, blockdev? raise "cannot handle device file" when socket? begin require 'socket' rescue LoadError raise "cannot handle socket" else raise "cannot handle socket" unless defined?(UNIXServer) end UNIXServer.new(dest).close File.chmod lstat().mode, dest when pipe? raise "cannot handle FIFO" unless File.respond_to?(:mkfifo) File.mkfifo dest, lstat().mode when door? raise "cannot handle door: #{path()}" else raise "unknown file type: #{path()}" end end
#copy_file(dest)
[ GitHub ]# File 'lib/fileutils.rb', line 2305
def copy_file(dest) File.open(path()) do |s| File.open(dest, 'wb', s.stat.mode) do |f| IO.copy_stream(s, f) end end end
#copy_metadata(path)
[ GitHub ]# File 'lib/fileutils.rb', line 2313
def (path) st = lstat() if !st.symlink? File.utime st.atime, st.mtime, path end mode = st.mode begin if st.symlink? begin File.lchown st.uid, st.gid, path rescue NotImplementedError end else File.chown st.uid, st.gid, path end rescue Errno::EPERM, Errno::EACCES # clear setuid/setgid mode &= 01777 end if st.symlink? begin File.lchmod mode, path rescue NotImplementedError, Errno::EOPNOTSUPP end else File.chmod mode, path end end
#descendant_directory?(descendant, ascendant) ⇒ Boolean (private)
# File 'lib/fileutils.rb', line 2480
def descendant_directory?(descendant, ascendant) if File::FNM_SYSCASE.nonzero? File.(File.dirname(descendant)).casecmp(File.(ascendant)) == 0 else File.(File.dirname(descendant)) == File.(ascendant) end end
#entries
[ GitHub ]#inspect
[ GitHub ]# File 'lib/fileutils.rb', line 2113
def inspect "\#<#{self.class} #{path()}>" end
#join(dir, base) (private)
[ GitHub ]# File 'lib/fileutils.rb', line 2460
def join(dir, base) return File.path(dir) if not base or base == '.' return File.path(base) if not dir or dir == '.' begin File.join(dir, base) rescue EncodingError if fu_windows? File.join(dir.encode(::Encoding::UTF_8), base.encode(::Encoding::UTF_8)) else raise end end end
#link(dest)
[ GitHub ]# File 'lib/fileutils.rb', line 2251
def link(dest) case when directory? if !File.exist?(dest) and descendant_directory?(dest, path) raise ArgumentError, "cannot link directory %s to itself %s" % [path, dest] end begin Dir.mkdir dest rescue raise unless File.directory?(dest) end else File.link path(), dest end end
#lstat
[ GitHub ]# File 'lib/fileutils.rb', line 2220
def lstat if dereference? @lstat ||= File.stat(path()) else @lstat ||= File.lstat(path()) end end
#lstat!
[ GitHub ]# File 'lib/fileutils.rb', line 2228
def lstat! lstat() rescue SystemCallError nil end
#path
[ GitHub ]# File 'lib/fileutils.rb', line 2117
def path if @path File.path(@path) else join(@prefix, @rel) end end
#platform_support
[ GitHub ]# File 'lib/fileutils.rb', line 2362
def platform_support return yield unless fu_windows? first_time_p = true begin yield rescue Errno::ENOENT raise rescue => err if first_time_p first_time_p = false begin File.chmod 0700, path() # Windows does not have symlink retry rescue SystemCallError end end raise err end end
#postorder_traverse {|_self| ... }
# File 'lib/fileutils.rb', line 2392
def postorder_traverse if directory? begin children = entries() rescue Errno::EACCES # Failed to get the list of children. # Assuming there is no children, try to process the parent directory. yield self return end children.each do |ent| ent.postorder_traverse do |e| yield e end end end yield self end
#prefix
[ GitHub ]# File 'lib/fileutils.rb', line 2125
def prefix @prefix || @path end
#preorder_traverse Also known as: #traverse
[ GitHub ]# File 'lib/fileutils.rb', line 2382
def preorder_traverse stack = [self] while ent = stack.pop yield ent stack.concat ent.entries.reverse if ent.directory? end end
#rel
[ GitHub ]# File 'lib/fileutils.rb', line 2129
def rel @rel end
#remove
[ GitHub ]# File 'lib/fileutils.rb', line 2342
def remove if directory? remove_dir1 else remove_file end end
#remove_dir1
[ GitHub ]# File 'lib/fileutils.rb', line 2350
def remove_dir1 platform_support { Dir.rmdir path().chomp(?/) } end
#remove_file
[ GitHub ]# File 'lib/fileutils.rb', line 2356
def remove_file platform_support { File.unlink path } end
#stat
[ GitHub ]#stat!
[ GitHub ]#traverse
Alias for #preorder_traverse.
# File 'lib/fileutils.rb', line 2390
alias traverse preorder_traverse
#wrap_traverse(pre, post)
[ GitHub ]# File 'lib/fileutils.rb', line 2412
def wrap_traverse(pre, post) pre.call self if directory? entries.each do |ent| ent.wrap_traverse pre, post end end post.call self end