Class: Archive::Tar::Minitar::Input
- Inherits:
-
Object
- Object
- Archive::Tar::Minitar::Input
- Includes:
- Enumerable
- Defined in:
- lib/shoes/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)
-
+ (Object) open(input)
With no associated block, Input::open is a synonym for Input::new.
Instance Method Summary (collapse)
-
- (Object) close
Closes the Reader object and the wrapped data stream.
-
- (Object) each(&block)
Iterates through each entry and rewinds to the beginning of the stream when finished.
-
- (Object) extract_entry(destdir, entry)
Extracts the current entry to destdir.
-
- (Input) initialize(input)
constructor
Creates a new Input object.
-
- (Object) tar
Returns the Reader object for direct access.
Constructor Details
- (Input) initialize(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.
671 672 673 674 675 676 677 678 |
# File 'lib/shoes/minitar.rb', line 671 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
+ (Object) open(input)
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.
654 655 656 657 658 659 660 661 662 663 664 665 |
# File 'lib/shoes/minitar.rb', line 654 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
- (Object) close
Closes the Reader object and the wrapped data stream.
769 770 771 772 |
# File 'lib/shoes/minitar.rb', line 769 def close @io.close @tarreader.close end |
- (Object) each(&block)
Iterates through each entry and rewinds to the beginning of the stream when finished.
682 683 684 685 686 |
# File 'lib/shoes/minitar.rb', line 682 def each(&block) @tarreader.each { |entry| yield entry } ensure @tarreader.rewind end |
- (Object) extract_entry(destdir, entry)
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 entry is a directory. |
:file_start |
The entry is 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 entry is 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. |
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 |
# File 'lib/shoes/minitar.rb', line 707 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 |
- (Object) tar
Returns the Reader object for direct access.
764 765 766 |
# File 'lib/shoes/minitar.rb', line 764 def tar @tarreader end |