fpm-cookery 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ # v0.8.0 (2012-05-23)
2
+ * Add /opt path helper.
3
+ * Use the new fpm API. (requires at least fpm-0.4.x)
4
+ * Show the fpm log output via cabin.
5
+ * Skip git fetch if the specified sha or tag exists.
6
+
1
7
  # v0.7.0 (2011-11-26)
2
8
  * Add hg (mercurial) source handler.
3
9
  * Fix tags fetchting for the git source handler.
@@ -18,9 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_development_dependency "fpm"
21
+ s.add_development_dependency "fpm", "~> 0.4"
22
22
  s.add_development_dependency "minitest"
23
23
  s.add_development_dependency "rake"
24
- s.add_runtime_dependency "fpm"
24
+ s.add_runtime_dependency "fpm", "~> 0.4"
25
25
  s.add_runtime_dependency "facter"
26
26
  end
@@ -1,4 +1,5 @@
1
1
  require 'fpm/cookery/log/output/null'
2
+ require 'cabin' # Via fpm.
2
3
 
3
4
  module FPM
4
5
  module Cookery
@@ -6,6 +7,10 @@ module FPM
6
7
  @debug = false
7
8
  @output = FPM::Cookery::Log::Output::Null.new
8
9
 
10
+ @channel = ::Cabin::Channel.get
11
+ @channel.subscribe(self)
12
+ @channel.level = :debug
13
+
9
14
  class << self
10
15
  def enable_debug(value = true)
11
16
  @debug = value
@@ -38,6 +43,19 @@ module FPM
38
43
  def puts(message)
39
44
  @output.puts(message)
40
45
  end
46
+
47
+ def <<(event)
48
+ level = event.fetch(:level, :info).downcase.to_sym
49
+
50
+ event.delete(:level)
51
+
52
+ data = event.clone
53
+
54
+ data.delete(:message)
55
+ data.delete(:timestamp)
56
+
57
+ send(level, "[FPM] #{event[:message]} #{data.to_json}")
58
+ end
41
59
  end
42
60
  end
43
61
  end
@@ -5,6 +5,9 @@ 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
+ require 'fpm/package/dir'
9
+ require 'fpm/package/deb'
10
+ require 'fpm/package/rpm'
8
11
 
9
12
  module FPM
10
13
  module Cookery
@@ -140,68 +143,98 @@ module FPM
140
143
  maintainer = recipe.maintainer || begin
141
144
  username = `git config --get user.name`.strip
142
145
  useremail = `git config --get user.email`.strip
143
- raise 'Set maintainer name/email via `git config --global user.name <name>`' if username.empty?
144
- "#{username} <#{useremail}>"
146
+
147
+ username && useremail ? "#{username} <#{useremail}>" : nil
145
148
  end
146
149
 
147
- # TODO(sissel): This should use an API in fpm. fpm doesn't have this
148
- # yet. fpm needs this.
149
- opts = [
150
- '-n', recipe.name,
151
- '-v', version,
152
- '-t', @target,
153
- '-s', 'dir',
154
- '--url', recipe.homepage || recipe.url,
155
- '-C', recipe.destdir.to_s,
156
- '--maintainer', maintainer,
157
- '--category', recipe.section || 'optional',
158
- ]
159
-
160
- opts += [
161
- '--epoch', epoch
162
- ] if epoch
163
-
164
- opts += [
165
- '--description', recipe.description.strip
166
- ] if recipe.description
167
-
168
- opts += [
169
- '--architecture', recipe.arch.to_s
170
- ] if recipe.arch
171
-
172
- script_map = {"pre_install" => "--pre-install", "post_install" => "--post-install", "pre_uninstall" => "--pre-uninstall", "post_uninstall" => "--post-uninstall"}
173
- %w[pre_install post_install pre_uninstall post_uninstall].each do |script|
174
- unless recipe.send(script).nil?
175
- script_file = FPM::Cookery::Path.new(recipe.send(script))
176
-
177
- # If the script file is an absolute path, just use that path.
178
- # Otherwise consider the location relative to the recipe.
179
- unless script_file.absolute?
180
- script_file = File.expand_path("../#{script_file.to_s}", recipe.filename)
181
- end
150
+ input = FPM::Package::Dir.new
151
+
152
+ input.name = recipe.name
153
+ input.version = version
154
+ input.url = recipe.homepage || recipe.url
155
+ input.maintainer = maintainer
156
+ input.category = recipe.section || 'optional'
157
+ input.epoch = epoch if epoch
158
+ input.description = recipe.description.strip if recipe.description
159
+ input.architecture = recipe.arch.to_s if recipe.arch
160
+
161
+ input.dependencies += recipe.depends
162
+ input.conflicts += recipe.conflicts
163
+ input.provides += recipe.provides
164
+ input.replaces += recipe.replaces
165
+ input.config_files += recipe.config_files
166
+
167
+ add_scripts(recipe, input)
168
+ remove_excluded_files(recipe)
169
+
170
+ input.attributes[:prefix] = '/'
171
+ input.attributes[:chdir] = recipe.destdir.to_s
172
+ input.attributes[:excludes] = [] # TODO replace remove_excluded_files() with this
173
+ input.input('.')
174
+
175
+ output_class = FPM::Package.types[@target]
176
+
177
+ output = input.convert(output_class)
178
+
179
+ begin
180
+ output.output(output.to_s)
181
+ rescue FPM::Package::FileAlreadyExists
182
+ Log.info "Removing existing package file: #{output.to_s}"
183
+ FileUtils.rm_f(output.to_s)
184
+ retry
185
+ ensure
186
+ input.cleanup if input
187
+ output.cleanup if output
188
+ Log.info "Created package: #{File.join(Dir.pwd, output.to_s)}"
189
+ end
190
+ end
191
+ end
182
192
 
183
- if File.exists?(script_file)
184
- p_opt = script_map[script]
185
- opts += ["#{p_opt}", script_file.to_s]
186
- else
187
- raise "#{script} script '#{script_file}' is missing"
188
- end
193
+ def add_scripts(recipe, input)
194
+ error = false
195
+
196
+ # Map script names to fpm method names.
197
+ script_map = {
198
+ 'pre_install' => :before_install,
199
+ 'post_install' => :after_install,
200
+ 'pre_uninstall' => :before_remove,
201
+ 'post_uninstall' => :after_remove
202
+ }
203
+
204
+ script_map.each do |script, fpm_script|
205
+ unless recipe.send(script).nil?
206
+ script_file = FPM::Cookery::Path.new(recipe.send(script))
207
+
208
+ # If the script file is an absolute path, just use that path.
209
+ # Otherwise consider the location relative to the recipe.
210
+ unless script_file.absolute?
211
+ script_file = File.expand_path("../#{script_file.to_s}", recipe.filename)
189
212
  end
190
- end
191
213
 
192
- %w[ depends exclude provides replaces conflicts config_files ].each do |type|
193
- if recipe.send(type).any?
194
- recipe.send(type).each do |dep|
195
- opts += ["--#{type.gsub('_','-')}", dep]
196
- end
214
+ if File.exists?(script_file)
215
+ input.scripts[fpm_script] = File.read(script_file.to_s)
216
+ else
217
+ Log.error "#{script} script '#{script_file}' is missing"
218
+ error = true
197
219
  end
198
220
  end
221
+ end
199
222
 
200
- opts << '.'
223
+ exit(1) if error
224
+ end
201
225
 
202
- Log.info 'Calling fpm to build the package'
203
- Log.debug ['fpm', opts].flatten.inspect
204
- safesystem(*['fpm', opts].flatten)
226
+ # Remove all excluded files from the destdir so they do not end up in the
227
+ # package.
228
+ def remove_excluded_files(recipe)
229
+ Dir.chdir(recipe.destdir.to_s) do
230
+ Dir['**/*'].each do |file|
231
+ recipe.exclude.each do |ex|
232
+ if File.fnmatch(ex, file)
233
+ Log.info "Exclude file: #{file}"
234
+ FileUtils.rm_f(file)
235
+ end
236
+ end
237
+ end
205
238
  end
206
239
  end
207
240
  end
@@ -18,6 +18,10 @@ module FPM
18
18
  current_pathname_for('etc')/path
19
19
  end
20
20
 
21
+ def opt(path = nil)
22
+ current_pathname_for('opt')/path
23
+ end
24
+
21
25
  def var(path = nil)
22
26
  current_pathname_for('var')/path
23
27
  end
@@ -34,7 +34,7 @@ module FPM
34
34
  attrs.each do |attr|
35
35
  class_eval %Q{
36
36
  def self.#{attr}(*list)
37
- @#{attr} ||= superclass.respond_to?(:#{attr}) ? superclass.#{attr} : []
37
+ @#{attr} ||= []
38
38
  @#{attr} << list
39
39
  @#{attr}.flatten!
40
40
  @#{attr}.uniq!
@@ -9,10 +9,16 @@ module FPM
9
9
  NAME = :git
10
10
 
11
11
  def fetch
12
+ rev = options[:sha] || options[:tag]
13
+
12
14
  if local_path.exist?
13
15
  Dir.chdir(local_path) do
14
- git('fetch', url)
15
- git('fetch', '--tags', url)
16
+ if rev and has_rev?(rev)
17
+ Log.info("Skipping fetch, rev #{rev} exists.")
18
+ else
19
+ git('fetch', url)
20
+ git('fetch', '--tags', url)
21
+ end
16
22
  end
17
23
  else
18
24
  Dir.chdir(cachedir) do
@@ -53,6 +59,14 @@ module FPM
53
59
  Log.debug "git #{command} #{args.join(' ')}"
54
60
  safesystem('git', command, *args)
55
61
  end
62
+
63
+ def has_rev?(rev)
64
+ Log.debug "git show #{rev} >/dev/null 2>&1"
65
+ safesystem("git show #{rev} >/dev/null 2>&1")
66
+ true
67
+ rescue
68
+ false
69
+ end
56
70
  end
57
71
  end
58
72
  end
@@ -1,5 +1,5 @@
1
1
  module FPM
2
2
  module Cookery
3
- VERSION = '0.7.0'
3
+ VERSION = '0.8.0'
4
4
  end
5
5
  end
@@ -13,6 +13,7 @@ describe "PathHelper" do
13
13
  describe "path helper methods" do
14
14
  [ ['prefix', '/usr'],
15
15
  ['etc', '/etc'],
16
+ ['opt', '/opt'],
16
17
  ['var', '/var'],
17
18
  ['bin', '/usr/bin'],
18
19
  ['doc', '/usr/share/doc'],
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.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-26 00:00:00.000000000 Z
12
+ date: 2012-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fpm
16
- requirement: &81673760 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: '0.4'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *81673760
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.4'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: minitest
27
- requirement: &81673550 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *81673550
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rake
38
- requirement: &81075460 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,21 +53,31 @@ dependencies:
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *81075460
47
- - !ruby/object:Gem::Dependency
48
- name: fpm
49
- requirement: &81075040 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
50
57
  none: false
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: fpm
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '0.4'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *81075040
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '0.4'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: facter
60
- requirement: &81074500 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,7 +85,12 @@ dependencies:
65
85
  version: '0'
66
86
  type: :runtime
67
87
  prerelease: false
68
- version_requirements: *81074500
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  description: A tool for building software packages with fpm.
70
95
  email:
71
96
  - bernd@tuneafish.de
@@ -134,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
159
  version: '0'
135
160
  requirements: []
136
161
  rubyforge_project: fpm-cookery
137
- rubygems_version: 1.8.11
162
+ rubygems_version: 1.8.24
138
163
  signing_key:
139
164
  specification_version: 3
140
165
  summary: A tool for building software packages with fpm.