class Rush::Entry
Rush::Entry
is the base class for Rush::File
and Rush::Dir
. One or more of these is instantiated whenever you use square brackets to access the filesystem on a box, as well as any other operation that returns an entry or list of entries.
Attributes
Public Class Methods
The factory checks to see if the full path has a trailing slash for creating a Rush::Dir
rather than the default Rush::File
.
# File lib/rush/entry.rb, line 30 def self.factory(full_path, box=nil) if full_path.tail(1) == '/' Rush::Dir.new(full_path, box) elsif File.directory?(full_path) Rush::Dir.new(full_path, box) else Rush::File.new(full_path, box) end end
Initialize with full path to the file or dir, and the box it resides on.
# File lib/rush/entry.rb, line 9 def initialize(full_path, box=nil) full_path = ::File.expand_path(full_path, '/') @path = ::File.dirname(full_path) @name = ::File.basename(full_path) @box = box || Rush::Box.new('localhost') end
Public Instance Methods
Returns a hash with up to nine values, combining user/group/other with read/write/execute. The key is omitted if the value is false.
Examples:
entry.access # -> { :user_can_read => true, :user_can_write => true, :group_can_read => true } entry.access[:other_can_read] # -> true or nil
# File lib/rush/entry.rb, line 185 def access Rush::Access.new.from_octal(stat[:mode]).display_hash end
Set the access permissions for the entry.
Permissions are set by role and permissions combinations which can be specified individually or grouped together. :user_can => :read, :user_can => :write is the same as :user_can => :read_write.
You can also insert 'and' if you find it reads better, like :user_and_group_can => :read_and_write.
Any permission excluded is set to deny access. The access call does not set partial permissions which combine with the existing state of the entry, like “chmod o+r” would.
Examples:
file.access = { :user_can => :read_write, :group_other_can => :read } dir.access = { :user => 'adam', :group => 'users', :read_write_execute => :user_group }
# File lib/rush/entry.rb, line 173 def access=(options) connection.set_access(full_path, Rush::Access.parse(options)) end
Timestamp of most recent change to the entry (permissions, contents, etc).
# File lib/rush/entry.rb, line 78 def changed_at stat[:ctime] end
Change entry ownership
Changes owner and group on the named files (in list) to the user user and the group group. user and group may be an ID (Integer/String) or a name (String
). If user or group is nil, this method does not change the attribute.
@param user [string/integer] The user to own the file @param group [string/integer] The group to own the file @param options [hash] the options to pass to FileUtils.chown (eg. 'noop', 'verbose' or 'recursive' )
# File lib/rush/entry.rb, line 197 def chown(user = nil, group = nil, options = {}) connection.chown(full_path, user, group, options) self end
Shortcut to Entry::chown to pass the 'recursive' option by default
# File lib/rush/entry.rb, line 204 def chown_R(user = nil, group = nil, options = {}) options[:recursive] = true chown(user, group, options) end
# File lib/rush/entry.rb, line 52 def connection box ? box.connection : Rush::Connection::Local.new end
Copy the entry to another dir. Returns an object representing the new copy.
# File lib/rush/entry.rb, line 113 def copy_to(dir) raise Rush::NotADir unless dir.class == Rush::Dir if box == dir.box connection.copy(full_path, dir.full_path) else archive = connection.read_archive(full_path) dir.box.connection.write_archive(archive, dir.full_path) end new_full_path = "#{dir.full_path}#{name}" self.class.new(new_full_path, dir.box) end
Destroy the entry. If it is a dir, everything inside it will also be destroyed.
# File lib/rush/entry.rb, line 225 def destroy connection.destroy(full_path) end
Rename an entry to another name within the same dir. The existing object will not be affected, but a new object representing the newly-created entry will be returned.
# File lib/rush/entry.rb, line 104 def duplicate(new_name) raise Rush::NameCannotContainSlash if new_name.match(/\//) new_full_path = "#{@path}/#{new_name}" connection.copy(full_path, new_full_path) self.class.new(new_full_path, box) end
# File lib/rush/entry.rb, line 24 def executables Rush::Path.executables end
Return true if the entry currently exists on the filesystem of the box.
# File lib/rush/entry.rb, line 70 def exists? stat true rescue Rush::DoesNotExist false end
# File lib/rush/entry.rb, line 61 def full_path "#{path}/#{name}" end
Timestamp that entry was last accessed (read from or written to).
# File lib/rush/entry.rb, line 88 def last_accessed stat[:atime] end
Timestamp of last modification of the contents.
# File lib/rush/entry.rb, line 83 def last_modified stat[:mtime] end
# File lib/rush/entry.rb, line 16 def method_missing(meth, *args, &block) if executables.include? meth.to_s open_with meth, *args else super end end
Move the entry to another dir. The object will be updated to show its new location.
# File lib/rush/entry.rb, line 129 def move_to(dir) moved = copy_to(dir) destroy mimic(moved) end
Chown in ruby way. Ruby way is creating accessors.
# File lib/rush/entry.rb, line 210 def owner stat = ::File.stat(full_path) { user: Etc.getpwuid(stat.uid).name, group: Etc.getgrgid(stat.gid).name } end
# File lib/rush/entry.rb, line 215 def owner=(params) case params when Hash then chown(params.delete(:user), params.delete(:group), params) when String then chown(params) when Numeric then chown(Etc.getpwuid(params).name) else raise 'Something wrong with params for chown' end end
# File lib/rush/entry.rb, line 65 def quoted_path Rush.quote(full_path) end
Rename an entry to another name within the same dir. The object's name will be updated to match the change on the filesystem.
# File lib/rush/entry.rb, line 94 def rename(new_name) connection.rename(@path, @name, new_name) @name = new_name self end
Symlink the file (see File.ln for options)
# File lib/rush/entry.rb, line 136 def symlink(dst, options = {}) connection.ln_s(full_path, dst, options) self.class.new(dst, box) end
Return true if the entry is a symlink.
# File lib/rush/entry.rb, line 142 def symlink? connection.symlink? full_path end
Private Instance Methods
# File lib/rush/entry.rb, line 235 def stat connection.stat(full_path) end