Module: Wright::Util::File Private

Defined in:
lib/wright/util/file.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Various file methods.

Class Method Summary collapse

Class Method Details

.expand_tilde_path(path) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Expands tilde symbols in file paths. Path elements other than the first one are left alone.

Examples:

Wright::Util::File.expand_tilde_path('~root/foo')
# => "/root/foo"

Wright::Util::File.expand_tilde_path('~root/foo/..')
# => "/root/foo/.."

Wright::Util::File.expand_tilde_path('../foo/bar')
# => "../foo/bar"

Parameters:

  • path (String)

    the file path

Returns:

  • (String)

    the expanded path


228
229
230
231
232
233
# File 'lib/wright/util/file.rb', line 228

def self.expand_tilde_path(path)
  return path unless path.start_with?('~')

  first, *rest = path.split(::File::SEPARATOR)
  ::File.join(::File.expand_path(first), rest)
end

.file_group(path) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a file's owner.

Examples:

FileUtils.touch('foo')
FileUtils.chown(0, 0, 'foo')
Wright::Util::File.file_group('foo')
# => 0

Wright::Util::File.file_group('nonexistent')
# => nil

Parameters:

  • path (String)

    the file's path

Returns:

  • (Integer)

    the file owner's uid or nil if the file does not exist.


208
209
210
# File 'lib/wright/util/file.rb', line 208

def self.file_group(path)
  ::File.exist?(path) ? ::File.stat(path).gid : nil
end

.file_mode(path) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a file's current mode.

Examples:

FileUtils.touch('foo')
FileUtils.chmod(0644, 'foo')
Wright::Util::File.file_mode('foo').to_s(8)
# => "644"

Parameters:

  • path (String)

    the file's path

Returns:

  • (Integer)

    the file mode as an integer or nil if the file does not exist


170
171
172
# File 'lib/wright/util/file.rb', line 170

def self.file_mode(path)
  ::File.exist?(path) ? (::File.stat(path).mode & 07777) : nil
end

.file_owner(path) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a file's owner.

Examples:

FileUtils.touch('foo')
FileUtils.chown(0, 0, 'foo')
Wright::Util::File.file_owner('foo')
# => 0

Wright::Util::File.file_owner('nonexistent')
# => nil

Parameters:

  • path (String)

    the file's path

Returns:

  • (Integer)

    the file owner's uid or nil if the file does not exist


189
190
191
# File 'lib/wright/util/file.rb', line 189

def self.file_owner(path)
  ::File.exist?(path) ? ::File.stat(path).uid : nil
end

.ln_sfn(target, link_name) ⇒ void

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Creates symlinks without descending into directories.

If the file denoted by link_name is a symlink to a directory, ln_sfn does not descend into it. Behaves similar to GNU ln(1) or OpenBSD ln(1) when using ln -sfn target link_name.

Parameters:

  • target (String)

    the link target

  • link_name (String)

    the link name


245
246
247
248
249
250
# File 'lib/wright/util/file.rb', line 245

def self.ln_sfn(target, link_name)
  if ::File.symlink?(link_name) && ::File.directory?(link_name)
    FileUtils.rm(link_name)
  end
  FileUtils.ln_sf(target, link_name)
end

.numeric_mode_to_i(mode) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Converts a numeric mode string to an integer mode.

Examples:

Wright::Util::File.numeric_mode_to_i('0600').to_s(8)
# => "600"

Wright::Util::File.numeric_mode_to_i('644').to_s(8)
# => "644"

Wright::Util::File.numeric_mode_to_i(0644).to_s(8)
# => "644"

Wright::Util::File.numeric_mode_to_i('invalid_mode').to_s(8)
# => nil

Parameters:

  • mode (String, #to_i)

    the numeric mode string

Returns:

  • (Integer)

    the mode in integer form or nil if the mode could not be converted


145
146
147
148
# File 'lib/wright/util/file.rb', line 145

def self.numeric_mode_to_i(mode)
  return mode.to_i unless mode.is_a?(String)
  mode =~ /\A[0-7]{3,4}\Z/ ? mode.to_i(8) : nil
end

.symbolic_mode_to_i(mode, base_mode, filetype = :file) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Converts a symbolic mode string to an integer mode value.

Examples:

Wright::Util::File.symbolic_mode_to_i('u=rw,go=r', 0400).to_s(8)
# => "644"

Wright::Util::File.symbolic_mode_to_i('u=rw,g+r', 0200).to_s(8)
# => "640"

Parameters:

  • mode (String)

    the symbolic mode string

  • base_mode (Integer)

    the base mode

  • filetype (Symbol) (defaults to: :file)

    the filetype

Returns:

  • (Integer)

    the integer mode


76
77
78
79
80
81
82
83
84
85
86
# File 'lib/wright/util/file.rb', line 76

def self.symbolic_mode_to_i(mode, base_mode, filetype = :file)
  is_directory = (filetype == :directory)
  unless symbolic_mode?(mode)
    fail ArgumentError, "Invalid file mode \"#{mode}\""
  end
  mode_i = base_mode
  mode.split(/,/).each do |mode_clause|
    mode_i = mode_clause_to_i(mode_clause, mode_i, is_directory)
  end
  mode_i
end