ffi-libarchive 1.0.17 → 1.1.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27c509a1d26618d51623cca95acc84cfeb8c804bdf818b999c8d10ac173a99ae
4
- data.tar.gz: 7d2a2184aa944ff1e91917be83e58be06d1df592154ce1a1bc33c8c1a6e1dd5e
3
+ metadata.gz: c36407f25d172183c558945197b30ab3de6ce623da69bcb95cd64eef1776ca6e
4
+ data.tar.gz: 6205aba975a305bef359027e6337c80829d2409dd25028ce4562af61e3d58e84
5
5
  SHA512:
6
- metadata.gz: e6ba3e6ccb7c1ce9656a6bf399e4d6050bf9b8bc813d4eb6f9435c0be177dda9c861d9387913e8220eb7e27067ce93cbd891f221efcdc62c11e61f0b9284b055
7
- data.tar.gz: 84bec17cb6e83978bd5241c116668ade6e4b2cf25595bdd44f10267c8274f42eaec00ec9719ecec2020cc1d927c13d55c437de89f4b5a8c387ed1ee1083b3797
6
+ metadata.gz: e2378c1c786464e9d5b77b6d27f97f5171349f6c5b37a3bccbbe4b597b98cefc972e27a89e22e7232d3554128e8929b296398fa04678d7943aa5e1ed32db6111
7
+ data.tar.gz: 0b30a8db432b3d7e8bb55b64fc284c9e74a343e67812aba08eee46ea15493e8a4998326aa9bbf258eeafe165bf01d90be60d7bb3ec4d430ffe9d19801bf73f19
@@ -12,11 +12,17 @@ module Archive
12
12
 
13
13
  attach_function :archive_version_number, [], :int
14
14
  attach_function :archive_version_string, [], :string
15
- attach_function :archive_error_string, [:pointer], :string
15
+
16
+ attach_function :archive_compression, [:pointer], :int
17
+ attach_function :archive_compression_name, [:pointer], :string
16
18
  attach_function :archive_errno, [:pointer], :int
19
+ attach_function :archive_error_string, [:pointer], :string
20
+ attach_function :archive_format, [:pointer], :int
21
+ attach_function :archive_format_name, [:pointer], :string
17
22
 
18
23
  attach_function :archive_read_new, [], :pointer
19
24
  attach_function :archive_read_open_filename, %i{pointer string size_t}, :int
25
+ attach_function :archive_read_open_fd, %i{pointer int size_t}, :int
20
26
  attach_function :archive_read_open_memory, %i{pointer pointer size_t}, :int
21
27
  attach_function :archive_read_open1, [:pointer], :int
22
28
  attach_function :archive_read_support_compression_program, %i{pointer string}, :int
@@ -284,6 +290,10 @@ module Archive
284
290
  Reader.open_filename file_name, command, &block
285
291
  end
286
292
 
293
+ def self.read_open_fd(fd, command = nil, &block)
294
+ Reader.open_fd fd, command, &block
295
+ end
296
+
287
297
  def self.read_open_memory(string, command = nil, &block)
288
298
  Reader.open_memory string, command, &block
289
299
  end
@@ -355,6 +365,14 @@ module Archive
355
365
  end
356
366
  protected :archive
357
367
 
368
+ def compression
369
+ C.archive_compression(@archive)
370
+ end
371
+
372
+ def compression_name
373
+ C.archive_compression_name(@archive)
374
+ end
375
+
358
376
  def error_string
359
377
  C.archive_error_string(@archive)
360
378
  end
@@ -362,5 +380,13 @@ module Archive
362
380
  def errno
363
381
  C.archive_errno(@archive)
364
382
  end
383
+
384
+ def format
385
+ C.archive_format(@archive)
386
+ end
387
+
388
+ def format_name
389
+ C.archive_format_name(@archive)
390
+ end
365
391
  end
366
392
  end
@@ -2,16 +2,29 @@ module Archive
2
2
  class Reader < BaseArchive
3
3
  private_class_method :new
4
4
 
5
- def self.open_filename(file_name, command = nil)
5
+ def self.open_filename(file_name, command = nil, strip_components: 0)
6
6
  if block_given?
7
- reader = open_filename file_name, command
7
+ reader = open_filename file_name, command, strip_components: strip_components
8
8
  begin
9
9
  yield reader
10
10
  ensure
11
11
  reader.close
12
12
  end
13
13
  else
14
- new file_name: file_name, command: command
14
+ new file_name: file_name, command: command, strip_components: strip_components
15
+ end
16
+ end
17
+
18
+ def self.open_fd(fd, command = nil, strip_components: 0)
19
+ if block_given?
20
+ reader = open_fd fd, command, strip_components: strip_components
21
+ begin
22
+ yield reader
23
+ ensure
24
+ reader.close
25
+ end
26
+ else
27
+ new fd: fd, command: command, strip_components: strip_components
15
28
  end
16
29
  end
17
30
 
@@ -41,9 +54,19 @@ module Archive
41
54
  end
42
55
  end
43
56
 
57
+ attr_reader :strip_components
58
+
44
59
  def initialize(params = {})
45
60
  super C.method(:archive_read_new), C.method(:archive_read_finish)
46
61
 
62
+ if params[:strip_components]
63
+ raise ArgumentError, "Expected Integer as strip_components" unless params[:strip_components].is_a?(Integer)
64
+
65
+ @strip_components = params[:strip_components]
66
+ else
67
+ @strip_components = 0
68
+ end
69
+
47
70
  if params[:command]
48
71
  cmd = params[:command]
49
72
  raise Error, @archive if C.archive_read_support_compression_program(archive, cmd) != C::OK
@@ -56,6 +79,8 @@ module Archive
56
79
  case
57
80
  when params[:file_name]
58
81
  raise Error, @archive if C.archive_read_open_filename(archive, params[:file_name], 1024) != C::OK
82
+ when params[:fd]
83
+ raise Error, @archive if C.archive_read_open_fd(archive, params[:fd], 1024) != C::OK
59
84
  when params[:memory]
60
85
  str = params[:memory]
61
86
  @data = FFI::MemoryPointer.new(str.bytesize + 1)
@@ -131,12 +156,16 @@ module Archive
131
156
 
132
157
  def each_entry
133
158
  while (entry = next_header)
159
+ next if strip_entry_components!(entry).nil?
160
+
134
161
  yield entry
135
162
  end
136
163
  end
137
164
 
138
165
  def each_entry_with_data(_size = C::DATA_BUFFER_SIZE)
139
166
  while (entry = next_header)
167
+ next if strip_entry_components!(entry).nil?
168
+
140
169
  yield entry, read_data
141
170
  end
142
171
  end
@@ -171,5 +200,57 @@ module Archive
171
200
  raise Error, @archive if C.archive_read_data_into_fd(archive, fd) != C::OK
172
201
  end
173
202
  end
203
+
204
+ private
205
+
206
+ #
207
+ # See:
208
+ # 1. https://github.com/libarchive/libarchive/blob/6a9dcf9fc429e2dc9fb08e669bf7b0bed4d5edf9/tar/read.c#L346
209
+ # 2. https://github.com/libarchive/libarchive/blob/a11f15860ae39ecdc8173243a211cdafc8ac893c/tar/util.c#L523-L535
210
+ # 3. https://github.com/libarchive/libarchive/blob/a11f15860ae39ecdc8173243a211cdafc8ac893c/tar/util.c#L554-L560
211
+ #
212
+ # @param entry [Archive::Entry]
213
+ #
214
+ # @return [Archive::Entry, nil] entry stripped or nil if entry is no longer relevant due to stripping
215
+ #
216
+ def strip_entry_components!(entry)
217
+ if strip_components > 0
218
+ name = entry.pathname
219
+ original_name = name.dup
220
+ hardlink_name = entry.hardlink
221
+ original_hardlink_name = hardlink_name.dup
222
+
223
+ strip_path_components!(name)
224
+ return if name.empty?
225
+
226
+ unless hardlink_name.nil?
227
+ strip_path_components!(hardlink_name)
228
+ return if hardlink_name.empty?
229
+ end
230
+
231
+ if name != original_name
232
+ entry.copy_pathname(name)
233
+ end
234
+ entry.copy_hardlink(hardlink_name) if hardlink_name != original_hardlink_name
235
+ end
236
+
237
+ entry
238
+ end
239
+
240
+ #
241
+ # @param path [String]
242
+ #
243
+ # @return [String]
244
+ #
245
+ def strip_path_components!(path)
246
+ if strip_components > 0
247
+ is_dir = path.end_with?("/")
248
+ updated_path = path.split("/").drop(strip_components).join("/")
249
+ updated_path = is_dir && updated_path != "" ? updated_path + "/" : updated_path
250
+ path.gsub!(path, updated_path)
251
+ else
252
+ path
253
+ end
254
+ end
174
255
  end
175
256
  end
@@ -1,3 +1,3 @@
1
1
  module Archive
2
- VERSION = "1.0.17".freeze
2
+ VERSION = "1.1.13".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-libarchive
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.17
4
+ version: 1.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Bellone
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-02-10 00:00:00.000000000 Z
13
+ date: 2023-08-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ffi
@@ -26,20 +26,6 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: '1.0'
29
- - !ruby/object:Gem::Dependency
30
- name: bundler
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :development
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
29
  description: A Ruby FFI binding to libarchive.
44
30
  email:
45
31
  - jbellone@bloomberg.net
@@ -69,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
69
55
  requirements:
70
56
  - - ">="
71
57
  - !ruby/object:Gem::Version
72
- version: 2.4.0
58
+ version: '2.5'
73
59
  required_rubygems_version: !ruby/object:Gem::Requirement
74
60
  requirements:
75
61
  - - ">="