fpm 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fpm/builder.rb +16 -5
- data/lib/fpm/source.rb +10 -5
- data/lib/fpm/source/dir.rb +8 -5
- data/lib/fpm/source/gem.rb +28 -6
- data/lib/fpm/source/npm.rb +3 -2
- data/lib/fpm/source/pyfpm/get_metadata.py +6 -1
- data/lib/fpm/source/pyfpm/get_metadata.pyc +0 -0
- data/lib/fpm/source/python.rb +24 -9
- data/lib/fpm/source/rpm.rb +3 -2
- data/lib/fpm/source/tar.rb +7 -3
- data/lib/fpm/target/deb.rb +30 -6
- data/lib/fpm/target/rpm.rb +21 -11
- data/lib/fpm/target/solaris.rb +7 -6
- data/lib/fpm/util.rb +7 -0
- data/templates/deb.erb +4 -0
- data/templates/rpm.erb +2 -2
- data/templates/solaris.erb +1 -1
- metadata +6 -7
data/lib/fpm/builder.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fileutils"
|
2
|
+
require "fpm/util"
|
2
3
|
require "pathname"
|
3
4
|
|
4
5
|
class FPM::Builder
|
@@ -102,10 +103,10 @@ class FPM::Builder
|
|
102
103
|
data_tarball = File.join(builddir, "data.tar.gz")
|
103
104
|
Dir.chdir(builddir) do
|
104
105
|
FileUtils.mkdir_p(@package.unpack_data_to)
|
105
|
-
|
106
|
+
safesystem("gzip -d #{data_tarball}")
|
106
107
|
Dir.chdir(@package.unpack_data_to) do
|
107
108
|
@source.root = Dir.pwd
|
108
|
-
|
109
|
+
safesystem("tar -xf #{data_tarball.gsub(/\.gz$/, "")}")
|
109
110
|
end
|
110
111
|
end
|
111
112
|
end
|
@@ -185,7 +186,7 @@ class FPM::Builder
|
|
185
186
|
# TODO(sissel): support editing multiple files for targets like
|
186
187
|
# puppet which generate multiple manifests.
|
187
188
|
editor = ENV['FPM_EDITOR'] || ENV['EDITOR'] || 'vi'
|
188
|
-
|
189
|
+
safesystem("#{editor} '#{package.specfile(builddir)}'")
|
189
190
|
unless File.size? package.specfile(builddir)
|
190
191
|
puts "Empty specfile. Aborting."
|
191
192
|
exit 1
|
@@ -202,8 +203,18 @@ class FPM::Builder
|
|
202
203
|
private
|
203
204
|
def checksum(paths)
|
204
205
|
paths.collect do |path|
|
205
|
-
|
206
|
-
|
206
|
+
if File.directory? path
|
207
|
+
# This should work for both cases where we use -C or not ...
|
208
|
+
%x{ find #{path} -type f -print0 | xargs -0 md5sum }.split("\n").collect do |i|
|
209
|
+
# Remove leading path and "./" from the md5sum output if present ...
|
210
|
+
i = i.split(/\s+/)
|
211
|
+
"%s %s" % [i[0], i[1].sub(/#{path}\//, '').sub(/\.\//, '')]
|
212
|
+
end
|
213
|
+
elsif File.exists? path
|
214
|
+
%x{md5sum #{path}}
|
215
|
+
else
|
216
|
+
next
|
217
|
+
end
|
207
218
|
end.flatten
|
208
219
|
end # def checksum
|
209
220
|
end
|
data/lib/fpm/source.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fpm/namespace"
|
2
|
+
require "fpm/util"
|
2
3
|
|
3
4
|
# Abstract class for a "thing to build a package from"
|
4
5
|
class FPM::Source
|
@@ -120,11 +121,15 @@ class FPM::Source
|
|
120
121
|
# than it is worth. For now, rely on tar's --exclude.
|
121
122
|
dir_tar = [tar_cmd, "--owner=root", "--group=root" ] \
|
122
123
|
+ excludes \
|
123
|
-
+ ["-cf", output, "--no-recursion" ]
|
124
|
-
+ dirs
|
124
|
+
+ ["-cf", output, "--no-recursion" ]
|
125
125
|
|
126
|
-
|
127
|
-
|
126
|
+
# Only if directories and paths do not have duplicates ...
|
127
|
+
dirs -= paths
|
128
|
+
|
129
|
+
if dirs.any?
|
130
|
+
::Dir.chdir(chdir) do
|
131
|
+
safesystem *(dir_tar += dirs)
|
132
|
+
end
|
128
133
|
end
|
129
134
|
|
130
135
|
files_tar = [ tar_cmd ] \
|
@@ -132,7 +137,7 @@ class FPM::Source
|
|
132
137
|
+ [ "--owner=root", "--group=root", "-rf", output ] \
|
133
138
|
+ paths
|
134
139
|
::Dir.chdir(chdir) do
|
135
|
-
|
140
|
+
safesystem(*files_tar)
|
136
141
|
end
|
137
142
|
end # def tar
|
138
143
|
|
data/lib/fpm/source/dir.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "fpm/source"
|
2
2
|
require "fileutils"
|
3
3
|
require "fpm/rubyfixes"
|
4
|
+
require "fpm/util"
|
4
5
|
|
5
6
|
class FPM::Source::Dir < FPM::Source
|
6
7
|
def get_metadata
|
@@ -30,8 +31,8 @@ class FPM::Source::Dir < FPM::Source
|
|
30
31
|
|
31
32
|
::FileUtils.mkdir_p(dest)
|
32
33
|
rsync = ["rsync", "-a", path, dest]
|
33
|
-
p rsync
|
34
|
-
|
34
|
+
p rsync if $DEBUG
|
35
|
+
safesystem(*rsync)
|
35
36
|
|
36
37
|
# FileUtils.cp_r is pretty silly about how it copies files in some
|
37
38
|
# cases (funky permissions, etc)
|
@@ -45,14 +46,16 @@ class FPM::Source::Dir < FPM::Source
|
|
45
46
|
end
|
46
47
|
|
47
48
|
::Dir.chdir("#{builddir}/tarbuild") do
|
48
|
-
|
49
|
+
safesystem("ls #{builddir}/tarbuild") if $DEBUG
|
49
50
|
tar(tar_path, ".")
|
50
51
|
end
|
51
52
|
else
|
52
|
-
|
53
|
+
# Prefix everything with "./" as per the Debian way if needed ...
|
54
|
+
path = paths[0].match(/^(\.\/|\.)/) ? paths[0] : "./%s" % paths[0]
|
55
|
+
tar(tar_path, path)
|
53
56
|
end
|
54
57
|
|
55
58
|
# TODO(sissel): Make a helper method.
|
56
|
-
|
59
|
+
safesystem(*["gzip", "-f", tar_path])
|
57
60
|
end # def make_tarball!
|
58
61
|
end # class FPM::Source::Dir
|
data/lib/fpm/source/gem.rb
CHANGED
@@ -3,13 +3,26 @@ require "fpm/source"
|
|
3
3
|
require "rubygems/package"
|
4
4
|
require "rubygems"
|
5
5
|
require "fileutils"
|
6
|
+
require "fpm/util"
|
6
7
|
|
7
8
|
class FPM::Source::Gem < FPM::Source
|
8
9
|
def self.flags(opts, settings)
|
10
|
+
settings.source[:gem] = "gem"
|
11
|
+
|
9
12
|
opts.on("--bin-path DIRECTORY",
|
10
13
|
"The directory to install gem executables") do |path|
|
11
14
|
settings.source[:bin_path] = path
|
12
15
|
end
|
16
|
+
opts.on("--package-prefix PREFIX",
|
17
|
+
"Prefix for gem packages") do |package_prefix|
|
18
|
+
settings.source[:package_prefix] = package_prefix
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.on("--gem PATH_TO_GEM",
|
22
|
+
"The path to the 'gem' tool (defaults to 'gem' and searches " \
|
23
|
+
"your $PATH)") do |path|
|
24
|
+
settings.source[:gem] = path
|
25
|
+
end
|
13
26
|
end # def flags
|
14
27
|
|
15
28
|
def get_source(params)
|
@@ -70,7 +83,12 @@ class FPM::Source::Gem < FPM::Source
|
|
70
83
|
self[field.to_sym] = spec.send(field) rescue "unknown"
|
71
84
|
end
|
72
85
|
|
73
|
-
self[:
|
86
|
+
if self[:settings][:package_prefix]
|
87
|
+
self[:package_prefix] = self[:settings][:package_prefix]
|
88
|
+
else
|
89
|
+
self[:package_prefix] = "rubygem"
|
90
|
+
end
|
91
|
+
self[:name] = "#{self[:package_prefix]}#{self[:suffix]}-#{spec.name}"
|
74
92
|
self[:maintainer] = spec.author
|
75
93
|
self[:url] = spec.homepage
|
76
94
|
|
@@ -85,6 +103,10 @@ class FPM::Source::Gem < FPM::Source
|
|
85
103
|
self[:architecture] = "all"
|
86
104
|
end
|
87
105
|
|
106
|
+
# make sure we have a description
|
107
|
+
descriptions = [ self[:description], self[:summary], "#{spec.name} - no description given" ]
|
108
|
+
self[:description] = descriptions.detect { |d| !(d.nil? or d.strip.empty?) }
|
109
|
+
|
88
110
|
self[:dependencies] = []
|
89
111
|
spec.runtime_dependencies.map do |dep|
|
90
112
|
# rubygems 1.3.5 doesn't have 'Gem::Dependency#requirement'
|
@@ -96,7 +118,7 @@ class FPM::Source::Gem < FPM::Source
|
|
96
118
|
|
97
119
|
# Some reqs can be ">= a, < b" versions, let's handle that.
|
98
120
|
reqs.to_s.split(/, */).each do |req|
|
99
|
-
self[:dependencies] << "
|
121
|
+
self[:dependencies] << "#{self[:package_prefix]}#{self[:suffix]}-#{dep.name} #{req}"
|
100
122
|
end
|
101
123
|
end # runtime_dependencies
|
102
124
|
end # ::Gem::Package
|
@@ -117,8 +139,8 @@ class FPM::Source::Gem < FPM::Source
|
|
117
139
|
end
|
118
140
|
|
119
141
|
::FileUtils.mkdir_p(installdir)
|
120
|
-
args = [
|
121
|
-
"--install-dir", installdir, "--ignore-dependencies"]
|
142
|
+
args = [self[:settings][:gem], "install", "--quiet", "--no-ri", "--no-rdoc",
|
143
|
+
"--install-dir", installdir, "--ignore-dependencies", "-E"]
|
122
144
|
if self[:settings][:bin_path]
|
123
145
|
tmp_bin_path = File.join(tmpdir, self[:settings][:bin_path])
|
124
146
|
args += ["--bindir", tmp_bin_path]
|
@@ -127,14 +149,14 @@ class FPM::Source::Gem < FPM::Source
|
|
127
149
|
end
|
128
150
|
|
129
151
|
args << gem
|
130
|
-
|
152
|
+
safesystem(*args)
|
131
153
|
|
132
154
|
# make paths relative (/foo becomes ./foo)
|
133
155
|
tar(tar_path, @paths.collect {|p| ".#{p}"}, tmpdir)
|
134
156
|
FileUtils.rm_r(tmpdir)
|
135
157
|
|
136
158
|
# TODO(sissel): Make a helper method.
|
137
|
-
|
159
|
+
safesystem(*["gzip", "-f", tar_path])
|
138
160
|
end
|
139
161
|
|
140
162
|
end # class FPM::Source::Gem
|
data/lib/fpm/source/npm.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "fpm/namespace"
|
2
2
|
require "fpm/source"
|
3
|
+
require "fpm/util"
|
3
4
|
require "fileutils"
|
4
5
|
|
5
6
|
class FPM::Source::Npm < FPM::Source
|
@@ -25,11 +26,11 @@ class FPM::Source::Npm < FPM::Source
|
|
25
26
|
::FileUtils.mkdir_p(installdir)
|
26
27
|
args = ["gem", "install", "--quiet", "--no-ri", "--no-rdoc",
|
27
28
|
"--install-dir", installdir, "--ignore-dependencies", @paths.first]
|
28
|
-
|
29
|
+
safesystem(*args)
|
29
30
|
tar(tar_path, ".", tmpdir)
|
30
31
|
|
31
32
|
# TODO(sissel): Make a helper method.
|
32
|
-
|
33
|
+
safesystem(*["gzip", "-f", tar_path])
|
33
34
|
end
|
34
35
|
|
35
36
|
end # class FPM::Source::Gem
|
@@ -83,6 +83,11 @@ class get_metadata(Command):
|
|
83
83
|
data["dependencies"] = final_deps
|
84
84
|
|
85
85
|
#print json.dumps(data, indent=2)
|
86
|
-
|
86
|
+
try:
|
87
|
+
print json.dumps(data, indent=2)
|
88
|
+
except AttributeError, e:
|
89
|
+
# For Python 2.5 and Debian's python-json
|
90
|
+
print json.write(data)
|
91
|
+
|
87
92
|
# def run
|
88
93
|
# class list_dependencies
|
Binary file
|
data/lib/fpm/source/python.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "fpm/namespace"
|
2
2
|
require "fpm/source"
|
3
|
+
require "fpm/util"
|
3
4
|
require "rubygems/package"
|
4
5
|
require "rubygems"
|
5
6
|
require "fileutils"
|
@@ -10,6 +11,7 @@ class FPM::Source::Python < FPM::Source
|
|
10
11
|
def self.flags(opts, settings)
|
11
12
|
settings.source[:python] = "python"
|
12
13
|
settings.source[:easy_install] = "easy_install"
|
14
|
+
settings.source[:pypi] ="http://pypi.python.org/simple"
|
13
15
|
|
14
16
|
opts.on("--bin PYTHON_BINARY_LOCATION",
|
15
17
|
"The path to the python you want to run. Default is 'python'") do |path|
|
@@ -20,6 +22,16 @@ class FPM::Source::Python < FPM::Source
|
|
20
22
|
"The path to your easy_install tool. Default is 'easy_install'") do |path|
|
21
23
|
settings.source[:easy_install] = path
|
22
24
|
end
|
25
|
+
|
26
|
+
opts.on("--pypi PYPI_SERVER",
|
27
|
+
"PyPi Server uri for retrieving packages. Default is 'http://pypi.python.org/simple'") do |pypi|
|
28
|
+
settings.source[:pypi] = pypi
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("--package-prefix PREFIX",
|
32
|
+
"Prefix for python packages") do |package_prefix|
|
33
|
+
settings.source[:package_prefix] = package_prefix
|
34
|
+
end
|
23
35
|
end # def flags
|
24
36
|
|
25
37
|
def get_source(params)
|
@@ -47,11 +59,8 @@ class FPM::Source::Python < FPM::Source
|
|
47
59
|
want_pkg = "#{package}==#{version}"
|
48
60
|
end
|
49
61
|
|
50
|
-
|
51
|
-
|
52
|
-
if return_value.nil?
|
53
|
-
raise "The execution of #{self[:settings][:easy_install]} failed"
|
54
|
-
end
|
62
|
+
safesystem(self[:settings][:easy_install], "-i", self[:settings][:pypi],
|
63
|
+
"--editable", "--build-directory", @tmpdir, want_pkg)
|
55
64
|
|
56
65
|
# easy_install will put stuff in @tmpdir/packagename/, flatten that.
|
57
66
|
# That is, we want @tmpdir/setup.py, and start with
|
@@ -81,16 +90,22 @@ class FPM::Source::Python < FPM::Source
|
|
81
90
|
metadata = JSON.parse(output[/\{.*\}/msx])
|
82
91
|
#p metadata
|
83
92
|
|
93
|
+
if self[:settings][:package_prefix]
|
94
|
+
self[:package_prefix] = self[:settings][:package_prefix]
|
95
|
+
else
|
96
|
+
self[:package_prefix] = "python"
|
97
|
+
end
|
98
|
+
|
84
99
|
self[:architecture] = metadata["architecture"]
|
85
100
|
self[:description] = metadata["description"]
|
86
101
|
self[:license] = metadata["license"]
|
87
102
|
self[:version] = metadata["version"]
|
88
|
-
self[:name] = "
|
103
|
+
self[:name] = "#{self[:package_prefix]}#{self[:suffix]}-#{metadata["name"]}"
|
89
104
|
self[:url] = metadata["url"]
|
90
105
|
|
91
106
|
self[:dependencies] = metadata["dependencies"].collect do |dep|
|
92
107
|
name, cmp, version = dep.split
|
93
|
-
"
|
108
|
+
"#{self[:package_prefix]}#{self[:suffix]}-#{name} #{cmp} #{version}"
|
94
109
|
end
|
95
110
|
end # def get_metadata
|
96
111
|
|
@@ -101,7 +116,7 @@ class FPM::Source::Python < FPM::Source
|
|
101
116
|
# Some setup.py's assume $PWD == current directory of setup.py, so let's
|
102
117
|
# chdir first.
|
103
118
|
::Dir.chdir(dir) do
|
104
|
-
|
119
|
+
safesystem(self[:settings][:python], "setup.py", "bdist")
|
105
120
|
end
|
106
121
|
|
107
122
|
dist_tar = ::Dir.glob(File.join(dir, "dist", "*.tar.gz")).first
|
@@ -110,7 +125,7 @@ class FPM::Source::Python < FPM::Source
|
|
110
125
|
|
111
126
|
@paths = [ "." ]
|
112
127
|
|
113
|
-
|
128
|
+
safesystem("cp", dist_tar, "#{tar_path}.gz")
|
114
129
|
end # def make_tarball!
|
115
130
|
|
116
131
|
def garbage
|
data/lib/fpm/source/rpm.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fpm/source"
|
2
|
+
require "fpm/util"
|
2
3
|
|
3
4
|
class FPM::Source::RPM < FPM::Source
|
4
5
|
def get_metadata
|
@@ -18,10 +19,10 @@ class FPM::Source::RPM < FPM::Source
|
|
18
19
|
def make_tarball!(tar_path, builddir)
|
19
20
|
tmpdir = "#{tar_path}.dir"
|
20
21
|
::Dir.mkdir(tmpdir)
|
21
|
-
|
22
|
+
safesystem("rpm2cpio #{@rpm} | (cd #{tmpdir}; cpio -i --make-directories)")
|
22
23
|
tar(tar_path, ".", tmpdir)
|
23
24
|
@paths = ["."]
|
24
25
|
# TODO(sissel): Make a helper method.
|
25
|
-
|
26
|
+
safesystem(*["gzip", "-f", tar_path])
|
26
27
|
end
|
27
28
|
end
|
data/lib/fpm/source/tar.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
require "fpm/rubyfixes"
|
1
2
|
require "fpm/source"
|
3
|
+
require "fpm/util"
|
2
4
|
require "fileutils"
|
3
|
-
require "fpm/rubyfixes"
|
4
5
|
|
5
6
|
class FPM::Source::Tar < FPM::Source
|
6
7
|
def get_metadata
|
@@ -14,6 +15,8 @@ class FPM::Source::Tar < FPM::Source
|
|
14
15
|
compression = :bipz2
|
15
16
|
elsif input_tarball =~ /\.tar\.gz$/
|
16
17
|
compression = :gzip
|
18
|
+
elsif input_tarball =~ /\.tar\.xz$/
|
19
|
+
compression = :lzma
|
17
20
|
else
|
18
21
|
compression = :none
|
19
22
|
end
|
@@ -25,10 +28,11 @@ class FPM::Source::Tar < FPM::Source
|
|
25
28
|
case compression
|
26
29
|
when :bzip2; flags += " -j"
|
27
30
|
when :gzip; flags += " -z"
|
31
|
+
when :lzma; flags += " --lzma"
|
28
32
|
end
|
29
33
|
#puts("tar #{flags}")
|
30
34
|
#sleep 5
|
31
|
-
|
35
|
+
safesystem("tar #{flags}")
|
32
36
|
|
33
37
|
if self[:prefix]
|
34
38
|
@paths = [self[:prefix]]
|
@@ -41,6 +45,6 @@ class FPM::Source::Tar < FPM::Source
|
|
41
45
|
end
|
42
46
|
|
43
47
|
# TODO(sissel): Make a helper method.
|
44
|
-
|
48
|
+
safesystem(*["gzip", "-f", tar_path])
|
45
49
|
end # def make_tarball!
|
46
50
|
end # class FPM::Source::Dir
|
data/lib/fpm/target/deb.rb
CHANGED
@@ -2,6 +2,7 @@ require "erb"
|
|
2
2
|
require "fpm/namespace"
|
3
3
|
require "fpm/package"
|
4
4
|
require "fpm/errors"
|
5
|
+
require "fpm/util"
|
5
6
|
|
6
7
|
class FPM::Target::Deb < FPM::Package
|
7
8
|
|
@@ -12,6 +13,16 @@ class FPM::Target::Deb < FPM::Package
|
|
12
13
|
"For = dependencies, allow iterations on the specified version. Default is to be specific.") do |x|
|
13
14
|
settings.target[:ignore_iteration] = true
|
14
15
|
end
|
16
|
+
|
17
|
+
opts.on("--pre-depends DEPENDENCY", "Add DEPENDENCY as Pre-Depends.") do |dep|
|
18
|
+
(settings.target[:pre_depends] ||= []) << dep
|
19
|
+
end
|
20
|
+
|
21
|
+
# Take care about the case when we want custom control file but still use fpm ...
|
22
|
+
opts.on("--custom-control FILEPATH",
|
23
|
+
"Custom version of the Debian control file.") do |control|
|
24
|
+
settings.target[:control] = File.expand_path(control)
|
25
|
+
end
|
15
26
|
end
|
16
27
|
|
17
28
|
def needs_md5sums
|
@@ -62,20 +73,29 @@ class FPM::Target::Deb < FPM::Package
|
|
62
73
|
|
63
74
|
def build!(params)
|
64
75
|
control_files = [ "control", "md5sums" ]
|
76
|
+
|
77
|
+
# Use custom Debian control file when given ...
|
78
|
+
if self.settings[:control]
|
79
|
+
%x{cp #{self.settings[:control]} ./control 2> /dev/null 2>&1}
|
80
|
+
@logger.warn("Unable to process custom Debian control file (exit " \
|
81
|
+
"code: #{$?.exitstatus}). Falling back to default " \
|
82
|
+
"template.") unless $?.exitstatus == 0
|
83
|
+
end
|
84
|
+
|
65
85
|
# place the postinst prerm files
|
66
86
|
self.scripts.each do |name, path|
|
67
87
|
case name
|
68
88
|
when "pre-install"
|
69
|
-
|
89
|
+
safesystem("cp #{path} ./preinst")
|
70
90
|
control_files << "preinst"
|
71
91
|
when "post-install"
|
72
|
-
|
92
|
+
safesystem("cp #{path} ./postinst")
|
73
93
|
control_files << "postinst"
|
74
94
|
when "pre-uninstall"
|
75
|
-
|
95
|
+
safesystem("cp #{path} ./prerm")
|
76
96
|
control_files << "prerm"
|
77
97
|
when "post-uninstall"
|
78
|
-
|
98
|
+
safesystem("cp #{path} ./postrm")
|
79
99
|
control_files << "postrm"
|
80
100
|
else raise "Unsupported script name '#{name}' (path: #{path})"
|
81
101
|
end # case name
|
@@ -87,13 +107,13 @@ class FPM::Target::Deb < FPM::Package
|
|
87
107
|
end
|
88
108
|
|
89
109
|
# Make the control
|
90
|
-
|
110
|
+
safesystem("tar -zcf control.tar.gz #{control_files.map{ |f| "./#{f}" }.join(" ")}")
|
91
111
|
|
92
112
|
# create debian-binary
|
93
113
|
File.open("debian-binary", "w") { |f| f.puts "2.0" }
|
94
114
|
|
95
115
|
# pack up the .deb
|
96
|
-
|
116
|
+
safesystem("ar -qc #{params[:output]} debian-binary control.tar.gz data.tar.gz")
|
97
117
|
end # def build
|
98
118
|
|
99
119
|
def default_output
|
@@ -149,4 +169,8 @@ class FPM::Target::Deb < FPM::Package
|
|
149
169
|
return dep
|
150
170
|
end
|
151
171
|
end # def fix_dependency
|
172
|
+
|
173
|
+
def pre_dependencies
|
174
|
+
self.settings[:pre_depends] || []
|
175
|
+
end # def pre_dependencies
|
152
176
|
end # class FPM::Target::Deb
|
data/lib/fpm/target/rpm.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fpm/package"
|
2
|
+
require "fpm/util"
|
2
3
|
|
3
4
|
class FPM::Target::Rpm < FPM::Package
|
4
5
|
def architecture
|
@@ -19,16 +20,28 @@ class FPM::Target::Rpm < FPM::Package
|
|
19
20
|
"#{builddir}/#{name}.spec"
|
20
21
|
end
|
21
22
|
|
23
|
+
def url
|
24
|
+
if @url.nil? || @url.empty?
|
25
|
+
'http://nourlgiven.example.com'
|
26
|
+
else
|
27
|
+
@url
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def version
|
32
|
+
if @version.kind_of?(String) and @version.include?("-")
|
33
|
+
@logger.info("Package version '#{@version}' includes dashes, converting" \
|
34
|
+
" to underscores")
|
35
|
+
@version = @version.gsub(/-/, "_")
|
36
|
+
end
|
37
|
+
|
38
|
+
return @version
|
39
|
+
end
|
40
|
+
|
22
41
|
def build!(params)
|
23
42
|
raise "No package name given. Can't assemble package" if !@name
|
24
43
|
# TODO(sissel): Abort if 'rpmbuild' tool not found.
|
25
44
|
|
26
|
-
if !replaces.empty?
|
27
|
-
$stderr.puts "Warning: RPM does not support 'replaces'"
|
28
|
-
$stderr.puts "If you have suggstions as to what --replaces means to RPM"
|
29
|
-
$stderr.puts "Please let me know: https://github.com/jordansissel/fpm/issues"
|
30
|
-
end
|
31
|
-
|
32
45
|
%w(BUILD RPMS SRPMS SOURCES SPECS).each { |d| Dir.mkdir(d) }
|
33
46
|
args = ["rpmbuild", "-ba",
|
34
47
|
"--define", "buildroot #{Dir.pwd}/BUILD",
|
@@ -36,14 +49,11 @@ class FPM::Target::Rpm < FPM::Package
|
|
36
49
|
"--define", "_sourcedir #{Dir.pwd}",
|
37
50
|
"--define", "_rpmdir #{Dir.pwd}/RPMS",
|
38
51
|
"#{name}.spec"]
|
39
|
-
|
40
|
-
if !ret
|
41
|
-
raise "rpmbuild failed (exit code: #{$?.exitstatus})"
|
42
|
-
end
|
52
|
+
safesystem(*args)
|
43
53
|
|
44
54
|
Dir["#{Dir.pwd}/RPMS/**/*.rpm"].each do |path|
|
45
55
|
# This should only output one rpm, should we verify this?
|
46
|
-
|
56
|
+
safesystem("mv", path, params[:output])
|
47
57
|
end
|
48
58
|
end # def build!
|
49
59
|
end # class FPM::Target::RPM
|
data/lib/fpm/target/solaris.rb
CHANGED
@@ -2,6 +2,7 @@ require "erb"
|
|
2
2
|
require "fpm/namespace"
|
3
3
|
require "fpm/package"
|
4
4
|
require "fpm/errors"
|
5
|
+
require "fpm/util"
|
5
6
|
|
6
7
|
# TODO(sissel): Add dependency checking support.
|
7
8
|
# IIRC this has to be done as a 'checkinstall' step.
|
@@ -25,10 +26,10 @@ class FPM::Target::Solaris < FPM::Package
|
|
25
26
|
self.scripts.each do |name, path|
|
26
27
|
case name
|
27
28
|
when "pre-install"
|
28
|
-
|
29
|
+
safesystem("cp #{path} ./preinstall")
|
29
30
|
File.chmod(0755, "./preinstall")
|
30
31
|
when "post-install"
|
31
|
-
|
32
|
+
safesystem("cp #{path} ./postinstall")
|
32
33
|
File.chmod(0755, "./postinstall")
|
33
34
|
when "pre-uninstall"
|
34
35
|
raise FPM::InvalidPackageConfiguration.new(
|
@@ -43,9 +44,9 @@ class FPM::Target::Solaris < FPM::Package
|
|
43
44
|
|
44
45
|
# Unpack data.tar.gz so we can build a package from it.
|
45
46
|
Dir.mkdir("data")
|
46
|
-
|
47
|
+
safesystem("gzip -d data.tar.gz");
|
47
48
|
Dir.chdir("data") do
|
48
|
-
|
49
|
+
safesystem("tar -xf ../data.tar");
|
49
50
|
end
|
50
51
|
|
51
52
|
#system("(echo 'i pkginfo'; pkgproto data=/) > Prototype")
|
@@ -69,10 +70,10 @@ class FPM::Target::Solaris < FPM::Package
|
|
69
70
|
end # File prototype
|
70
71
|
|
71
72
|
# Should create a package directory named by the package name.
|
72
|
-
|
73
|
+
safesystem("pkgmk -o -d .")
|
73
74
|
|
74
75
|
# Convert the 'package directory' built above to a real solaris package.
|
75
|
-
|
76
|
+
safesystem("pkgtrans -s . #{params[:output]} #{name}")
|
76
77
|
end # def build
|
77
78
|
|
78
79
|
def default_output
|
data/lib/fpm/util.rb
ADDED
data/templates/deb.erb
CHANGED
@@ -6,6 +6,10 @@ Maintainer: <%= maintainer or "<unknown>" %>
|
|
6
6
|
<% properdeps = dependencies.collect { |d| fix_dependency(d) }.flatten -%>
|
7
7
|
Depends: <%= properdeps.flatten.join(", ") %>
|
8
8
|
<% end -%>
|
9
|
+
<% if !pre_dependencies.empty? -%>
|
10
|
+
<% properpredeps = pre_dependencies.collect { |d| fix_dependency(d) }.flatten -%>
|
11
|
+
Pre-Depends: <%= properpredeps.flatten.join(", ") %>
|
12
|
+
<% end -%>
|
9
13
|
<% if !conflicts.empty? -%>
|
10
14
|
Conflicts: <%= conflicts.join(", ") %>
|
11
15
|
<% end -%>
|
data/templates/rpm.erb
CHANGED
@@ -31,8 +31,8 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
|
|
31
31
|
nextversion[l-1] = 0
|
32
32
|
nextversion = nextversion.join(".")
|
33
33
|
["#{name} >= #{version}", "#{name} < #{nextversion}"]
|
34
|
-
|
35
|
-
|
34
|
+
elsif d =~ /\d [<>]=? [0-9.+] [<>]=? \d/
|
35
|
+
# Convert gem >= A.B.C <= X.Y.Z to '>= A.B.C' and '<= X.Y.Z'
|
36
36
|
puts d
|
37
37
|
# split out version numbers with their equality sign
|
38
38
|
name, lower_version, upper_version = d.scan(/([\w-]+) ([<>]=? [\d\.]+) ([<>]=? [\d\.]+)/)[0]
|
data/templates/solaris.erb
CHANGED
@@ -11,5 +11,5 @@ CATEGORY=application
|
|
11
11
|
DESC=<%= description.split("\n").first[0..255] or "no description given" %>
|
12
12
|
VENDOR=<%= maintainer %>
|
13
13
|
<%# Take maintainer of "Foo <bar@baz.com>" and use "bar@baz.com" -%>
|
14
|
-
EMAIL=<%= maintainer[/<.+>/].gsub(/[<>]/, "") %>
|
14
|
+
EMAIL=<%= (maintainer[/<.+>/] or maintainer).gsub(/[<>]/, "") %>
|
15
15
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 8
|
10
|
+
version: 0.3.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jordan Sissel
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-09-06 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: json
|
@@ -53,6 +52,7 @@ files:
|
|
53
52
|
- lib/fpm/source.rb
|
54
53
|
- lib/fpm/namespace.rb
|
55
54
|
- lib/fpm/package.rb
|
55
|
+
- lib/fpm/util.rb
|
56
56
|
- lib/fpm/program.rb
|
57
57
|
- lib/fpm/source/gem.rb
|
58
58
|
- lib/fpm/source/npm.rb
|
@@ -80,7 +80,6 @@ files:
|
|
80
80
|
- LICENSE
|
81
81
|
- CONTRIBUTORS
|
82
82
|
- CHANGELIST
|
83
|
-
has_rdoc: true
|
84
83
|
homepage: https://github.com/jordansissel/fpm
|
85
84
|
licenses: []
|
86
85
|
|
@@ -111,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
110
|
requirements: []
|
112
111
|
|
113
112
|
rubyforge_project:
|
114
|
-
rubygems_version: 1.
|
113
|
+
rubygems_version: 1.7.2
|
115
114
|
signing_key:
|
116
115
|
specification_version: 3
|
117
116
|
summary: fpm - package building and mangling
|