ffi-libarchive 1.0.17 → 1.1.13

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 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
  - - ">="