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 1575"(?=/|\\z)"
-
S_IF_DOOR =
# File 'lib/fileutils.rb', line 12840xD000
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
- #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 1203
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 1269
def blockdev? s = lstat! s and s.blockdev? end
#chardev? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 1264
def chardev? s = lstat! s and s.chardev? end
#check_have_lchmod? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/fileutils.rb', line 1534
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 1552
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 1236
def dereference? @deref end
#directory? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 1254
def directory? s = lstat! s and s.directory? end
#door? ⇒ Boolean
(readonly)
[ GitHub ]
#exist? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 1240
def exist? begin lstat true rescue Errno::ENOENT false end end
#file? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 1249
def file? s = lstat! s and s.file? end
#have_lchmod? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/fileutils.rb', line 1526
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 1544
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 1279
def pipe? s = lstat! s and s.pipe? end
#socket? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 1274
def socket? s = lstat! s and s.socket? end
#symlink? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/fileutils.rb', line 1259
def symlink? s = lstat! s and s.symlink? end
Instance Method Details
#chmod(mode)
[ GitHub ]# File 'lib/fileutils.rb', line 1342
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 1351
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 1375
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 1413
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 1421
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 1580
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 ]# File 'lib/fileutils.rb', line 1291
def entries opts = {} opts[:encoding] = fu_windows? ? ::Encoding::UTF_8 : path.encoding files = if Dir.respond_to?(:children) Dir.children(path, **opts) else Dir.entries(path(), **opts) .reject {|n| n == '.' or n == '..' } end untaint = RUBY_VERSION < '2.7' files.map {|n| Entry_.new(prefix(), join(rel(), untaint ? n.untaint : n)) } end
#inspect
[ GitHub ]# File 'lib/fileutils.rb', line 1216
def inspect "\#<#{self.class} #{path()}>" end
#join(dir, base) (private)
[ GitHub ]# File 'lib/fileutils.rb', line 1560
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 1359
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 1328
def lstat if dereference? @lstat ||= File.stat(path()) else @lstat ||= File.lstat(path()) end end
#lstat!
[ GitHub ]# File 'lib/fileutils.rb', line 1336
def lstat! lstat() rescue SystemCallError nil end
#path
[ GitHub ]# File 'lib/fileutils.rb', line 1220
def path if @path File.path(@path) else join(@prefix, @rel) end end
#platform_support
[ GitHub ]# File 'lib/fileutils.rb', line 1470
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
[ GitHub ]# File 'lib/fileutils.rb', line 1500
def postorder_traverse if directory? entries().each do |ent| ent.postorder_traverse do |e| yield e end end end ensure yield self end
#prefix
[ GitHub ]# File 'lib/fileutils.rb', line 1228
def prefix @prefix || @path end
#preorder_traverse Also known as: #traverse
[ GitHub ]# File 'lib/fileutils.rb', line 1490
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 1232
def rel @rel end
#remove
[ GitHub ]# File 'lib/fileutils.rb', line 1450
def remove if directory? remove_dir1 else remove_file end end
#remove_dir1
[ GitHub ]# File 'lib/fileutils.rb', line 1458
def remove_dir1 platform_support { Dir.rmdir path().chomp(?/) } end
#remove_file
[ GitHub ]# File 'lib/fileutils.rb', line 1464
def remove_file platform_support { File.unlink path } end
#stat
[ GitHub ]#stat!
[ GitHub ]#traverse
Alias for #preorder_traverse.
# File 'lib/fileutils.rb', line 1498
alias traverse preorder_traverse
#wrap_traverse(pre, post)
[ GitHub ]# File 'lib/fileutils.rb', line 1512
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