Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
ruby/lib/rubygems/package/tar_reader/entry.rb
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
170 lines (121 sloc)
2.54 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# frozen_string_literal: true | |
#++ | |
# Copyright (C) 2004 Mauricio Julio Fernández Pradier | |
# See LICENSE.txt for additional licensing information. | |
#-- | |
## | |
# Class for reading entries out of a tar file | |
class Gem::Package::TarReader::Entry | |
## | |
# Header for this tar entry | |
attr_reader :header | |
## | |
# Creates a new tar entry for +header+ that will be read from +io+ | |
def initialize(header, io) | |
@closed = false | |
@header = header | |
@io = io | |
@orig_pos = @io.pos | |
@read = 0 | |
end | |
def check_closed # :nodoc: | |
raise IOError, "closed #{self.class}" if closed? | |
end | |
## | |
# Number of bytes read out of the tar entry | |
def bytes_read | |
@read | |
end | |
## | |
# Closes the tar entry | |
def close | |
@closed = true | |
end | |
## | |
# Is the tar entry closed? | |
def closed? | |
@closed | |
end | |
## | |
# Are we at the end of the tar entry? | |
def eof? | |
check_closed | |
@read >= @header.size | |
end | |
## | |
# Full name of the tar entry | |
def full_name | |
if @header.prefix != "" | |
File.join @header.prefix, @header.name | |
else | |
@header.name | |
end | |
rescue ArgumentError => e | |
raise unless e.message == 'string contains null byte' | |
raise Gem::Package::TarInvalidError, | |
'tar is corrupt, name contains null byte' | |
end | |
## | |
# Read one byte from the tar entry | |
def getc | |
check_closed | |
return nil if @read >= @header.size | |
ret = @io.getc | |
@read += 1 if ret | |
ret | |
end | |
## | |
# Is this tar entry a directory? | |
def directory? | |
@header.typeflag == "5" | |
end | |
## | |
# Is this tar entry a file? | |
def file? | |
@header.typeflag == "0" | |
end | |
## | |
# Is this tar entry a symlink? | |
def symlink? | |
@header.typeflag == "2" | |
end | |
## | |
# The position in the tar entry | |
def pos | |
check_closed | |
bytes_read | |
end | |
def size | |
@header.size | |
end | |
alias length size | |
## | |
# Reads +len+ bytes from the tar file entry, or the rest of the entry if | |
# nil | |
def read(len = nil) | |
check_closed | |
return nil if @read >= @header.size | |
len ||= @header.size - @read | |
max_read = [len, @header.size - @read].min | |
ret = @io.read max_read | |
@read += ret.size | |
ret | |
end | |
def readpartial(maxlen = nil, outbuf = "".b) | |
check_closed | |
raise EOFError if @read >= @header.size | |
maxlen ||= @header.size - @read | |
max_read = [maxlen, @header.size - @read].min | |
@io.readpartial(max_read, outbuf) | |
@read += outbuf.size | |
outbuf | |
end | |
## | |
# Rewinds to the beginning of the tar file entry | |
def rewind | |
check_closed | |
@io.pos = @orig_pos | |
@read = 0 | |
end | |
end |