omnibus 5.3.0 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a17a0e151fcd48e38827a9504daafcbdeb58abe5
4
- data.tar.gz: 599d4ab2fb191028721c42fb912d836a05ef6e69
3
+ metadata.gz: 407d08f9b06a939ef258ff8c14f27b12afb74234
4
+ data.tar.gz: 84d25b4c5c73eede7828af010d99273771f2d547
5
5
  SHA512:
6
- metadata.gz: 829c377378e984fabdbc83f3e23e7f092a25c8dda2823391fa7c4198a873529c8f8750367abeca0b908ad9c3b6073633a4308aa90814cb0e114fe6a2d6a0b39f
7
- data.tar.gz: 6262ddf08f75fc3d49735e2f223a63c0eced1bf6050ab912f9a79113589c4dfd69ccc30abcc97f4c5caca60609435dabd861d09f0a6b88dd4ae61b586de77c32
6
+ metadata.gz: fecc2417ce2c9137d12a2675e52105e9f2b263e8953a1f264582c15204614fd8de7cb62792c9e6d9b46a18b69ce707973f275ce46490703eabbea4ee7c0e5b0f
7
+ data.tar.gz: b7d07fb926de84af9f2bb56b526bca9594a634c0b20a92e4b88d5daf206f595035ddf06bbe138c61b5a361f44b071bfb867f0ac2ce57dfee1336585cbf6b11fb
@@ -1,6 +1,20 @@
1
1
  Omnibus CHANGELOG
2
2
  =================
3
3
 
4
+ v5.4.0 (April 18, 2016)
5
+ -----------------------
6
+ ### New Features
7
+ - Include license and version manifest in generated `*.metadata.json` (#656)
8
+ - Deprecate the `--version-manifest` on `omnibus publish` (#656)
9
+ - Create Solaris IPS package (#654)
10
+ - Use symbolized keys for all Manifest hashes (#657)
11
+ - Publish a package’s `*.metadata.json` to Artifactory (#664)
12
+ - Add the build’s `LICENSE` content to `*.metadata.json` (#664)
13
+
14
+ ### Bug Fixes
15
+ - Add proper support for loading v2 manifests (#657)
16
+ - Replacing the use of JSON gem with FFI_yajl (#661)
17
+
4
18
  v5.3.0 (March 25, 2016)
5
19
  -----------------------
6
20
  ### New Features
@@ -18,6 +18,7 @@ Feature: omnibus manifest
18
18
  And the output should contain:
19
19
  """
20
20
  "software": {
21
+
21
22
  },
22
23
  """
23
24
 
@@ -6,3 +6,10 @@ Feature: omnibus publish
6
6
  """
7
7
  Publishing will be performed using provided platform mappings.
8
8
  """
9
+
10
+ Scenario: When a user provides the deprecated `--version-manifest` flag
11
+ * I run `omnibus publish artifactory fake * --version-manifest /fake/path/version-manifest.json`
12
+ * the output should contain:
13
+ """
14
+ The `--version-manifest' option has been deprecated. Version manifest data is now part of the `*.metadata.json' file
15
+ """
@@ -18,7 +18,6 @@ require 'omnibus/core_extensions'
18
18
 
19
19
  require 'cleanroom'
20
20
  require 'pathname'
21
- require 'json'
22
21
 
23
22
  require 'omnibus/exceptions'
24
23
  require 'omnibus/version'
@@ -16,6 +16,7 @@
16
16
 
17
17
  require 'thor'
18
18
  require 'omnibus'
19
+ require "ffi_yajl"
19
20
 
20
21
  module Omnibus
21
22
  class CLI < Command::Base
@@ -85,7 +86,7 @@ module Omnibus
85
86
  if @options[:output_manifest]
86
87
  FileUtils.mkdir_p('pkg')
87
88
  File.open(::File.join('pkg', 'version-manifest.json'), 'w') do |f|
88
- f.write(project.built_manifest.to_json)
89
+ f.write(FFI_Yajl::Encoder.encode(project.built_manifest.to_hash))
89
90
  end
90
91
  end
91
92
  end
@@ -121,7 +122,7 @@ module Omnibus
121
122
  Ohai['platform'] = @options[:platform] if @options[:platform]
122
123
  Ohai['platform_version'] = @options[:platform_version] if @options[:platform_version]
123
124
  Ohai['kernel']['machine'] = @options[:architecture] if @options[:architecture]
124
- puts JSON.pretty_generate(Project.load(name).built_manifest.to_hash)
125
+ puts FFI_Yajl::Encoder.encode(Project.load(name).built_manifest.to_hash, pretty: true)
125
126
  end
126
127
 
127
128
  #
@@ -18,6 +18,7 @@ require 'omnibus/changelog'
18
18
  require 'omnibus/changelog_printer'
19
19
  require 'omnibus/manifest_diff'
20
20
  require 'omnibus/semantic_version'
21
+ require 'ffi_yajl'
21
22
 
22
23
  module Omnibus
23
24
  class Command::ChangeLog < Command::Base
@@ -104,7 +105,7 @@ module Omnibus
104
105
  end
105
106
 
106
107
  def manifest_for_revision(rev)
107
- Omnibus::Manifest.from_hash(JSON.parse(local_git_repo.file_at_revision("version-manifest.json", rev)))
108
+ Omnibus::Manifest.from_hash(FFI_Yajl::Parser.parse(local_git_repo.file_at_revision("version-manifest.json", rev)))
108
109
  end
109
110
 
110
111
 
@@ -76,6 +76,11 @@ module Omnibus
76
76
  default: {}
77
77
  desc 'artifactory REPOSITORY PATTERN', 'Publish to an Artifactory instance'
78
78
  def artifactory(repository, pattern)
79
+
80
+ Omnibus.logger.deprecated('ArtifactoryPublisher') do
81
+ "The `--version-manifest' option has been deprecated. Version manifest data is now part of the `*.metadata.json' file"
82
+ end if options[:version_manifest]
83
+
79
84
  options[:repository] = repository
80
85
  publish(ArtifactoryPublisher, pattern, options)
81
86
  end
@@ -89,7 +94,7 @@ module Omnibus
89
94
  #
90
95
  def publish(klass, pattern, options)
91
96
  if options[:platform_mappings]
92
- options[:platform_mappings] = JSON.parse(File.read(File.expand_path(options[:platform_mappings])))
97
+ options[:platform_mappings] = FFI_Yajl::Parser.parse(File.read(File.expand_path(options[:platform_mappings])))
93
98
  end
94
99
 
95
100
  klass.publish(pattern, options) do |package|
@@ -14,7 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'json'
17
+ require 'ffi_yajl'
18
18
 
19
19
  module Omnibus
20
20
  class Manifest
@@ -35,8 +35,9 @@ module Omnibus
35
35
  end
36
36
 
37
37
  def entry_for(name)
38
- if @data.key?(name)
39
- @data[name]
38
+ name_sym = name.to_sym
39
+ if @data.key?(name_sym)
40
+ @data[name_sym]
40
41
  else
41
42
  raise MissingManifestEntry, "No manifest entry found for #{name}"
42
43
  end
@@ -47,11 +48,12 @@ module Omnibus
47
48
  raise NotAManifestEntry, "#{entry} is not an Omnibus:ManifestEntry"
48
49
  end
49
50
 
50
- if @data.key?(name)
51
+ name_sym = name.to_sym
52
+ if @data.key?(name_sym)
51
53
  log.warn(log_key) { "Overritting existing manifest entry for #{name}" }
52
54
  end
53
55
 
54
- @data[name] = entry
56
+ @data[name_sym] = entry
55
57
  self
56
58
  end
57
59
 
@@ -71,12 +73,12 @@ module Omnibus
71
73
  memo
72
74
  end
73
75
  ret = {
74
- 'manifest_format' => LATEST_MANIFEST_FORMAT,
75
- 'software' => software_hash
76
+ manifest_format: LATEST_MANIFEST_FORMAT,
77
+ software: software_hash
76
78
  }
77
- ret['build_version'] = build_version if build_version
78
- ret['build_git_revision'] = build_git_revision if build_git_revision
79
- ret['license'] = license
79
+ ret[:build_version] = build_version if build_version
80
+ ret[:build_git_revision] = build_git_revision if build_git_revision
81
+ ret[:license] = license
80
82
  ret
81
83
  end
82
84
 
@@ -86,7 +88,7 @@ module Omnibus
86
88
  # @return [String]
87
89
  #
88
90
  def to_json
89
- JSON.pretty_generate(to_hash)
91
+ FFI_Yajl::Encoder.encode(to_hash, pretty: true)
90
92
  end
91
93
 
92
94
  #
@@ -94,24 +96,36 @@ module Omnibus
94
96
  #
95
97
 
96
98
  def self.from_hash(manifest_data)
97
- case manifest_data['manifest_format'].to_i
99
+ case manifest_data[:manifest_format].to_i
98
100
  when 1
99
101
  from_hash_v1(manifest_data)
102
+ when 2
103
+ from_hash_v2(manifest_data)
100
104
  else
101
- raise InvalidManifestFormat, "Unknown manifest format version: #{manifest_data['manifest_format']}"
105
+ raise InvalidManifestFormat, "Unknown manifest format version: #{manifest_data[:manifest_format]}"
102
106
  end
103
107
  end
104
108
 
105
109
  def self.from_hash_v1(manifest_data)
106
- m = Omnibus::Manifest.new(manifest_data['build_version'], manifest_data['build_git_revision'])
107
- manifest_data['software'].each do |name, entry_data|
110
+ m = Omnibus::Manifest.new(manifest_data[:build_version], manifest_data[:build_git_revision])
111
+ manifest_data[:software].each do |name, entry_data|
112
+ m.add(name, Omnibus::ManifestEntry.new(name, keys_to_syms(entry_data)))
113
+ end
114
+ m
115
+ end
116
+
117
+ def self.from_hash_v2(manifest_data)
118
+ m = Omnibus::Manifest.new(manifest_data[:build_version], manifest_data[:build_git_revision], manifest_data[:license])
119
+ manifest_data[:software].each do |name, entry_data|
108
120
  m.add(name, Omnibus::ManifestEntry.new(name, keys_to_syms(entry_data)))
109
121
  end
110
122
  m
111
123
  end
112
124
 
113
125
  def self.from_file(filename)
114
- from_hash(JSON.parse(File.read(File.expand_path(filename))))
126
+ data = File.read(File.expand_path(filename))
127
+ hash = FFI_Yajl::Parser.parse(data, symbolize_names: true)
128
+ from_hash(hash)
115
129
  end
116
130
 
117
131
  private
@@ -28,11 +28,11 @@ module Omnibus
28
28
 
29
29
  def to_hash
30
30
  {
31
- "locked_version" => @locked_version,
32
- "locked_source" => @locked_source,
33
- "source_type" => @source_type,
34
- "described_version" => @described_version,
35
- "license" => @license
31
+ locked_version: @locked_version,
32
+ locked_source: @locked_source,
33
+ source_type: @source_type,
34
+ described_version: @described_version,
35
+ license: @license
36
36
  }
37
37
  end
38
38
 
@@ -14,7 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'json'
17
+ require 'ffi_yajl'
18
18
 
19
19
  module Omnibus
20
20
  class Metadata
@@ -61,6 +61,9 @@ module Omnibus
61
61
  homepage: project.homepage,
62
62
  version: project.build_version,
63
63
  iteration: project.build_iteration,
64
+ license: project.license,
65
+ version_manifest: project.built_manifest.to_hash,
66
+ license_content: File.exist?(project.license_file_path) ? File.read(project.license_file_path) : ''
64
67
  }
65
68
 
66
69
  instance = new(package, data)
@@ -78,7 +81,7 @@ module Omnibus
78
81
  #
79
82
  def for_package(package)
80
83
  data = File.read(path_for(package))
81
- hash = JSON.parse(data, symbolize_names: true)
84
+ hash = FFI_Yajl::Parser.parse(data, symbolize_names: true)
82
85
 
83
86
  # Ensure Platform version has been truncated
84
87
  if hash[:platform_version] && hash[:platform]
@@ -265,7 +268,7 @@ module Omnibus
265
268
  #
266
269
  def save
267
270
  File.open(path, 'w+') do |f|
268
- f.write(to_json)
271
+ f.write(FFI_Yajl::Encoder.encode(to_hash, pretty: true))
269
272
  end
270
273
 
271
274
  true
@@ -286,7 +289,7 @@ module Omnibus
286
289
  # @return [String]
287
290
  #
288
291
  def to_json
289
- JSON.pretty_generate(@data)
292
+ FFI_Yajl::Encoder.encode(@data, pretty: true)
290
293
  end
291
294
  end
292
295
  end
@@ -14,7 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'json'
17
+ require 'ffi_yajl'
18
18
 
19
19
  module Omnibus
20
20
  class Package
@@ -95,7 +95,7 @@ module Omnibus
95
95
  # The parsed contents of the metadata.
96
96
  #
97
97
  # @raise [NoPackageMetadataFile] if the {#metadata} does not exist
98
- # @raise [JSON::ParserError] if the JSON is not valid
98
+ # @raise [FFI_Yajl::ParseError] if the JSON is not valid
99
99
  #
100
100
  # @return [Hash<Symbol, String>]
101
101
  #
@@ -17,6 +17,7 @@
17
17
  module Omnibus
18
18
  module Packager
19
19
  include Logging
20
+ include Sugarable
20
21
 
21
22
  autoload :Base, 'omnibus/packagers/base'
22
23
  autoload :BFF, 'omnibus/packagers/bff'
@@ -25,6 +26,7 @@ module Omnibus
25
26
  autoload :MSI, 'omnibus/packagers/msi'
26
27
  autoload :PKG, 'omnibus/packagers/pkg'
27
28
  autoload :Solaris, 'omnibus/packagers/solaris'
29
+ autoload :IPS, 'omnibus/packagers/ips'
28
30
  autoload :RPM, 'omnibus/packagers/rpm'
29
31
 
30
32
  #
@@ -40,7 +42,8 @@ module Omnibus
40
42
  'rhel' => RPM,
41
43
  'wrlinux' => RPM,
42
44
  'aix' => BFF,
43
- 'solaris2' => Solaris,
45
+ 'solaris' => Solaris,
46
+ 'ips' => IPS,
44
47
  'windows' => MSI,
45
48
  'mac_os_x' => PKG,
46
49
  }.freeze
@@ -56,7 +59,13 @@ module Omnibus
56
59
  #
57
60
  def for_current_system
58
61
  family = Ohai['platform_family']
62
+ version = Ohai['platform_version']
59
63
 
64
+ if family == 'solaris2' && Chef::Sugar::Constraints::Version.new(version).satisfies?('>= 5.11')
65
+ family = "ips"
66
+ elsif family == 'solaris2' && Chef::Sugar::Constraints::Version.new(version).satisfies?('>= 5.10')
67
+ family = "solaris"
68
+ end
60
69
  if klass = PLATFORM_PACKAGER_MAP[family]
61
70
  klass
62
71
  else
@@ -64,7 +73,6 @@ module Omnibus
64
73
  "Could not determine packager for `#{family}', defaulting " \
65
74
  "to `makeself'!"
66
75
  end
67
-
68
76
  Makeself
69
77
  end
70
78
  end
@@ -0,0 +1,301 @@
1
+ #
2
+ # Copyright 2016 Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Omnibus
18
+ class Packager::IPS < Packager::Base
19
+ id :ips
20
+
21
+ setup do
22
+ create_directory(source_dir)
23
+ # Copy the full-stack installer into our scratch directory, accounting for
24
+ # any excluded files.
25
+ #
26
+ # /opt/hamlet => /tmp/daj29013/proto_install/opt/hamlet
27
+ # Create the proto_install directory inside staging_dir
28
+ destination = File.join(source_dir, project.install_dir)
29
+ FileSyncer.sync(project.install_dir, destination, exclude: exclusions)
30
+ write_transform_file
31
+ end
32
+
33
+ build do
34
+ #
35
+ # Package manifest generation is divided into the following stages:
36
+ #
37
+ write_pkg_metadata
38
+ generate_pkg_contents
39
+ generate_pkg_deps
40
+ validate_pkg_manifest
41
+
42
+ #
43
+ # To create an IPS package we need to generate a repo, publish our
44
+ # package into said repo. Finally, we export a portable `*.p5p`
45
+ # file from this repo.
46
+ #
47
+ create_ips_repo
48
+ publish_ips_pkg
49
+ export_pkg_archive_file
50
+ end
51
+
52
+ #
53
+ # @!group DSL methods
54
+ # --------------------------------------------------
55
+
56
+ #
57
+ # The publisher prefix for the IPS package.
58
+ #
59
+ # @example
60
+ # identifier 'Chef'
61
+ #
62
+ # @param [String] val
63
+ # the package identifier
64
+ #
65
+ # @return [String]
66
+ #
67
+ def publisher_prefix(val = NULL)
68
+ if null?(val)
69
+ @publisher_prefix || 'Omnibus'
70
+ else
71
+ @publisher_prefix = val
72
+ end
73
+ end
74
+ expose :publisher_prefix
75
+
76
+ #
77
+ # @!endgroup
78
+ # --------------------------------------------------
79
+
80
+ #
81
+ # @see Base#package_name
82
+ #
83
+ def package_name
84
+ "#{safe_base_package_name}.p5p"
85
+ end
86
+
87
+ #
88
+ # For more info about fmri see:
89
+ #
90
+ # http://docs.oracle.com/cd/E23824_01/html/E21796/pkg-5.html
91
+ #
92
+ def fmri_package_name
93
+ version = project.build_version.split(/[^\d]/)[0..2].join('.')
94
+ platform = Ohai['platform_version']
95
+ "#{safe_base_package_name}@#{version},#{platform}-#{project.build_iteration}"
96
+ end
97
+
98
+ #
99
+ # The full path to the transform file on disk.
100
+ #
101
+ # @return [String]
102
+ #
103
+ def transform_file
104
+ @transform_file ||= File.join(staging_dir, 'doc-transform')
105
+ end
106
+
107
+ #
108
+ # The full path to the pkg metadata file on disk.
109
+ #
110
+ # @return [String]
111
+ #
112
+ def pkg_metadata_file
113
+ @pkg_metadata_file ||= File.join(staging_dir, 'gen.manifestfile')
114
+ end
115
+
116
+ #
117
+ # The full path to the pkg manifest file on disk.
118
+ #
119
+ # @return [String]
120
+ #
121
+ def pkg_manifest_file
122
+ @pkg_manifest_file ||= File.join(staging_dir, "#{safe_base_package_name}.p5m")
123
+ end
124
+
125
+ #
126
+ # The path to the +publish/repo+ directory inside the staging directory.
127
+ #
128
+ # @return [String]
129
+ #
130
+ def repo_dir
131
+ @repo_dir ||= File.join(staging_dir, 'publish', 'repo')
132
+ end
133
+
134
+ #
135
+ # The path to the +proto-install+ directory inside the staging directory.
136
+ #
137
+ # @return [String]
138
+ #
139
+ def source_dir
140
+ @source_dir ||= File.join(staging_dir, 'proto_install')
141
+ end
142
+
143
+ #
144
+ # Return the IPS-ready base package name, converting any invalid characters to
145
+ # dashes (+-+).
146
+ #
147
+ # @return [String]
148
+ #
149
+ def safe_base_package_name
150
+ if project.package_name =~ /\A[a-z0-9\.\+\-]+\z/
151
+ project.package_name.dup
152
+ else
153
+ converted = project.package_name.downcase.gsub(/[^a-z0-9\.\+\-]+/, '-')
154
+
155
+ log.warn(log_key) do
156
+ "The `name' component of IPS package names can only include " \
157
+ "lowercase alphabetical characters (a-z), numbers (0-9), dots (.), " \
158
+ "plus signs (+), and dashes (-). Converting `#{project.package_name}' to " \
159
+ "`#{converted}'."
160
+ end
161
+ converted
162
+ end
163
+ end
164
+
165
+ #
166
+ # The architecture for this IPS package.
167
+ #
168
+ # @return [String]
169
+ #
170
+ def safe_architecture
171
+ if intel?
172
+ 'i386'
173
+ elsif sparc?
174
+ 'sparc'
175
+ else
176
+ Ohai['kernel']['machine']
177
+ end
178
+ end
179
+
180
+ #
181
+ # A set of transform rules that `pkgmogrify' will apply to the package
182
+ # manifest.
183
+ #
184
+ # @return [void]
185
+ #
186
+ def write_transform_file
187
+ render_template(resource_path('doc-transform.erb'),
188
+ destination: transform_file,
189
+ variables: {
190
+ pathdir: project.install_dir.split('/')[1],
191
+ }
192
+ )
193
+ end
194
+
195
+ #
196
+ # Generate package metadata
197
+ #
198
+ # Create the gen template for `pkgmogrify`
199
+ #
200
+ # @return [void]
201
+ #
202
+ def write_pkg_metadata
203
+ render_template(resource_path('gen.manifestfile.erb'),
204
+ destination: pkg_metadata_file,
205
+ variables: {
206
+ name: safe_base_package_name,
207
+ fmri_package_name: fmri_package_name,
208
+ description: project.description,
209
+ summary: project.friendly_name,
210
+ arch: safe_architecture,
211
+ }
212
+ )
213
+
214
+ # Print the full contents of the rendered template file to generate package contents
215
+ log.debug(log_key) { "Rendered Template:\n" + File.read(pkg_metadata_file) }
216
+ end
217
+
218
+ #
219
+ # Create the package contents using `pkgsend` and `pkgfmt`
220
+ #
221
+ # @return [void]
222
+ #
223
+ def generate_pkg_contents
224
+ shellout!("pkgsend generate #{source_dir} | pkgfmt > #{pkg_manifest_file}.1")
225
+ shellout!("pkgmogrify -DARCH=`uname -p` #{pkg_manifest_file}.1 #{pkg_metadata_file} #{transform_file} | pkgfmt > #{pkg_manifest_file}.2")
226
+ end
227
+
228
+ #
229
+ # Generate the package deps
230
+ #
231
+ # @return [void]
232
+ #
233
+ def generate_pkg_deps
234
+ shellout!("pkgdepend generate -md #{source_dir} #{pkg_manifest_file}.2 | pkgfmt > #{pkg_manifest_file}.3")
235
+ shellout!("pkgmogrify -DARCH=`uname -p` #{pkg_manifest_file}.3 #{transform_file} | pkgfmt > #{pkg_manifest_file}.4")
236
+ shellout!("pkgdepend resolve -m #{pkg_manifest_file}.4")
237
+ end
238
+
239
+ #
240
+ # Validate the generated package manifest using `pkglint`
241
+ #
242
+ # @return [void]
243
+ #
244
+ def validate_pkg_manifest
245
+ log.info(log_key) { "Validating package manifest" }
246
+ shellout!("pkglint -c /tmp/lint-cache -r http://pkg.oracle.com/solaris/release #{pkg_manifest_file}.4.res")
247
+ end
248
+
249
+ #
250
+ # Create a local IPS repo for publishing
251
+ #
252
+ # @return [void]
253
+ #
254
+ def create_ips_repo
255
+ shellout!("pkgrepo create #{repo_dir}")
256
+ log.info(log_key) { "Created IPS repo: #{repo_dir}" }
257
+ end
258
+
259
+ #
260
+ # Publish the IPS pkg into the local IPS repo
261
+ #
262
+ # @return [void]
263
+ #
264
+ def publish_ips_pkg
265
+ shellout!("pkgrepo -s #{repo_dir} set publisher/prefix=#{publisher_prefix}")
266
+ shellout!("pkgsend publish -s #{repo_dir} -d #{source_dir} #{pkg_manifest_file}.4.res")
267
+ log.info(log_key) { "Published IPS package to repo: #{repo_dir}"}
268
+
269
+ repo_info = shellout("pkg list -afv -g #{repo_dir}").stdout
270
+ log.debug(log_key) do
271
+ <<-EOH.strip
272
+ Published IPS package:
273
+
274
+ #{repo_info}
275
+ EOH
276
+ end
277
+ end
278
+
279
+ #
280
+ # Convert a the published IPS pkg from the local repo into the more
281
+ # easily distributable `*.p5p` archive.
282
+ #
283
+ # @return [void]
284
+ #
285
+ def export_pkg_archive_file
286
+ # The destination file cannot already exist
287
+ File.delete(package_path) if File.exist?(package_path)
288
+ shellout!("pkgrecv -s #{repo_dir} -a -d #{package_path} #{safe_base_package_name}")
289
+ log.info(log_key) { "Exported IPS package archive: #{package_path}"}
290
+
291
+ list_pkgarchive = shellout("pkgrepo list -s #{package_path} '*@latest'").stdout
292
+ log.debug(log_key) do
293
+ <<-EOH.strip
294
+ IPS package archive contents:
295
+
296
+ #{list_pkgarchive}
297
+ EOH
298
+ end
299
+ end
300
+ end
301
+ end