fpm 1.12.0 → 1.14.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.rst +45 -5
- data/CONTRIBUTORS +1 -0
- data/LICENSE +1 -1
- data/lib/fpm/package/deb.rb +113 -7
- data/lib/fpm/package/empty.rb +12 -0
- data/lib/fpm/package/freebsd.rb +12 -19
- data/lib/fpm/package/gem.rb +1 -1
- data/lib/fpm/package/pyfpm/get_metadata.py +5 -0
- data/lib/fpm/package/python.rb +22 -11
- data/lib/fpm/package/rpm.rb +14 -2
- data/lib/fpm/package/virtualenv.rb +2 -0
- data/lib/fpm/util.rb +29 -46
- data/lib/fpm/version.rb +1 -1
- data/templates/deb/postinst_upgrade.sh.erb +1 -0
- data/templates/deb.erb +1 -1
- data/templates/rpm.erb +4 -4
- metadata +22 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '079f0bd8cc1fe2a84b6e5dfc38cc0ae2e509d271d9752e0fb739c7cde79c746b'
|
4
|
+
data.tar.gz: 28ed14320c22c0dc5767781d3f325cd4e817b16e42999b0a2d1e2713522d0761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6287a7079c1f00a327d92a268f46df825cdbcc5008d719a23a4dd8f4fdba574bedf735f559207781794c7c29cf39153092d1f1452d8d3ddd4d23f808a8856ae
|
7
|
+
data.tar.gz: 4c90779c8b7990818a76dc4fd60035311fe8ad461e7717271abd11318d1cad10bff03783468ee78fa17bc8455d692deabd69c41bb0ffef8195d6c4be61a56d6e
|
data/CHANGELOG.rst
CHANGED
@@ -1,6 +1,46 @@
|
|
1
1
|
Release Notes and Change Log
|
2
2
|
============================
|
3
3
|
|
4
|
+
1.14.1 (November 10, 2021)
|
5
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
6
|
+
* Fix a bug that impacted fpm api usage (from other ruby programs) that caused an error "NameError: uninitialized constant FPM::Package::CPAN" when trying to output a Deb package. (`#1854`_, `#1856`_; Karol Bucek, Jordan Sissel)
|
7
|
+
|
8
|
+
1.14.0 (November 9, 2021)
|
9
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^
|
10
|
+
* python: Use pip by default for fetching Python packages. This matches the Python 3 "installation" docs which recommend calling pip as ``python -m pip`` where ``python`` depends on ``--python-bin`` (default "python"). Previous default was to use `easy_install` which is no longer available on many newer systems. To use easy_install, you can set ``--no-python-internal-pip`` to revert this pip default. Further, you can specify your own pip path instead of using ``python -m pip`` with the ``--python-pip /path/to/pip`` flag. (`#1820`_, `#1821`_; Jordan Sissel)
|
11
|
+
* python: Support extras_require build markers in python packages (`#1307`_, `#1816`_; Joris Vandermeersch)
|
12
|
+
* freebsd: Fix bug which caused fpm to generate incorrect FreeBSD packages "missing leading `/`" (`#1811`_, `#1812`_, `#1844`_, `#1832`_, `#1845`_; Vlastimil Holer, Clayton Wong, Markus Ueberall, Jordan Sissel)
|
13
|
+
* deb: In order to only allow fpm to create valid packages, fpm now rejects packages with invalid "provides" (``--provides``) values. (`#1829`_, `#1825`_; Jordan Sissel, Peter Teichman)
|
14
|
+
* deb: Only show a warning about /etc and config files if there are files in /etc (`#1852`_, `#1851`_; Jordan Sissel)
|
15
|
+
|
16
|
+
* rpm: replace dash with underscore in rpm's "Release" field aka what fpm calls ``--iteration``. (`#1834`_, `#1833`_; Jordan Sissel)
|
17
|
+
* empty: `fpm -s empty ...` now defaults to "all" architecture instead of "native". (`#1850`_, `#1846`_; Jordan Sissel)
|
18
|
+
* Significant documentation improvements rewriting most of the documentation. New overview pages, full CLI flag listing, and new sections dedicated package types (rpm, cpan, deb, etc). (`#1815`_, `#1817`_, `#1838`_; Vedant K, Jordan Sissel)
|
19
|
+
* Typo fixes in documentation are always appreciated! (`#1842`_; Clayton Wong)
|
20
|
+
* fpm can now (we hope!) now be tested more easily from docker (`#1818`_, `#1682`_, `#1453`_; @directionless, Jordan Sissel, Douglas Muth)
|
21
|
+
|
22
|
+
1.13.1 (July 6, 2021)
|
23
|
+
^^^^^^^^^^^^^^^^^^^^^
|
24
|
+
* deb: The `--provides` flag now allows for versions. Previously, fpm would
|
25
|
+
remove the version part of a provides field when generating deb packages.
|
26
|
+
(`#1788`_, `#1803`_; Jordan Sissel, Phil Schwartz, tympanix)
|
27
|
+
* osxpkg: Update documentation to include installing `rpm` tools on OSX
|
28
|
+
(`#1797`_; allen joslin)
|
29
|
+
|
30
|
+
1.13.0 (June 19, 2021)
|
31
|
+
^^^^^^^^^^^^^^^^^^^^^^
|
32
|
+
* Apple M1 users should now work (`#1772`_, `#1785`_, `#1786`_; Jordan Sissel)
|
33
|
+
* Removed `ffi` ruby library as a dependency. This should make it easier to support a wider range of Ruby versions (Ruby 2.2, 3.0, etc) and platforms (like arm64, Apple M1, etc) in the future. (`#1785`_, `#1786`_; Jordan Sissel)
|
34
|
+
* Now uses the correct architecture synonym for ARM 64 systems. Debian uses `arm64` as a synonym for what other systems call `aarch64` (linux kernel, RPM, Arch Linux). (`#1775`_; Steve Kamerman)
|
35
|
+
* Docs: Fix a typo in an example (`#1785`_; Zoe O'Connell)
|
36
|
+
* rpm: File paths can now contain single-quote characters (`#1774`_; Jordan Sissel)
|
37
|
+
* rpm: Use correct SPEC syntax when using --after-upgrade or similar features (`#1761`_; Jo Vandeginste. Robert Fielding)
|
38
|
+
* Ruby 3.0 support: Added `rexml` as a runtime dependency. In Ruby 2.0, `rexml` came by default, but in Ruby 3.0, `rexml` is now a bundled gem and some distributiosn do not include it by default. (`#1794`_; Jordan Sissel)
|
39
|
+
* Fix error "git: not found (Git::GitExecuteError)". Now loads `git` library only when using git features. (`#1753`_, `#1748`_, `#1751`_, `#1766`_; Jordan Sissel, Cameron Nemo, Jason Rogers, Luke Short)
|
40
|
+
* deb: Fix syntax error in `postinst` (`--after-install`) script. (`#1752`_, `#1749`_, `#1764`_; rmanus, Adam Mohammed, Elliot Murphy, kimw, Jordan Sissel)
|
41
|
+
* deb: --deb-compression now uses the same compression and file suffix on the control.tar file (`#1760`_; Philippe Poilbarbe)
|
42
|
+
|
43
|
+
|
4
44
|
1.12.0 (January 19, 2021)
|
5
45
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
6
46
|
|
@@ -36,7 +76,7 @@ Release Notes and Change Log
|
|
36
76
|
* cpan: Adds `--[no-]cpan-verbose` flag which, when set, runs `cpanm` with the `--verbose` flag (`#1511`_; William N. Braswell, Jr)
|
37
77
|
|
38
78
|
1.10.0 (May 21, 2018)
|
39
|
-
|
79
|
+
^^^^^^^^^^^^^^^^^^^^^
|
40
80
|
|
41
81
|
* Pin `ruby-xz` dependency to one which allows Ruby versions older than 2.3.0 (`#1494`_; Marat Sharafutdinov)
|
42
82
|
* Documentation improvements: `#1488`_; Arthur Burkart. `#1384`_; Justin Kolberg. `#1452`_; Anatoli Babenia.
|
@@ -64,7 +104,7 @@ Release Notes and Change Log
|
|
64
104
|
* rpm: Fix `--config-files` handling (`#1390`_, `#1391`_; Jordan Sissel)
|
65
105
|
|
66
106
|
1.9.1 (July 28, 2017) happy sysadmin day!
|
67
|
-
|
107
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
68
108
|
|
69
109
|
* Documentation improvements: `#1291`_; Pablo Castellano. `#1321`_; ge-fa. `#1309`_; jesusbagpuss. `#1349`_; Perry Stole. `#1352`_, Jordan Sissel. `#1384`_; Justin Kolberg.
|
70
110
|
* Testing improvements: `#1320`_; Rob Young. `#1266`_; Ryan Parman. `#1374`_; Thiago Figueiró.
|
@@ -93,9 +133,9 @@ Release Notes and Change Log
|
|
93
133
|
* Other: Remove unused archive-tar-minitar as a dependency of fpm (`#1355`_; Diego Martins)
|
94
134
|
* Other: Add stud as a runtime dependency (`#1354`_; Elan Ruusamäe)
|
95
135
|
|
96
|
-
.. _reproducible_builds
|
97
|
-
.. _path mapping
|
98
|
-
.. _Deterministic output
|
136
|
+
.. _reproducible_builds: https://reproducible-builds.org/
|
137
|
+
.. _path mapping: source/dir.html#path-mapping
|
138
|
+
.. _Deterministic output: source/gem.html
|
99
139
|
|
100
140
|
1.9.0 (July 28, 2017)
|
101
141
|
^^^^^^^^^^^^^^^^^^^^^
|
data/CONTRIBUTORS
CHANGED
@@ -21,6 +21,7 @@ sbuss
|
|
21
21
|
Brett Gailey (github: dnbert)
|
22
22
|
Daniel Haskin (github: djhaskin987)
|
23
23
|
Richard Grainger (github: liger1978)
|
24
|
+
seph (github: directionless)
|
24
25
|
|
25
26
|
If you have contributed (bug reports, feature requests, help in IRC, blog
|
26
27
|
posts, code, etc) and aren't listed here, please let me know if you wish to be
|
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
(This is an MIT-style license)
|
2
2
|
|
3
|
-
Copyright (c) 2011-
|
3
|
+
Copyright (c) 2011-2021 Jordan Sissel and contributors.
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/lib/fpm/package/deb.rb
CHANGED
@@ -8,6 +8,10 @@ require "fileutils"
|
|
8
8
|
require "digest"
|
9
9
|
require "zlib"
|
10
10
|
|
11
|
+
# For handling conversion
|
12
|
+
require "fpm/package/cpan"
|
13
|
+
require "fpm/package/gem"
|
14
|
+
|
11
15
|
# Support for debian packages (.deb files)
|
12
16
|
#
|
13
17
|
# This class supports both input and output of packages.
|
@@ -25,6 +29,17 @@ class FPM::Package::Deb < FPM::Package
|
|
25
29
|
# The list of supported compression types. Default is gz (gzip)
|
26
30
|
COMPRESSION_TYPES = [ "gz", "bzip2", "xz", "none" ]
|
27
31
|
|
32
|
+
# https://www.debian.org/doc/debian-policy/ch-relationships.html#syntax-of-relationship-fields
|
33
|
+
# Example value with version relationship: libc6 (>= 2.2.1)
|
34
|
+
# Example value: libc6
|
35
|
+
|
36
|
+
# Version string docs here: https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-version
|
37
|
+
# The format is: [epoch:]upstream_version[-debian_revision].
|
38
|
+
# epoch - This is a single (generally small) unsigned integer
|
39
|
+
# upstream_version - must contain only alphanumerics 6 and the characters . + - ~
|
40
|
+
# debian_revision - only alphanumerics and the characters + . ~
|
41
|
+
RELATIONSHIP_FIELD_PATTERN = /^(?<name>[A-z0-9_-]+)(?: *\((?<relation>[<>=]+) *(?<version>(?:[0-9]+:)?[0-9A-Za-z+~.-]+(?:-[0-9A-Za-z+~.]+)?)\))?$/
|
42
|
+
|
28
43
|
option "--ignore-iteration-in-dependencies", :flag,
|
29
44
|
"For '=' (equal) dependencies, allow iterations on the specified " \
|
30
45
|
"version. Default is to be specific. This option allows the same " \
|
@@ -178,7 +193,7 @@ class FPM::Package::Deb < FPM::Package
|
|
178
193
|
end
|
179
194
|
|
180
195
|
option "--systemd", "FILEPATH", "Add FILEPATH as a systemd script",
|
181
|
-
|
196
|
+
:multivalued => true do |file|
|
182
197
|
next File.expand_path(file)
|
183
198
|
end
|
184
199
|
|
@@ -228,6 +243,9 @@ class FPM::Package::Deb < FPM::Package
|
|
228
243
|
when "x86_64"
|
229
244
|
# Debian calls x86_64 "amd64"
|
230
245
|
@architecture = "amd64"
|
246
|
+
when "aarch64"
|
247
|
+
# Debian calls aarch64 "arm64"
|
248
|
+
@architecture = "arm64"
|
231
249
|
when "noarch"
|
232
250
|
# Debian calls noarch "all"
|
233
251
|
@architecture = "all"
|
@@ -424,6 +442,12 @@ class FPM::Package::Deb < FPM::Package
|
|
424
442
|
|
425
443
|
def output(output_path)
|
426
444
|
self.provides = self.provides.collect { |p| fix_provides(p) }
|
445
|
+
|
446
|
+
self.provides.each do |provide|
|
447
|
+
if !valid_provides_field?(provide)
|
448
|
+
raise FPM::InvalidPackageConfiguration, "Found invalid Provides field values (#{provide.inspect}). This is not valid in a Debian package."
|
449
|
+
end
|
450
|
+
end
|
427
451
|
output_check(output_path)
|
428
452
|
# Abort if the target path already exists.
|
429
453
|
|
@@ -588,15 +612,19 @@ class FPM::Package::Deb < FPM::Package
|
|
588
612
|
case self.attributes[:deb_compression]
|
589
613
|
when "gz", nil
|
590
614
|
datatar = build_path("data.tar.gz")
|
615
|
+
controltar = build_path("control.tar.gz")
|
591
616
|
compression = "-z"
|
592
617
|
when "bzip2"
|
593
618
|
datatar = build_path("data.tar.bz2")
|
619
|
+
controltar = build_path("control.tar.gz")
|
594
620
|
compression = "-j"
|
595
621
|
when "xz"
|
596
622
|
datatar = build_path("data.tar.xz")
|
623
|
+
controltar = build_path("control.tar.xz")
|
597
624
|
compression = "-J"
|
598
625
|
when "none"
|
599
626
|
datatar = build_path("data.tar")
|
627
|
+
controltar = build_path("control.tar")
|
600
628
|
compression = ""
|
601
629
|
else
|
602
630
|
raise FPM::InvalidPackageConfiguration,
|
@@ -616,7 +644,7 @@ class FPM::Package::Deb < FPM::Package
|
|
616
644
|
# the 'debian-binary' file has to be first
|
617
645
|
File.expand_path(output_path).tap do |output_path|
|
618
646
|
::Dir.chdir(build_path) do
|
619
|
-
safesystem(*ar_cmd, output_path, "debian-binary",
|
647
|
+
safesystem(*ar_cmd, output_path, "debian-binary", controltar, datatar)
|
620
648
|
end
|
621
649
|
end
|
622
650
|
|
@@ -653,6 +681,43 @@ class FPM::Package::Deb < FPM::Package
|
|
653
681
|
fix_provides(provides)
|
654
682
|
end.flatten
|
655
683
|
|
684
|
+
if origin == FPM::Package::CPAN
|
685
|
+
# The fpm cpan code presents dependencies and provides fields as perl(ModuleName)
|
686
|
+
# so we'll need to convert them to something debian supports.
|
687
|
+
|
688
|
+
# Replace perl(ModuleName) > 1.0 with Debian-style perl-ModuleName (> 1.0)
|
689
|
+
perldepfix = lambda do |dep|
|
690
|
+
m = dep.match(/perl\((?<name>[A-Za-z0-9_:]+)\)\s*(?<op>.*$)/)
|
691
|
+
if m.nil?
|
692
|
+
# 'dep' syntax didn't look like 'perl(Name) > 1.0'
|
693
|
+
dep
|
694
|
+
else
|
695
|
+
# Also replace '::' in the perl module name with '-'
|
696
|
+
modulename = m["name"].gsub("::", "-")
|
697
|
+
|
698
|
+
# Fix any upper-casing or other naming concerns Debian has about packages
|
699
|
+
name = "#{attributes[:cpan_package_name_prefix]}-#{modulename}"
|
700
|
+
|
701
|
+
if m["op"].empty?
|
702
|
+
name
|
703
|
+
else
|
704
|
+
# 'dep' syntax was like this (version constraint): perl(Module) > 1.0
|
705
|
+
"#{name} (#{m["op"]})"
|
706
|
+
end
|
707
|
+
end
|
708
|
+
end
|
709
|
+
|
710
|
+
rejects = [ "perl(vars)", "perl(warnings)", "perl(strict)", "perl(Config)" ]
|
711
|
+
self.dependencies = self.dependencies.reject do |dep|
|
712
|
+
# Reject non-module Perl dependencies like 'vars' and 'warnings'
|
713
|
+
rejects.include?(dep)
|
714
|
+
end.collect(&perldepfix).collect(&method(:fix_dependency))
|
715
|
+
|
716
|
+
# Also fix the Provides field 'perl(ModuleName) = version' to be 'perl-modulename (= version)'
|
717
|
+
self.provides = self.provides.collect(&perldepfix).collect(&method(:fix_provides))
|
718
|
+
|
719
|
+
end # if origin == FPM::Packagin::CPAN
|
720
|
+
|
656
721
|
if origin == FPM::Package::Deb
|
657
722
|
changelog_path = staging_path("usr/share/doc/#{name}/changelog.Debian.gz")
|
658
723
|
if File.exists?(changelog_path)
|
@@ -680,6 +745,19 @@ class FPM::Package::Deb < FPM::Package
|
|
680
745
|
File.unlink(changelog_path)
|
681
746
|
end
|
682
747
|
end
|
748
|
+
|
749
|
+
if origin == FPM::Package::Gem
|
750
|
+
# fpm's gem input will have provides as "rubygem-name = version"
|
751
|
+
# and we need to convert this to Debian-style "rubygem-name (= version)"
|
752
|
+
self.provides = self.provides.collect do |provides|
|
753
|
+
m = /^(#{attributes[:gem_package_name_prefix]})-([^\s]+)\s*=\s*(.*)$/.match(provides)
|
754
|
+
if m
|
755
|
+
"#{m[1]}-#{m[2]} (= #{m[3]})"
|
756
|
+
else
|
757
|
+
provides
|
758
|
+
end
|
759
|
+
end
|
760
|
+
end
|
683
761
|
end # def converted_from
|
684
762
|
|
685
763
|
def debianize_op(op)
|
@@ -754,6 +832,32 @@ class FPM::Package::Deb < FPM::Package
|
|
754
832
|
end
|
755
833
|
end # def fix_dependency
|
756
834
|
|
835
|
+
def valid_provides_field?(text)
|
836
|
+
m = RELATIONSHIP_FIELD_PATTERN.match(text)
|
837
|
+
if m.nil?
|
838
|
+
logger.error("Invalid relationship field for debian package: #{text}")
|
839
|
+
return false
|
840
|
+
end
|
841
|
+
|
842
|
+
# Per Debian Policy manual, https://www.debian.org/doc/debian-policy/ch-relationships.html#syntax-of-relationship-fields
|
843
|
+
# >> The relations allowed are <<, <=, =, >= and >> for strictly earlier, earlier or equal,
|
844
|
+
# >> exactly equal, later or equal and strictly later, respectively. The exception is the
|
845
|
+
# >> Provides field, for which only = is allowed
|
846
|
+
if m["relation"] == "=" || m["relation"] == nil
|
847
|
+
return true
|
848
|
+
end
|
849
|
+
return false
|
850
|
+
end
|
851
|
+
|
852
|
+
def valid_relationship_field?(text)
|
853
|
+
m = RELATIONSHIP_FIELD_PATTERN.match(text)
|
854
|
+
if m.nil?
|
855
|
+
logger.error("Invalid relationship field for debian package: #{text}")
|
856
|
+
return false
|
857
|
+
end
|
858
|
+
return true
|
859
|
+
end
|
860
|
+
|
757
861
|
def fix_provides(provides)
|
758
862
|
name_re = /^[^ \(]+/
|
759
863
|
name = provides[name_re]
|
@@ -768,6 +872,11 @@ class FPM::Package::Deb < FPM::Package
|
|
768
872
|
"debs don't like underscores")
|
769
873
|
provides = provides.gsub("_", "-")
|
770
874
|
end
|
875
|
+
|
876
|
+
if m = provides.match(/^([A-Za-z0-9_-]+)\s*=\s*(\d+.*$)/)
|
877
|
+
logger.warn("Replacing 'provides' entry #{provides} with syntax 'name (= version)'")
|
878
|
+
provides = "#{m[1]} (= #{m[2]})"
|
879
|
+
end
|
771
880
|
return provides.rstrip
|
772
881
|
end
|
773
882
|
|
@@ -795,12 +904,9 @@ class FPM::Package::Deb < FPM::Package
|
|
795
904
|
|
796
905
|
# Tar up the staging_path into control.tar.{compression type}
|
797
906
|
case self.attributes[:deb_compression]
|
798
|
-
when "gz", nil
|
907
|
+
when "gz", "bzip2", nil
|
799
908
|
controltar = "control.tar.gz"
|
800
909
|
compression = "-z"
|
801
|
-
when "bzip2"
|
802
|
-
controltar = "control.tar.bz2"
|
803
|
-
compression = "-j"
|
804
910
|
when "xz"
|
805
911
|
controltar = "control.tar.xz"
|
806
912
|
compression = "-J"
|
@@ -905,7 +1011,7 @@ class FPM::Package::Deb < FPM::Package
|
|
905
1011
|
etcfiles = []
|
906
1012
|
# Add everything in /etc
|
907
1013
|
begin
|
908
|
-
if !attributes[:deb_no_default_config_files?]
|
1014
|
+
if !attributes[:deb_no_default_config_files?] && File.exists?(staging_path("/etc"))
|
909
1015
|
logger.warn("Debian packaging tools generally labels all files in /etc as config files, " \
|
910
1016
|
"as mandated by policy, so fpm defaults to this behavior for deb packages. " \
|
911
1017
|
"You can disable this default behavior with --deb-no-default-config-files flag")
|
data/lib/fpm/package/empty.rb
CHANGED
@@ -4,6 +4,18 @@ require "backports/latest"
|
|
4
4
|
# Empty Package type. For strict/meta/virtual package creation
|
5
5
|
|
6
6
|
class FPM::Package::Empty < FPM::Package
|
7
|
+
def initialize(*args)
|
8
|
+
super(*args)
|
9
|
+
|
10
|
+
# Override FPM::Package's default "native" architecture value
|
11
|
+
# This feels like the right default because an empty package has no
|
12
|
+
# architecture-specific files, and in most cases an empty package should be
|
13
|
+
# installable anywhere.
|
14
|
+
#
|
15
|
+
# https://github.com/jordansissel/fpm/issues/1846
|
16
|
+
@architecture = "all"
|
17
|
+
end
|
18
|
+
|
7
19
|
def output(output_path)
|
8
20
|
logger.warn("Your package has gone into the void.")
|
9
21
|
end
|
data/lib/fpm/package/freebsd.rb
CHANGED
@@ -17,10 +17,6 @@ class FPM::Package::FreeBSD < FPM::Package
|
|
17
17
|
:default => "fpm/<name>"
|
18
18
|
|
19
19
|
def output(output_path)
|
20
|
-
# See https://github.com/jordansissel/fpm/issues/1090
|
21
|
-
# require xz later, because this triggers a load of liblzma.so.5 that is
|
22
|
-
# unavailable on older CentOS/RH distros.
|
23
|
-
require "xz"
|
24
20
|
output_check(output_path)
|
25
21
|
|
26
22
|
# Build the packaging metadata files.
|
@@ -80,22 +76,17 @@ class FPM::Package::FreeBSD < FPM::Package
|
|
80
76
|
file.write(pkgdata.to_json + "\n")
|
81
77
|
end
|
82
78
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
FPM::Util::TarWriter.new(xz) do |tar|
|
87
|
-
# The manifests must come first for pkg.
|
88
|
-
add_path(tar, "+COMPACT_MANIFEST",
|
89
|
-
File.join(staging_path, "+COMPACT_MANIFEST"))
|
90
|
-
add_path(tar, "+MANIFEST",
|
91
|
-
File.join(staging_path, "+MANIFEST"))
|
92
|
-
|
93
|
-
checksums.keys.each do |path|
|
94
|
-
add_path(tar, "/" + path, File.join(staging_path, path))
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
79
|
+
file_list = File.new(build_path("file_list"), "w")
|
80
|
+
files.each do |i|
|
81
|
+
file_list.puts(i)
|
98
82
|
end
|
83
|
+
file_list.close
|
84
|
+
|
85
|
+
# Create the .txz package archive from the files in staging_path.
|
86
|
+
# We use --files-from here to keep the tar entries from having `./` as the prefix.
|
87
|
+
# This is done as a best effor to mimic what FreeBSD packages do, having everything at the top-level as
|
88
|
+
# file names, like "+MANIFEST" instead of "./+MANIFEST"
|
89
|
+
safesystem("tar", "-Jcf", output_path, "-C", staging_path, "--files-from", build_path("file_list"), "--transform", 's|^\([^+]\)|/\1|')
|
99
90
|
end # def output
|
100
91
|
|
101
92
|
# Handle architecture naming conversion:
|
@@ -110,6 +101,8 @@ class FPM::Package::FreeBSD < FPM::Package
|
|
110
101
|
wordsize = case @architecture
|
111
102
|
when nil, 'native'
|
112
103
|
%x{getconf LONG_BIT}.chomp # 'native' is current arch
|
104
|
+
when 'arm64'
|
105
|
+
'64'
|
113
106
|
when 'amd64'
|
114
107
|
'64'
|
115
108
|
when 'i386'
|
data/lib/fpm/package/gem.rb
CHANGED
@@ -4,7 +4,6 @@ require "rubygems"
|
|
4
4
|
require "fileutils"
|
5
5
|
require "fpm/util"
|
6
6
|
require "yaml"
|
7
|
-
require "git"
|
8
7
|
|
9
8
|
# A rubygems package.
|
10
9
|
#
|
@@ -105,6 +104,7 @@ class FPM::Package::Gem < FPM::Package
|
|
105
104
|
FileUtils.mkdir(download_dir) unless File.directory?(download_dir)
|
106
105
|
|
107
106
|
if attributes[:gem_git_repo]
|
107
|
+
require "git"
|
108
108
|
logger.debug("Git cloning in directory #{download_dir}")
|
109
109
|
g = Git.clone(attributes[:gem_git_repo],gem_name,:path => download_dir)
|
110
110
|
if attributes[:gem_git_branch]
|
@@ -90,6 +90,11 @@ class get_metadata(Command):
|
|
90
90
|
for dep in pkg_resources.parse_requirements(
|
91
91
|
self.distribution.install_requires):
|
92
92
|
final_deps.extend(self.process_dep(dep))
|
93
|
+
if getattr(self.distribution, 'extras_require', None):
|
94
|
+
for dep in pkg_resources.parse_requirements(
|
95
|
+
v for k, v in self.distribution.extras_require.items()
|
96
|
+
if k.startswith(':') and pkg_resources.evaluate_marker(k[1:])):
|
97
|
+
final_deps.extend(self.process_dep(dep))
|
93
98
|
|
94
99
|
data["dependencies"] = final_deps
|
95
100
|
|
data/lib/fpm/package/python.rb
CHANGED
@@ -79,7 +79,11 @@ class FPM::Package::Python < FPM::Package
|
|
79
79
|
option "--setup-py-arguments", "setup_py_argument",
|
80
80
|
"Arbitrary argument(s) to be passed to setup.py",
|
81
81
|
:multivalued => true, :attribute_name => :python_setup_py_arguments,
|
82
|
-
:default => []
|
82
|
+
:default => []
|
83
|
+
option "--internal-pip", :flag,
|
84
|
+
"Use the pip module within python to install modules - aka 'python -m pip'. This is the recommended usage since Python 3.4 (2014) instead of invoking the 'pip' script",
|
85
|
+
:attribute_name => :python_internal_pip,
|
86
|
+
:default => true
|
83
87
|
|
84
88
|
private
|
85
89
|
|
@@ -130,23 +134,24 @@ class FPM::Package::Python < FPM::Package
|
|
130
134
|
target = build_path(package)
|
131
135
|
FileUtils.mkdir(target) unless File.directory?(target)
|
132
136
|
|
133
|
-
if attributes[:
|
134
|
-
#
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
137
|
+
if attributes[:python_internal_pip?]
|
138
|
+
# XXX: Should we detect if internal pip is available?
|
139
|
+
attributes[:python_pip] = [ attributes[:python_bin], "-m", "pip"]
|
140
|
+
end
|
141
|
+
|
142
|
+
# attributes[:python_pip] -- expected to be a path
|
143
|
+
if attributes[:python_pip]
|
140
144
|
logger.debug("using pip", :pip => attributes[:python_pip])
|
141
145
|
# TODO: Support older versions of pip
|
142
146
|
|
147
|
+
pip = [attributes[:python_pip]] if pip.is_a?(String)
|
143
148
|
setup_cmd = [
|
144
|
-
attributes[:python_pip],
|
149
|
+
*attributes[:python_pip],
|
145
150
|
"download",
|
146
151
|
"--no-clean",
|
147
152
|
"--no-deps",
|
148
|
-
"--no-binary",
|
149
|
-
"
|
153
|
+
"--no-binary", ":all:",
|
154
|
+
"-d", build_path,
|
150
155
|
"-i", attributes[:python_pypi],
|
151
156
|
]
|
152
157
|
|
@@ -164,6 +169,12 @@ class FPM::Package::Python < FPM::Package
|
|
164
169
|
]
|
165
170
|
|
166
171
|
safesystem(*setup_cmd)
|
172
|
+
else
|
173
|
+
# no pip, use easy_install
|
174
|
+
logger.debug("no pip, defaulting to easy_install", :easy_install => attributes[:python_easyinstall])
|
175
|
+
safesystem(attributes[:python_easyinstall], "-i",
|
176
|
+
attributes[:python_pypi], "--editable", "-U",
|
177
|
+
"--build-directory", target, want_pkg)
|
167
178
|
end
|
168
179
|
|
169
180
|
# easy_install will put stuff in @tmpdir/packagename/, so find that:
|
data/lib/fpm/package/rpm.rb
CHANGED
@@ -4,6 +4,9 @@ require "fileutils"
|
|
4
4
|
require "find"
|
5
5
|
require "arr-pm/file" # gem 'arr-pm'
|
6
6
|
|
7
|
+
# For conversion handling
|
8
|
+
require "fpm/package/gem"
|
9
|
+
|
7
10
|
# RPM Package type.
|
8
11
|
#
|
9
12
|
# Build RPMs without having to waste hours reading Maximum-RPM.
|
@@ -190,14 +193,15 @@ class FPM::Package::RPM < FPM::Package
|
|
190
193
|
# Replace ? with [?] to make rpm not use globs
|
191
194
|
# Replace % with [%] to make rpm not expand macros
|
192
195
|
def rpm_fix_name(name)
|
193
|
-
name = name.gsub(/(\ |\[|\]
|
196
|
+
name = name.gsub(/(\ |\[|\]|\*|\?|\%|\$|')/, {
|
194
197
|
' ' => '?',
|
195
198
|
'%' => '[%]',
|
196
199
|
'$' => '[$]',
|
197
200
|
'?' => '[?]',
|
198
201
|
'*' => '[*]',
|
199
202
|
'[' => '[\[]',
|
200
|
-
']' => '[\]]'
|
203
|
+
']' => '[\]]',
|
204
|
+
"'" => "\\'",
|
201
205
|
})
|
202
206
|
end
|
203
207
|
|
@@ -239,6 +243,8 @@ class FPM::Package::RPM < FPM::Package
|
|
239
243
|
return %x{uname -m}.chomp # default to current arch
|
240
244
|
when "amd64" # debian and redhat disagree on architecture names
|
241
245
|
return "x86_64"
|
246
|
+
when "arm64" # debian and redhat disagree on architecture names
|
247
|
+
return "aarch64"
|
242
248
|
when "native"
|
243
249
|
return %x{uname -m}.chomp # 'native' is current arch
|
244
250
|
when "all"
|
@@ -251,6 +257,12 @@ class FPM::Package::RPM < FPM::Package
|
|
251
257
|
|
252
258
|
# This method ensures a default value for iteration if none is provided.
|
253
259
|
def iteration
|
260
|
+
if @iteration.kind_of?(String) and @iteration.include?("-")
|
261
|
+
logger.warn("Package iteration '#{@iteration}' includes dashes, converting" \
|
262
|
+
" to underscores. rpmbuild does not allow the dashes in the package iteration (called 'Release' in rpm)")
|
263
|
+
@iteration = @iteration.gsub(/-/, "_")
|
264
|
+
end
|
265
|
+
|
254
266
|
return @iteration ? @iteration : 1
|
255
267
|
end # def iteration
|
256
268
|
|
data/lib/fpm/util.rb
CHANGED
@@ -1,21 +1,8 @@
|
|
1
1
|
require "fpm/namespace"
|
2
|
-
require "childprocess"
|
3
|
-
require "ffi"
|
4
2
|
require "fileutils"
|
5
3
|
|
6
4
|
# Some utility functions
|
7
5
|
module FPM::Util
|
8
|
-
extend FFI::Library
|
9
|
-
ffi_lib FFI::Library::LIBC
|
10
|
-
|
11
|
-
# mknod is __xmknod in glibc a wrapper around mknod to handle
|
12
|
-
# various stat struct formats. See bits/stat.h in glibc source
|
13
|
-
begin
|
14
|
-
attach_function :mknod, :mknod, [:string, :uint, :ulong], :int
|
15
|
-
rescue FFI::NotFoundError
|
16
|
-
# glibc/io/xmknod.c int __xmknod (int vers, const char *path, mode_t mode, dev_t *dev)
|
17
|
-
attach_function :xmknod, :__xmknod, [:int, :string, :uint, :pointer], :int
|
18
|
-
end
|
19
6
|
|
20
7
|
# Raised if safesystem cannot find the program to run.
|
21
8
|
class ExecutableNotFound < StandardError; end
|
@@ -23,6 +10,12 @@ module FPM::Util
|
|
23
10
|
# Raised if a safesystem program exits nonzero
|
24
11
|
class ProcessFailed < StandardError; end
|
25
12
|
|
13
|
+
# Raised when a named pipe cannot be copied due to missing functions in fpm and ruby.
|
14
|
+
class NamedPipeCannotBeCopied < StandardError; end
|
15
|
+
|
16
|
+
# Raised when an attempting to copy a special file such as a block device.
|
17
|
+
class UnsupportedSpecialFile < StandardError; end
|
18
|
+
|
26
19
|
# Is the given program in the system's PATH?
|
27
20
|
def program_in_path?(program)
|
28
21
|
# return false if path is not set
|
@@ -146,31 +139,22 @@ module FPM::Util
|
|
146
139
|
|
147
140
|
stdout_r, stdout_w = IO.pipe
|
148
141
|
stderr_r, stderr_w = IO.pipe
|
142
|
+
stdin_r, stdin_w = IO.pipe
|
149
143
|
|
150
|
-
|
151
|
-
process.environment.merge!(env)
|
152
|
-
|
153
|
-
process.io.stdout = stdout_w
|
154
|
-
process.io.stderr = stderr_w
|
155
|
-
|
156
|
-
if block_given? and opts[:stdin]
|
157
|
-
process.duplex = true
|
158
|
-
end
|
159
|
-
|
160
|
-
process.start
|
144
|
+
pid = Process.spawn(env, *args2, :out => stdout_w, :err => stderr_w, :in => stdin_r)
|
161
145
|
|
162
146
|
stdout_w.close; stderr_w.close
|
163
|
-
logger.debug("Process is running", :pid =>
|
147
|
+
logger.debug("Process is running", :pid => pid)
|
164
148
|
if block_given?
|
165
149
|
args3 = []
|
166
150
|
args3.push(process) if opts[:process]
|
167
|
-
args3.push(
|
151
|
+
args3.push(stdin_w) if opts[:stdin]
|
168
152
|
args3.push(stdout_r) if opts[:stdout]
|
169
153
|
args3.push(stderr_r) if opts[:stderr]
|
170
154
|
|
171
155
|
yield(*args3)
|
172
156
|
|
173
|
-
|
157
|
+
stdin_w_close if opts[:stdin] and not stdin_w.closed?
|
174
158
|
stdout_r.close unless stdout_r.closed?
|
175
159
|
stderr_r.close unless stderr_r.closed?
|
176
160
|
else
|
@@ -179,9 +163,10 @@ module FPM::Util
|
|
179
163
|
logger.pipe(stdout_r => :info, stderr_r => :info)
|
180
164
|
end
|
181
165
|
|
182
|
-
|
166
|
+
Process.waitpid(pid)
|
167
|
+
status = $?
|
183
168
|
|
184
|
-
return
|
169
|
+
return status.exitstatus
|
185
170
|
end # def execmd
|
186
171
|
|
187
172
|
# Run a command safely in a way that gets reports useful errors.
|
@@ -316,19 +301,6 @@ module FPM::Util
|
|
316
301
|
return @@tar_cmd_deterministic
|
317
302
|
end
|
318
303
|
|
319
|
-
# wrapper around mknod ffi calls
|
320
|
-
def mknod_w(path, mode, dev)
|
321
|
-
rc = -1
|
322
|
-
case %x{uname -s}.chomp
|
323
|
-
when 'Linux'
|
324
|
-
# bits/stat.h #define _MKNOD_VER_LINUX 0
|
325
|
-
rc = xmknod(0, path, mode, FFI::MemoryPointer.new(dev))
|
326
|
-
else
|
327
|
-
rc = mknod(path, mode, dev)
|
328
|
-
end
|
329
|
-
rc
|
330
|
-
end
|
331
|
-
|
332
304
|
def copy_metadata(source, destination)
|
333
305
|
source_stat = File::lstat(source)
|
334
306
|
dest_stat = File::lstat(destination)
|
@@ -354,10 +326,21 @@ module FPM::Util
|
|
354
326
|
|
355
327
|
def copy_entry(src, dst, preserve=false, remove_destination=false)
|
356
328
|
case File.ftype(src)
|
357
|
-
when 'fifo'
|
358
|
-
|
359
|
-
|
360
|
-
|
329
|
+
when 'fifo'
|
330
|
+
if File.respond_to?(:mkfifo)
|
331
|
+
File.mkfifo(dst)
|
332
|
+
elsif program_exists?("mkfifo")
|
333
|
+
safesystem("mkfifo", dst)
|
334
|
+
else
|
335
|
+
raise NamedPipeCannotBeCopied("Unable to copy. Cannot find program 'mkfifo' and Ruby is missing the 'File.mkfifo' method: #{src}")
|
336
|
+
end
|
337
|
+
when 'socket'
|
338
|
+
require "socket"
|
339
|
+
# In 2019, Ruby's FileUtils added this as a way to "copy" a unix socket.
|
340
|
+
# Reference: https://github.com/ruby/fileutils/pull/36/files
|
341
|
+
UNIXServer.new(dst).close()
|
342
|
+
when 'characterSpecial', 'blockSpecial'
|
343
|
+
raise UnsupportedSpecialFile.new("File is device which fpm doesn't know how to copy (#{File.ftype(src)}): #{src}")
|
361
344
|
when 'directory'
|
362
345
|
FileUtils.mkdir(dst) unless File.exists? dst
|
363
346
|
else
|
data/lib/fpm/version.rb
CHANGED
@@ -20,6 +20,7 @@ debsystemctl=$(command -v deb-systemd-invoke || echo systemctl)
|
|
20
20
|
<% attributes[:deb_systemd].each do |service| -%>
|
21
21
|
if ! systemctl is-enabled <%= service %> >/dev/null
|
22
22
|
then
|
23
|
+
: # Ensure this if-clause is not empty. If it were empty, and we had an 'else', then it is an error in shell syntax
|
23
24
|
<% if attributes[:deb_systemd_enable?]-%>
|
24
25
|
systemctl enable <%= service %> >/dev/null || true
|
25
26
|
<% end -%>
|
data/templates/deb.erb
CHANGED
@@ -25,7 +25,7 @@ Build-Depends: <%= attributes[:deb_build_depends].collect { |d| fix_dependency(d
|
|
25
25
|
<% if !provides.empty? -%>
|
26
26
|
<%# Turn each provides from 'foo = 123' to simply 'foo' because Debian :\ -%>
|
27
27
|
<%# http://www.debian.org/doc/debian-policy/ch-relationships.html -%>
|
28
|
-
Provides: <%= provides.
|
28
|
+
Provides: <%= provides.join ", " %>
|
29
29
|
<% end -%>
|
30
30
|
<% if !replaces.empty? -%>
|
31
31
|
Replaces: <%= replaces.collect { |d| fix_dependency(d) }.flatten.join(", ") %>
|
data/templates/rpm.erb
CHANGED
@@ -126,7 +126,7 @@ Obsoletes: <%= repl %>
|
|
126
126
|
-%>
|
127
127
|
<% if script?(:before_upgrade) or script?(:after_upgrade) -%>
|
128
128
|
<% if script?(:before_upgrade) or script?(:before_install) -%>
|
129
|
-
%pre <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end
|
129
|
+
%pre <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
130
130
|
upgrade() {
|
131
131
|
<%# Making sure that at least one command is in the function -%>
|
132
132
|
<%# avoids a lot of potential errors, including the case that -%>
|
@@ -156,7 +156,7 @@ then
|
|
156
156
|
fi
|
157
157
|
<% end -%>
|
158
158
|
<% if script?(:after_upgrade) or script?(:after_install) -%>
|
159
|
-
%post <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end
|
159
|
+
%post <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
160
160
|
upgrade() {
|
161
161
|
<%# Making sure that at least one command is in the function -%>
|
162
162
|
<%# avoids a lot of potential errors, including the case that -%>
|
@@ -186,7 +186,7 @@ then
|
|
186
186
|
fi
|
187
187
|
<% end -%>
|
188
188
|
<% if script?(:before_remove) -%>
|
189
|
-
%preun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end
|
189
|
+
%preun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
190
190
|
if [ "${1}" -eq 0 ]
|
191
191
|
then
|
192
192
|
<%# Making sure that at least one command is in the function -%>
|
@@ -197,7 +197,7 @@ then
|
|
197
197
|
fi
|
198
198
|
<% end -%>
|
199
199
|
<% if script?(:after_remove) -%>
|
200
|
-
%postun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end
|
200
|
+
%postun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %>
|
201
201
|
if [ "${1}" -eq 0 ]
|
202
202
|
then
|
203
203
|
<%# Making sure that at least one command is in the function -%>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.14.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Sissel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -64,14 +64,14 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0.0.
|
67
|
+
version: 0.0.11
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0.0.
|
74
|
+
version: 0.0.11
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: clamp
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,62 +86,6 @@ dependencies:
|
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: 1.0.0
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: childprocess
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - "<"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: 1.0.0
|
96
|
-
type: :runtime
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "<"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: 1.0.0
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: ffi
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 1.12.0
|
110
|
-
type: :runtime
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: 1.12.0
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: rake
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - "~>"
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: '10'
|
124
|
-
type: :development
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - "~>"
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: '10'
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: ruby-xz
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - "~>"
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: 0.2.3
|
138
|
-
type: :runtime
|
139
|
-
prerelease: false
|
140
|
-
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
requirements:
|
142
|
-
- - "~>"
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: 0.2.3
|
145
89
|
- !ruby/object:Gem::Dependency
|
146
90
|
name: pleaserun
|
147
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -190,6 +134,20 @@ dependencies:
|
|
190
134
|
- - ">="
|
191
135
|
- !ruby/object:Gem::Version
|
192
136
|
version: '0'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: rexml
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
type: :runtime
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
193
151
|
- !ruby/object:Gem::Dependency
|
194
152
|
name: rspec
|
195
153
|
requirement: !ruby/object:Gem::Requirement
|
@@ -306,7 +264,7 @@ homepage: https://github.com/jordansissel/fpm
|
|
306
264
|
licenses:
|
307
265
|
- MIT-like
|
308
266
|
metadata: {}
|
309
|
-
post_install_message:
|
267
|
+
post_install_message:
|
310
268
|
rdoc_options: []
|
311
269
|
require_paths:
|
312
270
|
- lib
|
@@ -322,9 +280,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
322
280
|
- !ruby/object:Gem::Version
|
323
281
|
version: '0'
|
324
282
|
requirements: []
|
325
|
-
|
326
|
-
|
327
|
-
signing_key:
|
283
|
+
rubygems_version: 3.2.31
|
284
|
+
signing_key:
|
328
285
|
specification_version: 4
|
329
286
|
summary: fpm - package building and mangling
|
330
287
|
test_files: []
|