Class: Archive::Zip::Entry::Symlink
- Inherits:
-
Object
- Object
- Archive::Zip::Entry::Symlink
- Includes:
- Archive::Zip::Entry
- Defined in:
- lib/archive/zip/entry.rb
Overview
Archive::Zip::Entry::Symlink represents a symlink entry withing a Zip archive.
Constant Summary
Constants included from Archive::Zip::Entry
FLAG_DATA_DESCRIPTOR_FOLLOWS, FLAG_ENCRYPTED
Instance Attribute Summary
Attributes included from Archive::Zip::Entry
#atime, #comment, #compression_codec, #encryption_codec, #expected_data_descriptor, #gid, #mode, #mtime, #password, #raw_data, #uid, #zip_path
Instance Method Summary collapse
-
#extract(options = {}) ⇒ Object
Extracts this entry.
-
#ftype ⇒ Object
Returns the file type of this entry as the symbol
:symlink
. -
#link_target ⇒ Object
Returns the link target for this entry.
-
#link_target=(link_target) ⇒ Object
Sets the link target for this entry.
-
#mode=(mode) ⇒ Object
Overridden in order to ensure that the proper mode bits are set for a symlink.
-
#symlink? ⇒ Boolean
Returns
true
.
Methods included from Archive::Zip::Entry
#add_extra_field, #directory?, #dump_central_file_record, #dump_local_file_record, expand_path, #file?, from_file, #initialize, parse
Instance Method Details
#extract(options = {}) ⇒ Object
Extracts this entry.
options is a Hash optionally containing the following:
- :file_path
-
Specifies the path to which this entry will be extracted. Defaults to the zip path of this entry.
- :permissions
-
When set to
false
(the default), POSIX mode/permission bits will be ignored. Otherwise, they will be restored if possible. Not supported on all platforms. - :ownerships
-
When set to
false
(the default), user and group ownerships will be ignored. On most systems, only a superuser is able to change ownerships, so setting this option totrue
as a regular user may have no effect. Not supported on all platforms.
Raises Archive::Zip::EntryError if the link_target attribute is not specified.
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 |
# File 'lib/archive/zip/entry.rb', line 970 def extract( = {}) raise Zip::EntryError, 'link_target is nil' if link_target.nil? # Ensure that unspecified options have default values. file_path = .has_key?(:file_path) ? [:file_path].to_s : @zip_path = .has_key?(:permissions) ? [:permissions] : false restore_ownerships = .has_key?(:ownerships) ? [:ownerships] : false # Create the containing directory tree if necessary. parent_dir = ::File.dirname(file_path) FileUtils.mkdir_p(parent_dir) unless ::File.exist?(parent_dir) # Create the symlink. ::File.symlink(link_target, file_path) # Restore the metadata. # NOTE: Ruby does not have the ability to restore atime and mtime on # symlinks at this time (version 1.8.6). begin ::File.lchmod(mode, file_path) if rescue NotImplementedError # Ignore on platforms that do not support lchmod. end begin ::File.lchown(uid, gid, file_path) if restore_ownerships rescue NotImplementedError # Ignore on platforms that do not support lchown. end nil end |
#ftype ⇒ Object
Returns the file type of this entry as the symbol :symlink
.
901 902 903 |
# File 'lib/archive/zip/entry.rb', line 901 def ftype :symlink end |
#link_target ⇒ Object
Returns the link target for this entry.
Raises Archive::Zip::EntryError if decoding the link target from an archive is required but fails.
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 |
# File 'lib/archive/zip/entry.rb', line 920 def link_target return @link_target unless @link_target.nil? raw_data.seek(0) compression_codec.decompressor( encryption_codec.decryptor(raw_data, password) ) do |decompressor| @link_target = ''.b begin loop do @link_target << decompressor.read(8192) end rescue EOFError # Ignore. end # Verify that the extracted data is good. begin unless expected_data_descriptor.nil? then expected_data_descriptor.verify(decompressor.data_descriptor) end rescue => e raise Zip::EntryError, "`#{zip_path}': #{e.}" end end @link_target end |
#link_target=(link_target) ⇒ Object
Sets the link target for this entry. As a side effect, the raw_data attribute is set to nil
.
947 948 949 950 |
# File 'lib/archive/zip/entry.rb', line 947 def link_target=(link_target) self.raw_data = nil @link_target = link_target end |
#mode=(mode) ⇒ Object
Overridden in order to ensure that the proper mode bits are set for a symlink.
912 913 914 |
# File 'lib/archive/zip/entry.rb', line 912 def mode=(mode) super(0120000 | (mode & 07777)) end |
#symlink? ⇒ Boolean
Returns true
.
906 907 908 |
# File 'lib/archive/zip/entry.rb', line 906 def symlink? true end |