fpm-cookery 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/LICENSE +23 -0
- data/README.md +9 -6
- data/fpm-cookery.gemspec +3 -1
- data/lib/fpm/cookery/book.rb +10 -2
- data/lib/fpm/cookery/book_hook.rb +1 -1
- data/lib/fpm/cookery/cli.rb +20 -4
- data/lib/fpm/cookery/dependency_inspector.rb +89 -0
- data/lib/fpm/cookery/omnibus_packager.rb +69 -0
- data/lib/fpm/cookery/package/dir.rb +8 -2
- data/lib/fpm/cookery/packager.rb +36 -11
- data/lib/fpm/cookery/path_helper.rb +10 -2
- data/lib/fpm/cookery/recipe.rb +3 -2
- data/lib/fpm/cookery/source_handler/curl.rb +2 -1
- data/lib/fpm/cookery/source_handler/noop.rb +22 -0
- data/lib/fpm/cookery/source_handler.rb +1 -0
- data/lib/fpm/cookery/utils.rb +16 -1
- data/lib/fpm/cookery/version.rb +1 -1
- data/recipes/fpm-cookery/fpm-cook.bin +19 -0
- data/recipes/fpm-cookery/recipe.rb +72 -0
- data/recipes/fpm-cookery/ruby.rb +35 -0
- data/recipes/omnibustest/bundler-gem.rb +21 -0
- data/recipes/omnibustest/recipe.rb +14 -0
- data/recipes/omnibustest/ruby.rb +32 -0
- data/spec/path_helper_spec.rb +34 -0
- data/spec/recipe_spec.rb +13 -0
- metadata +52 -4
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# v0.14.0 (2013-05-31)
|
2
|
+
* Install dependencies via Puppet. (andytinycat)
|
3
|
+
* Add install-deps action to install dependencies. (andytinycat)
|
4
|
+
* Fix log message. (ryansch)
|
5
|
+
* Add a `patch` helper method to apply patches. (piavlo)
|
6
|
+
* Support for [Omnibus](http://wiki.opscode.com/display/chef/Omnibus+Information)-style
|
7
|
+
packaging. (andytinycat)
|
8
|
+
* Add recipe to build a fat (omnibus-style) package for fpm-cookery.
|
9
|
+
* Add `:args` option for the curl handler. (torrancew)
|
10
|
+
* Add `-V` command line option to show fpm-cookery and fpm versions.
|
11
|
+
|
1
12
|
# v0.13.0 (2013-01-28)
|
2
13
|
* Make local file source behave like the remote url source. (#14)
|
3
14
|
|
data/Gemfile
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Copyright (c) 2009-2012 Max Howell and other contributors.
|
2
|
+
Copyright (c) 2011 Bernd Ahlers
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions
|
6
|
+
are met:
|
7
|
+
|
8
|
+
1. Redistributions of source code must retain the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer.
|
10
|
+
2. Redistributions in binary form must reproduce the above copyright
|
11
|
+
notice, this list of conditions and the following disclaimer in the
|
12
|
+
documentation and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
15
|
+
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
16
|
+
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
17
|
+
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
18
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
19
|
+
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
20
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
21
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
22
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
23
|
+
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
CHANGED
@@ -47,11 +47,13 @@ __fpm-cookery__ is my attempt to build such a tool.
|
|
47
47
|
* Package creation via __fpm__.
|
48
48
|
* Standalone recipe trees/books/you name it. No need to put the recipes into
|
49
49
|
the __fpm-cookery__ source tree.
|
50
|
+
* Can build [Omnibus](http://wiki.opscode.com/display/chef/Omnibus+Information)
|
51
|
+
style packages (allows you to embed many builds into the same package -
|
52
|
+
used by the Opscode folks to build an embedded Ruby and the gems for Chef into
|
53
|
+
a single package; also the [Sensu](https://github.com/sensu/sensu) guys do something similar.)
|
50
54
|
|
51
55
|
## Upcoming Features
|
52
56
|
|
53
|
-
* Apply custom patches.
|
54
|
-
* Dependency checking.
|
55
57
|
* Recipe validation.
|
56
58
|
* More source types. (hg, bzr, ...)
|
57
59
|
* Progress output and logging.
|
@@ -131,16 +133,17 @@ The following is an example recipe. I have some more in my recipe collection
|
|
131
133
|
* No recipe documentation and API documentation yet.
|
132
134
|
* No recipe validation yet.
|
133
135
|
* No dependency validation yet.
|
134
|
-
* No support for patches yet.
|
135
136
|
* Pretty new and not well tested.
|
136
137
|
|
137
138
|
## Credits
|
138
139
|
|
139
140
|
__fpm-cookery__ borrows lots of __ideas__ and also __code__ from the
|
140
141
|
[homebrew](https://github.com/mxcl/homebrew) and
|
141
|
-
[brew2deb](https://github.com/tmm1/brew2deb) projects.
|
142
|
-
|
143
|
-
|
142
|
+
[brew2deb](https://github.com/tmm1/brew2deb) projects.
|
143
|
+
|
144
|
+
## License
|
145
|
+
|
146
|
+
The BSD 2-Clause License - See [LICENSE](LICENSE) for details
|
144
147
|
|
145
148
|
## How To Contribute
|
146
149
|
|
data/fpm-cookery.gemspec
CHANGED
@@ -19,8 +19,10 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_development_dependency "fpm", "~> 0.4"
|
22
|
-
s.add_development_dependency "minitest"
|
22
|
+
s.add_development_dependency "minitest", "~> 4.0"
|
23
23
|
s.add_development_dependency "rake"
|
24
|
+
s.add_development_dependency "puppet"
|
24
25
|
s.add_runtime_dependency "fpm", "~> 0.4"
|
25
26
|
s.add_runtime_dependency "facter"
|
27
|
+
s.add_runtime_dependency "puppet"
|
26
28
|
end
|
data/lib/fpm/cookery/book.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
1
3
|
module FPM
|
2
4
|
module Cookery
|
3
5
|
class Book
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@recipe = nil
|
10
|
+
end
|
11
|
+
|
4
12
|
# Load the given file and instantiate an object. Wrap the class in an
|
5
13
|
# anonymous module to avoid namespace cluttering. (see Kernel.load)
|
6
|
-
def
|
14
|
+
def load_recipe(filename, &callback)
|
7
15
|
Kernel.load(filename, true)
|
8
16
|
callback.call(@recipe.new(filename))
|
9
17
|
end
|
10
18
|
|
11
|
-
def
|
19
|
+
def add_recipe_class(klass)
|
12
20
|
@recipe = klass
|
13
21
|
end
|
14
22
|
end
|
data/lib/fpm/cookery/cli.rb
CHANGED
@@ -2,6 +2,7 @@ require 'fpm/cookery/book_hook'
|
|
2
2
|
require 'fpm/cookery/recipe'
|
3
3
|
require 'fpm/cookery/facts'
|
4
4
|
require 'fpm/cookery/packager'
|
5
|
+
require 'fpm/cookery/omnibus_packager'
|
5
6
|
require 'fpm/cookery/log'
|
6
7
|
require 'fpm/cookery/log/output/console'
|
7
8
|
require 'fpm/cookery/log/output/console_color'
|
@@ -21,8 +22,9 @@ module FPM
|
|
21
22
|
options.banner = \
|
22
23
|
"Usage: #{program} [options] [path/to/recipe.rb] action [...]"
|
23
24
|
options.separator "Actions:"
|
24
|
-
options.separator " package
|
25
|
-
options.separator " clean
|
25
|
+
options.separator " package - builds the package"
|
26
|
+
options.separator " clean - cleans up"
|
27
|
+
options.separator " install-deps - installs build and runtime dependencies"
|
26
28
|
options.separator "Options:"
|
27
29
|
|
28
30
|
options.on("-c", "--color",
|
@@ -44,6 +46,14 @@ module FPM
|
|
44
46
|
@platform = o
|
45
47
|
end
|
46
48
|
|
49
|
+
options.on("-V", "--version", "Show fpm-cookery and fpm version") do
|
50
|
+
require 'fpm/version'
|
51
|
+
require 'fpm/cookery/version'
|
52
|
+
|
53
|
+
puts "fpm-cookery v#{FPM::Cookery::VERSION} (fpm v#{FPM::VERSION})"
|
54
|
+
exit 0
|
55
|
+
end
|
56
|
+
|
47
57
|
# Parse flags and such, remainder is all non-option args.
|
48
58
|
remainder = options.parse(argv)
|
49
59
|
|
@@ -112,14 +122,20 @@ module FPM
|
|
112
122
|
|
113
123
|
FPM::Cookery::Recipe.send(:include, FPM::Cookery::BookHook)
|
114
124
|
|
115
|
-
FPM::Cookery::Book.load_recipe(@filename) do |recipe|
|
125
|
+
FPM::Cookery::Book.instance.load_recipe(@filename) do |recipe|
|
116
126
|
packager = FPM::Cookery::Packager.new(recipe)
|
117
127
|
packager.target = FPM::Cookery::Facts.target.to_s
|
118
128
|
|
119
129
|
@actions.each do |action|
|
120
130
|
case action
|
121
131
|
when "clean" ; packager.cleanup
|
122
|
-
when "package"
|
132
|
+
when "package"
|
133
|
+
if recipe.omnibus_package == true
|
134
|
+
FPM::Cookery::OmnibusPackager.new(packager).run
|
135
|
+
else
|
136
|
+
packager.dispense
|
137
|
+
end
|
138
|
+
when "install-deps" ; packager.install_deps
|
123
139
|
else
|
124
140
|
# TODO(sissel): fail if this happens
|
125
141
|
Log.error "Unknown action: #{action}"
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'puppet'
|
2
|
+
require 'puppet/resource'
|
3
|
+
require 'puppet/transaction/report'
|
4
|
+
require 'fpm/cookery/facts'
|
5
|
+
require 'fpm/cookery/log'
|
6
|
+
|
7
|
+
# Init Puppet before using it
|
8
|
+
Puppet.initialize_settings
|
9
|
+
|
10
|
+
module FPM
|
11
|
+
module Cookery
|
12
|
+
class DependencyInspector
|
13
|
+
|
14
|
+
def self.verify!(depends, build_depends)
|
15
|
+
|
16
|
+
Log.info "Verifying build_depends and depends with Puppet"
|
17
|
+
|
18
|
+
missing = (build_depends + depends).reject do |package|
|
19
|
+
self.package_installed?(package)
|
20
|
+
end
|
21
|
+
|
22
|
+
if missing.length == 0
|
23
|
+
Log.info "All build_depends and depends packages installed"
|
24
|
+
else
|
25
|
+
Log.info "Missing/wrong version packages: #{missing.join(', ')}"
|
26
|
+
if Process.euid != 0
|
27
|
+
Log.error "Not running as root; please run 'sudo fpm-cook install-deps' to install dependencies."
|
28
|
+
exit 1
|
29
|
+
else
|
30
|
+
Log.info "Running as root; installing missing/wrong version build_depends and depends with Puppet"
|
31
|
+
missing.each do |package|
|
32
|
+
self.install_package(package)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.package_installed?(package)
|
40
|
+
Log.info("Verifying package: #{package}")
|
41
|
+
return unless self.package_suitable?(package)
|
42
|
+
|
43
|
+
# Use Puppet in noop mode to see if the package exists
|
44
|
+
Puppet[:noop] = true
|
45
|
+
resource = Puppet::Resource.new("package", package, :parameters => {
|
46
|
+
:ensure => "present"
|
47
|
+
})
|
48
|
+
result = Puppet::Resource.indirection.save(resource)[1]
|
49
|
+
!result.resource_statuses.values.first.out_of_sync
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.install_package(package)
|
53
|
+
Log.info("Installing package: #{package}")
|
54
|
+
return unless self.package_suitable?(package)
|
55
|
+
|
56
|
+
# Use Puppet to install a package
|
57
|
+
Puppet[:noop] = false
|
58
|
+
resource = Puppet::Resource.new("package", package, :parameters => {
|
59
|
+
:ensure => "present"
|
60
|
+
})
|
61
|
+
result = Puppet::Resource.indirection.save(resource)[1]
|
62
|
+
failed = Puppet::Resource.indirection.save(resource)[1].resource_statuses.values.first.failed
|
63
|
+
if failed
|
64
|
+
Log.fatal "While processing depends package '#{package}':"
|
65
|
+
result.logs.each {|log_line| Log.fatal log_line}
|
66
|
+
exit 1
|
67
|
+
else
|
68
|
+
result.logs.each {|log_line| Log.info log_line}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.package_suitable?(package)
|
73
|
+
# How can we handle "or" style depends?
|
74
|
+
if package =~ / \| /
|
75
|
+
Log.warn "Required package '#{package}' is an 'or' string; not attempting to find/install a package to satisfy"
|
76
|
+
return false
|
77
|
+
end
|
78
|
+
|
79
|
+
# We can't handle >=, <<, >>, <=
|
80
|
+
if package =~ />=|<<|>>|<=/
|
81
|
+
Log.warn "Required package '#{package}' has a relative version requirement; not attempting to find/install a package to satisfy"
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'fpm/cookery/packager'
|
2
|
+
require 'fpm/cookery/facts'
|
3
|
+
|
4
|
+
module FPM
|
5
|
+
module Cookery
|
6
|
+
class OmnibusPackager
|
7
|
+
include FPM::Cookery::Utils
|
8
|
+
|
9
|
+
attr_reader :packager, :recipe
|
10
|
+
|
11
|
+
def initialize(packager)
|
12
|
+
@packager = packager
|
13
|
+
@recipe = packager.recipe
|
14
|
+
@depends = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
# Omnibus packages are many builds in one package; e.g. Ruby + Puppet together.
|
19
|
+
Log.info "Recipe #{recipe.name} is an Omnibus package; looking for child recipes to build"
|
20
|
+
|
21
|
+
recipe.omnibus_recipes.each do |name|
|
22
|
+
recipe_file = build_recipe_file_path(name)
|
23
|
+
|
24
|
+
unless File.exists?(recipe_file)
|
25
|
+
Log.fatal "Cannot find a recipe for #{name} at #{recipe_file}"
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
|
29
|
+
FPM::Cookery::Book.instance.load_recipe(recipe_file) do |dep_recipe|
|
30
|
+
dep_recipe.destdir = "#{recipe.omnibus_dir}/embedded" if recipe.omnibus_dir
|
31
|
+
dep_recipe.omnibus_installing = true if recipe.omnibus_dir
|
32
|
+
|
33
|
+
pkg = FPM::Cookery::Packager.new(dep_recipe, :skip_package => true, :keep_destdir => true)
|
34
|
+
pkg.target = FPM::Cookery::Facts.target.to_s
|
35
|
+
|
36
|
+
Log.info "Located recipe at #{recipe_file} for child recipe #{name}; starting build"
|
37
|
+
pkg.dispense
|
38
|
+
|
39
|
+
@depends += dep_recipe.depends
|
40
|
+
Log.info "Finished building #{name}, moving on to next recipe"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Now all child recipes are built; set depends to combined set of dependencies
|
45
|
+
recipe.class.depends(@depends.flatten.uniq)
|
46
|
+
Log.info "Combined dependencies: #{recipe.depends.join(', ')}"
|
47
|
+
|
48
|
+
recipe.destdir = recipe.omnibus_dir if recipe.omnibus_dir
|
49
|
+
|
50
|
+
if recipe.omnibus_additional_paths
|
51
|
+
packager.config[:input] = [ recipe.destdir ] + recipe.omnibus_additional_paths
|
52
|
+
else
|
53
|
+
packager.config[:input] = recipe.destdir
|
54
|
+
end
|
55
|
+
|
56
|
+
packager.config[:keep_destdir] = true
|
57
|
+
|
58
|
+
packager.dispense
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def build_recipe_file_path(name)
|
64
|
+
# Look for recipes in the same dir as the recipe we loaded
|
65
|
+
File.expand_path(File.dirname(recipe.filename) + "/#{name}.rb")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -5,7 +5,7 @@ module FPM
|
|
5
5
|
module Cookery
|
6
6
|
module Package
|
7
7
|
class Dir < SimpleDelegator
|
8
|
-
def initialize(recipe)
|
8
|
+
def initialize(recipe, config = {})
|
9
9
|
super(FPM::Package::Dir.new)
|
10
10
|
|
11
11
|
self.name = recipe.name
|
@@ -29,11 +29,17 @@ module FPM
|
|
29
29
|
attributes[:rpm_digest] = 'md5'
|
30
30
|
attributes[:rpm_user] = 'root'
|
31
31
|
attributes[:rpm_group] = 'root'
|
32
|
+
attributes[:rpm_defattrfile] = '-'
|
33
|
+
attributes[:rpm_defattrdir] = '-'
|
32
34
|
|
33
35
|
# TODO replace remove_excluded_files() in packager with this.
|
34
36
|
attributes[:excludes] = []
|
35
37
|
|
36
|
-
input
|
38
|
+
inputs = config.fetch(:input, nil) || '.'
|
39
|
+
|
40
|
+
Array(inputs).each do |path|
|
41
|
+
input(path)
|
42
|
+
end
|
37
43
|
|
38
44
|
# The call to input() overwrites the license and vendor attributes.
|
39
45
|
# XXX Needs to be fixed in fpm/package/dir.rb.
|
data/lib/fpm/cookery/packager.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
#require 'digest/md5'
|
2
2
|
#require 'fpm/cookery/recipe_inspector'
|
3
|
-
|
3
|
+
require 'fpm/cookery/dependency_inspector'
|
4
4
|
require 'fpm/cookery/utils'
|
5
5
|
require 'fpm/cookery/source_integrity_check'
|
6
6
|
require 'fpm/cookery/path'
|
7
7
|
require 'fpm/cookery/log'
|
8
8
|
require 'fpm/cookery/package/dir'
|
9
|
-
require 'fpm
|
10
|
-
require 'fpm/package/rpm'
|
9
|
+
require 'fpm'
|
11
10
|
|
12
11
|
module FPM
|
13
12
|
module Cookery
|
@@ -21,6 +20,14 @@ module FPM
|
|
21
20
|
@config = config
|
22
21
|
end
|
23
22
|
|
23
|
+
def skip_package?
|
24
|
+
!!config[:skip_package]
|
25
|
+
end
|
26
|
+
|
27
|
+
def keep_destdir?
|
28
|
+
!!config[:keep_destdir]
|
29
|
+
end
|
30
|
+
|
24
31
|
def target=(target)
|
25
32
|
# TODO(sissel): do sanity checking
|
26
33
|
@target = target
|
@@ -34,6 +41,11 @@ module FPM
|
|
34
41
|
FileUtils.rm_rf(recipe.destdir)
|
35
42
|
end
|
36
43
|
|
44
|
+
def install_deps
|
45
|
+
DependencyInspector.verify!(recipe.depends, recipe.build_depends)
|
46
|
+
Log.info("All dependencies installed!")
|
47
|
+
end
|
48
|
+
|
37
49
|
def dispense
|
38
50
|
env = ENV.to_hash
|
39
51
|
package_name = "#{recipe.name}-#{recipe.version}"
|
@@ -44,7 +56,7 @@ module FPM
|
|
44
56
|
Log.info ''
|
45
57
|
|
46
58
|
# RecipeInspector.verify!(recipe)
|
47
|
-
|
59
|
+
DependencyInspector.verify!(recipe.depends, recipe.build_depends)
|
48
60
|
|
49
61
|
recipe.installing = false
|
50
62
|
|
@@ -92,12 +104,12 @@ module FPM
|
|
92
104
|
if File.exists?(build_cookie)
|
93
105
|
Log.info 'Skipping build (`fpm-cook clean` to rebuild)'
|
94
106
|
else
|
95
|
-
Log.info "Building in #{File.expand_path(extracted_source)}"
|
107
|
+
Log.info "Building in #{File.expand_path(extracted_source, recipe.builddir)}"
|
96
108
|
recipe.build and FileUtils.touch(build_cookie)
|
97
109
|
end
|
98
110
|
|
99
|
-
FileUtils.rm_rf(recipe.destdir)
|
100
|
-
recipe.destdir.mkdir
|
111
|
+
FileUtils.rm_rf(recipe.destdir) unless keep_destdir?
|
112
|
+
recipe.destdir.mkdir unless File.exists?(recipe.destdir)
|
101
113
|
|
102
114
|
begin
|
103
115
|
recipe.installing = true
|
@@ -109,7 +121,11 @@ module FPM
|
|
109
121
|
end
|
110
122
|
end
|
111
123
|
|
112
|
-
|
124
|
+
if skip_package?
|
125
|
+
Log.info "Package building disabled"
|
126
|
+
else
|
127
|
+
build_package(recipe, config)
|
128
|
+
end
|
113
129
|
ensure
|
114
130
|
# Make sure we reset the environment.
|
115
131
|
ENV.replace(env)
|
@@ -141,13 +157,13 @@ module FPM
|
|
141
157
|
version = [ver, vendor_rev].join(vendor_delimiter)
|
142
158
|
|
143
159
|
maintainer = recipe.maintainer || begin
|
144
|
-
username =
|
145
|
-
useremail =
|
160
|
+
username = git_config('user.name')
|
161
|
+
useremail = git_config('user.email')
|
146
162
|
|
147
163
|
username && useremail ? "#{username} <#{useremail}>" : nil
|
148
164
|
end
|
149
165
|
|
150
|
-
input = FPM::Cookery::Package::Dir.new(recipe)
|
166
|
+
input = FPM::Cookery::Package::Dir.new(recipe, :input => config[:input])
|
151
167
|
|
152
168
|
input.version = version
|
153
169
|
input.maintainer = maintainer
|
@@ -222,6 +238,15 @@ module FPM
|
|
222
238
|
end
|
223
239
|
end
|
224
240
|
end
|
241
|
+
|
242
|
+
private
|
243
|
+
|
244
|
+
def git_config(key)
|
245
|
+
%x(git config --get #{key}).strip
|
246
|
+
rescue
|
247
|
+
Log.warn "Git config command for key '#{key}' failed."
|
248
|
+
nil
|
249
|
+
end
|
225
250
|
end
|
226
251
|
end
|
227
252
|
end
|
@@ -3,12 +3,16 @@ require 'fpm/cookery/path'
|
|
3
3
|
module FPM
|
4
4
|
module Cookery
|
5
5
|
module PathHelper
|
6
|
-
attr_accessor :installing
|
6
|
+
attr_accessor :installing, :omnibus_installing
|
7
7
|
|
8
8
|
def installing?
|
9
9
|
installing
|
10
10
|
end
|
11
11
|
|
12
|
+
def omnibus_installing?
|
13
|
+
omnibus_installing
|
14
|
+
end
|
15
|
+
|
12
16
|
# Most of the path helper stuff comes from brew2deb and homebrew.
|
13
17
|
def prefix(path = nil)
|
14
18
|
current_pathname_for('usr')/path
|
@@ -61,7 +65,11 @@ module FPM
|
|
61
65
|
|
62
66
|
private
|
63
67
|
def current_pathname_for(dir)
|
64
|
-
|
68
|
+
if omnibus_installing?
|
69
|
+
Path.new("/#{dir}")
|
70
|
+
else
|
71
|
+
installing? ? destdir/dir : Path.new("/#{dir}")
|
72
|
+
end
|
65
73
|
end
|
66
74
|
end
|
67
75
|
end
|
data/lib/fpm/cookery/recipe.rb
CHANGED
@@ -56,10 +56,11 @@ module FPM
|
|
56
56
|
attr_rw :arch, :description, :homepage, :maintainer, :md5, :name,
|
57
57
|
:revision, :section, :sha1, :sha256, :spec, :vendor, :version,
|
58
58
|
:pre_install, :post_install, :pre_uninstall, :post_uninstall,
|
59
|
-
:license
|
59
|
+
:license, :omnibus_package, :omnibus_dir
|
60
60
|
|
61
61
|
attr_rw_list :build_depends, :config_files, :conflicts, :depends,
|
62
|
-
:exclude, :patches, :provides, :replaces
|
62
|
+
:exclude, :patches, :provides, :replaces, :omnibus_recipes,
|
63
|
+
:omnibus_additional_paths
|
63
64
|
|
64
65
|
class << self
|
65
66
|
def source(source = nil, spec = {})
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'fpm/cookery/source_handler/template'
|
2
|
+
|
3
|
+
module FPM
|
4
|
+
module Cookery
|
5
|
+
class SourceHandler
|
6
|
+
class Noop < FPM::Cookery::SourceHandler::Template
|
7
|
+
CHECKSUM = false
|
8
|
+
NAME = :noop
|
9
|
+
|
10
|
+
def fetch
|
11
|
+
Log.info "Noop source_handler; do nothing."
|
12
|
+
end
|
13
|
+
|
14
|
+
def extract
|
15
|
+
Log.info "Not extracting - noop source handler"
|
16
|
+
builddir
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/fpm/cookery/utils.rb
CHANGED
@@ -4,13 +4,22 @@ module FPM
|
|
4
4
|
protected
|
5
5
|
# From fpm. (lib/fpm/util.rb)
|
6
6
|
def safesystem(*args)
|
7
|
-
success = system(*args)
|
7
|
+
success = system(*args.flatten)
|
8
8
|
if !success
|
9
9
|
raise "'system(#{args.inspect})' failed with error code: #{$?.exitstatus}"
|
10
10
|
end
|
11
11
|
return success
|
12
12
|
end
|
13
13
|
|
14
|
+
def cleanenv_safesystem(*args)
|
15
|
+
bundler_vars = %w(BUNDLE_GEMFILE RUBYOPT BUNDLE_BIN_PATH GEM_HOME GEM_PATH)
|
16
|
+
bundled_env = ENV.to_hash
|
17
|
+
bundler_vars.each {|var| ENV.delete(var)}
|
18
|
+
result = safesystem(*args)
|
19
|
+
ENV.replace(bundled_env.to_hash)
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
14
23
|
# From brew2deb. (lib/debian_formula.rb)
|
15
24
|
def configure(*args)
|
16
25
|
if args.last.is_a?(Hash)
|
@@ -57,6 +66,12 @@ module FPM
|
|
57
66
|
end
|
58
67
|
end
|
59
68
|
alias_method :inreplace, :inline_replace # homebrew compat
|
69
|
+
|
70
|
+
def patch(src, level = 0)
|
71
|
+
raise "patch level must be integer" unless level.is_a?(Fixnum)
|
72
|
+
raise "#{src} does not exist" unless File.exist? src
|
73
|
+
safesystem "patch -p#{level} --batch < #{src}"
|
74
|
+
end
|
60
75
|
end
|
61
76
|
end
|
62
77
|
end
|
data/lib/fpm/cookery/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# Stolen from Vagrant
|
4
|
+
|
5
|
+
# Get the directory where this script is. This will also resolve
|
6
|
+
# any symlinks in the directory/script, so it will be the fully
|
7
|
+
# resolved path.
|
8
|
+
SOURCE="${BASH_SOURCE[0]}"
|
9
|
+
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
|
10
|
+
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
11
|
+
|
12
|
+
# Useful variables
|
13
|
+
EMBEDDED_DIR="${DIR}/../embedded"
|
14
|
+
|
15
|
+
# Unset some variables that might be set by rvm and friends.
|
16
|
+
unset RUBYOPT BUNDLE_GEMFILE BUNDLE_BIN_PATH GEM_HOME GEM_PATH GEMRC
|
17
|
+
|
18
|
+
# Call the actual fpm-cook bin with our arguments
|
19
|
+
${EMBEDDED_DIR}/bin/fpm-cook "$@"
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class FPMCookery < FPM::Cookery::Recipe
|
2
|
+
description 'building packages'
|
3
|
+
|
4
|
+
name 'fpm-cookery'
|
5
|
+
version '0.13.0'
|
6
|
+
revision 0
|
7
|
+
homepage 'https://github.com/bernd/fpm-cookery'
|
8
|
+
|
9
|
+
source '', :with => :noop
|
10
|
+
|
11
|
+
omnibus_package true
|
12
|
+
omnibus_recipes 'ruby'
|
13
|
+
omnibus_dir '/opt/fpm-cookery'
|
14
|
+
|
15
|
+
def build
|
16
|
+
gem_install 'fpm-cookery', version
|
17
|
+
end
|
18
|
+
|
19
|
+
def install
|
20
|
+
destdir('bin').install workdir('fpm-cook.bin'), 'fpm-cook'
|
21
|
+
|
22
|
+
with_trueprefix do
|
23
|
+
create_post_install_hook
|
24
|
+
create_pre_uninstall_hook
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def gem_install(name, version = nil)
|
31
|
+
v = version.nil? ? '' : "-v #{version}"
|
32
|
+
cleanenv_safesystem "#{destdir}/embedded/bin/gem install #{v} #{name}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_post_install_hook
|
36
|
+
File.open(builddir('post-install'), 'w', 0755) do |f|
|
37
|
+
f.write <<-__POSTINST
|
38
|
+
#!/bin/sh
|
39
|
+
set -e
|
40
|
+
|
41
|
+
BIN_PATH="#{destdir}/bin"
|
42
|
+
BIN="fpm-cook"
|
43
|
+
|
44
|
+
update-alternatives --install /usr/bin/$BIN $BIN $BIN_PATH/$BIN 100
|
45
|
+
|
46
|
+
exit 0
|
47
|
+
__POSTINST
|
48
|
+
|
49
|
+
self.class.post_install(File.expand_path(f.path))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_pre_uninstall_hook
|
54
|
+
File.open(builddir('pre-uninstall'), 'w', 0755) do |f|
|
55
|
+
f.write <<-__PRERM
|
56
|
+
#!/bin/sh
|
57
|
+
set -e
|
58
|
+
|
59
|
+
BIN_PATH="#{destdir}/bin"
|
60
|
+
BIN="fpm-cook"
|
61
|
+
|
62
|
+
if [ "$1" != "upgrade" ]; then
|
63
|
+
update-alternatives --remove $BIN $BIN_PATH/$BIN
|
64
|
+
fi
|
65
|
+
|
66
|
+
exit 0
|
67
|
+
__PRERM
|
68
|
+
|
69
|
+
self.class.pre_uninstall(File.expand_path(f.path))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Ruby200 < FPM::Cookery::Recipe
|
2
|
+
description 'The Ruby virtual machine'
|
3
|
+
|
4
|
+
name 'ruby'
|
5
|
+
version '2.0.0.0'
|
6
|
+
revision 0
|
7
|
+
homepage 'http://www.ruby-lang.org/'
|
8
|
+
source 'http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.bz2'
|
9
|
+
sha256 'c680d392ccc4901c32067576f5b474ee186def2fcd3fcbfa485739168093295f'
|
10
|
+
|
11
|
+
license 'The Ruby License'
|
12
|
+
section 'interpreters'
|
13
|
+
|
14
|
+
build_depends 'autoconf', 'libreadline6-dev', 'bison', 'zlib1g-dev',
|
15
|
+
'libssl-dev', 'libyaml-dev', 'libffi-dev', 'libgdbm-dev', 'libncurses5-dev',
|
16
|
+
'libreadline6-dev'
|
17
|
+
|
18
|
+
depends 'libffi6', 'libncurses5', 'libreadline6', 'libssl1.0.0',
|
19
|
+
'libtinfo5', 'libyaml-0-2', 'zlib1g', 'libffi6', 'libgdbm3', 'libncurses5',
|
20
|
+
'libreadline6'
|
21
|
+
|
22
|
+
def build
|
23
|
+
configure :prefix => destdir, 'disable-install-doc' => true
|
24
|
+
make
|
25
|
+
end
|
26
|
+
|
27
|
+
def install
|
28
|
+
make :install
|
29
|
+
|
30
|
+
# Shrink package.
|
31
|
+
rm_f "#{destdir}/lib/libruby-static.a"
|
32
|
+
safesystem "strip #{destdir}/bin/ruby"
|
33
|
+
safesystem "find #{destdir} -name '*.so*' | xargs strip"
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class BundlerGem < FPM::Cookery::Recipe
|
2
|
+
description 'Bundler gem'
|
3
|
+
|
4
|
+
name 'bundler'
|
5
|
+
version '1.3.4'
|
6
|
+
revision 0
|
7
|
+
source "nothing", :with => :noop
|
8
|
+
|
9
|
+
vendor 'fpm'
|
10
|
+
license 'Unknown'
|
11
|
+
|
12
|
+
section 'interpreters'
|
13
|
+
|
14
|
+
def build
|
15
|
+
cleanenv_safesystem "#{destdir}/bin/gem install #{name} -v #{version}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def install
|
19
|
+
# Do nothing!
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class OmnibusTest < FPM::Cookery::Recipe
|
2
|
+
homepage 'http://test'
|
3
|
+
|
4
|
+
section 'interpreters'
|
5
|
+
name 'omnibus-test'
|
6
|
+
version '1.0.0'
|
7
|
+
description 'Testing Omnibus package'
|
8
|
+
revision 0
|
9
|
+
|
10
|
+
omnibus_package true
|
11
|
+
omnibus_recipes "ruby", "bundler-gem"
|
12
|
+
omnibus_dir '/opt/omnibustest'
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Ruby200 < FPM::Cookery::Recipe
|
2
|
+
description 'The Ruby virtual machine'
|
3
|
+
|
4
|
+
name 'ruby'
|
5
|
+
version '2.0.0.0'
|
6
|
+
revision 0
|
7
|
+
homepage 'http://www.ruby-lang.org/'
|
8
|
+
source 'http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.bz2'
|
9
|
+
sha256 'c680d392ccc4901c32067576f5b474ee186def2fcd3fcbfa485739168093295f'
|
10
|
+
|
11
|
+
vendor 'fpm'
|
12
|
+
license 'The Ruby License'
|
13
|
+
|
14
|
+
section 'interpreters'
|
15
|
+
|
16
|
+
build_depends 'autoconf', 'libreadline6-dev', 'bison', 'zlib1g-dev',
|
17
|
+
'libssl-dev', 'libyaml-dev', 'libffi-dev', 'libgdbm-dev', 'libncurses5-dev',
|
18
|
+
'libreadline6-dev'
|
19
|
+
|
20
|
+
depends 'libffi6', 'libncurses5', 'libreadline6', 'libssl1.0.0',
|
21
|
+
'libtinfo5', 'libyaml-0-2', 'zlib1g', 'libffi6', 'libgdbm3', 'libncurses5',
|
22
|
+
'libreadline6'
|
23
|
+
|
24
|
+
def build
|
25
|
+
configure :prefix => destdir, 'disable-install-doc' => true
|
26
|
+
make
|
27
|
+
end
|
28
|
+
|
29
|
+
def install
|
30
|
+
make :install
|
31
|
+
end
|
32
|
+
end
|
data/spec/path_helper_spec.rb
CHANGED
@@ -61,6 +61,22 @@ describe "PathHelper" do
|
|
61
61
|
helper.send(name, 'blah').to_s.must_equal "#{helper.destdir}#{path}/blah"
|
62
62
|
end
|
63
63
|
end
|
64
|
+
|
65
|
+
context "with omnibus_installing set to true" do
|
66
|
+
before { helper.omnibus_installing = true }
|
67
|
+
|
68
|
+
it "does not add anything to the path" do
|
69
|
+
helper.send(name, 'blah').to_s.must_equal "#{path}/blah"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "with omnibus_installing and installing set to true" do
|
74
|
+
before { helper.omnibus_installing = true ; helper.installing = true }
|
75
|
+
|
76
|
+
it "does not add anything to the path" do
|
77
|
+
helper.send(name, 'blah').to_s.must_equal "#{path}/blah"
|
78
|
+
end
|
79
|
+
end
|
64
80
|
end
|
65
81
|
end
|
66
82
|
end
|
@@ -83,6 +99,24 @@ describe "PathHelper" do
|
|
83
99
|
end
|
84
100
|
end
|
85
101
|
|
102
|
+
describe "#omnibus_installing?" do
|
103
|
+
context "with omnibus_installing set to true" do
|
104
|
+
before { helper.omnibus_installing = true }
|
105
|
+
|
106
|
+
it "returns true" do
|
107
|
+
helper.omnibus_installing?.must_equal true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "with omnibus_installing set to false" do
|
112
|
+
before { helper.omnibus_installing = false }
|
113
|
+
|
114
|
+
it "returns false" do
|
115
|
+
helper.omnibus_installing?.must_equal false
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
86
120
|
describe "#with_trueprefix" do
|
87
121
|
context "with installing set to true" do
|
88
122
|
before { helper.installing = true }
|
data/spec/recipe_spec.rb
CHANGED
@@ -176,6 +176,18 @@ describe "Recipe" do
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
+
describe "#omnibus_package" do
|
180
|
+
it "can be set" do
|
181
|
+
check_attribute(:omnibus_package, true)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe "#omnibus_dir" do
|
186
|
+
it "can be set" do
|
187
|
+
check_attribute(:omnibus_dir, '/foo')
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
179
191
|
def self.spec_recipe_attribute_list(name, list)
|
180
192
|
class_eval %Q{
|
181
193
|
describe "##{name}" do
|
@@ -203,6 +215,7 @@ describe "Recipe" do
|
|
203
215
|
spec_recipe_attribute_list(:patches, %w{one two})
|
204
216
|
spec_recipe_attribute_list(:provides, %w{one two})
|
205
217
|
spec_recipe_attribute_list(:replaces, %w{one two})
|
218
|
+
spec_recipe_attribute_list(:omnibus_recipes, %w{one two})
|
206
219
|
|
207
220
|
describe ".source" do
|
208
221
|
it "sets a source url" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm-cookery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fpm
|
@@ -29,6 +29,22 @@ dependencies:
|
|
29
29
|
version: '0.4'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: minitest
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '4.0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '4.0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
33
49
|
none: false
|
34
50
|
requirements:
|
@@ -44,7 +60,7 @@ dependencies:
|
|
44
60
|
- !ruby/object:Gem::Version
|
45
61
|
version: '0'
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
63
|
+
name: puppet
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
49
65
|
none: false
|
50
66
|
requirements:
|
@@ -91,6 +107,22 @@ dependencies:
|
|
91
107
|
- - ! '>='
|
92
108
|
- !ruby/object:Gem::Version
|
93
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: puppet
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
94
126
|
description: A tool for building software packages with fpm.
|
95
127
|
email:
|
96
128
|
- bernd@tuneafish.de
|
@@ -103,6 +135,7 @@ files:
|
|
103
135
|
- .gitignore
|
104
136
|
- CHANGELOG.md
|
105
137
|
- Gemfile
|
138
|
+
- LICENSE
|
106
139
|
- README.md
|
107
140
|
- Rakefile
|
108
141
|
- bin/fpm-cook
|
@@ -110,12 +143,14 @@ files:
|
|
110
143
|
- lib/fpm/cookery/book.rb
|
111
144
|
- lib/fpm/cookery/book_hook.rb
|
112
145
|
- lib/fpm/cookery/cli.rb
|
146
|
+
- lib/fpm/cookery/dependency_inspector.rb
|
113
147
|
- lib/fpm/cookery/facts.rb
|
114
148
|
- lib/fpm/cookery/log.rb
|
115
149
|
- lib/fpm/cookery/log/color.rb
|
116
150
|
- lib/fpm/cookery/log/output/console.rb
|
117
151
|
- lib/fpm/cookery/log/output/console_color.rb
|
118
152
|
- lib/fpm/cookery/log/output/null.rb
|
153
|
+
- lib/fpm/cookery/omnibus_packager.rb
|
119
154
|
- lib/fpm/cookery/package/dir.rb
|
120
155
|
- lib/fpm/cookery/packager.rb
|
121
156
|
- lib/fpm/cookery/path.rb
|
@@ -127,12 +162,19 @@ files:
|
|
127
162
|
- lib/fpm/cookery/source_handler/git.rb
|
128
163
|
- lib/fpm/cookery/source_handler/hg.rb
|
129
164
|
- lib/fpm/cookery/source_handler/local_path.rb
|
165
|
+
- lib/fpm/cookery/source_handler/noop.rb
|
130
166
|
- lib/fpm/cookery/source_handler/svn.rb
|
131
167
|
- lib/fpm/cookery/source_handler/template.rb
|
132
168
|
- lib/fpm/cookery/source_integrity_check.rb
|
133
169
|
- lib/fpm/cookery/utils.rb
|
134
170
|
- lib/fpm/cookery/version.rb
|
171
|
+
- recipes/fpm-cookery/fpm-cook.bin
|
172
|
+
- recipes/fpm-cookery/recipe.rb
|
173
|
+
- recipes/fpm-cookery/ruby.rb
|
135
174
|
- recipes/nodejs/recipe.rb
|
175
|
+
- recipes/omnibustest/bundler-gem.rb
|
176
|
+
- recipes/omnibustest/recipe.rb
|
177
|
+
- recipes/omnibustest/ruby.rb
|
136
178
|
- recipes/redis/recipe.rb
|
137
179
|
- recipes/redis/redis-server.init.d
|
138
180
|
- spec/facts_spec.rb
|
@@ -155,15 +197,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
197
|
- - ! '>='
|
156
198
|
- !ruby/object:Gem::Version
|
157
199
|
version: '0'
|
200
|
+
segments:
|
201
|
+
- 0
|
202
|
+
hash: -1124392889621969599
|
158
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
204
|
none: false
|
160
205
|
requirements:
|
161
206
|
- - ! '>='
|
162
207
|
- !ruby/object:Gem::Version
|
163
208
|
version: '0'
|
209
|
+
segments:
|
210
|
+
- 0
|
211
|
+
hash: -1124392889621969599
|
164
212
|
requirements: []
|
165
213
|
rubyforge_project: fpm-cookery
|
166
|
-
rubygems_version: 1.8.
|
214
|
+
rubygems_version: 1.8.25
|
167
215
|
signing_key:
|
168
216
|
specification_version: 3
|
169
217
|
summary: A tool for building software packages with fpm.
|