| Class | Gem::Package::TarWriter |
| In: |
lib/rubygems/package/tar_writer.rb
|
| Parent: | Object |
# File lib/rubygems/package/tar_writer.rb, line 59
59: def initialize(io)
60: @io = io
61: @closed = false
62: end
# File lib/rubygems/package/tar_writer.rb, line 45
45: def self.new(io)
46: writer = super
47:
48: return writer unless block_given?
49:
50: begin
51: yield writer
52: ensure
53: writer.close
54: end
55:
56: nil
57: end
# File lib/rubygems/package/tar_writer.rb, line 64
64: def add_file(name, mode)
65: check_closed
66:
67: raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=
68:
69: name, prefix = split_name name
70:
71: init_pos = @io.pos
72: @io.write "\0" * 512 # placeholder for the header
73:
74: yield RestrictedStream.new(@io) if block_given?
75:
76: size = @io.pos - init_pos - 512
77:
78: remainder = (512 - (size % 512)) % 512
79: @io.write "\0" * remainder
80:
81: final_pos = @io.pos
82: @io.pos = init_pos
83:
84: header = Gem::Package::TarHeader.new :name => name, :mode => mode,
85: :size => size, :prefix => prefix
86:
87: @io.write header
88: @io.pos = final_pos
89:
90: self
91: end
# File lib/rubygems/package/tar_writer.rb, line 93
93: def add_file_simple(name, mode, size)
94: check_closed
95:
96: name, prefix = split_name name
97:
98: header = Gem::Package::TarHeader.new(:name => name, :mode => mode,
99: :size => size, :prefix => prefix).to_s
100:
101: @io.write header
102: os = BoundedStream.new @io, size
103:
104: yield os if block_given?
105:
106: min_padding = size - os.written
107: @io.write("\0" * min_padding)
108:
109: remainder = (512 - (size % 512)) % 512
110: @io.write("\0" * remainder)
111:
112: self
113: end
# File lib/rubygems/package/tar_writer.rb, line 115
115: def check_closed
116: raise IOError, "closed #{self.class}" if closed?
117: end
# File lib/rubygems/package/tar_writer.rb, line 119
119: def close
120: check_closed
121:
122: @io.write "\0" * 1024
123: flush
124:
125: @closed = true
126: end
# File lib/rubygems/package/tar_writer.rb, line 132
132: def flush
133: check_closed
134:
135: @io.flush if @io.respond_to? :flush
136: end
# File lib/rubygems/package/tar_writer.rb, line 138
138: def mkdir(name, mode)
139: check_closed
140:
141: name, prefix = split_name(name)
142:
143: header = Gem::Package::TarHeader.new :name => name, :mode => mode,
144: :typeflag => "5", :size => 0,
145: :prefix => prefix
146:
147: @io.write header
148:
149: self
150: end