Class: Archive::Tar::Minitar::Input
- Inherits:
-
Object
- Object
- Archive::Tar::Minitar::Input
- Includes:
- Enumerable
- Defined in:
- lib/folio/minitar.rb
Overview
Wraps a Archive::Tar::Minitar::Reader with convenience methods and wrapped stream management; Input only works with random access data streams. See Input::new for details.
Class Method Summary collapse
-
.open(input) ⇒ Object
With no associated block,
Input::openis a synonym forInput::new.
Instance Method Summary collapse
-
#close ⇒ Object
Closes the Reader object and the wrapped data stream.
-
#each(&block) ⇒ Object
Iterates through each entry and rewinds to the beginning of the stream when finished.
-
#extract_entry(destdir, entry) ⇒ Object
Extracts the current
entrytodestdir. -
#initialize(input) ⇒ Input
constructor
Creates a new Input object.
-
#tar ⇒ Object
Returns the Reader object for direct access.
Constructor Details
#initialize(input) ⇒ Input
Creates a new Input object. If input is a stream object that responds to #read), then it will simply be wrapped. Otherwise, one will be created and opened using Kernel#open. When Input#close is called, the stream object wrapped will be closed.
749 750 751 752 753 754 755 756 |
# File 'lib/folio/minitar.rb', line 749 def initialize(input) if input.respond_to?(:read) @io = input else @io = open(input, "rb") end @tarreader = Archive::Tar::Minitar::Reader.new(@io) end |
Class Method Details
.open(input) ⇒ Object
With no associated block, Input::open is a synonym for Input::new. If the optional code block is given, it will be passed the new writer as an argument and the Input object will automatically be closed when the block terminates. In this instance, Input::open returns the value of the block.
732 733 734 735 736 737 738 739 740 741 742 743 |
# File 'lib/folio/minitar.rb', line 732 def self.open(input) stream = Input.new(input) return stream unless block_given? begin res = yield stream ensure stream.close end res end |
Instance Method Details
#close ⇒ Object
Closes the Reader object and the wrapped data stream.
847 848 849 850 |
# File 'lib/folio/minitar.rb', line 847 def close @io.close @tarreader.close end |
#each(&block) ⇒ Object
Iterates through each entry and rewinds to the beginning of the stream when finished.
760 761 762 763 764 |
# File 'lib/folio/minitar.rb', line 760 def each(&block) @tarreader.each { |entry| yield entry } ensure @tarreader.rewind end |
#extract_entry(destdir, entry) ⇒ Object
Extracts the current entry to destdir. If a block is provided, it yields an action Symbol, the full name of the file being extracted (name), and a Hash of statistical information (stats).
The action will be one of:
:dir-
The
entryis a directory. :file_start-
The
entryis a file; the extract of the file is just beginning. :file_progress-
Yielded every 4096 bytes during the extract of the
entry. :file_done-
Yielded when the
entryis completed.
The stats hash contains the following keys:
:current-
The current total number of bytes read in the
entry. :currinc-
The current number of bytes read in this read cycle.
:entry-
The entry being extracted; this is a Reader::EntryStream, with all methods thereof.
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 |
# File 'lib/folio/minitar.rb', line 785 def extract_entry(destdir, entry) # :yields action, name, stats: stats = { :current => 0, :currinc => 0, :entry => entry } if entry.directory? dest = File.join(destdir, entry.full_name) yield :dir, entry.full_name, stats if block_given? if Archive::Tar::Minitar.dir?(dest) begin FileUtils.chmod(entry.mode, dest) rescue Exception nil end else FileUtils.mkdir_p(dest, :mode => entry.mode) FileUtils.chmod(entry.mode, dest) end fsync_dir(dest) fsync_dir(File.join(dest, "..")) return else # it's a file destdir = File.join(destdir, File.dirname(entry.full_name)) FileUtils.mkdir_p(destdir, :mode => 0755) destfile = File.join(destdir, File.basename(entry.full_name)) FileUtils.chmod(0600, destfile) rescue nil # Errno::ENOENT yield :file_start, entry.full_name, stats if block_given? File.open(destfile, "wb", entry.mode) do |os| loop do data = entry.read(4096) break unless data stats[:currinc] = os.write(data) stats[:current] += stats[:currinc] yield :file_progress, entry.full_name, stats if block_given? end os.fsync end FileUtils.chmod(entry.mode, destfile) fsync_dir(File.dirname(destfile)) fsync_dir(File.join(File.dirname(destfile), "..")) yield :file_done, entry.full_name, stats if block_given? end end |
#tar ⇒ Object
Returns the Reader object for direct access.
842 843 844 |
# File 'lib/folio/minitar.rb', line 842 def tar @tarreader end |