minitar 0.8 → 0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Contributing.md +48 -46
- data/History.md +161 -123
- data/Manifest.txt +1 -0
- data/README.rdoc +1 -21
- data/Rakefile +53 -33
- data/lib/archive/tar/minitar/input.rb +96 -75
- data/lib/archive/tar/minitar/output.rb +6 -6
- data/lib/archive/tar/minitar/posix_header.rb +36 -34
- data/lib/archive/tar/minitar/reader.rb +47 -33
- data/lib/archive/tar/minitar/writer.rb +64 -35
- data/lib/archive/tar/minitar.rb +47 -46
- data/lib/archive-tar-minitar.rb +1 -1
- data/lib/minitar.rb +1 -1
- data/support/hoe/deprecated_gem.rb +64 -0
- data/test/minitest_helper.rb +7 -6
- data/test/support/tar_test_helpers.rb +45 -41
- data/test/test_tar_header.rb +30 -31
- data/test/test_tar_input.rb +38 -30
- data/test/test_tar_output.rb +12 -12
- data/test/test_tar_reader.rb +23 -23
- data/test/test_tar_writer.rb +119 -69
- metadata +70 -47
@@ -4,7 +4,7 @@ module TarTestHelpers
|
|
4
4
|
include Archive::Tar::Minitar::ByteSize
|
5
5
|
|
6
6
|
Field = Struct.new(:name, :offset, :length)
|
7
|
-
def self.Field(name, length)
|
7
|
+
def self.Field(name, length)
|
8
8
|
@offset ||= 0
|
9
9
|
field = Field.new(name, @offset, length)
|
10
10
|
@offset += length
|
@@ -15,38 +15,38 @@ module TarTestHelpers
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
FIELDS = {}
|
19
|
-
FIELD_ORDER = []
|
20
|
-
|
21
|
-
Field(
|
22
|
-
Field(
|
23
|
-
Field(
|
24
|
-
Field(
|
25
|
-
Field(
|
26
|
-
Field(
|
27
|
-
Field(
|
28
|
-
Field(
|
29
|
-
Field(
|
30
|
-
Field(
|
31
|
-
Field(
|
32
|
-
Field(
|
33
|
-
Field(
|
34
|
-
Field(
|
35
|
-
Field(
|
36
|
-
Field(
|
37
|
-
|
38
|
-
BLANK_CHECKSUM =
|
18
|
+
FIELDS = {}
|
19
|
+
FIELD_ORDER = []
|
20
|
+
|
21
|
+
Field("name", 100)
|
22
|
+
Field("mode", 8)
|
23
|
+
Field("uid", 8)
|
24
|
+
Field("gid", 8)
|
25
|
+
Field("size", 12)
|
26
|
+
Field("mtime", 12)
|
27
|
+
Field("checksum", 8)
|
28
|
+
Field("typeflag", 1)
|
29
|
+
Field("linkname", 100)
|
30
|
+
Field("magic", 6)
|
31
|
+
Field("version", 2)
|
32
|
+
Field("uname", 32)
|
33
|
+
Field("gname", 32)
|
34
|
+
Field("devmajor", 8)
|
35
|
+
Field("devminor", 8)
|
36
|
+
Field("prefix", 155)
|
37
|
+
|
38
|
+
BLANK_CHECKSUM = " " * 8
|
39
39
|
NULL_100 = "\0" * 100
|
40
|
-
USTAR = "ustar\0"
|
41
|
-
DOUBLE_ZERO =
|
40
|
+
USTAR = "ustar\0"
|
41
|
+
DOUBLE_ZERO = "00"
|
42
42
|
|
43
43
|
def assert_headers_equal(expected, actual)
|
44
44
|
FIELD_ORDER.each do |field|
|
45
|
-
message = if field ==
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
message = if field == "checksum"
|
46
|
+
"Header checksums are expected to match."
|
47
|
+
else
|
48
|
+
"Header field #{field} is expected to match."
|
49
|
+
end
|
50
50
|
|
51
51
|
offset = FIELDS[field].offset
|
52
52
|
length = FIELDS[field].length
|
@@ -66,40 +66,44 @@ module TarTestHelpers
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def tar_file_header(fname, dname, mode, length)
|
69
|
-
update_checksum(header(
|
69
|
+
update_checksum(header("0", fname, dname, length, mode))
|
70
70
|
end
|
71
71
|
|
72
72
|
def tar_dir_header(name, prefix, mode)
|
73
|
-
update_checksum(header(
|
73
|
+
update_checksum(header("5", name, prefix, 0, mode))
|
74
74
|
end
|
75
75
|
|
76
|
-
def
|
76
|
+
def tar_symlink_header(name, prefix, mode, target)
|
77
|
+
update_checksum(header("2", name, prefix, 0, mode, target))
|
78
|
+
end
|
79
|
+
|
80
|
+
def header(type, fname, dname, length, mode, link_name = "")
|
77
81
|
raw_header(type,
|
78
82
|
asciiz(fname, 100),
|
79
83
|
asciiz(dname, 155),
|
80
84
|
z(to_oct(length, 11)),
|
81
|
-
z(to_oct(mode, 7))
|
82
|
-
|
85
|
+
z(to_oct(mode, 7)),
|
86
|
+
asciiz(link_name, 100))
|
83
87
|
end
|
84
88
|
|
85
|
-
def raw_header(type, fname, dname, length, mode)
|
89
|
+
def raw_header(type, fname, dname, length, mode, link_name = "")
|
86
90
|
arr = [
|
87
91
|
fname, mode, z(to_oct(nil, 7)), z(to_oct(nil, 7)),
|
88
92
|
length, z(to_oct(0, 11)), BLANK_CHECKSUM, type,
|
89
|
-
|
93
|
+
asciiz(link_name, 100), USTAR, DOUBLE_ZERO, asciiz("", 32), asciiz("", 32),
|
90
94
|
z(to_oct(nil, 7)), z(to_oct(nil, 7)), dname
|
91
95
|
]
|
92
96
|
|
93
|
-
h = arr.join.bytes.to_a.pack(
|
97
|
+
h = arr.join.bytes.to_a.pack("C100C8C8C8C12C12C8CC100C6C2C32C32C8C8C155")
|
94
98
|
ret = h + "\0" * (512 - bytesize(h))
|
95
99
|
assert_equal(512, bytesize(ret))
|
96
100
|
ret
|
97
101
|
end
|
98
102
|
|
99
103
|
def update_checksum(header)
|
100
|
-
header[FIELDS[
|
104
|
+
header[FIELDS["checksum"].offset, FIELDS["checksum"].length] =
|
101
105
|
# inject(:+) was introduced in which version?
|
102
|
-
sp(z(to_oct(header.unpack(
|
106
|
+
sp(z(to_oct(header.unpack("C*").inject { |a, e| a + e }, 6)))
|
103
107
|
header
|
104
108
|
end
|
105
109
|
|
@@ -116,7 +120,7 @@ module TarTestHelpers
|
|
116
120
|
end
|
117
121
|
|
118
122
|
def sp(s)
|
119
|
-
s +
|
123
|
+
s + " "
|
120
124
|
end
|
121
125
|
|
122
126
|
def z(s)
|
@@ -124,7 +128,7 @@ module TarTestHelpers
|
|
124
128
|
end
|
125
129
|
|
126
130
|
def mode_string(value)
|
127
|
-
|
131
|
+
"%04o" % (value & 0o777)
|
128
132
|
end
|
129
133
|
|
130
134
|
Minitest::Test.send(:include, self)
|
data/test/test_tar_header.rb
CHANGED
@@ -1,79 +1,79 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "minitest_helper"
|
4
4
|
|
5
5
|
class TestTarHeader < Minitest::Test
|
6
6
|
def test_arguments_are_checked
|
7
7
|
ph = Archive::Tar::Minitar::PosixHeader
|
8
8
|
assert_raises(ArgumentError) {
|
9
|
-
ph.new(:name =>
|
9
|
+
ph.new(:name => "", :size => "", :mode => "")
|
10
10
|
}
|
11
11
|
assert_raises(ArgumentError) {
|
12
|
-
ph.new(:name =>
|
12
|
+
ph.new(:name => "", :size => "", :prefix => "")
|
13
13
|
}
|
14
14
|
assert_raises(ArgumentError) {
|
15
|
-
ph.new(:name =>
|
15
|
+
ph.new(:name => "", :prefix => "", :mode => "")
|
16
16
|
}
|
17
17
|
assert_raises(ArgumentError) {
|
18
|
-
ph.new(:prefix =>
|
18
|
+
ph.new(:prefix => "", :size => "", :mode => "")
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_basic_headers
|
23
23
|
header = {
|
24
|
-
:name =>
|
24
|
+
:name => "bla",
|
25
25
|
:mode => 0o12345,
|
26
26
|
:size => 10,
|
27
|
-
:prefix =>
|
28
|
-
:typeflag =>
|
27
|
+
:prefix => "",
|
28
|
+
:typeflag => "0"
|
29
29
|
}
|
30
|
-
assert_headers_equal(tar_file_header(
|
30
|
+
assert_headers_equal(tar_file_header("bla", "", 0o12345, 10),
|
31
31
|
Archive::Tar::Minitar::PosixHeader.new(header).to_s)
|
32
32
|
|
33
33
|
header = {
|
34
|
-
:name =>
|
34
|
+
:name => "bla",
|
35
35
|
:mode => 0o12345,
|
36
36
|
:size => 0,
|
37
|
-
:prefix =>
|
38
|
-
:typeflag =>
|
37
|
+
:prefix => "",
|
38
|
+
:typeflag => "5"
|
39
39
|
}
|
40
|
-
assert_headers_equal(tar_dir_header(
|
40
|
+
assert_headers_equal(tar_dir_header("bla", "", 0o12345),
|
41
41
|
Archive::Tar::Minitar::PosixHeader.new(header).to_s)
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_long_name_works
|
45
45
|
header = {
|
46
|
-
:name =>
|
46
|
+
:name => "a" * 100, :mode => 0o12345, :size => 10, :prefix => ""
|
47
47
|
}
|
48
|
-
assert_headers_equal(tar_file_header(
|
48
|
+
assert_headers_equal(tar_file_header("a" * 100, "", 0o12345, 10),
|
49
49
|
Archive::Tar::Minitar::PosixHeader.new(header).to_s)
|
50
50
|
header = {
|
51
|
-
:name =>
|
51
|
+
:name => "a" * 100, :mode => 0o12345, :size => 10, :prefix => "bb" * 60
|
52
52
|
}
|
53
|
-
assert_headers_equal(tar_file_header(
|
53
|
+
assert_headers_equal(tar_file_header("a" * 100, "bb" * 60, 0o12345, 10),
|
54
54
|
Archive::Tar::Minitar::PosixHeader.new(header).to_s)
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_from_stream
|
58
|
-
header = tar_file_header(
|
58
|
+
header = tar_file_header("a" * 100, "", 0o12345, 10)
|
59
59
|
header = StringIO.new(header)
|
60
60
|
h = Archive::Tar::Minitar::PosixHeader.from_stream(header)
|
61
|
-
assert_equal(
|
61
|
+
assert_equal("a" * 100, h.name)
|
62
62
|
assert_equal(0o12345, h.mode)
|
63
63
|
assert_equal(10, h.size)
|
64
|
-
assert_equal(
|
65
|
-
assert_equal(
|
64
|
+
assert_equal("", h.prefix)
|
65
|
+
assert_equal("ustar", h.magic)
|
66
66
|
end
|
67
67
|
|
68
68
|
def test_from_stream_with_evil_name
|
69
|
-
header = tar_file_header("a \0" + "\0" * 97,
|
69
|
+
header = tar_file_header("a \0" + "\0" * 97, "", 0o12345, 10)
|
70
70
|
header = StringIO.new(header)
|
71
71
|
h = Archive::Tar::Minitar::PosixHeader.from_stream header
|
72
|
-
assert_equal(
|
72
|
+
assert_equal("a ", h.name)
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_valid_with_valid_header
|
76
|
-
header = tar_file_header(
|
76
|
+
header = tar_file_header("a" * 100, "", 0o12345, 10)
|
77
77
|
header = StringIO.new(header)
|
78
78
|
h = Archive::Tar::Minitar::PosixHeader.from_stream header
|
79
79
|
|
@@ -81,8 +81,8 @@ class TestTarHeader < Minitest::Test
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def test_from_stream_with_no_strict_octal
|
84
|
-
header = tar_file_header(
|
85
|
-
io
|
84
|
+
header = tar_file_header("a" * 100, "", 0o12345, -1213)
|
85
|
+
io = StringIO.new(header)
|
86
86
|
|
87
87
|
assert_raises(ArgumentError) do
|
88
88
|
Archive::Tar::Minitar::PosixHeader.from_stream(io)
|
@@ -91,14 +91,13 @@ class TestTarHeader < Minitest::Test
|
|
91
91
|
|
92
92
|
def test_from_stream_with_octal_wrapped_by_spaces
|
93
93
|
header = raw_header(0,
|
94
|
-
asciiz(
|
95
|
-
asciiz(
|
94
|
+
asciiz("a" * 100, 100),
|
95
|
+
asciiz("", 155),
|
96
96
|
" 1213\0",
|
97
|
-
z(to_oct(0o12345, 7))
|
98
|
-
)
|
97
|
+
z(to_oct(0o12345, 7)))
|
99
98
|
|
100
99
|
header = update_checksum(header)
|
101
|
-
io
|
100
|
+
io = StringIO.new(header)
|
102
101
|
header = Archive::Tar::Minitar::PosixHeader.from_stream(io)
|
103
102
|
|
104
103
|
assert_equal(651, header.size)
|
data/test/test_tar_input.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "minitar"
|
4
|
+
require "minitest_helper"
|
5
|
+
require "base64"
|
6
|
+
require "zlib"
|
7
7
|
|
8
8
|
class TestTarInput < Minitest::Test
|
9
9
|
TEST_TGZ = Base64.decode64(<<-EOS).freeze
|
@@ -19,23 +19,23 @@ UTAKRsEoGAWjYBSMglEwCkbBKBgFo2AUjIJRMApGwSgYBaNgFIwCUgAAGnyo6wAoAAA=
|
|
19
19
|
FILETIMES = Time.utc(2004).to_i
|
20
20
|
|
21
21
|
TEST_CONTENTS = {
|
22
|
-
|
23
|
-
|
22
|
+
"data.tar.gz" => {:size => 210, :mode => 0o644},
|
23
|
+
"file3" => {:size => 18, :mode => 0o755}
|
24
24
|
}.freeze
|
25
25
|
|
26
26
|
TEST_DATA_CONTENTS = {
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
"data/" => {:size => 0, :mode => 0o755},
|
28
|
+
"data/__dir__/" => {:size => 0, :mode => 0o755},
|
29
|
+
"data/file1" => {:size => 16, :mode => 0o644},
|
30
|
+
"data/file2" => {:size => 16, :mode => 0o644}
|
31
31
|
}.freeze
|
32
32
|
|
33
33
|
def setup
|
34
|
-
FileUtils.mkdir_p(
|
34
|
+
FileUtils.mkdir_p("data__")
|
35
35
|
end
|
36
36
|
|
37
37
|
def teardown
|
38
|
-
FileUtils.rm_rf(
|
38
|
+
FileUtils.rm_rf("data__")
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_open_no_block
|
@@ -58,7 +58,7 @@ UTAKRsEoGAWjYBSMglEwCkbBKBgFo2AUjIJRMApGwSgYBaNgFIwCUgAAGnyo6wAoAAA=
|
|
58
58
|
assert_equal(TEST_CONTENTS[entry.name][:size], entry.size, entry.name)
|
59
59
|
assert_modes_equal(TEST_CONTENTS[entry.name][:mode],
|
60
60
|
entry.mode, entry.name)
|
61
|
-
assert_equal(FILETIMES, entry.mtime,
|
61
|
+
assert_equal(FILETIMES, entry.mtime, "entry.mtime")
|
62
62
|
|
63
63
|
if i.zero?
|
64
64
|
data_reader = Zlib::GzipReader.new(StringIO.new(entry.read))
|
@@ -90,8 +90,8 @@ UTAKRsEoGAWjYBSMglEwCkbBKBgFo2AUjIJRMApGwSgYBaNgFIwCUgAAGnyo6wAoAAA=
|
|
90
90
|
Minitar::Input.open(reader) do |stream|
|
91
91
|
outer_count = 0
|
92
92
|
stream.each_with_index do |entry, i|
|
93
|
-
stream.extract_entry(
|
94
|
-
name = File.join(
|
93
|
+
stream.extract_entry("data__", entry)
|
94
|
+
name = File.join("data__", entry.name)
|
95
95
|
|
96
96
|
assert TEST_CONTENTS.key?(entry.name)
|
97
97
|
|
@@ -108,12 +108,12 @@ UTAKRsEoGAWjYBSMglEwCkbBKBgFo2AUjIJRMApGwSgYBaNgFIwCUgAAGnyo6wAoAAA=
|
|
108
108
|
|
109
109
|
if i.zero?
|
110
110
|
begin
|
111
|
-
ff = File.open(name,
|
111
|
+
ff = File.open(name, "rb")
|
112
112
|
data_reader = Zlib::GzipReader.new(ff)
|
113
113
|
Minitar::Input.open(data_reader) do |is2|
|
114
114
|
is2.each_with_index do |entry2, _j|
|
115
|
-
is2.extract_entry(
|
116
|
-
name2 = File.join(
|
115
|
+
is2.extract_entry("data__", entry2)
|
116
|
+
name2 = File.join("data__", entry2.name)
|
117
117
|
|
118
118
|
assert TEST_DATA_CONTENTS.key?(entry2.name)
|
119
119
|
|
@@ -144,18 +144,18 @@ UTAKRsEoGAWjYBSMglEwCkbBKBgFo2AUjIJRMApGwSgYBaNgFIwCUgAAGnyo6wAoAAA=
|
|
144
144
|
return if Minitar.windows?
|
145
145
|
|
146
146
|
IO.respond_to?(:write) &&
|
147
|
-
IO.write(
|
148
|
-
File.open(
|
147
|
+
IO.write("data__/file4", "") ||
|
148
|
+
File.open("data__/file4", "w") { |f| f.write "" }
|
149
149
|
|
150
|
-
File.symlink(
|
151
|
-
File.symlink(
|
150
|
+
File.symlink("data__/file4", "data__/file3")
|
151
|
+
File.symlink("data__/file4", "data__/data")
|
152
152
|
|
153
|
-
Minitar.unpack(Zlib::GzipReader.new(StringIO.new(TEST_TGZ)),
|
154
|
-
Minitar.unpack(Zlib::GzipReader.new(File.open(
|
155
|
-
|
153
|
+
Minitar.unpack(Zlib::GzipReader.new(StringIO.new(TEST_TGZ)), "data__")
|
154
|
+
Minitar.unpack(Zlib::GzipReader.new(File.open("data__/data.tar.gz", "rb")),
|
155
|
+
"data__")
|
156
156
|
|
157
|
-
refute File.symlink?(
|
158
|
-
refute File.symlink?(
|
157
|
+
refute File.symlink?("data__/file3")
|
158
|
+
refute File.symlink?("data__/data")
|
159
159
|
end
|
160
160
|
|
161
161
|
RELATIVE_DIRECTORY_TGZ = Base64.decode64 <<-EOS
|
@@ -168,7 +168,7 @@ MDUzVDAwNDY0N2VQMGCgAygtLkksAjolEcjIzMOtDqgsLQ2/J0H+gNOjYBSMglEwyAEA2LchrwAGAAA=
|
|
168
168
|
Minitar::Input.open(reader) do |stream|
|
169
169
|
stream.each do |entry|
|
170
170
|
assert_raises Archive::Tar::Minitar::SecureRelativePathError do
|
171
|
-
stream.extract_entry(
|
171
|
+
stream.extract_entry("data__", entry)
|
172
172
|
end
|
173
173
|
end
|
174
174
|
end
|
@@ -191,7 +191,7 @@ glEwCkbBKBgFo2AUjIJRMApIAQD0DyzXACgAAA==
|
|
191
191
|
reader = Zlib::GzipReader.new(StringIO.new(NON_STRICT_OCTAL_TGZ))
|
192
192
|
|
193
193
|
assert_raises(ArgumentError) do
|
194
|
-
Minitar.unpack(reader,
|
194
|
+
Minitar.unpack(reader, "data__")
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
@@ -214,6 +214,14 @@ UTAKRsEoGAWjYBSMglFACgAAuUHUvwAoAAA=
|
|
214
214
|
assert_equal(210, header.size)
|
215
215
|
|
216
216
|
reader = Zlib::GzipReader.new(StringIO.new(OCTAL_WRAPPED_BY_SPACE_TGZ))
|
217
|
-
Minitar.unpack(reader,
|
217
|
+
Minitar.unpack(reader, "data__", [])
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_fsync_false
|
221
|
+
outer = 0
|
222
|
+
Minitar.unpack(Zlib::GzipReader.new(StringIO.new(TEST_TGZ)), "data__", [], :fsync => false) do |_label, _path, _stats|
|
223
|
+
outer += 1
|
224
|
+
end
|
225
|
+
assert_equal(6, outer)
|
218
226
|
end
|
219
227
|
end
|
data/test/test_tar_output.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "minitar"
|
4
|
+
require "minitest_helper"
|
5
5
|
|
6
6
|
class TestTarOutput < Minitest::Test
|
7
|
-
NAMES = [
|
7
|
+
NAMES = ["a", "b", "c", "d" * 200]
|
8
8
|
|
9
9
|
def setup
|
10
|
-
FileUtils.mkdir_p(
|
10
|
+
FileUtils.mkdir_p("data__")
|
11
11
|
NAMES.each do |filename|
|
12
|
-
name = File.join(
|
13
|
-
File.open(name,
|
12
|
+
name = File.join("data__", filename)
|
13
|
+
File.open(name, "wb") { |f|
|
14
14
|
f.puts "#{name}: 123456789012345678901234567890"
|
15
15
|
}
|
16
16
|
end
|
17
|
-
@tarfile =
|
17
|
+
@tarfile = "data__/bla2.tar"
|
18
18
|
end
|
19
19
|
|
20
20
|
def teardown
|
21
|
-
FileUtils.rm_rf(
|
21
|
+
FileUtils.rm_rf("data__")
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_open_no_block
|
@@ -31,17 +31,17 @@ class TestTarOutput < Minitest::Test
|
|
31
31
|
|
32
32
|
def test_file_looks_good
|
33
33
|
Minitar::Output.open(@tarfile) do |os|
|
34
|
-
Dir.chdir(
|
34
|
+
Dir.chdir("data__") do
|
35
35
|
NAMES.each do |name|
|
36
36
|
stat = File.stat(name)
|
37
|
-
opts = {
|
37
|
+
opts = {:size => stat.size, :mode => 0o644}
|
38
38
|
os.tar.add_file_simple(name, opts) do |ss|
|
39
|
-
File.open(name,
|
39
|
+
File.open(name, "rb") { |ff| ss.write(ff.read(4096)) until ff.eof? }
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
|
-
ff = File.open(@tarfile,
|
44
|
+
ff = File.open(@tarfile, "rb")
|
45
45
|
Minitar::Reader.open(ff) do |is|
|
46
46
|
names_from_tar = is.map do |entry|
|
47
47
|
entry.name
|
data/test/test_tar_reader.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "minitar"
|
4
|
+
require "minitest_helper"
|
5
5
|
|
6
6
|
class TestTarReader < Minitest::Test
|
7
7
|
include Archive::Tar::Minitar::ByteSize
|
8
8
|
|
9
9
|
def test_open_no_block
|
10
|
-
str = tar_file_header(
|
11
|
-
str += tar_file_header(
|
12
|
-
str += tar_dir_header(
|
10
|
+
str = tar_file_header("lib/foo", "", 0o10644, 10) + "\0" * 512
|
11
|
+
str += tar_file_header("bar", "baz", 0o644, 0)
|
12
|
+
str += tar_dir_header("foo", "bar", 0o12345)
|
13
13
|
str += "\0" * 1024
|
14
14
|
|
15
15
|
reader = Minitar::Reader.open(StringIO.new(str))
|
@@ -20,13 +20,13 @@ class TestTarReader < Minitest::Test
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_multiple_entries
|
23
|
-
str = tar_file_header(
|
24
|
-
str += tar_file_header(
|
25
|
-
str += tar_dir_header(
|
26
|
-
str += tar_file_header(
|
23
|
+
str = tar_file_header("lib/foo", "", 0o10644, 10) + "\0" * 512
|
24
|
+
str += tar_file_header("bar", "baz", 0o644, 0)
|
25
|
+
str += tar_dir_header("foo", "bar", 0o12345)
|
26
|
+
str += tar_file_header("src/", "", 0o755, 0) # "file" with a trailing slash
|
27
27
|
str += "\0" * 1024
|
28
|
-
names = %w
|
29
|
-
prefixes = [
|
28
|
+
names = %w[lib/foo bar foo src/]
|
29
|
+
prefixes = ["", "baz", "bar", ""]
|
30
30
|
modes = [0o10644, 0o644, 0o12345, 0o755]
|
31
31
|
sizes = [10, 0, 0, 0]
|
32
32
|
isdir = [false, false, true, true]
|
@@ -41,7 +41,7 @@ class TestTarReader < Minitest::Test
|
|
41
41
|
assert_equal(modes[i], entry.mode)
|
42
42
|
assert_equal(isdir[i], entry.directory?)
|
43
43
|
assert_equal(isfile[i], entry.file?)
|
44
|
-
if prefixes[i] !=
|
44
|
+
if prefixes[i] != ""
|
45
45
|
assert_equal(File.join(prefixes[i], names[i]), entry.full_name)
|
46
46
|
else
|
47
47
|
assert_equal(names[i], entry.name)
|
@@ -53,8 +53,8 @@ class TestTarReader < Minitest::Test
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_rewind_entry_works
|
56
|
-
content = (
|
57
|
-
str = tar_file_header(
|
56
|
+
content = ("a".."z").to_a.join(" ")
|
57
|
+
str = tar_file_header("lib/foo", "", 0o10644, bytesize(content)) +
|
58
58
|
content + "\0" * (512 - bytesize(content))
|
59
59
|
str << "\0" * 1024
|
60
60
|
Minitar::Reader.new(StringIO.new(str)) do |is|
|
@@ -69,8 +69,8 @@ class TestTarReader < Minitest::Test
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def test_rewind_works
|
72
|
-
content = (
|
73
|
-
str = tar_file_header(
|
72
|
+
content = ("a".."z").to_a.join(" ")
|
73
|
+
str = tar_file_header("lib/foo", "", 0o10644, bytesize(content)) +
|
74
74
|
content + "\0" * (512 - bytesize(content))
|
75
75
|
str << "\0" * 1024
|
76
76
|
Minitar::Reader.new(StringIO.new(str)) do |is|
|
@@ -87,8 +87,8 @@ class TestTarReader < Minitest::Test
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def test_read_works
|
90
|
-
contents = (
|
91
|
-
str = tar_file_header(
|
90
|
+
contents = ("a".."z").inject("") { |a, e| a << e * 100 }
|
91
|
+
str = tar_file_header("lib/foo", "", 0o10644, bytesize(contents)) + contents
|
92
92
|
str += "\0" * (512 - (bytesize(str) % 512))
|
93
93
|
Minitar::Reader.new(StringIO.new(str)) do |is|
|
94
94
|
is.each_entry do |entry|
|
@@ -122,7 +122,7 @@ class TestTarReader < Minitest::Test
|
|
122
122
|
end
|
123
123
|
|
124
124
|
def test_eof_works
|
125
|
-
str = tar_file_header(
|
125
|
+
str = tar_file_header("bar", "baz", 0o644, 0)
|
126
126
|
Minitar::Reader.new(StringIO.new(str)) do |is|
|
127
127
|
is.each_entry do |entry|
|
128
128
|
assert_kind_of(Minitar::Reader::EntryStream, entry)
|
@@ -134,7 +134,7 @@ class TestTarReader < Minitest::Test
|
|
134
134
|
assert_equal(true, entry.eof?)
|
135
135
|
end
|
136
136
|
end
|
137
|
-
str = tar_dir_header(
|
137
|
+
str = tar_dir_header("foo", "bar", 0o12345)
|
138
138
|
Minitar::Reader.new(StringIO.new(str)) do |is|
|
139
139
|
is.each_entry do |entry|
|
140
140
|
assert_kind_of(Minitar::Reader::EntryStream, entry)
|
@@ -146,9 +146,9 @@ class TestTarReader < Minitest::Test
|
|
146
146
|
assert_equal(true, entry.eof?)
|
147
147
|
end
|
148
148
|
end
|
149
|
-
str = tar_dir_header(
|
150
|
-
str += tar_file_header(
|
151
|
-
str += tar_file_header(
|
149
|
+
str = tar_dir_header("foo", "bar", 0o12345)
|
150
|
+
str += tar_file_header("bar", "baz", 0o644, 0)
|
151
|
+
str += tar_file_header("bar", "baz", 0o644, 0)
|
152
152
|
Minitar::Reader.new(StringIO.new(str)) do |is|
|
153
153
|
is.each_entry do |entry|
|
154
154
|
assert_kind_of(Minitar::Reader::EntryStream, entry)
|