omnibus 5.1.0 → 5.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6c6004b5090f1bef33eea64eec8e741fef4af4d
4
- data.tar.gz: 540e7c85bff51d2e8865325d388e08260be11b98
3
+ metadata.gz: d909e83257599b77c57d11ad3f4cad644286d005
4
+ data.tar.gz: ff63967a1b6a5189f29bb6524e73af08ecfc2d29
5
5
  SHA512:
6
- metadata.gz: 3d4e0d40424b6e0e5d2ebbaa0fa411fe9435bde23c508dfa22e84a10337153415e6467c9c40a41cfed138c9cb1ec77660c19a211fe491e8d9839cf83e587a358
7
- data.tar.gz: a6d063e1f4772956aa11a0264d5a06611b6de49ea184cc4a89aa0296a1c0cc02be3b21e721270b31730e9ccadff4578dca5edc0df60f5d10e91d77afc24b5efc
6
+ metadata.gz: 5c02188f92090b922772ffc0c9c50a92ae32224a90ae36d0c5b3fe3bf79c56e3e32043ef797ade533ac783700665ea8b8874bfea24954c8db5190a21321565ef
7
+ data.tar.gz: 67be7899e3af5eff14c57d54c2d414165daa3b4811a65e8f4491a355a2725274f6522ca6daa4a7b8a3df1251657659e71b1ed8d664afecdd6e7561522ff16726
@@ -1,6 +1,28 @@
1
1
  Omnibus CHANGELOG
2
2
  =================
3
3
 
4
+ v5.2.0 (March 15, 2016)
5
+ -----------------------
6
+ ### New Features
7
+
8
+ - License reporting (#635):
9
+ - Add `license` & `license_file` DSL methods to software.
10
+ - `license` (String): Sets the license of the software component.
11
+ - `license_file` (String): The relative path or the url of the license file of the software to be included in `"LICENSES"` directory.
12
+ - Can be used multiple times.
13
+ - You can use `:project_license` as a special value if the software is build related code and if it is using project's license.
14
+ - Add `license`, `license_file` and `license_file_path` DSL methods to project.
15
+ - `license` (String): Sets the license of the project.
16
+ - `license_file` (String): The relative path or the url of the license file of the project to be included in the file that will be created at project.license_file_path.
17
+ - `license_file_path` (String): The relative path of the main license file that will be created for the project. Default: `"LICENSE"`.
18
+
19
+ With this omnibus will:
20
+
21
+ 1. Collect all the license files specified in software components into `install_dir/LICENSES` directory.
22
+ 2. Create a license file at `install_dir/LICENSE` which will contain license of the project and license information for all the software components that are being included.
23
+ - Ability to change `dist_tag` in RPM packager. (#634)
24
+ - Ability to update submodules during git checkout. (#603)
25
+
4
26
  v5.1.0 (March 10, 2016)
5
27
  -----------------------
6
28
  ### New Features
@@ -62,6 +62,7 @@ module Omnibus
62
62
  autoload :Templating, 'omnibus/templating'
63
63
  autoload :ThreadPool, 'omnibus/thread_pool'
64
64
  autoload :Util, 'omnibus/util'
65
+ autoload :Licensing, 'omnibus/licensing'
65
66
 
66
67
  autoload :GitFetcher, 'omnibus/fetchers/git_fetcher'
67
68
  autoload :NetFetcher, 'omnibus/fetchers/net_fetcher'
@@ -154,6 +154,7 @@ module Omnibus
154
154
  # default when a sha1 is provided). git older than 1.7.5 doesn't
155
155
  # support the --detach flag.
156
156
  git("checkout #{resolved_version} -f -q")
157
+ git("submodule update --recursive") if clone_submodules?
157
158
  end
158
159
 
159
160
  #
@@ -0,0 +1,227 @@
1
+ #
2
+ # Copyright 2015 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
+ require 'uri'
18
+ require 'fileutils'
19
+
20
+ module Omnibus
21
+ class Licensing
22
+ include Logging
23
+
24
+ OUTPUT_DIRECTORY = "LICENSES".freeze
25
+
26
+ class << self
27
+ # @see (Licensing#create!)
28
+ def create!(project)
29
+ new(project).create!
30
+ end
31
+ end
32
+
33
+ #
34
+ # The project to create licenses for.
35
+ #
36
+ # @return [Project]
37
+ #
38
+ attr_reader :project
39
+
40
+ #
41
+ # @param [Project] project
42
+ # the project to create licenses for.
43
+ #
44
+ def initialize(project)
45
+ @project = project
46
+ end
47
+
48
+ #
49
+ # Creates the license files for given project.
50
+ # It is assumed that the project has already been built.
51
+ #
52
+ # @return [void]
53
+ #
54
+ def create!
55
+ prepare
56
+ create_software_license_files
57
+ create_project_license_file
58
+ end
59
+
60
+ #
61
+ # Creates the required directories for licenses.
62
+ #
63
+ # @return [void]
64
+ #
65
+ def prepare
66
+ FileUtils.rm_rf(output_dir)
67
+ FileUtils.mkdir_p(output_dir)
68
+ end
69
+
70
+ #
71
+ # Creates the top level license file for the project.
72
+ # Top level file is created at #{project.license_file_path}
73
+ # and contains the name of the project, version of the project,
74
+ # text of the license of the project and a summary of the licenses
75
+ # of the included software components.
76
+ #
77
+ # @return [void]
78
+ #
79
+ def create_project_license_file
80
+ File.open(project.license_file_path, 'w') do |f|
81
+ f.puts "#{project.name} #{project.build_version} license: \"#{project.license}\""
82
+ f.puts ""
83
+ f.puts project_license_content
84
+ f.puts ""
85
+ f.puts components_license_summary
86
+ end
87
+ end
88
+
89
+ #
90
+ # Copies the license files specified by the software components into the
91
+ # output directory.
92
+ #
93
+ # @return [void]
94
+ #
95
+ def create_software_license_files
96
+ license_map.each do |name, values|
97
+ license_files = values[:license_files]
98
+
99
+ license_files.each do |license_file|
100
+ if license_file && local?(license_file)
101
+ input_file = File.expand_path(license_file, values[:project_dir])
102
+ output_file = license_package_location(name, license_file)
103
+ FileUtils.cp(input_file, output_file) if File.exist?(input_file)
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ #
110
+ # Contents of the project's license
111
+ #
112
+ # @return [String]
113
+ #
114
+ def project_license_content
115
+ project.license_file.nil? ? "" : IO.read(File.join(Config.project_root,project.license_file))
116
+ end
117
+
118
+ #
119
+ # Summary of the licenses included by the softwares of the project.
120
+ # It is in the form of:
121
+ # ...
122
+ # This product bundles python 2.7.9,
123
+ # which is available under a "Python" License.
124
+ # For details, see:
125
+ # /opt/opscode/LICENSES/python-LICENSE
126
+ # ...
127
+ #
128
+ # @return [String]
129
+ #
130
+ def components_license_summary
131
+ out = "\n\n"
132
+
133
+ license_map.keys.sort.each do |name|
134
+ license = license_map[name][:license]
135
+ license_files = license_map[name][:license_files]
136
+ version = license_map[name][:version]
137
+
138
+ out << "This product bundles #{name} #{version},\n"
139
+ out << "which is available under a \"#{license}\" License.\n"
140
+ if !license_files.empty?
141
+ out << "For details, see:\n"
142
+ license_files.each do |license_file|
143
+ out << "#{license_package_location(name, license_file)}\n"
144
+ end
145
+ end
146
+ out << "\n"
147
+ end
148
+
149
+ out
150
+ end
151
+
152
+ #
153
+ # Map that collects information about the licenses of the softwares
154
+ # included in the project.
155
+ #
156
+ # @example
157
+ # {
158
+ # ...
159
+ # "python" => {
160
+ # "license" => "Python",
161
+ # "license_files" => "LICENSE",
162
+ # "version" => "2.7.9",
163
+ # "project_dir" => "/var/cache/omnibus/src/python/Python-2.7.9/"
164
+ # },
165
+ # ...
166
+ # }
167
+ #
168
+ # @return [Hash]
169
+ #
170
+ def license_map
171
+ @license_map ||= begin
172
+ map = {}
173
+
174
+ project.library.each do |component|
175
+ # Some of the components do not bundle any software but contain
176
+ # some logic that we use during the build. These components are
177
+ # covered under the project's license and they do not need specific
178
+ # license files.
179
+ next if component.license == :project_license
180
+
181
+ map[component.name] = {
182
+ license: component.license,
183
+ license_files: component.license_files,
184
+ version: component.version,
185
+ project_dir: component.project_dir,
186
+ }
187
+ end
188
+
189
+ map
190
+ end
191
+ end
192
+
193
+ #
194
+ # Returns the location where the license file should reside in the package.
195
+ # License file is named as <project_name>-<license_file_name> and created
196
+ # under the output licenses directory.
197
+ #
198
+ # @return [String]
199
+ #
200
+ def license_package_location(component_name, where)
201
+ if local?(where)
202
+ File.join(output_dir, "#{component_name}-#{File.split(where).last}")
203
+ else
204
+ where
205
+ end
206
+ end
207
+
208
+ #
209
+ # Output directory to create the licenses in.
210
+ #
211
+ # @return [String]
212
+ #
213
+ def output_dir
214
+ File.expand_path(OUTPUT_DIRECTORY, project.install_dir)
215
+ end
216
+
217
+ #
218
+ # Returns if the given path to a license is local or a remote url.
219
+ #
220
+ # @return [Boolean]
221
+ #
222
+ def local?(license)
223
+ u = URI(license)
224
+ return u.scheme.nil?
225
+ end
226
+ end
227
+ end
@@ -24,13 +24,14 @@ module Omnibus
24
24
 
25
25
  include Logging
26
26
 
27
- LATEST_MANIFEST_FORMAT = 1
27
+ LATEST_MANIFEST_FORMAT = 2
28
28
 
29
- attr_reader :build_version, :build_git_revision
30
- def initialize(version=nil, git_rev=nil)
29
+ attr_reader :build_version, :build_git_revision, :license
30
+ def initialize(version=nil, git_rev=nil, license="Unspecified")
31
31
  @data = {}
32
32
  @build_version = version
33
33
  @build_git_revision = git_rev
34
+ @license = license
34
35
  end
35
36
 
36
37
  def entry_for(name)
@@ -75,6 +76,7 @@ module Omnibus
75
76
  }
76
77
  ret['build_version'] = build_version if build_version
77
78
  ret['build_git_revision'] = build_git_revision if build_git_revision
79
+ ret['license'] = license
78
80
  ret
79
81
  end
80
82
 
@@ -16,13 +16,14 @@
16
16
 
17
17
  module Omnibus
18
18
  class ManifestEntry
19
- attr_reader :locked_version, :locked_source, :source_type, :described_version, :name
19
+ attr_reader :locked_version, :locked_source, :source_type, :described_version, :name, :license
20
20
  def initialize(name, manifest_data)
21
21
  @name = name
22
22
  @locked_version = manifest_data[:locked_version]
23
23
  @locked_source = manifest_data[:locked_source]
24
24
  @source_type = manifest_data[:source_type]
25
25
  @described_version = manifest_data[:described_version]
26
+ @license = manifest_data[:license]
26
27
  end
27
28
 
28
29
  def to_hash
@@ -30,7 +31,8 @@ module Omnibus
30
31
  "locked_version" => @locked_version,
31
32
  "locked_source" => @locked_source,
32
33
  "source_type" => @source_type,
33
- "described_version" => @described_version
34
+ "described_version" => @described_version,
35
+ "license" => @license
34
36
  }
35
37
  end
36
38
 
@@ -202,6 +202,31 @@ module Omnibus
202
202
  end
203
203
  expose :category
204
204
 
205
+ #
206
+ # Set or return the dist_tag for this package
207
+ #
208
+ # The Dist Tag for this RPM package as per the Fedora packaging guidlines.
209
+ #
210
+ # @see http://fedoraproject.org/wiki/Packaging:DistTag
211
+ #
212
+ # @example
213
+ # dist_tag ".#{Omnibus::Metadata.platform_shortname}#{Omnibus::Metadata.platform_version}"
214
+ #
215
+ # @param [String] val
216
+ # the dist_tag for this package
217
+ #
218
+ # @return [String]
219
+ # the dist_tag for this package
220
+ #
221
+ def dist_tag(val = NULL)
222
+ if null?(val)
223
+ @dist_tag || ".#{Omnibus::Metadata.platform_shortname}#{Omnibus::Metadata.platform_version}"
224
+ else
225
+ @dist_tag = val
226
+ end
227
+ end
228
+ expose :dist_tag
229
+
205
230
  #
206
231
  # @!endgroup
207
232
  # --------------------------------------------------
@@ -210,7 +235,11 @@ module Omnibus
210
235
  # @return [String]
211
236
  #
212
237
  def package_name
213
- "#{safe_base_package_name}-#{safe_version}-#{safe_build_iteration}#{dist_tag}.#{safe_architecture}.rpm"
238
+ if dist_tag
239
+ "#{safe_base_package_name}-#{safe_version}-#{safe_build_iteration}#{dist_tag}.#{safe_architecture}.rpm"
240
+ else
241
+ "#{safe_base_package_name}-#{safe_version}-#{safe_build_iteration}.#{safe_architecture}.rpm"
242
+ end
214
243
  end
215
244
 
216
245
  #
@@ -435,17 +464,6 @@ module Omnibus
435
464
  .gsub("%", "[%]")
436
465
  end
437
466
 
438
- #
439
- # The Dist Tag for this RPM package per the Fedora packaging guidlines.
440
- #
441
- # @see http://fedoraproject.org/wiki/Packaging:DistTag
442
- #
443
- # @return [String]
444
- #
445
- def dist_tag
446
- ".#{Omnibus::Metadata.platform_shortname}#{Omnibus::Metadata.platform_version}"
447
- end
448
-
449
467
  #
450
468
  # Return the RPM-ready base package name, converting any invalid characters to
451
469
  # dashes (+-+).
@@ -691,6 +691,70 @@ module Omnibus
691
691
  end
692
692
  expose :ohai
693
693
 
694
+ #
695
+ # Set or retrieve the {#license} of the project.
696
+ #
697
+ # @example
698
+ # license 'Apache 2.0'
699
+ #
700
+ # @param [String] val
701
+ # the license to set for the project.
702
+ #
703
+ # @return [String]
704
+ #
705
+ def license(val = NULL)
706
+ if null?(val)
707
+ @license || 'Unspecified'
708
+ else
709
+ @license = val
710
+ end
711
+ end
712
+ expose :license
713
+
714
+ #
715
+ # Set or retrieve the location of the {#license_file}
716
+ # of the project. It can either be a relative path inside
717
+ # the project source directory or a URL.
718
+ #
719
+ #
720
+ # @example
721
+ # license_file 'LICENSES/artistic.txt'
722
+ #
723
+ # @param [String] val
724
+ # the location of the license file for the project.
725
+ #
726
+ # @return [String]
727
+ #
728
+ def license_file(val = NULL)
729
+ if null?(val)
730
+ @license_file
731
+ else
732
+ @license_file = val
733
+ end
734
+ end
735
+ expose :license_file
736
+
737
+ #
738
+ # Location of license file that omnibus will create and that will contain
739
+ # the information about the license of the project plus the details about
740
+ # the licenses of the software components included in the project.
741
+ #
742
+ # If no path is specified install_dir/LICENSE is used.
743
+ #
744
+ # @example
745
+ # license_file_path
746
+ #
747
+ # @return [String]
748
+ #
749
+ def license_file_path(path = NULL)
750
+ if null?(path)
751
+ @license_file_path || File.join(install_dir, "LICENSE")
752
+ else
753
+ @license_file_path = File.join(install_dir, path)
754
+ end
755
+ end
756
+ expose :license_file_path
757
+
694
758
  #
695
759
  # Location of json-formated version manifest, written at at the
696
760
  # end of the build. If no path is specified
@@ -983,7 +1047,7 @@ module Omnibus
983
1047
  #
984
1048
  def built_manifest
985
1049
  log.info(log_key) { "Building version manifest" }
986
- m = Omnibus::Manifest.new(build_version, build_git_revision)
1050
+ m = Omnibus::Manifest.new(build_version, build_git_revision, license)
987
1051
  softwares.each do |software|
988
1052
  m.add(software.name, software.manifest_entry)
989
1053
  end
@@ -1008,6 +1072,7 @@ module Omnibus
1008
1072
 
1009
1073
  write_json_manifest
1010
1074
  write_text_manifest
1075
+ Licensing.create!(self)
1011
1076
  HealthCheck.run!(self)
1012
1077
  package_me
1013
1078
  compress_me
@@ -327,6 +327,46 @@ module Omnibus
327
327
  end
328
328
  expose :default_version
329
329
 
330
+ #
331
+ # Set or retrieve the {#license} of the software to build.
332
+ #
333
+ # @example
334
+ # license 'Apache 2.0'
335
+ #
336
+ # @param [String] val
337
+ # the license to set for the software.
338
+ #
339
+ # @return [String]
340
+ #
341
+ def license(val = NULL)
342
+ if null?(val)
343
+ @license || 'Unspecified'
344
+ else
345
+ @license = val
346
+ end
347
+ end
348
+ expose :license
349
+
350
+ #
351
+ # Set or retrieve the location of a {#license_file}
352
+ # of the software. It can either be a relative path inside
353
+ # the source package or a URL.
354
+ #
355
+ #
356
+ # @example
357
+ # license_file 'LICENSES/artistic.txt'
358
+ #
359
+ # @param [String] val
360
+ # the location of the license file for the software.
361
+ #
362
+ # @return [String]
363
+ #
364
+ def license_file(file)
365
+ license_files << file
366
+ license_files.dup
367
+ end
368
+ expose :license_file
369
+
330
370
  #
331
371
  # Evaluate a block only if the version matches.
332
372
  #
@@ -727,7 +767,9 @@ module Omnibus
727
767
  source_type: source_type,
728
768
  described_version: version,
729
769
  locked_version: Fetcher.resolve_version(version, source),
730
- locked_source: source})
770
+ locked_source: source,
771
+ license: license
772
+ })
731
773
  end
732
774
 
733
775
  #
@@ -770,6 +812,17 @@ module Omnibus
770
812
  @whitelist_files ||= []
771
813
  end
772
814
 
815
+ #
816
+ # The list of license files for this software
817
+ #
818
+ # @see #license_file
819
+ #
820
+ # @return [Array<String>]
821
+ #
822
+ def license_files
823
+ @license_files ||= []
824
+ end
825
+
773
826
  #
774
827
  # The path (on disk) where this software came from. Warning: this can be
775
828
  # +nil+ if a software was dynamically created!
@@ -15,5 +15,5 @@
15
15
  #
16
16
 
17
17
  module Omnibus
18
- VERSION = '5.1.0'
18
+ VERSION = '5.2.0'
19
19
  end
@@ -17,7 +17,7 @@
17
17
  # Metadata
18
18
  Name: <%= name %>
19
19
  Version: <%= version %>
20
- Release: <%= iteration %><%= dist_tag %>
20
+ Release: <%= iteration %><%= dist_tag ? dist_tag : '' %>
21
21
  Summary: <%= description.split("\n").first.empty? ? "_" : description.split("\n").first %>
22
22
  AutoReqProv: no
23
23
  BuildRoot: %buildroot
@@ -608,7 +608,7 @@ module Omnibus
608
608
  end
609
609
  end
610
610
 
611
- describe '#update_config_guess', :not_supported_on_windows, :focus => true do
611
+ describe '#update_config_guess', :not_supported_on_windows do
612
612
  let(:config_guess_dir) { "#{install_dir}/embedded/lib/config_guess" }
613
613
 
614
614
  before do
@@ -0,0 +1,141 @@
1
+ require "spec_helper"
2
+
3
+ module Omnibus
4
+ describe Licensing do
5
+ let(:license) { nil }
6
+ let(:license_file_path) { nil }
7
+ let(:license_file) { nil }
8
+
9
+ let(:install_dir) { File.join(tmp_path, "install_dir")}
10
+ let(:software_project_dir) { File.join(tmp_path, "software_project_dir")}
11
+
12
+ before do
13
+ FileUtils.mkdir_p(install_dir)
14
+ FileUtils.mkdir_p(software_project_dir)
15
+ allow_any_instance_of(Software).to receive(:project_dir).and_return(software_project_dir)
16
+ %w{README LICENSE NOTICE}.each do |file|
17
+ File.open(File.join(software_project_dir, file), "w+") do |f|
18
+ f.puts "This file is #{file}."
19
+ end
20
+ end
21
+ end
22
+
23
+ shared_examples "correctly created licenses" do
24
+ it "creates the main license file for the project correctly" do
25
+ project_license = File.join(install_dir, expected_project_license_path)
26
+ expect(File.exist?(project_license)).to be(true)
27
+ project_license = File.read(project_license)
28
+ expect(project_license).to match /test-project 1.2.3 license: "#{expected_project_license}"/
29
+ expect(project_license).to match /#{expected_project_license_content}/
30
+ expect(project_license).to match /This product bundles private_code 1.7.2,\nwhich is available under a "Unspecified"/
31
+ expect(project_license).to match /This product bundles snoopy 1.0.0,\nwhich is available under a "GPL v2"/
32
+ expect(project_license).to match /This product bundles zlib 1.7.2,\nwhich is available under a "Zlib"/
33
+ expect(project_license).not_to match /preparation/
34
+ expect(project_license).to match /LICENSES\/snoopy-README/
35
+ expect(project_license).to match /LICENSES\/snoopy-NOTICE/
36
+ expect(project_license).to match /LICENSES\/zlib-LICENSE/
37
+ end
38
+
39
+ it "creates the license files of software components correctly" do
40
+ license_dir = File.join(install_dir, "LICENSES")
41
+ expect(Dir.glob("#{license_dir}/**/*").length).to be(3)
42
+
43
+ %w{snoopy-NOTICE snoopy-README zlib-LICENSE}.each do |software_license|
44
+ license_path = File.join(license_dir, software_license)
45
+ expect(File.exist?(license_path)).to be(true)
46
+ expect(File.read(license_path)).to match /#{software_license.split("-").last}/
47
+ end
48
+ end
49
+ end
50
+
51
+ let(:project) do
52
+ Project.new.tap do |project|
53
+ project.name('test-project')
54
+ project.install_dir(install_dir)
55
+ project.license(license) unless license.nil?
56
+ project.license_file_path(license_file_path) unless license_file_path.nil?
57
+ project.license_file(license_file) unless license_file.nil?
58
+ project.build_version('1.2.3')
59
+ end
60
+ end
61
+
62
+ let(:private_code) do
63
+ Software.new(project, 'private_code.rb').evaluate do
64
+ name 'private_code'
65
+ default_version '1.7.2'
66
+ end
67
+ end
68
+
69
+ let(:zlib) do
70
+ Software.new(project, 'zlib.rb').evaluate do
71
+ name 'zlib'
72
+ default_version '1.7.2'
73
+ license "Zlib"
74
+ license_file "LICENSE"
75
+ end
76
+ end
77
+
78
+ let(:snoopy) do
79
+ Software.new(project, 'snoopy.rb').evaluate do
80
+ name 'snoopy'
81
+ default_version '1.0.0'
82
+ license "GPL v2"
83
+ license_file "README"
84
+ license_file "NOTICE"
85
+ end
86
+ end
87
+
88
+ let(:preparation) do
89
+ Software.new(project, 'preparation.rb').evaluate do
90
+ name 'preparation'
91
+ default_version '1.0.0'
92
+ license :project_license
93
+ end
94
+ end
95
+
96
+ def create_licenses
97
+ project.library.component_added(preparation)
98
+ project.library.component_added(snoopy)
99
+ project.library.component_added(zlib)
100
+ project.library.component_added(private_code)
101
+
102
+ Licensing.create!(project)
103
+ end
104
+
105
+ describe "without license definitions in the project" do
106
+ let(:expected_project_license_path) { "LICENSE" }
107
+ let(:expected_project_license) { "Unspecified" }
108
+ let(:expected_project_license_content) { "" }
109
+
110
+ before do
111
+ create_licenses
112
+ end
113
+
114
+ it_behaves_like "correctly created licenses"
115
+ end
116
+
117
+ describe "with license definitions in the project" do
118
+ let(:license) { "Custom Chef" }
119
+ let(:license_file_path) { "CHEF.LICENSE" }
120
+ let(:license_file) { "CUSTOM_CHEF" }
121
+
122
+ let(:expected_project_license_path) { license_file_path }
123
+ let(:expected_project_license) { license }
124
+ let(:expected_project_license_content) { "Chef Custom License" }
125
+
126
+ before do
127
+ File.open(File.join(Config.project_root, license_file), "w+") do |f|
128
+ f.puts "Chef Custom License is awesome."
129
+ end
130
+
131
+ create_licenses
132
+ end
133
+
134
+ after do
135
+ FileUtils.rm_rf(license_file)
136
+ end
137
+
138
+ it_behaves_like "correctly created licenses"
139
+ end
140
+ end
141
+ end
@@ -71,6 +71,10 @@ module Omnibus
71
71
  it "returns a build_git_revision if one was passed in" do
72
72
  expect(Omnibus::Manifest.new("1.2.3", "e8e8e8").to_hash["build_git_revision"]).to eq("e8e8e8")
73
73
  end
74
+
75
+ it "returns a license if one was passed in" do
76
+ expect(Omnibus::Manifest.new("1.2.3", "e8e8e8", "Apache").to_hash["license"]).to eq("Apache")
77
+ end
74
78
  end
75
79
 
76
80
  describe "#from_hash" do
@@ -105,6 +105,16 @@ module Omnibus
105
105
  end
106
106
  end
107
107
 
108
+ describe '#dist_tag' do
109
+ it 'is a DSL method' do
110
+ expect(subject).to have_exposed_method(:dist_tag)
111
+ end
112
+
113
+ it 'has a default value' do
114
+ expect(subject.dist_tag).to eq('.el6')
115
+ end
116
+ end
117
+
108
118
  describe '#id' do
109
119
  it 'is :rpm' do
110
120
  expect(subject.id).to eq(:rpm)
@@ -112,12 +122,24 @@ module Omnibus
112
122
  end
113
123
 
114
124
  describe '#package_name' do
115
- before do
116
- allow(subject).to receive(:safe_architecture).and_return('x86_64')
125
+ context 'when dist_tag is enabled' do
126
+ before do
127
+ allow(subject).to receive(:safe_architecture).and_return('x86_64')
128
+ end
129
+
130
+ it 'includes the name, version, and build iteration' do
131
+ expect(subject.package_name).to eq('project-1.2.3-2.el6.x86_64.rpm')
132
+ end
117
133
  end
118
134
 
119
- it 'includes the name, version, and build iteration' do
120
- expect(subject.package_name).to eq('project-1.2.3-2.el6.x86_64.rpm')
135
+ context 'when dist_tag is disabled' do
136
+ before do
137
+ allow(subject).to receive(:dist_tag).and_return(false)
138
+ end
139
+
140
+ it 'excludes dist tag' do
141
+ expect(subject.package_name).to eq('project-1.2.3-2.x86_64.rpm')
142
+ end
121
143
  end
122
144
  end
123
145
 
@@ -254,6 +276,20 @@ module Omnibus
254
276
  expect(contents).not_to include("BuildArch")
255
277
  end
256
278
  end
279
+
280
+ context 'when dist_tag is disabled' do
281
+ let(:spec_file) { "#{staging_dir}/SPECS/project-1.2.3-2.x86_64.rpm.spec" }
282
+
283
+ before do
284
+ allow(subject).to receive(:dist_tag).and_return(false)
285
+ end
286
+
287
+ it 'has the correct release' do
288
+ subject.write_rpm_spec
289
+ contents = File.read(spec_file)
290
+ expect(contents).to include("Release: 2")
291
+ end
292
+ end
257
293
  end
258
294
 
259
295
  describe '#create_rpm_file' do
@@ -319,12 +355,6 @@ module Omnibus
319
355
  end
320
356
  end
321
357
 
322
- describe '#dist_tag' do
323
- it 'returns the Fedora packaging guidelines dist tag for the package' do
324
- expect(subject.dist_tag).to eq('.el6')
325
- end
326
- end
327
-
328
358
  describe '#safe_base_package_name' do
329
359
  context 'when the project name is "safe"' do
330
360
  it 'returns the value without logging a message' do
@@ -45,6 +45,9 @@ module Omnibus
45
45
  it_behaves_like 'a cleanroom setter', :json_manifest_path, %|json_manifest_path '/path/to/manifest.txt'|
46
46
  it_behaves_like 'a cleanroom setter', :build_git_revision, %|build_git_revision 'wombats'|
47
47
  it_behaves_like 'a cleanroom getter', :files_path
48
+ it_behaves_like 'a cleanroom setter', :license, %|license 'Apache 2.0'|
49
+ it_behaves_like 'a cleanroom setter', :license_file, %|license_file 'LICENSES/artistic.txt'|
50
+ it_behaves_like 'a cleanroom setter', :license_file_path, %|license_file_path 'CHEF_LICENSE'|
48
51
 
49
52
  describe 'basics' do
50
53
  it 'returns a name' do
@@ -142,6 +145,18 @@ module Omnibus
142
145
  end
143
146
  end
144
147
 
148
+ describe '#license' do
149
+ it "sets the default to Unspecified" do
150
+ expect(subject.license).to eq ('Unspecified')
151
+ end
152
+ end
153
+
154
+ describe '#license_file_path' do
155
+ it "sets the default to LICENSE" do
156
+ expect(subject.license_file_path).to eq ('/sample/LICENSE')
157
+ end
158
+ end
159
+
145
160
  describe '#dirty!' do
146
161
  let(:software) { double(Omnibus::Software) }
147
162
 
@@ -39,6 +39,8 @@ module Omnibus
39
39
  it_behaves_like 'a cleanroom setter', :source, %|source url: 'https://source.example.com'|
40
40
  it_behaves_like 'a cleanroom setter', :default_version, %|default_version '1.2.3'|
41
41
  it_behaves_like 'a cleanroom setter', :version, %|version '1.2.3'|
42
+ it_behaves_like 'a cleanroom setter', :license, %|license 'Apache 2.0'|
43
+ it_behaves_like 'a cleanroom setter', :license_file, %|license_file 'LICENSES/artistic.txt'|
42
44
  it_behaves_like 'a cleanroom setter', :whitelist_file, %|whitelist_file '/opt/whatever'|
43
45
  it_behaves_like 'a cleanroom setter', :relative_path, %|relative_path '/path/to/extracted'|
44
46
  it_behaves_like 'a cleanroom setter', :build, %|build {}|
@@ -56,6 +58,12 @@ module Omnibus
56
58
  it_behaves_like 'a cleanroom getter', :project_file
57
59
  end
58
60
 
61
+ context 'when no license is present' do
62
+ it "sets the defaults" do
63
+ expect(subject.license).to eq ('Unspecified')
64
+ end
65
+ end
66
+
59
67
  describe "with_standard_compiler_flags helper" do
60
68
  context "on ubuntu" do
61
69
  before { stub_ohai(platform: 'ubuntu', version: '12.04') }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omnibus
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef Software, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-10 00:00:00.000000000 Z
11
+ date: 2016-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-sugar
@@ -330,6 +330,7 @@ files:
330
330
  - lib/omnibus/health_check.rb
331
331
  - lib/omnibus/instrumentation.rb
332
332
  - lib/omnibus/library.rb
333
+ - lib/omnibus/licensing.rb
333
334
  - lib/omnibus/logger.rb
334
335
  - lib/omnibus/logging.rb
335
336
  - lib/omnibus/manifest.rb
@@ -400,6 +401,7 @@ files:
400
401
  - spec/functional/fetchers/net_fetcher_spec.rb
401
402
  - spec/functional/fetchers/path_fetcher_spec.rb
402
403
  - spec/functional/file_syncer_spec.rb
404
+ - spec/functional/licensing_spec.rb
403
405
  - spec/functional/templating_spec.rb
404
406
  - spec/spec_helper.rb
405
407
  - spec/support/env_helpers.rb
@@ -497,6 +499,7 @@ test_files:
497
499
  - spec/functional/fetchers/net_fetcher_spec.rb
498
500
  - spec/functional/fetchers/path_fetcher_spec.rb
499
501
  - spec/functional/file_syncer_spec.rb
502
+ - spec/functional/licensing_spec.rb
500
503
  - spec/functional/templating_spec.rb
501
504
  - spec/spec_helper.rb
502
505
  - spec/support/env_helpers.rb