Class: Gem::Package::TarReader::Entry

Inherits:
Object
  • Object
show all
Defined in:
lib/rubygems/package/tar_reader/entry.rb

Overview

Class for reading entries out of a tar file

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(header, io) ⇒ Entry

Creates a new tar entry for header that will be read from io



19
20
21
22
23
24
25
# File 'lib/rubygems/package/tar_reader/entry.rb', line 19

def initialize(header, io)
  @closed = false
  @header = header
  @io = io
  @orig_pos = @io.pos
  @read = 0
end

Instance Attribute Details

#headerObject (readonly)

Header for this tar entry



14
15
16
# File 'lib/rubygems/package/tar_reader/entry.rb', line 14

def header
  @header
end

Instance Method Details

#bytes_readObject

Number of bytes read out of the tar entry



34
35
36
# File 'lib/rubygems/package/tar_reader/entry.rb', line 34

def bytes_read
  @read
end

#check_closedObject

:nodoc:

Raises:

  • (IOError)


27
28
29
# File 'lib/rubygems/package/tar_reader/entry.rb', line 27

def check_closed # :nodoc:
  raise IOError, "closed #{self.class}" if closed?
end

#closeObject

Closes the tar entry



41
42
43
# File 'lib/rubygems/package/tar_reader/entry.rb', line 41

def close
  @closed = true
end

#closed?Boolean

Is the tar entry closed?

Returns:

  • (Boolean)


48
49
50
# File 'lib/rubygems/package/tar_reader/entry.rb', line 48

def closed?
  @closed
end

#directory?Boolean

Is this tar entry a directory?

Returns:

  • (Boolean)


93
94
95
# File 'lib/rubygems/package/tar_reader/entry.rb', line 93

def directory?
  @header.typeflag == "5"
end

#eof?Boolean

Are we at the end of the tar entry?

Returns:

  • (Boolean)


55
56
57
58
59
# File 'lib/rubygems/package/tar_reader/entry.rb', line 55

def eof?
  check_closed

  @read >= @header.size
end

#file?Boolean

Is this tar entry a file?

Returns:

  • (Boolean)


100
101
102
# File 'lib/rubygems/package/tar_reader/entry.rb', line 100

def file?
  @header.typeflag == "0"
end

#full_nameObject

Full name of the tar entry



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/rubygems/package/tar_reader/entry.rb', line 64

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

#getcObject

Read one byte from the tar entry



79
80
81
82
83
84
85
86
87
88
# File 'lib/rubygems/package/tar_reader/entry.rb', line 79

def getc
  check_closed

  return nil if @read >= @header.size

  ret = @io.getc
  @read += 1 if ret

  ret
end

#posObject

The position in the tar entry



114
115
116
117
118
# File 'lib/rubygems/package/tar_reader/entry.rb', line 114

def pos
  check_closed

  bytes_read
end

#read(len = nil) ⇒ Object

Reads len bytes from the tar file entry, or the rest of the entry if nil



130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/rubygems/package/tar_reader/entry.rb', line 130

def read(len = nil)
  check_closed

  len ||= @header.size - @read

  return nil if len > 0 && @read >= @header.size

  max_read = [len, @header.size - @read].min

  ret = @io.read max_read
  @read += ret.size

  ret
end

#readpartial(maxlen = nil, outbuf = "".b) ⇒ Object

Raises:

  • (EOFError)


145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/rubygems/package/tar_reader/entry.rb', line 145

def readpartial(maxlen = nil, outbuf = "".b)
  check_closed

  maxlen ||= @header.size - @read

  raise EOFError if maxlen > 0 && @read >= @header.size

  max_read = [maxlen, @header.size - @read].min

  @io.readpartial(max_read, outbuf)
  @read += outbuf.size

  outbuf
end

#rewindObject

Rewinds to the beginning of the tar file entry



163
164
165
166
167
168
# File 'lib/rubygems/package/tar_reader/entry.rb', line 163

def rewind
  check_closed

  @io.pos = @orig_pos
  @read = 0
end

#sizeObject Also known as: length



120
121
122
# File 'lib/rubygems/package/tar_reader/entry.rb', line 120

def size
  @header.size
end

#symlink?Boolean

Is this tar entry a symlink?

Returns:

  • (Boolean)


107
108
109
# File 'lib/rubygems/package/tar_reader/entry.rb', line 107

def symlink?
  @header.typeflag == "2"
end