excavate 0.3.7 → 0.3.9
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/.github/workflows/post-rake.yml +29 -0
- data/.github/workflows/rake-metanorma.yaml +60 -0
- data/.github/workflows/rake.yml +81 -0
- data/.github/workflows/release.yml +24 -0
- data/.rubocop.yml +11 -10
- data/.rubocop_todo.yml +78 -0
- data/Gemfile +7 -0
- data/README.adoc +480 -52
- data/excavate.gemspec +9 -13
- data/lib/excavate/archive.rb +2 -1
- data/lib/excavate/extractors/ole_extractor.rb +1 -1
- data/lib/excavate/extractors/xz_extractor.rb +58 -0
- data/lib/excavate/extractors.rb +1 -0
- data/lib/excavate/file_magic.rb +8 -3
- data/lib/excavate/utils.rb +1 -1
- data/lib/excavate/version.rb +1 -1
- metadata +17 -68
- data/.github/workflows/test-and-release.yml +0 -99
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require "ffi-libarchive-binary"
|
|
2
|
+
|
|
3
|
+
module Excavate
|
|
4
|
+
module Extractors
|
|
5
|
+
# Extractor for XZ compressed archives (both .xz and .tar.xz formats)
|
|
6
|
+
#
|
|
7
|
+
# This extractor handles:
|
|
8
|
+
# - Pure XZ compressed files (.xz)
|
|
9
|
+
# - Compound TAR+XZ archives (.tar.xz)
|
|
10
|
+
#
|
|
11
|
+
# Uses libarchive through ffi-libarchive-binary for extraction,
|
|
12
|
+
# which provides native XZ decompression support.
|
|
13
|
+
#
|
|
14
|
+
# @example Extract a .tar.xz file
|
|
15
|
+
# extractor = XzExtractor.new("archive.tar.xz")
|
|
16
|
+
# extractor.extract("/target/directory")
|
|
17
|
+
#
|
|
18
|
+
# @example Extract a pure .xz file
|
|
19
|
+
# extractor = XzExtractor.new("file.xz")
|
|
20
|
+
# extractor.extract("/target/directory")
|
|
21
|
+
class XzExtractor < Extractor
|
|
22
|
+
# Extract the XZ archive to the specified target directory
|
|
23
|
+
#
|
|
24
|
+
# @param target [String] the directory path where files should be extracted
|
|
25
|
+
# @return [void]
|
|
26
|
+
#
|
|
27
|
+
# @raise [StandardError] if extraction fails
|
|
28
|
+
def extract(target)
|
|
29
|
+
extract_with_libarchive(target)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
# Perform extraction using libarchive
|
|
35
|
+
#
|
|
36
|
+
# This method uses libarchive's reader API to:
|
|
37
|
+
# 1. Open the XZ archive
|
|
38
|
+
# 2. Iterate through all entries
|
|
39
|
+
# 3. Extract each entry with appropriate permissions
|
|
40
|
+
# 4. Close the reader
|
|
41
|
+
#
|
|
42
|
+
# @param target [String] the target directory for extraction
|
|
43
|
+
# @return [void]
|
|
44
|
+
def extract_with_libarchive(target)
|
|
45
|
+
flags = ::Archive::EXTRACT_PERM
|
|
46
|
+
reader = ::Archive::Reader.open_filename(@archive)
|
|
47
|
+
|
|
48
|
+
Dir.chdir(target) do
|
|
49
|
+
reader.each_entry do |entry|
|
|
50
|
+
reader.extract(entry, flags.to_i)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
reader.close
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
data/lib/excavate/extractors.rb
CHANGED
|
@@ -7,4 +7,5 @@ require_relative "extractors/rpm_extractor"
|
|
|
7
7
|
require_relative "extractors/seven_zip_extractor"
|
|
8
8
|
require_relative "extractors/tar_extractor"
|
|
9
9
|
require_relative "extractors/xar_extractor"
|
|
10
|
+
require_relative "extractors/xz_extractor"
|
|
10
11
|
require_relative "extractors/zip_extractor"
|
data/lib/excavate/file_magic.rb
CHANGED
|
@@ -14,9 +14,14 @@ module Excavate
|
|
|
14
14
|
when "MSCF\x00\x00\x00\x00".force_encoding("BINARY")
|
|
15
15
|
:cab
|
|
16
16
|
else
|
|
17
|
-
case beginning.byteslice(0,
|
|
18
|
-
when "\
|
|
19
|
-
:
|
|
17
|
+
case beginning.byteslice(0, 6)
|
|
18
|
+
when "\xFD7zXZ\x00".force_encoding("BINARY")
|
|
19
|
+
:xz
|
|
20
|
+
else
|
|
21
|
+
case beginning.byteslice(0, 2)
|
|
22
|
+
when "\x1F\x8B".force_encoding("BINARY")
|
|
23
|
+
:gzip
|
|
24
|
+
end
|
|
20
25
|
end
|
|
21
26
|
end
|
|
22
27
|
end
|
data/lib/excavate/utils.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Excavate
|
|
|
4
4
|
|
|
5
5
|
def silence_stream(stream)
|
|
6
6
|
old_stream = stream.dup
|
|
7
|
-
stream.reopen(RbConfig::CONFIG["host_os"]
|
|
7
|
+
stream.reopen(/mswin|mingw/.match?(RbConfig::CONFIG["host_os"]) ? File::NULL : File::NULL)
|
|
8
8
|
stream.sync = true
|
|
9
9
|
yield
|
|
10
10
|
ensure
|
data/lib/excavate/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: excavate
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.9
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2025-12-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: arr-pm
|
|
@@ -24,26 +24,6 @@ dependencies:
|
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '0.0'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: bundler
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '2.3'
|
|
34
|
-
- - ">="
|
|
35
|
-
- !ruby/object:Gem::Version
|
|
36
|
-
version: 2.3.24
|
|
37
|
-
type: :runtime
|
|
38
|
-
prerelease: false
|
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
40
|
-
requirements:
|
|
41
|
-
- - "~>"
|
|
42
|
-
- !ruby/object:Gem::Version
|
|
43
|
-
version: '2.3'
|
|
44
|
-
- - ">="
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: 2.3.24
|
|
47
27
|
- !ruby/object:Gem::Dependency
|
|
48
28
|
name: ffi-compiler2
|
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -64,14 +44,20 @@ dependencies:
|
|
|
64
44
|
requirements:
|
|
65
45
|
- - "~>"
|
|
66
46
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: '0.
|
|
47
|
+
version: '0.4'
|
|
48
|
+
- - ">="
|
|
49
|
+
- !ruby/object:Gem::Version
|
|
50
|
+
version: 0.4.2
|
|
68
51
|
type: :runtime
|
|
69
52
|
prerelease: false
|
|
70
53
|
version_requirements: !ruby/object:Gem::Requirement
|
|
71
54
|
requirements:
|
|
72
55
|
- - "~>"
|
|
73
56
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0.
|
|
57
|
+
version: '0.4'
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: 0.4.2
|
|
75
61
|
- !ruby/object:Gem::Dependency
|
|
76
62
|
name: libmspack
|
|
77
63
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -142,48 +128,6 @@ dependencies:
|
|
|
142
128
|
- - "~>"
|
|
143
129
|
- !ruby/object:Gem::Version
|
|
144
130
|
version: '1.0'
|
|
145
|
-
- !ruby/object:Gem::Dependency
|
|
146
|
-
name: rspec
|
|
147
|
-
requirement: !ruby/object:Gem::Requirement
|
|
148
|
-
requirements:
|
|
149
|
-
- - "~>"
|
|
150
|
-
- !ruby/object:Gem::Version
|
|
151
|
-
version: '3.0'
|
|
152
|
-
type: :development
|
|
153
|
-
prerelease: false
|
|
154
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
155
|
-
requirements:
|
|
156
|
-
- - "~>"
|
|
157
|
-
- !ruby/object:Gem::Version
|
|
158
|
-
version: '3.0'
|
|
159
|
-
- !ruby/object:Gem::Dependency
|
|
160
|
-
name: rubocop
|
|
161
|
-
requirement: !ruby/object:Gem::Requirement
|
|
162
|
-
requirements:
|
|
163
|
-
- - "~>"
|
|
164
|
-
- !ruby/object:Gem::Version
|
|
165
|
-
version: '1.7'
|
|
166
|
-
type: :development
|
|
167
|
-
prerelease: false
|
|
168
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
-
requirements:
|
|
170
|
-
- - "~>"
|
|
171
|
-
- !ruby/object:Gem::Version
|
|
172
|
-
version: '1.7'
|
|
173
|
-
- !ruby/object:Gem::Dependency
|
|
174
|
-
name: rubocop-performance
|
|
175
|
-
requirement: !ruby/object:Gem::Requirement
|
|
176
|
-
requirements:
|
|
177
|
-
- - "~>"
|
|
178
|
-
- !ruby/object:Gem::Version
|
|
179
|
-
version: '1.15'
|
|
180
|
-
type: :development
|
|
181
|
-
prerelease: false
|
|
182
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
183
|
-
requirements:
|
|
184
|
-
- - "~>"
|
|
185
|
-
- !ruby/object:Gem::Version
|
|
186
|
-
version: '1.15'
|
|
187
131
|
description: Extract nested archives with a single command.
|
|
188
132
|
email:
|
|
189
133
|
- open.source@ribose.com
|
|
@@ -192,10 +136,14 @@ executables:
|
|
|
192
136
|
extensions: []
|
|
193
137
|
extra_rdoc_files: []
|
|
194
138
|
files:
|
|
195
|
-
- ".github/workflows/
|
|
139
|
+
- ".github/workflows/post-rake.yml"
|
|
140
|
+
- ".github/workflows/rake-metanorma.yaml"
|
|
141
|
+
- ".github/workflows/rake.yml"
|
|
142
|
+
- ".github/workflows/release.yml"
|
|
196
143
|
- ".gitignore"
|
|
197
144
|
- ".rspec"
|
|
198
145
|
- ".rubocop.yml"
|
|
146
|
+
- ".rubocop_todo.yml"
|
|
199
147
|
- Gemfile
|
|
200
148
|
- LICENSE.adoc
|
|
201
149
|
- README.adoc
|
|
@@ -217,6 +165,7 @@ files:
|
|
|
217
165
|
- lib/excavate/extractors/seven_zip_extractor.rb
|
|
218
166
|
- lib/excavate/extractors/tar_extractor.rb
|
|
219
167
|
- lib/excavate/extractors/xar_extractor.rb
|
|
168
|
+
- lib/excavate/extractors/xz_extractor.rb
|
|
220
169
|
- lib/excavate/extractors/zip_extractor.rb
|
|
221
170
|
- lib/excavate/file_magic.rb
|
|
222
171
|
- lib/excavate/utils.rb
|
|
@@ -244,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
244
193
|
- !ruby/object:Gem::Version
|
|
245
194
|
version: '0'
|
|
246
195
|
requirements: []
|
|
247
|
-
rubygems_version: 3.5.
|
|
196
|
+
rubygems_version: 3.5.22
|
|
248
197
|
signing_key:
|
|
249
198
|
specification_version: 4
|
|
250
199
|
summary: Extract nested archives with a single command.
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
name: test-and-release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ main ]
|
|
6
|
-
tags: [ 'v*' ]
|
|
7
|
-
pull_request:
|
|
8
|
-
|
|
9
|
-
concurrency:
|
|
10
|
-
group: '${{ github.workflow }}-${{ github.job }}-${{ github.head_ref || github.ref_name }}'
|
|
11
|
-
cancel-in-progress: true
|
|
12
|
-
|
|
13
|
-
env:
|
|
14
|
-
BUNDLER_VER: 2.4.22
|
|
15
|
-
# Forcing bundler version to ensure that it is consistent everywhere and
|
|
16
|
-
# does not cause bundler gem reinstalls
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
prepare:
|
|
20
|
-
uses: metanorma/ci/.github/workflows/prepare-rake.yml@main
|
|
21
|
-
|
|
22
|
-
test:
|
|
23
|
-
name: Test on Ruby ${{ matrix.ruby.version }} ${{ matrix.os }}
|
|
24
|
-
runs-on: ${{ matrix.os }}
|
|
25
|
-
|
|
26
|
-
needs: prepare
|
|
27
|
-
if: needs.prepare.outputs.push-for-tag != 'true'
|
|
28
|
-
|
|
29
|
-
continue-on-error: ${{ matrix.ruby.experimental }}
|
|
30
|
-
strategy:
|
|
31
|
-
fail-fast: false
|
|
32
|
-
max-parallel: 5
|
|
33
|
-
matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
|
|
34
|
-
|
|
35
|
-
steps:
|
|
36
|
-
- uses: actions/checkout@v4
|
|
37
|
-
|
|
38
|
-
- uses: ruby/setup-ruby@v1
|
|
39
|
-
with:
|
|
40
|
-
ruby-version: ${{ matrix.ruby.version }}
|
|
41
|
-
rubygems: ${{ matrix.ruby.rubygems }}
|
|
42
|
-
bundler: ${{ env.BUNDLER_VER }}
|
|
43
|
-
bundler-cache: true
|
|
44
|
-
|
|
45
|
-
- run: bundle exec rspec
|
|
46
|
-
|
|
47
|
-
metanorma:
|
|
48
|
-
name: Test with Metanorma on Ruby ${{ matrix.ruby.version }} ${{ matrix.os }}
|
|
49
|
-
runs-on: ${{ matrix.os }}
|
|
50
|
-
|
|
51
|
-
needs: prepare
|
|
52
|
-
if: needs.prepare.outputs.push-for-tag != 'true'
|
|
53
|
-
|
|
54
|
-
continue-on-error: ${{ matrix.ruby.experimental }}
|
|
55
|
-
|
|
56
|
-
strategy:
|
|
57
|
-
fail-fast: false
|
|
58
|
-
matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
|
|
59
|
-
|
|
60
|
-
steps:
|
|
61
|
-
- uses: actions/checkout@v4
|
|
62
|
-
with:
|
|
63
|
-
repository: metanorma/metanorma
|
|
64
|
-
|
|
65
|
-
- uses: metanorma/metanorma-build-scripts/inkscape-setup-action@main
|
|
66
|
-
|
|
67
|
-
- uses: actions/checkout@v4
|
|
68
|
-
with:
|
|
69
|
-
path: excavate
|
|
70
|
-
|
|
71
|
-
- uses: ruby/setup-ruby@v1
|
|
72
|
-
with:
|
|
73
|
-
ruby-version: ${{ matrix.ruby.version }}
|
|
74
|
-
rubygems: ${{ matrix.ruby.rubygems }}
|
|
75
|
-
bundler: ${{ env.BUNDLER_VER }}
|
|
76
|
-
bundler-cache: false
|
|
77
|
-
|
|
78
|
-
- name: Install excavate from source
|
|
79
|
-
run: |
|
|
80
|
-
cd excavate
|
|
81
|
-
bundle install
|
|
82
|
-
bundle exec rake install
|
|
83
|
-
|
|
84
|
-
- name: Install metanorma
|
|
85
|
-
run: bundle install
|
|
86
|
-
|
|
87
|
-
- run: bundle exec rake
|
|
88
|
-
|
|
89
|
-
release:
|
|
90
|
-
name: Release gem
|
|
91
|
-
needs: [ test, metanorma ]
|
|
92
|
-
runs-on: ubuntu-latest
|
|
93
|
-
if: contains(github.ref, 'refs/tags/v')
|
|
94
|
-
steps:
|
|
95
|
-
- uses: actions/checkout@v4
|
|
96
|
-
|
|
97
|
-
- uses: cadwallion/publish-rubygems-action@master
|
|
98
|
-
env:
|
|
99
|
-
RUBYGEMS_API_KEY: ${{secrets.FONTIST_CI_RUBYGEMS_API_KEY}}
|