mini_tarball 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mini_tarball/streams/limited_size_stream.rb +23 -0
- data/lib/mini_tarball/streams/placeholder_stream.rb +14 -0
- data/lib/mini_tarball/{write_only_stream.rb → streams/write_only_stream.rb} +1 -1
- data/lib/mini_tarball/version.rb +1 -1
- data/lib/mini_tarball/writer.rb +38 -0
- data/lib/mini_tarball.rb +3 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4f402eb6b43dd9a6a5b62d59d60d4ab949e9ea9c4e03be89354ab71624f5c74
|
4
|
+
data.tar.gz: 96e28996b32be3a777e7e8a1517e746536851e8a5e5cd330854a2e75b763be70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b941f8cb82d7a0a73782cd59e4e6185c4e28bd4c3e41f5eaaff1056e8503747df7012ba5cbe6a515d2138183bed3502f977b62f5cf6ab1909d9d7efdc3cd956
|
7
|
+
data.tar.gz: 108091d73b67d1cff944b04fc9c0123490b2234fcf1d53a53858bfa341204ab1bb7048b71cc4e596cb979c4ef92d62f0ebce6d914267f0012fe5e387477e7d40
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniTarball
|
4
|
+
class WriteOutOfRangeError < StandardError; end
|
5
|
+
|
6
|
+
class LimitedSizeStream
|
7
|
+
attr_reader :start_position, :end_position
|
8
|
+
|
9
|
+
def initialize(io, start_position:, max_file_size:)
|
10
|
+
@io = io
|
11
|
+
@start_position = start_position
|
12
|
+
@end_position = start_position + max_file_size
|
13
|
+
end
|
14
|
+
|
15
|
+
def write(data)
|
16
|
+
if @io.pos < start_position || @io.pos + data.bytesize > end_position
|
17
|
+
raise WriteOutOfRangeError.new("Writing outside of limits not allowed")
|
18
|
+
end
|
19
|
+
|
20
|
+
@io.write(data)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniTarball
|
4
|
+
class PlaceholderStream < LimitedSizeStream
|
5
|
+
def initialize(io, start_position:, file_size:)
|
6
|
+
super(io, start_position: start_position, max_file_size: file_size)
|
7
|
+
end
|
8
|
+
|
9
|
+
def write(data)
|
10
|
+
super(data)
|
11
|
+
@io.write("\0" * (end_position - @io.pos)) if @io.pos <= end_position
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/mini_tarball/version.rb
CHANGED
data/lib/mini_tarball/writer.rb
CHANGED
@@ -35,6 +35,7 @@ module MiniTarball
|
|
35
35
|
@write_only_io = WriteOnlyStream.new(@io)
|
36
36
|
@header_writer = HeaderWriter.new(@write_only_io)
|
37
37
|
@closed = false
|
38
|
+
@placeholders = []
|
38
39
|
end
|
39
40
|
|
40
41
|
def add_file(name:, source_file_path:, mode: nil, uname: nil, gname: nil, uid: nil, gid: nil, mtime: nil)
|
@@ -86,6 +87,43 @@ module MiniTarball
|
|
86
87
|
nil
|
87
88
|
end
|
88
89
|
|
90
|
+
def add_file_placeholder(name:, file_size:)
|
91
|
+
ensure_not_closed!
|
92
|
+
|
93
|
+
placeholder = {}
|
94
|
+
placeholder[:header_start_position] = @io.pos
|
95
|
+
@header_writer.write(Header.new(name: name, size: file_size))
|
96
|
+
|
97
|
+
placeholder[:file_start_position] = @io.pos
|
98
|
+
@io.write("\0" * file_size)
|
99
|
+
placeholder[:file_size] = file_size
|
100
|
+
|
101
|
+
write_padding
|
102
|
+
|
103
|
+
@placeholders << placeholder
|
104
|
+
@placeholders.size - 1
|
105
|
+
end
|
106
|
+
|
107
|
+
def with_placeholder(index)
|
108
|
+
placeholder = @placeholders[index]
|
109
|
+
raise ArgumentError.new("Placeholder not found") if placeholder.nil?
|
110
|
+
|
111
|
+
@io.seek(placeholder[:header_start_position])
|
112
|
+
old_write_only_io = @write_only_io
|
113
|
+
@write_only_io = PlaceholderStream.new(
|
114
|
+
@io,
|
115
|
+
start_position: placeholder[:file_start_position],
|
116
|
+
file_size: placeholder[:file_size]
|
117
|
+
)
|
118
|
+
|
119
|
+
yield self
|
120
|
+
|
121
|
+
@write_only_io = old_write_only_io
|
122
|
+
@io.seek(0, IO::SEEK_END)
|
123
|
+
|
124
|
+
nil
|
125
|
+
end
|
126
|
+
|
89
127
|
def closed?
|
90
128
|
@closed
|
91
129
|
end
|
data/lib/mini_tarball.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
require 'mini_tarball/header'
|
4
4
|
require 'mini_tarball/header_formatter'
|
5
5
|
require 'mini_tarball/header_writer'
|
6
|
-
require 'mini_tarball/
|
6
|
+
require 'mini_tarball/streams/limited_size_stream'
|
7
|
+
require 'mini_tarball/streams/placeholder_stream'
|
8
|
+
require 'mini_tarball/streams/write_only_stream'
|
7
9
|
require 'mini_tarball/writer'
|
8
10
|
require 'mini_tarball/version'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_tarball
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Discourse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -105,8 +105,10 @@ files:
|
|
105
105
|
- lib/mini_tarball/header.rb
|
106
106
|
- lib/mini_tarball/header_formatter.rb
|
107
107
|
- lib/mini_tarball/header_writer.rb
|
108
|
+
- lib/mini_tarball/streams/limited_size_stream.rb
|
109
|
+
- lib/mini_tarball/streams/placeholder_stream.rb
|
110
|
+
- lib/mini_tarball/streams/write_only_stream.rb
|
108
111
|
- lib/mini_tarball/version.rb
|
109
|
-
- lib/mini_tarball/write_only_stream.rb
|
110
112
|
- lib/mini_tarball/writer.rb
|
111
113
|
homepage: https://github.com/discourse/mini_tarball
|
112
114
|
licenses:
|
@@ -122,14 +124,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
124
|
requirements:
|
123
125
|
- - ">="
|
124
126
|
- !ruby/object:Gem::Version
|
125
|
-
version: 2.
|
127
|
+
version: 2.7.0
|
126
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
129
|
requirements:
|
128
130
|
- - ">="
|
129
131
|
- !ruby/object:Gem::Version
|
130
132
|
version: '0'
|
131
133
|
requirements: []
|
132
|
-
rubygems_version: 3.1.
|
134
|
+
rubygems_version: 3.1.6
|
133
135
|
signing_key:
|
134
136
|
specification_version: 4
|
135
137
|
summary: A minimal implementation of the GNU Tar format.
|