mini_portile2 2.8.5 → 2.8.7
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/ci.yml +84 -9
- data/.github/workflows/downstream.yml +66 -0
- data/CHANGELOG.md +22 -0
- data/README.md +14 -5
- data/Rakefile +3 -5
- data/lib/mini_portile2/mini_portile.rb +58 -47
- data/lib/mini_portile2/mini_portile_cmake.rb +5 -30
- data/lib/mini_portile2/version.rb +1 -1
- data/test/helper.rb +12 -1
- data/test/test_cmake.rb +50 -45
- data/test/test_cook.rb +30 -1
- data/test/test_digest.rb +75 -77
- data/test/test_download.rb +5 -4
- data/test/test_execute.rb +4 -3
- data/test/test_proxy.rb +7 -6
- metadata +7 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 70898a2aae18144f603247968314787f2bb4291ce43bab39e7d9f0236d1dcd16
|
|
4
|
+
data.tar.gz: be938e39466de9c5d731d261c7e2afa63a88e5ca20bdfd594b6f39761b250798
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 55d44167607aca34fee6fa086246d7f71146e500d77a79f128af9399cd057404ee44d9fb8a349f89928c6f21139826e785d2da23bc4ea656c93047fa1990a20a
|
|
7
|
+
data.tar.gz: bd0c5d6b654deb5325d1f5329ef0e93b1a47cfde7225ab4f8730dfb419ab27604eb4713d1ae3659dcd4fdf1697e00acbad020c06347b7456041f0121ae40bb05
|
data/.github/workflows/ci.yml
CHANGED
|
@@ -25,7 +25,15 @@ jobs:
|
|
|
25
25
|
fail-fast: false
|
|
26
26
|
matrix:
|
|
27
27
|
platform: [ubuntu-latest, windows-latest, macos-latest]
|
|
28
|
-
ruby: ["2.3", "2.4", "2.5", "2.6", "2.7", "3.0", "3.1", "3.2", "head"]
|
|
28
|
+
ruby: ["2.3", "2.4", "2.5", "2.6", "2.7", "3.0", "3.1", "3.2", "3.3", "head"]
|
|
29
|
+
exclude:
|
|
30
|
+
# I can't figure out how to install these on macos through setup-ruby
|
|
31
|
+
- ruby: "2.3"
|
|
32
|
+
platform: "macos-latest"
|
|
33
|
+
- ruby: "2.4"
|
|
34
|
+
platform: "macos-latest"
|
|
35
|
+
- ruby: "2.5"
|
|
36
|
+
platform: "macos-latest"
|
|
29
37
|
runs-on: ${{ matrix.platform }}
|
|
30
38
|
steps:
|
|
31
39
|
- name: configure git crlf on windows
|
|
@@ -33,7 +41,7 @@ jobs:
|
|
|
33
41
|
run: |
|
|
34
42
|
git config --system core.autocrlf false
|
|
35
43
|
git config --system core.eol lf
|
|
36
|
-
- uses: actions/checkout@
|
|
44
|
+
- uses: actions/checkout@v4
|
|
37
45
|
- uses: MSP-Greg/setup-ruby-pkgs@v1
|
|
38
46
|
with:
|
|
39
47
|
apt-get: _update_ build-essential cmake
|
|
@@ -48,7 +56,8 @@ jobs:
|
|
|
48
56
|
strategy:
|
|
49
57
|
fail-fast: false
|
|
50
58
|
matrix:
|
|
51
|
-
|
|
59
|
+
# use macos-13 (not 14) because libyaml 0.2.5 doesn't have up-to-date config.guess and config.sub
|
|
60
|
+
platform: [ubuntu-latest, windows-latest, macos-13]
|
|
52
61
|
ruby: ["3.1"]
|
|
53
62
|
runs-on: ${{ matrix.platform }}
|
|
54
63
|
steps:
|
|
@@ -57,20 +66,24 @@ jobs:
|
|
|
57
66
|
run: |
|
|
58
67
|
git config --system core.autocrlf false
|
|
59
68
|
git config --system core.eol lf
|
|
60
|
-
- uses: actions/checkout@
|
|
69
|
+
- uses: actions/checkout@v4
|
|
61
70
|
- uses: MSP-Greg/setup-ruby-pkgs@v1
|
|
62
71
|
with:
|
|
63
72
|
apt-get: _update_ build-essential cmake
|
|
64
73
|
mingw: _upgrade_ cmake
|
|
65
74
|
ruby-version: ${{ matrix.ruby }}
|
|
66
75
|
bundler-cache: true
|
|
67
|
-
- uses: actions/cache@
|
|
76
|
+
- uses: actions/cache@v4
|
|
68
77
|
with:
|
|
69
78
|
path: examples/ports/archives
|
|
70
79
|
key: examples-${{ hashFiles('examples/Rakefile') }}
|
|
71
80
|
- run: bundle exec rake test:examples
|
|
72
81
|
|
|
73
82
|
fedora: # see https://github.com/flavorjones/mini_portile/issues/118
|
|
83
|
+
strategy:
|
|
84
|
+
fail-fast: false
|
|
85
|
+
matrix:
|
|
86
|
+
task: ["test:unit", "test:examples"]
|
|
74
87
|
runs-on: ubuntu-latest
|
|
75
88
|
container:
|
|
76
89
|
image: fedora:35
|
|
@@ -78,11 +91,73 @@ jobs:
|
|
|
78
91
|
- run: |
|
|
79
92
|
dnf group install -y "C Development Tools and Libraries"
|
|
80
93
|
dnf install -y ruby ruby-devel libyaml-devel git-all patch cmake xz
|
|
81
|
-
- uses: actions/checkout@
|
|
82
|
-
- uses: actions/cache@
|
|
94
|
+
- uses: actions/checkout@v4
|
|
95
|
+
- uses: actions/cache@v4
|
|
83
96
|
with:
|
|
84
97
|
path: examples/ports/archives
|
|
85
98
|
key: examples-${{ hashFiles('examples/Rakefile') }}
|
|
86
99
|
- run: bundle install
|
|
87
|
-
- run: bundle exec rake
|
|
88
|
-
|
|
100
|
+
- run: bundle exec rake ${{ matrix.task }}
|
|
101
|
+
|
|
102
|
+
freebsd:
|
|
103
|
+
strategy:
|
|
104
|
+
fail-fast: false
|
|
105
|
+
matrix:
|
|
106
|
+
task: ["test:unit", "test:examples"]
|
|
107
|
+
runs-on: ubuntu-latest
|
|
108
|
+
env:
|
|
109
|
+
MAKE: gmake
|
|
110
|
+
steps:
|
|
111
|
+
- uses: actions/checkout@v4
|
|
112
|
+
- uses: actions/cache@v4
|
|
113
|
+
with:
|
|
114
|
+
path: examples/ports/archives
|
|
115
|
+
key: examples-${{ hashFiles('examples/Rakefile') }}
|
|
116
|
+
- uses: vmactions/freebsd-vm@v1
|
|
117
|
+
with:
|
|
118
|
+
envs: MAKE
|
|
119
|
+
usesh: true
|
|
120
|
+
copyback: false
|
|
121
|
+
prepare: pkg install -y ruby devel/ruby-gems pkgconf git cmake devel/gmake textproc/libyaml security/gnupg
|
|
122
|
+
run: |
|
|
123
|
+
git config --global --add safe.directory /home/runner/work/mini_portile/mini_portile
|
|
124
|
+
gem install bundler
|
|
125
|
+
bundle install
|
|
126
|
+
bundle exec rake ${{ matrix.task }}
|
|
127
|
+
|
|
128
|
+
openbsd:
|
|
129
|
+
strategy:
|
|
130
|
+
fail-fast: false
|
|
131
|
+
matrix:
|
|
132
|
+
task: ["test:unit", "test:examples"]
|
|
133
|
+
runs-on: ubuntu-latest
|
|
134
|
+
env:
|
|
135
|
+
MAKE: gmake
|
|
136
|
+
steps:
|
|
137
|
+
- uses: actions/checkout@v4
|
|
138
|
+
- uses: vmactions/openbsd-vm@v1
|
|
139
|
+
with:
|
|
140
|
+
envs: MAKE
|
|
141
|
+
usesh: true
|
|
142
|
+
copyback: false
|
|
143
|
+
prepare: |
|
|
144
|
+
pkg_add ruby%3.1 gmake cmake git pkgconf security/gnupg
|
|
145
|
+
ln -sf /usr/local/bin/ruby31 /usr/local/bin/ruby
|
|
146
|
+
ln -sf /usr/local/bin/bundle31 /usr/local/bin/bundle
|
|
147
|
+
ln -sf /usr/local/bin/bundler31 /usr/local/bin/bundler
|
|
148
|
+
ln -sf /usr/local/bin/erb31 /usr/local/bin/erb
|
|
149
|
+
ln -sf /usr/local/bin/gem31 /usr/local/bin/gem
|
|
150
|
+
ln -sf /usr/local/bin/irb31 /usr/local/bin/irb
|
|
151
|
+
ln -sf /usr/local/bin/racc31 /usr/local/bin/racc
|
|
152
|
+
ln -sf /usr/local/bin/rake31 /usr/local/bin/rake
|
|
153
|
+
ln -sf /usr/local/bin/rbs31 /usr/local/bin/rbs
|
|
154
|
+
ln -sf /usr/local/bin/rdbg31 /usr/local/bin/rdbg
|
|
155
|
+
ln -sf /usr/local/bin/rdoc31 /usr/local/bin/rdoc
|
|
156
|
+
ln -sf /usr/local/bin/ri31 /usr/local/bin/ri
|
|
157
|
+
ln -sf /usr/local/bin/syntax_suggest31 /usr/local/bin/syntax_suggest
|
|
158
|
+
ln -sf /usr/local/bin/typeprof31 /usr/local/bin/typeprof
|
|
159
|
+
run: |
|
|
160
|
+
git config --global --add safe.directory /home/runner/work/mini_portile/mini_portile
|
|
161
|
+
gem install bundler
|
|
162
|
+
bundle install
|
|
163
|
+
bundle exec rake ${{ matrix.task }}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: downstream
|
|
2
|
+
concurrency:
|
|
3
|
+
group: "${{github.workflow}}-${{github.ref}}"
|
|
4
|
+
cancel-in-progress: true
|
|
5
|
+
on:
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: "0 7 * * 1,3,5" # At 07:00 on Monday, Wednesday, and Friday # https://crontab.guru/#0_7_*_*_1,3,5
|
|
9
|
+
push:
|
|
10
|
+
branches:
|
|
11
|
+
- main
|
|
12
|
+
- "v*.*.x"
|
|
13
|
+
tags:
|
|
14
|
+
- v*.*.*
|
|
15
|
+
pull_request:
|
|
16
|
+
types: [opened, synchronize]
|
|
17
|
+
branches:
|
|
18
|
+
- '*'
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
downstream:
|
|
22
|
+
name: downstream-${{matrix.name}}-${{matrix.platform}}
|
|
23
|
+
strategy:
|
|
24
|
+
fail-fast: false
|
|
25
|
+
matrix:
|
|
26
|
+
name: [re2, nokogiri, sqlite3]
|
|
27
|
+
platform: [ubuntu-latest, windows-latest, macos-latest]
|
|
28
|
+
include:
|
|
29
|
+
- name: re2
|
|
30
|
+
url: https://github.com/mudge/re2
|
|
31
|
+
command: "bundle exec rake compile spec"
|
|
32
|
+
ruby: "3.3"
|
|
33
|
+
- name: nokogiri
|
|
34
|
+
url: https://github.com/sparklemotion/nokogiri
|
|
35
|
+
command: "bundle exec rake compile test"
|
|
36
|
+
ruby: "3.3"
|
|
37
|
+
- name: sqlite3
|
|
38
|
+
url: https://github.com/sparklemotion/sqlite3-ruby
|
|
39
|
+
command: "bundle exec rake compile test"
|
|
40
|
+
ruby: "3.3"
|
|
41
|
+
runs-on: ${{matrix.platform}}
|
|
42
|
+
steps:
|
|
43
|
+
- name: configure git crlf
|
|
44
|
+
if: ${{ startsWith(matrix.platform, 'windows') }}
|
|
45
|
+
run: |
|
|
46
|
+
git config --system core.autocrlf false
|
|
47
|
+
git config --system core.eol lf
|
|
48
|
+
- uses: actions/checkout@v4
|
|
49
|
+
- uses: ruby/setup-ruby@v1
|
|
50
|
+
with:
|
|
51
|
+
ruby-version: ${{matrix.ruby}}
|
|
52
|
+
bundler-cache: true
|
|
53
|
+
bundler: latest
|
|
54
|
+
- run: git clone --depth=1 ${{matrix.url}} ${{matrix.name}}
|
|
55
|
+
- uses: actions/cache@v4
|
|
56
|
+
with:
|
|
57
|
+
path: ${{matrix.name}}/ports/archives
|
|
58
|
+
key: tarballs-${{matrix.name}}
|
|
59
|
+
enableCrossOsArchive: true
|
|
60
|
+
- name: ${{matrix.name}} test suite
|
|
61
|
+
working-directory: ${{matrix.name}}
|
|
62
|
+
run: |
|
|
63
|
+
bundle remove mini_portile2 || true
|
|
64
|
+
bundle add mini_portile2 --path=".."
|
|
65
|
+
bundle install --local || bundle install
|
|
66
|
+
${{matrix.command}}
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
## mini_portile changelog
|
|
2
2
|
|
|
3
|
+
### 2.8.7 / 2024-05-31
|
|
4
|
+
|
|
5
|
+
#### Added
|
|
6
|
+
|
|
7
|
+
- When setting the C compiler through the `MiniPortile` constructor, the preferred keyword argument is now `:cc_command`. The original `:gcc_command` is still supported. (#144 by @flavorjones)
|
|
8
|
+
- Add support for extracting xz-compressed tarballs on OpenBSD. (#141 by @postmodern)
|
|
9
|
+
- Add OpenBSD support to the experimental method `MakeMakefile#mkmf_config`. (#141 by @flavorjones)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
#### Changed
|
|
13
|
+
|
|
14
|
+
- `MiniPortileCMake` now detects the C and C++ compiler the same way `MiniPortile` does: by examining environment variables, then using kwargs, then looking in RbConfig (in that order). (#144 by @flavorjones)
|
|
15
|
+
- GPG file verification error messages are captured in the raised exception. Previously these errors went to `stderr`. (#145 by @flavorjones)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### 2.8.6 / 2024-04-14
|
|
19
|
+
|
|
20
|
+
#### Added
|
|
21
|
+
|
|
22
|
+
- When using CMake on FreeBSD, default to clang's "cc" and "c++" compilers. (#139 by @mudge)
|
|
23
|
+
|
|
24
|
+
|
|
3
25
|
### 2.8.5 / 2023-10-22
|
|
4
26
|
|
|
5
27
|
#### Added
|
data/README.md
CHANGED
|
@@ -85,21 +85,30 @@ system-wide installation.
|
|
|
85
85
|
|
|
86
86
|
Some keyword arguments can be passed to the constructor to configure the commands used:
|
|
87
87
|
|
|
88
|
-
#### `
|
|
88
|
+
#### `cc_command` and `cxx_command`
|
|
89
89
|
|
|
90
|
-
The compiler command that is used is configurable, and in order of preference will use:
|
|
90
|
+
The C compiler command that is used is configurable, and in order of preference will use:
|
|
91
91
|
|
|
92
92
|
- the `CC` environment variable (if present)
|
|
93
|
-
- the `
|
|
93
|
+
- the `:cc_command` keyword argument passed in to the constructor
|
|
94
94
|
- `RbConfig::CONFIG["CC"]`
|
|
95
95
|
- `"gcc"`
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
The C++ compiler is similarly configuratble, and in order of preference will use:
|
|
98
|
+
|
|
99
|
+
- the `CXX` environment variable (if present)
|
|
100
|
+
- the `:cxx_command` keyword argument passed in to the constructor
|
|
101
|
+
- `RbConfig::CONFIG["CXX"]`
|
|
102
|
+
- `"g++"`
|
|
103
|
+
|
|
104
|
+
You can pass your compiler commands to the MiniPortile constructor:
|
|
98
105
|
|
|
99
106
|
``` ruby
|
|
100
|
-
MiniPortile.new("libiconv", "1.13.1",
|
|
107
|
+
MiniPortile.new("libiconv", "1.13.1", cc_command: "clang", cxx_command: "clang++")
|
|
101
108
|
```
|
|
102
109
|
|
|
110
|
+
(For backwards compatibility, the constructor also supports a keyword argument `:gcc_command` for the C compiler.)
|
|
111
|
+
|
|
103
112
|
#### `make_command`
|
|
104
113
|
|
|
105
114
|
The configuration/make command that is used is configurable, and in order of preference will use:
|
data/Rakefile
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
require "rake/clean"
|
|
2
2
|
require "bundler/gem_tasks"
|
|
3
|
+
require "rake/testtask"
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
desc "Test MiniPortile by running unit tests"
|
|
6
|
-
task :unit do
|
|
7
|
-
sh "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map { |f| "require '#{f}';" }.join}\" -- #{ENV["TESTOPTS"]} -v"
|
|
8
|
-
end
|
|
5
|
+
Rake::TestTask.new("test:unit")
|
|
9
6
|
|
|
7
|
+
namespace :test do
|
|
10
8
|
desc "Test MiniPortile by compiling examples"
|
|
11
9
|
task :examples do
|
|
12
10
|
Dir.chdir("examples") do
|
|
@@ -8,6 +8,7 @@ require 'open-uri'
|
|
|
8
8
|
require 'cgi'
|
|
9
9
|
require 'rbconfig'
|
|
10
10
|
require 'shellwords'
|
|
11
|
+
require 'open3'
|
|
11
12
|
|
|
12
13
|
# Monkey patch for Net::HTTP by ruby open-uri fix:
|
|
13
14
|
# https://github.com/ruby/ruby/commit/58835a9
|
|
@@ -103,10 +104,11 @@ class MiniPortile
|
|
|
103
104
|
@files = []
|
|
104
105
|
@patch_files = []
|
|
105
106
|
@log_files = {}
|
|
106
|
-
@logger = STDOUT
|
|
107
|
+
@logger = kwargs[:logger] || STDOUT
|
|
107
108
|
@source_directory = nil
|
|
108
109
|
|
|
109
|
-
@
|
|
110
|
+
@cc_command = kwargs[:cc_command] || kwargs[:gcc_command]
|
|
111
|
+
@cxx_command = kwargs[:cxx_command]
|
|
110
112
|
@make_command = kwargs[:make_command]
|
|
111
113
|
@open_timeout = kwargs[:open_timeout] || DEFAULT_TIMEOUT
|
|
112
114
|
@read_timeout = kwargs[:read_timeout] || DEFAULT_TIMEOUT
|
|
@@ -318,10 +320,8 @@ class MiniPortile
|
|
|
318
320
|
if static
|
|
319
321
|
libdir = lib_path
|
|
320
322
|
if pcfile
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
libdir = minimal_pkg_config(pcfile, "variable=libdir")
|
|
324
|
-
end
|
|
323
|
+
pcfile_libdir = minimal_pkg_config(pcfile, "variable=libdir").strip
|
|
324
|
+
libdir = pcfile_libdir unless pcfile_libdir.empty?
|
|
325
325
|
end
|
|
326
326
|
|
|
327
327
|
#
|
|
@@ -372,8 +372,13 @@ class MiniPortile
|
|
|
372
372
|
File.join(path, "lib")
|
|
373
373
|
end
|
|
374
374
|
|
|
375
|
-
def
|
|
376
|
-
(ENV["CC"] || @
|
|
375
|
+
def cc_cmd
|
|
376
|
+
(ENV["CC"] || @cc_command || RbConfig::CONFIG["CC"] || "gcc").dup
|
|
377
|
+
end
|
|
378
|
+
alias :gcc_cmd :cc_cmd
|
|
379
|
+
|
|
380
|
+
def cxx_cmd
|
|
381
|
+
(ENV["CXX"] || @cxx_command || RbConfig::CONFIG["CXX"] || "g++").dup
|
|
377
382
|
end
|
|
378
383
|
|
|
379
384
|
def make_cmd
|
|
@@ -457,24 +462,29 @@ class MiniPortile
|
|
|
457
462
|
gpg_exe = which('gpg2') || which('gpg') || raise("Neither GPG nor GPG2 is installed")
|
|
458
463
|
|
|
459
464
|
# import the key into our own keyring
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
465
|
+
gpg_error = nil
|
|
466
|
+
gpg_status = Open3.popen3(gpg_exe, "--status-fd", "1", "--no-default-keyring", "--keyring", KEYRING_NAME, "--import") do |gpg_in, gpg_out, gpg_err, _thread|
|
|
467
|
+
gpg_in.write gpg[:key]
|
|
468
|
+
gpg_in.close
|
|
469
|
+
gpg_error = gpg_err.read
|
|
470
|
+
gpg_out.read
|
|
464
471
|
end
|
|
465
472
|
key_ids = gpg_status.scan(/\[GNUPG:\] IMPORT_OK \d+ (?<key_id>[0-9a-f]+)/i).map(&:first)
|
|
466
|
-
raise "invalid gpg key provided" if key_ids.empty?
|
|
473
|
+
raise "invalid gpg key provided:\n#{gpg_error}" if key_ids.empty?
|
|
467
474
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
+
begin
|
|
476
|
+
# verify the signature against our keyring
|
|
477
|
+
gpg_status, gpg_error, _status = Open3.capture3(gpg_exe, "--status-fd", "1", "--no-default-keyring", "--keyring", KEYRING_NAME, "--verify", signature_file, file[:local_path])
|
|
478
|
+
|
|
479
|
+
raise "signature mismatch:\n#{gpg_error}" unless gpg_status.match(/^\[GNUPG:\] VALIDSIG/)
|
|
480
|
+
ensure
|
|
481
|
+
# remove the key from our keyring
|
|
482
|
+
key_ids.each do |key_id|
|
|
483
|
+
IO.popen([gpg_exe, "--batch", "--yes", "--no-default-keyring", "--keyring", KEYRING_NAME, "--delete-keys", key_id], &:read)
|
|
484
|
+
raise "unable to delete the imported key" unless $?.exitstatus==0
|
|
485
|
+
end
|
|
475
486
|
end
|
|
476
487
|
|
|
477
|
-
raise "signature mismatch" unless gpg_status.match(/^\[GNUPG:\] VALIDSIG/)
|
|
478
488
|
|
|
479
489
|
else
|
|
480
490
|
digest = case
|
|
@@ -498,30 +508,6 @@ class MiniPortile
|
|
|
498
508
|
}
|
|
499
509
|
end
|
|
500
510
|
|
|
501
|
-
TAR_EXECUTABLES = %w[gtar bsdtar tar basic-bsdtar]
|
|
502
|
-
def tar_exe
|
|
503
|
-
@@tar_exe ||= begin
|
|
504
|
-
TAR_EXECUTABLES.find { |c|
|
|
505
|
-
which(c)
|
|
506
|
-
} or raise("tar not found - please make sure that one of the following commands is in the PATH: #{TAR_EXECUTABLES.join(", ")}")
|
|
507
|
-
end
|
|
508
|
-
end
|
|
509
|
-
|
|
510
|
-
def tar_compression_switch(filename)
|
|
511
|
-
case File.extname(filename)
|
|
512
|
-
when '.gz', '.tgz'
|
|
513
|
-
'z'
|
|
514
|
-
when '.bz2', '.tbz2'
|
|
515
|
-
'j'
|
|
516
|
-
when '.xz'
|
|
517
|
-
'J'
|
|
518
|
-
when '.Z'
|
|
519
|
-
'Z'
|
|
520
|
-
else
|
|
521
|
-
''
|
|
522
|
-
end
|
|
523
|
-
end
|
|
524
|
-
|
|
525
511
|
# From: http://stackoverflow.com/a/5471032/7672
|
|
526
512
|
# Thanks, Mislav!
|
|
527
513
|
#
|
|
@@ -548,6 +534,8 @@ class MiniPortile
|
|
|
548
534
|
output = `#{gcc_cmd} -v 2>&1`
|
|
549
535
|
if m = output.match(/^Target\: (.*)$/)
|
|
550
536
|
@detect_host = m[1]
|
|
537
|
+
else
|
|
538
|
+
@detect_host = nil
|
|
551
539
|
end
|
|
552
540
|
|
|
553
541
|
@detect_host
|
|
@@ -556,12 +544,35 @@ class MiniPortile
|
|
|
556
544
|
end
|
|
557
545
|
end
|
|
558
546
|
|
|
547
|
+
TAR_EXECUTABLES = %w[gtar bsdtar tar basic-bsdtar]
|
|
548
|
+
def tar_exe
|
|
549
|
+
@@tar_exe ||= begin
|
|
550
|
+
TAR_EXECUTABLES.find { |c|
|
|
551
|
+
which(c)
|
|
552
|
+
} or raise("tar not found - please make sure that one of the following commands is in the PATH: #{TAR_EXECUTABLES.join(", ")}")
|
|
553
|
+
end
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
def tar_command(file, target)
|
|
557
|
+
case File.extname(file)
|
|
558
|
+
when '.gz', '.tgz'
|
|
559
|
+
[tar_exe, 'xzf', file, '-C', target]
|
|
560
|
+
when '.bz2', '.tbz2'
|
|
561
|
+
[tar_exe, 'xjf', file, '-C', target]
|
|
562
|
+
when '.xz'
|
|
563
|
+
# NOTE: OpenBSD's tar command does not support the -J option
|
|
564
|
+
"xzcat #{file.shellescape} | #{tar_exe.shellescape} xf - -C #{target.shellescape}"
|
|
565
|
+
else
|
|
566
|
+
[tar_exe, 'xf', file, '-C', target]
|
|
567
|
+
end
|
|
568
|
+
end
|
|
569
|
+
|
|
559
570
|
def extract_file(file, target)
|
|
560
571
|
filename = File.basename(file)
|
|
561
572
|
FileUtils.mkdir_p target
|
|
562
573
|
|
|
563
574
|
message "Extracting #{filename} into #{target}... "
|
|
564
|
-
execute('extract',
|
|
575
|
+
execute('extract', tar_command(file, target) , {:cd => Dir.pwd, :initial_message => false})
|
|
565
576
|
end
|
|
566
577
|
|
|
567
578
|
# command could be an array of args, or one string containing a command passed to the shell. See
|
|
@@ -697,7 +708,7 @@ class MiniPortile
|
|
|
697
708
|
return download_file(redirect.url, full_path, count-1)
|
|
698
709
|
rescue => e
|
|
699
710
|
count = count - 1
|
|
700
|
-
puts "#{count} retrie(s) left for #{filename} (#{e.message})"
|
|
711
|
+
@logger.puts "#{count} retrie(s) left for #{filename} (#{e.message})"
|
|
701
712
|
if count > 0
|
|
702
713
|
sleep 1
|
|
703
714
|
return download_file_http(url, full_path, count)
|
|
@@ -67,46 +67,21 @@ class MiniPortileCMake < MiniPortile
|
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def cmake_compile_flags
|
|
70
|
-
|
|
70
|
+
# RbConfig::CONFIG['CC'] and RbConfig::CONFIG['CXX'] can contain additional flags, for example
|
|
71
|
+
# "clang++ -std=gnu++11" or "clang -fdeclspec". CMake is just looking for the command name.
|
|
72
|
+
cc_compiler = cc_cmd.split.first
|
|
73
|
+
cxx_compiler = cxx_cmd.split.first
|
|
71
74
|
|
|
72
75
|
# needed to ensure cross-compilation with CMake targets the right CPU and compilers
|
|
73
76
|
[
|
|
74
77
|
"-DCMAKE_SYSTEM_NAME=#{cmake_system_name}",
|
|
75
78
|
"-DCMAKE_SYSTEM_PROCESSOR=#{cpu_type}",
|
|
76
|
-
"-DCMAKE_C_COMPILER=#{
|
|
79
|
+
"-DCMAKE_C_COMPILER=#{cc_compiler}",
|
|
77
80
|
"-DCMAKE_CXX_COMPILER=#{cxx_compiler}",
|
|
78
81
|
"-DCMAKE_BUILD_TYPE=#{cmake_build_type}",
|
|
79
82
|
]
|
|
80
83
|
end
|
|
81
84
|
|
|
82
|
-
def find_compiler(compilers)
|
|
83
|
-
compilers.find { |binary| which(binary) }
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# configure automatically searches for the right compiler based on the
|
|
87
|
-
# `--host` parameter. However, CMake doesn't have an equivalent feature.
|
|
88
|
-
# Search for the right compiler for the target architecture using
|
|
89
|
-
# some basic heruistics.
|
|
90
|
-
def find_c_and_cxx_compilers(host)
|
|
91
|
-
c_compiler = ENV["CC"]
|
|
92
|
-
cxx_compiler = ENV["CXX"]
|
|
93
|
-
|
|
94
|
-
if MiniPortile.darwin?
|
|
95
|
-
c_compiler ||= 'clang'
|
|
96
|
-
cxx_compiler ||='clang++'
|
|
97
|
-
else
|
|
98
|
-
c_compiler ||= 'gcc'
|
|
99
|
-
cxx_compiler ||= 'g++'
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
c_platform_compiler = "#{host}-#{c_compiler}"
|
|
103
|
-
cxx_platform_compiler = "#{host}-#{cxx_compiler}"
|
|
104
|
-
c_compiler = find_compiler([c_platform_compiler, c_compiler])
|
|
105
|
-
cxx_compiler = find_compiler([cxx_platform_compiler, cxx_compiler])
|
|
106
|
-
|
|
107
|
-
[c_compiler, cxx_compiler]
|
|
108
|
-
end
|
|
109
|
-
|
|
110
85
|
# Full list: https://gitlab.kitware.com/cmake/cmake/-/blob/v3.26.4/Modules/CMakeDetermineSystem.cmake?ref_type=tags#L12-31
|
|
111
86
|
def cmake_system_name
|
|
112
87
|
return system_name if system_name
|
data/test/helper.rb
CHANGED
|
@@ -9,6 +9,12 @@ require 'archive/tar/minitar'
|
|
|
9
9
|
require 'fileutils'
|
|
10
10
|
require 'erb'
|
|
11
11
|
require 'mini_portile2'
|
|
12
|
+
require 'logger'
|
|
13
|
+
|
|
14
|
+
puts "#{__FILE__}:#{__LINE__}: relevant RbConfig::CONFIG values:"
|
|
15
|
+
%w[target_os target_cpu CC CXX].each do |key|
|
|
16
|
+
puts "- #{key}: #{RbConfig::CONFIG[key].inspect}"
|
|
17
|
+
end
|
|
12
18
|
|
|
13
19
|
class TestCase < Minitest::Test
|
|
14
20
|
include Minitest::Hooks
|
|
@@ -18,7 +24,12 @@ class TestCase < Minitest::Test
|
|
|
18
24
|
attr_accessor :webrick
|
|
19
25
|
|
|
20
26
|
def start_webrick(path)
|
|
21
|
-
@webrick = WEBrick::HTTPServer.new(
|
|
27
|
+
@webrick = WEBrick::HTTPServer.new(
|
|
28
|
+
:Port => HTTP_PORT,
|
|
29
|
+
:DocumentRoot => path,
|
|
30
|
+
:Logger => Logger.new(File::NULL),
|
|
31
|
+
:AccessLog => [],
|
|
32
|
+
).tap do |w|
|
|
22
33
|
Thread.new do
|
|
23
34
|
w.start
|
|
24
35
|
end
|
data/test/test_cmake.rb
CHANGED
|
@@ -14,12 +14,16 @@ class TestCMake < TestCase
|
|
|
14
14
|
create_tar(@tar_path, @assets_path, "test-cmake-1.0")
|
|
15
15
|
start_webrick(File.dirname(@tar_path))
|
|
16
16
|
|
|
17
|
+
@logger = StringIO.new # IO to keep recipe logs in case we need to debug
|
|
17
18
|
@recipe = init_recipe
|
|
18
19
|
|
|
19
20
|
git_dir = File.join(@assets_path, "git")
|
|
20
21
|
with_custom_git_dir(git_dir) do
|
|
21
22
|
recipe.cook
|
|
22
23
|
end
|
|
24
|
+
rescue => e
|
|
25
|
+
puts @logger.string
|
|
26
|
+
raise e
|
|
23
27
|
end
|
|
24
28
|
|
|
25
29
|
def after_all
|
|
@@ -58,6 +62,7 @@ class TestCMake < TestCase
|
|
|
58
62
|
|
|
59
63
|
def init_recipe
|
|
60
64
|
MiniPortileCMake.new("test-cmake", "1.0").tap do |recipe|
|
|
65
|
+
recipe.logger = @logger
|
|
61
66
|
recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}"
|
|
62
67
|
recipe.patch_files << File.join(@assets_path, "patch 1.diff")
|
|
63
68
|
end
|
|
@@ -83,23 +88,20 @@ class TestCMakeConfig < TestCMake
|
|
|
83
88
|
end
|
|
84
89
|
|
|
85
90
|
def test_configure_defaults_with_macos
|
|
86
|
-
recipe = init_recipe
|
|
87
|
-
recipe.host = 'some-host'
|
|
88
|
-
|
|
89
91
|
with_env({ "CC" => nil, "CXX" => nil }) do
|
|
90
92
|
MiniPortile.stub(:darwin?, true) do
|
|
91
93
|
with_stubbed_target(os: 'darwin22', cpu: 'arm64') do
|
|
92
|
-
with_compilers(
|
|
94
|
+
with_compilers(c_compiler: 'clang', cxx_compiler: 'clang++') do
|
|
93
95
|
Open3.stub(:capture2, cmake_help_mock('Unix')) do
|
|
94
96
|
assert_equal(
|
|
95
97
|
[
|
|
96
98
|
"-DCMAKE_SYSTEM_NAME=Darwin",
|
|
97
99
|
"-DCMAKE_SYSTEM_PROCESSOR=arm64",
|
|
98
|
-
"-DCMAKE_C_COMPILER=
|
|
99
|
-
"-DCMAKE_CXX_COMPILER=
|
|
100
|
+
"-DCMAKE_C_COMPILER=clang",
|
|
101
|
+
"-DCMAKE_CXX_COMPILER=clang++",
|
|
100
102
|
"-DCMAKE_BUILD_TYPE=Release"
|
|
101
103
|
],
|
|
102
|
-
recipe.configure_defaults)
|
|
104
|
+
@recipe.configure_defaults)
|
|
103
105
|
end
|
|
104
106
|
end
|
|
105
107
|
end
|
|
@@ -107,40 +109,57 @@ class TestCMakeConfig < TestCMake
|
|
|
107
109
|
end
|
|
108
110
|
end
|
|
109
111
|
|
|
110
|
-
def
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
MiniPortile.stub(:darwin?, false) do
|
|
115
|
-
with_stubbed_target do
|
|
116
|
-
with_compilers(recipe) do
|
|
112
|
+
def test_configure_defaults_with_freebsd
|
|
113
|
+
with_env({ "CC" => nil, "CXX" => nil }) do
|
|
114
|
+
with_stubbed_target(os: 'freebsd14') do
|
|
115
|
+
with_compilers(c_compiler: 'cc', cxx_compiler: 'c++') do
|
|
117
116
|
Open3.stub(:capture2, cmake_help_mock('Unix')) do
|
|
118
117
|
assert_equal(
|
|
119
118
|
[
|
|
120
|
-
"-DCMAKE_SYSTEM_NAME=
|
|
119
|
+
"-DCMAKE_SYSTEM_NAME=FreeBSD",
|
|
121
120
|
"-DCMAKE_SYSTEM_PROCESSOR=x86_64",
|
|
122
|
-
"-DCMAKE_C_COMPILER=
|
|
123
|
-
"-DCMAKE_CXX_COMPILER=
|
|
121
|
+
"-DCMAKE_C_COMPILER=cc",
|
|
122
|
+
"-DCMAKE_CXX_COMPILER=c++",
|
|
124
123
|
"-DCMAKE_BUILD_TYPE=Release"
|
|
125
124
|
],
|
|
126
|
-
recipe.configure_defaults)
|
|
125
|
+
@recipe.configure_defaults)
|
|
127
126
|
end
|
|
128
127
|
end
|
|
129
128
|
end
|
|
130
129
|
end
|
|
131
130
|
end
|
|
132
131
|
|
|
133
|
-
def
|
|
134
|
-
|
|
132
|
+
def test_configure_defaults_with_manual_system_name
|
|
133
|
+
MiniPortile.stub(:darwin?, false) do
|
|
134
|
+
with_stubbed_target do
|
|
135
|
+
with_compilers do
|
|
136
|
+
Open3.stub(:capture2, cmake_help_mock('Unix')) do
|
|
137
|
+
@recipe.stub(:system_name, 'Custom') do
|
|
138
|
+
assert_equal(
|
|
139
|
+
[
|
|
140
|
+
"-DCMAKE_SYSTEM_NAME=Custom",
|
|
141
|
+
"-DCMAKE_SYSTEM_PROCESSOR=x86_64",
|
|
142
|
+
"-DCMAKE_C_COMPILER=gcc",
|
|
143
|
+
"-DCMAKE_CXX_COMPILER=g++",
|
|
144
|
+
"-DCMAKE_BUILD_TYPE=Release"
|
|
145
|
+
],
|
|
146
|
+
@recipe.configure_defaults)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
135
153
|
|
|
154
|
+
def test_configure_defaults_with_unix_makefiles
|
|
136
155
|
MiniPortile.stub(:linux?, true) do
|
|
137
156
|
MiniPortile.stub(:darwin?, false) do
|
|
138
157
|
with_stubbed_target do
|
|
139
|
-
with_compilers
|
|
158
|
+
with_compilers do
|
|
140
159
|
Open3.stub(:capture2, cmake_help_mock('Unix')) do
|
|
141
160
|
MiniPortile.stub(:mingw?, true) do
|
|
142
161
|
assert_equal(default_x86_compile_flags,
|
|
143
|
-
|
|
162
|
+
@recipe.configure_defaults)
|
|
144
163
|
end
|
|
145
164
|
end
|
|
146
165
|
end
|
|
@@ -150,15 +169,13 @@ class TestCMakeConfig < TestCMake
|
|
|
150
169
|
end
|
|
151
170
|
|
|
152
171
|
def test_configure_defaults_with_msys_makefiles
|
|
153
|
-
recipe = init_recipe
|
|
154
|
-
|
|
155
172
|
MiniPortile.stub(:linux?, true) do
|
|
156
173
|
MiniPortile.stub(:darwin?, false) do
|
|
157
174
|
with_stubbed_target do
|
|
158
|
-
with_compilers
|
|
175
|
+
with_compilers do
|
|
159
176
|
Open3.stub(:capture2, cmake_help_mock('MSYS')) do
|
|
160
177
|
MiniPortile.stub(:mingw?, true) do
|
|
161
|
-
assert_equal(['-G', 'MSYS Makefiles'] + default_x86_compile_flags, recipe.configure_defaults)
|
|
178
|
+
assert_equal(['-G', 'MSYS Makefiles'] + default_x86_compile_flags, @recipe.configure_defaults)
|
|
162
179
|
end
|
|
163
180
|
end
|
|
164
181
|
end
|
|
@@ -168,15 +185,13 @@ class TestCMakeConfig < TestCMake
|
|
|
168
185
|
end
|
|
169
186
|
|
|
170
187
|
def test_configure_defaults_with_nmake_makefiles
|
|
171
|
-
recipe = init_recipe
|
|
172
|
-
|
|
173
188
|
MiniPortile.stub(:linux?, true) do
|
|
174
189
|
MiniPortile.stub(:darwin?, false) do
|
|
175
190
|
with_stubbed_target do
|
|
176
|
-
with_compilers
|
|
191
|
+
with_compilers do
|
|
177
192
|
Open3.stub(:capture2, cmake_help_mock('NMake')) do
|
|
178
193
|
MiniPortile.stub(:mswin?, true) do
|
|
179
|
-
assert_equal(['-G', 'NMake Makefiles'] + default_x86_compile_flags, recipe.configure_defaults)
|
|
194
|
+
assert_equal(['-G', 'NMake Makefiles'] + default_x86_compile_flags, @recipe.configure_defaults)
|
|
180
195
|
end
|
|
181
196
|
end
|
|
182
197
|
end
|
|
@@ -217,21 +232,11 @@ class TestCMakeConfig < TestCMake
|
|
|
217
232
|
end
|
|
218
233
|
end
|
|
219
234
|
|
|
220
|
-
def with_compilers(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
mock.expect(:call, true, ["#{recipe.host}-#{cxx_compiler}"])
|
|
226
|
-
else
|
|
227
|
-
mock.expect(:call, false, ["#{recipe.host}-#{c_compiler}"])
|
|
228
|
-
mock.expect(:call, true, [c_compiler])
|
|
229
|
-
mock.expect(:call, false, ["#{recipe.host}-#{cxx_compiler}"])
|
|
230
|
-
mock.expect(:call, true, [cxx_compiler])
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
recipe.stub(:which, mock) do
|
|
234
|
-
yield
|
|
235
|
+
def with_compilers(c_compiler: 'gcc', cxx_compiler: 'g++')
|
|
236
|
+
@recipe.stub(:cc_cmd, c_compiler) do
|
|
237
|
+
@recipe.stub(:cxx_cmd, cxx_compiler) do
|
|
238
|
+
yield
|
|
239
|
+
end
|
|
235
240
|
end
|
|
236
241
|
end
|
|
237
242
|
|
data/test/test_cook.rb
CHANGED
|
@@ -13,7 +13,9 @@ class TestCook < TestCase
|
|
|
13
13
|
create_tar(@tar_path, @assets_path, "test mini portile-1.0.0")
|
|
14
14
|
start_webrick(File.dirname(@tar_path))
|
|
15
15
|
|
|
16
|
+
@logger = StringIO.new # IO to keep recipe logs in case we need to debug
|
|
16
17
|
@recipe = MiniPortile.new("test mini portile", "1.0.0").tap do |recipe|
|
|
18
|
+
recipe.logger = @logger
|
|
17
19
|
recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}"
|
|
18
20
|
recipe.patch_files << File.join(@assets_path, "patch 1.diff")
|
|
19
21
|
recipe.configure_options << "--option=\"path with 'space'\""
|
|
@@ -22,6 +24,9 @@ class TestCook < TestCase
|
|
|
22
24
|
recipe.cook
|
|
23
25
|
end
|
|
24
26
|
end
|
|
27
|
+
rescue => e
|
|
28
|
+
puts @logger.string
|
|
29
|
+
raise e
|
|
25
30
|
end
|
|
26
31
|
|
|
27
32
|
def after_all
|
|
@@ -79,17 +84,37 @@ class TestCookConfiguration < TestCase
|
|
|
79
84
|
end
|
|
80
85
|
end
|
|
81
86
|
|
|
82
|
-
def
|
|
87
|
+
def test_cc_command_configuration
|
|
83
88
|
without_env("CC") do
|
|
84
89
|
expected_compiler = RbConfig::CONFIG["CC"] || "gcc"
|
|
90
|
+
assert_equal(expected_compiler, MiniPortile.new("test", "1.0.0").cc_cmd)
|
|
85
91
|
assert_equal(expected_compiler, MiniPortile.new("test", "1.0.0").gcc_cmd)
|
|
92
|
+
assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", cc_command: "xyzzy").cc_cmd)
|
|
93
|
+
assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", gcc_command: "xyzzy").cc_cmd)
|
|
94
|
+
assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", cc_command: "xyzzy").gcc_cmd)
|
|
86
95
|
assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", gcc_command: "xyzzy").gcc_cmd)
|
|
87
96
|
end
|
|
88
97
|
with_env("CC"=>"asdf") do
|
|
98
|
+
assert_equal("asdf", MiniPortile.new("test", "1.0.0").cc_cmd)
|
|
89
99
|
assert_equal("asdf", MiniPortile.new("test", "1.0.0").gcc_cmd)
|
|
100
|
+
assert_equal("asdf", MiniPortile.new("test", "1.0.0", cc_command: "xyzzy").cc_cmd)
|
|
101
|
+
assert_equal("asdf", MiniPortile.new("test", "1.0.0", gcc_command: "xyzzy").cc_cmd)
|
|
102
|
+
assert_equal("asdf", MiniPortile.new("test", "1.0.0", cc_command: "xyzzy").gcc_cmd)
|
|
90
103
|
assert_equal("asdf", MiniPortile.new("test", "1.0.0", gcc_command: "xyzzy").gcc_cmd)
|
|
91
104
|
end
|
|
92
105
|
end
|
|
106
|
+
|
|
107
|
+
def test_cxx_command_configuration
|
|
108
|
+
without_env("CXX") do
|
|
109
|
+
expected_compiler = RbConfig::CONFIG["CXX"] || "g++"
|
|
110
|
+
assert_equal(expected_compiler, MiniPortile.new("test", "1.0.0").cxx_cmd)
|
|
111
|
+
assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", cxx_command: "xyzzy").cxx_cmd)
|
|
112
|
+
end
|
|
113
|
+
with_env("CXX"=>"asdf") do
|
|
114
|
+
assert_equal("asdf", MiniPortile.new("test", "1.0.0").cxx_cmd)
|
|
115
|
+
assert_equal("asdf", MiniPortile.new("test", "1.0.0", cxx_command: "xyzzy").cxx_cmd)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
93
118
|
end
|
|
94
119
|
|
|
95
120
|
|
|
@@ -116,7 +141,9 @@ class TestCookWithBrokenGitDir < TestCase
|
|
|
116
141
|
|
|
117
142
|
create_tar(@tar_path, @assets_path, "test mini portile-1.0.0")
|
|
118
143
|
|
|
144
|
+
@logger = StringIO.new # IO to keep recipe logs in case we need to debug
|
|
119
145
|
@recipe = MiniPortile.new("test mini portile", "1.0.0").tap do |recipe|
|
|
146
|
+
recipe.logger = @logger
|
|
120
147
|
recipe.files << "file://#{@tar_path}"
|
|
121
148
|
recipe.patch_files << File.join(@assets_path, "patch 1.diff")
|
|
122
149
|
recipe.configure_options << "--option=\"path with 'space'\""
|
|
@@ -146,7 +173,9 @@ class TestCookAgainstSourceDirectory < TestCase
|
|
|
146
173
|
def setup
|
|
147
174
|
super
|
|
148
175
|
|
|
176
|
+
@logger = StringIO.new # IO to keep recipe logs in case we need to debug
|
|
149
177
|
@recipe ||= MiniPortile.new("test mini portile", "1.0.0").tap do |recipe|
|
|
178
|
+
recipe.logger = @logger
|
|
150
179
|
recipe.source_directory = File.expand_path("../assets/test mini portile-1.0.0", __FILE__)
|
|
151
180
|
end
|
|
152
181
|
end
|
data/test/test_digest.rb
CHANGED
|
@@ -24,7 +24,8 @@ class TestDigest < TestCase
|
|
|
24
24
|
def setup
|
|
25
25
|
super
|
|
26
26
|
FileUtils.rm_rf("ports/archives")
|
|
27
|
-
@
|
|
27
|
+
@logger = StringIO.new # IO to keep recipe logs in case we need to debug
|
|
28
|
+
@recipe = MiniPortile.new("test-digest", "1.0.0", logger: @logger)
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def download_with_digest(key, klass)
|
|
@@ -68,28 +69,28 @@ class TestDigest < TestCase
|
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
def public_key
|
|
71
|
-
|
|
72
|
-
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
73
|
-
Version: GnuPG v1
|
|
74
|
-
|
|
75
|
-
mI0EVwUhJQEEAMYxFhgaAdM2Ul5r+XfpqAaI7SOxB14eRjhFjhchy4ylgVxetyLq
|
|
76
|
-
di3zeANXBIHsLBl7quYTlnmhJr/+GQRkCnXWiUp0tJsBVzGM3puK7c534gakEUH6
|
|
77
|
-
AlDtj5p3IeygzSyn8u7KORv+ainXfhwkvTO04mJmxAb2uT8ngKYFdPa1ABEBAAG0
|
|
78
|
-
J1Rlc3QgTWluaXBvcnRpbGUgPHRlc3RAbWluaXBvcnRpbGUub3JnPoi4BBMBAgAi
|
|
79
|
-
BQJXBSElAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBl6D5JZMNwswAK
|
|
80
|
-
A/90Cdb+PX21weBR2Q6uR06M/alPexuXXyJL8ZcwbQMJ/pBBgcS5/h1+rQkBI/CN
|
|
81
|
-
qpXdDlw2Xys2k0sNwdjIw3hmYRzBrddXlCSW3Sifq/hS+kfPZ1snQmIjCgy1Xky5
|
|
82
|
-
QGCcPUxBUxzmra88LakkDO+euKK3hcrfeFIi611lTum1NLiNBFcFISUBBADoyY6z
|
|
83
|
-
2PwH3RWUbqv0VX1s3/JO3v3xMjCRKPlFwsNwLTBtZoWfR6Ao1ajeCuZKfzNKIQ2I
|
|
84
|
-
rn86Rcqyrq4hTj+7BTWjkIPOBthjiL1YqbEBtX7jcYRkYvdQz/IG2F4zVV6X4AAR
|
|
85
|
-
Twx7qaXNt67ArzbHCe5gLNRUK6e6OArkahMv7QARAQABiJ8EGAECAAkFAlcFISUC
|
|
86
|
-
GwwACgkQZeg+SWTDcLNFiwP/TR33ClqWOz0mpjt0xPEoZ0ORmV6fo4sjjzgQoHH/
|
|
87
|
-
KTdsabJbGp8oLQGW/mx3OxgbsAkyZymb5H5cjaF4HtSd4cxI5t1C9ZS/ytN8pqfR
|
|
88
|
-
e29SBje8DAAJn2l57s2OddXLPQ0DUwCcdNEaqgHwSk/Swxc7K+IpfvjLKHKUZZBP
|
|
89
|
-
4Ko=
|
|
90
|
-
=SVWi
|
|
91
|
-
-----END PGP PUBLIC KEY BLOCK-----
|
|
92
|
-
KEY
|
|
72
|
+
<<~KEY
|
|
73
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
74
|
+
Version: GnuPG v1
|
|
75
|
+
|
|
76
|
+
mI0EVwUhJQEEAMYxFhgaAdM2Ul5r+XfpqAaI7SOxB14eRjhFjhchy4ylgVxetyLq
|
|
77
|
+
di3zeANXBIHsLBl7quYTlnmhJr/+GQRkCnXWiUp0tJsBVzGM3puK7c534gakEUH6
|
|
78
|
+
AlDtj5p3IeygzSyn8u7KORv+ainXfhwkvTO04mJmxAb2uT8ngKYFdPa1ABEBAAG0
|
|
79
|
+
J1Rlc3QgTWluaXBvcnRpbGUgPHRlc3RAbWluaXBvcnRpbGUub3JnPoi4BBMBAgAi
|
|
80
|
+
BQJXBSElAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBl6D5JZMNwswAK
|
|
81
|
+
A/90Cdb+PX21weBR2Q6uR06M/alPexuXXyJL8ZcwbQMJ/pBBgcS5/h1+rQkBI/CN
|
|
82
|
+
qpXdDlw2Xys2k0sNwdjIw3hmYRzBrddXlCSW3Sifq/hS+kfPZ1snQmIjCgy1Xky5
|
|
83
|
+
QGCcPUxBUxzmra88LakkDO+euKK3hcrfeFIi611lTum1NLiNBFcFISUBBADoyY6z
|
|
84
|
+
2PwH3RWUbqv0VX1s3/JO3v3xMjCRKPlFwsNwLTBtZoWfR6Ao1ajeCuZKfzNKIQ2I
|
|
85
|
+
rn86Rcqyrq4hTj+7BTWjkIPOBthjiL1YqbEBtX7jcYRkYvdQz/IG2F4zVV6X4AAR
|
|
86
|
+
Twx7qaXNt67ArzbHCe5gLNRUK6e6OArkahMv7QARAQABiJ8EGAECAAkFAlcFISUC
|
|
87
|
+
GwwACgkQZeg+SWTDcLNFiwP/TR33ClqWOz0mpjt0xPEoZ0ORmV6fo4sjjzgQoHH/
|
|
88
|
+
KTdsabJbGp8oLQGW/mx3OxgbsAkyZymb5H5cjaF4HtSd4cxI5t1C9ZS/ytN8pqfR
|
|
89
|
+
e29SBje8DAAJn2l57s2OddXLPQ0DUwCcdNEaqgHwSk/Swxc7K+IpfvjLKHKUZZBP
|
|
90
|
+
4Ko=
|
|
91
|
+
=SVWi
|
|
92
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
|
93
|
+
KEY
|
|
93
94
|
end
|
|
94
95
|
|
|
95
96
|
def test_with_valid_gpg_signature
|
|
@@ -130,7 +131,7 @@ KEY
|
|
|
130
131
|
exception = assert_raises(RuntimeError){
|
|
131
132
|
@recipe.download
|
|
132
133
|
}
|
|
133
|
-
|
|
134
|
+
assert_includes(exception.message, "signature mismatch")
|
|
134
135
|
end
|
|
135
136
|
|
|
136
137
|
def test_with_invalid_key
|
|
@@ -144,60 +145,58 @@ KEY
|
|
|
144
145
|
}
|
|
145
146
|
}
|
|
146
147
|
exception = assert_raises(RuntimeError){ @recipe.download }
|
|
147
|
-
|
|
148
|
+
assert_includes(exception.message, "invalid gpg key provided")
|
|
148
149
|
end
|
|
149
150
|
|
|
150
151
|
def test_with_different_key_than_one_used_to_sign
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
/
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
+
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-----END PGP PUBLIC KEY BLOCK-----
|
|
200
|
-
KEY
|
|
152
|
+
key = <<~KEY
|
|
153
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
154
|
+
Version: GnuPG v1
|
|
155
|
+
|
|
156
|
+
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
|
|
197
|
+
=4JAR
|
|
198
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
|
199
|
+
KEY
|
|
201
200
|
|
|
202
201
|
data_file = File.expand_path(File.join(File.dirname(__FILE__), 'assets', 'gpg-fixtures', 'data'))
|
|
203
202
|
|
|
@@ -209,7 +208,6 @@ KEY
|
|
|
209
208
|
}
|
|
210
209
|
}
|
|
211
210
|
exception = assert_raises(RuntimeError){ @recipe.download }
|
|
212
|
-
|
|
211
|
+
assert_includes(exception.message, "signature mismatch")
|
|
213
212
|
end
|
|
214
213
|
end
|
|
215
|
-
|
data/test/test_download.rb
CHANGED
|
@@ -25,12 +25,13 @@ describe "recipe download" do
|
|
|
25
25
|
server.close
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
request_count
|
|
28
|
+
assert_operator(request_count, :>, 0)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
before do
|
|
32
32
|
@request_count = 0
|
|
33
|
-
@
|
|
33
|
+
@logger = StringIO.new
|
|
34
|
+
@recipe = MiniPortile.new("test-download", "1.1.1", logger: @logger)
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
describe "urls" do
|
|
@@ -62,12 +63,12 @@ describe "recipe download" do
|
|
|
62
63
|
@recipe.files << "file://#{path}"
|
|
63
64
|
@recipe.download
|
|
64
65
|
assert File.exist?(dest)
|
|
65
|
-
Digest::MD5.file(dest).hexdigest
|
|
66
|
+
assert_equal("ee0e9f44e72213015ef976d5ac23931d", Digest::MD5.file(dest).hexdigest)
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
it "other" do
|
|
69
70
|
@recipe.files << "foo://foo"
|
|
70
|
-
|
|
71
|
+
assert_raises(ArgumentError) { @recipe.download }
|
|
71
72
|
end
|
|
72
73
|
end
|
|
73
74
|
end
|
data/test/test_execute.rb
CHANGED
|
@@ -4,7 +4,8 @@ class TestExecute < TestCase
|
|
|
4
4
|
def setup
|
|
5
5
|
super
|
|
6
6
|
@env = {"TEST_ENV_VAR1" => "VAR1_VALUE", "TEST_ENV_VAR2" => "VAR2_VALUE"}
|
|
7
|
-
@
|
|
7
|
+
@logger = StringIO.new
|
|
8
|
+
@recipe = MiniPortile.new("test_execute", "1.0.0", logger: @logger)
|
|
8
9
|
@log_path = @recipe.send(:tmp_path)
|
|
9
10
|
FileUtils.mkdir_p File.join(@log_path, "subdir") # normally created by `download`
|
|
10
11
|
end
|
|
@@ -14,7 +15,7 @@ class TestExecute < TestCase
|
|
|
14
15
|
def execute_with_env(env)
|
|
15
16
|
execute("testenv1",
|
|
16
17
|
%Q(ruby -e "puts ENV['TEST_ENV_VAR1'].inspect ; exit 0"),
|
|
17
|
-
{:env => env, :initial_message => false
|
|
18
|
+
{:env => env, :initial_message => false})
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
21
|
|
|
@@ -28,7 +29,7 @@ class TestExecute < TestCase
|
|
|
28
29
|
def execute_with_env(env)
|
|
29
30
|
execute("testenv2",
|
|
30
31
|
["ruby", "-e", "puts ENV['TEST_ENV_VAR2'].inspect"],
|
|
31
|
-
{:env => env, :initial_message => false
|
|
32
|
+
{:env => env, :initial_message => false})
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
|
data/test/test_proxy.rb
CHANGED
|
@@ -37,6 +37,7 @@ class TestProxy < TestCase
|
|
|
37
37
|
def setup
|
|
38
38
|
# remove any download files
|
|
39
39
|
FileUtils.rm_rf("port/archives")
|
|
40
|
+
@logger = StringIO.new
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
def assert_proxy_auth(expected, request)
|
|
@@ -48,7 +49,7 @@ class TestProxy < TestCase
|
|
|
48
49
|
end
|
|
49
50
|
|
|
50
51
|
def test_http_proxy
|
|
51
|
-
recipe = MiniPortile.new("test http_proxy", "1.0.0")
|
|
52
|
+
recipe = MiniPortile.new("test http_proxy", "1.0.0", logger: @logger)
|
|
52
53
|
recipe.files << "http://myserver/path/to/tar.gz"
|
|
53
54
|
request = with_dummy_proxy do |url, thread|
|
|
54
55
|
ENV['http_proxy'] = url
|
|
@@ -59,7 +60,7 @@ class TestProxy < TestCase
|
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
def test_http_proxy_with_basic_auth
|
|
62
|
-
recipe = MiniPortile.new("test http_proxy", "1.0.0")
|
|
63
|
+
recipe = MiniPortile.new("test http_proxy", "1.0.0", logger: @logger)
|
|
63
64
|
recipe.files << "http://myserver/path/to/tar.gz"
|
|
64
65
|
request = with_dummy_proxy('user: @name', '@12: üMp') do |url, thread|
|
|
65
66
|
ENV['http_proxy'] = url
|
|
@@ -72,7 +73,7 @@ class TestProxy < TestCase
|
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
def test_https_proxy
|
|
75
|
-
recipe = MiniPortile.new("test https_proxy", "1.0.0")
|
|
76
|
+
recipe = MiniPortile.new("test https_proxy", "1.0.0", logger: @logger)
|
|
76
77
|
recipe.files << "https://myserver/path/to/tar.gz"
|
|
77
78
|
request = with_dummy_proxy do |url, thread|
|
|
78
79
|
ENV['https_proxy'] = url
|
|
@@ -83,7 +84,7 @@ class TestProxy < TestCase
|
|
|
83
84
|
end
|
|
84
85
|
|
|
85
86
|
def test_https_proxy_with_basic_auth
|
|
86
|
-
recipe = MiniPortile.new("test https_proxy", "1.0.0")
|
|
87
|
+
recipe = MiniPortile.new("test https_proxy", "1.0.0", logger: @logger)
|
|
87
88
|
recipe.files << "https://myserver/path/to/tar.gz"
|
|
88
89
|
request = with_dummy_proxy('user: @name', '@12: üMp') do |url, thread|
|
|
89
90
|
ENV['https_proxy'] = url
|
|
@@ -96,7 +97,7 @@ class TestProxy < TestCase
|
|
|
96
97
|
end
|
|
97
98
|
|
|
98
99
|
def test_ftp_proxy
|
|
99
|
-
recipe = MiniPortile.new("test ftp_proxy", "1.0.0")
|
|
100
|
+
recipe = MiniPortile.new("test ftp_proxy", "1.0.0", logger: @logger)
|
|
100
101
|
recipe.files << "ftp://myserver/path/to/tar.gz"
|
|
101
102
|
request = with_dummy_proxy do |url, thread|
|
|
102
103
|
ENV['ftp_proxy'] = url
|
|
@@ -107,7 +108,7 @@ class TestProxy < TestCase
|
|
|
107
108
|
end
|
|
108
109
|
|
|
109
110
|
def test_ftp_proxy_with_basic_auth
|
|
110
|
-
recipe = MiniPortile.new("test ftp_proxy", "1.0.0")
|
|
111
|
+
recipe = MiniPortile.new("test ftp_proxy", "1.0.0", logger: @logger)
|
|
111
112
|
recipe.files << "ftp://myserver/path/to/tar.gz"
|
|
112
113
|
request = with_dummy_proxy('user: @name', '@12: üMp') do |url, thread|
|
|
113
114
|
ENV['ftp_proxy'] = url
|
metadata
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mini_portile2
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.8.
|
|
4
|
+
version: 2.8.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Luis Lavena
|
|
8
8
|
- Mike Dalessio
|
|
9
9
|
- Lars Kanis
|
|
10
|
-
autorequire:
|
|
10
|
+
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2024-05-31 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: bundler
|
|
@@ -107,6 +107,7 @@ extra_rdoc_files: []
|
|
|
107
107
|
files:
|
|
108
108
|
- ".github/FUNDING.yml"
|
|
109
109
|
- ".github/workflows/ci.yml"
|
|
110
|
+
- ".github/workflows/downstream.yml"
|
|
110
111
|
- ".gitignore"
|
|
111
112
|
- CHANGELOG.md
|
|
112
113
|
- Gemfile
|
|
@@ -145,7 +146,7 @@ homepage: https://github.com/flavorjones/mini_portile
|
|
|
145
146
|
licenses:
|
|
146
147
|
- MIT
|
|
147
148
|
metadata: {}
|
|
148
|
-
post_install_message:
|
|
149
|
+
post_install_message:
|
|
149
150
|
rdoc_options: []
|
|
150
151
|
require_paths:
|
|
151
152
|
- lib
|
|
@@ -160,8 +161,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
160
161
|
- !ruby/object:Gem::Version
|
|
161
162
|
version: '0'
|
|
162
163
|
requirements: []
|
|
163
|
-
rubygems_version: 3.
|
|
164
|
-
signing_key:
|
|
164
|
+
rubygems_version: 3.5.10
|
|
165
|
+
signing_key:
|
|
165
166
|
specification_version: 4
|
|
166
167
|
summary: Simple autoconf and cmake builder for developers
|
|
167
168
|
test_files:
|