mini_portile2 2.8.5 → 2.8.7
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|