license_finder 6.6.0 → 6.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/VERSION +1 -1
- data/ci/pipelines/release.yml.erb +13 -3
- data/lib/license_finder/cli/inherited_decisions.rb +18 -0
- data/lib/license_finder/decisions.rb +29 -9
- data/lib/license_finder/license.rb +36 -0
- data/lib/license_finder/package_managers/nuget.rb +28 -15
- data/lib/license_finder/packages/pip_package.rb +9 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee81cbd6066d49c1b93db3632b2d67f23e4fb902acb36c0de7c325d5de34646f
|
4
|
+
data.tar.gz: a419dca63dc18e5cc1729ae19121df28017454ecaade8988ed50461c796d5a17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4d1ddc619a4216629b35e902a17c59f04ea65de6cce867c9cbfcddfb95281d23879bb595b202d867e388dd5f6f6d5ac68f7fa813a111c27b122aaa353ca6d1a
|
7
|
+
data.tar.gz: 5ec2d9e6f798b53870cf6e7196be92d0a596d58d459de70b585f68f8d8e618d8a98a6b91ded3991ed42f4f9a1793496fc9d7db34966900570201eac77ddc1e6e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [6.6.1] / 2020-06-30
|
2
|
+
|
3
|
+
### Changed
|
4
|
+
* Handle multiple solution files for nuget [#173021333] - [040d9559](https://github.com/pivotal/LicenseFinder/commit/040d9559a4bda07490255cc34c1a7891081bc511)
|
5
|
+
* matches license names from pypi api call with known licenses to avoid returning misformatted licenses [#173421573] - [6b96d746](https://github.com/pivotal/LicenseFinder/commit/6b96d74600034abcacee6ed2b322aa3abfaa0992) - Jeff Jun
|
6
|
+
* Update Nuget Package Manager prepare command - [6ac07066](https://github.com/pivotal/LicenseFinder/commit/6ac070668955bc034da1647658440ce5bb0d9bd2) - Jason Smith
|
7
|
+
|
1
8
|
# [6.6.0] / 2020-06-22
|
2
9
|
|
3
10
|
# [6.5.0] / 2020-06-01
|
@@ -877,3 +884,4 @@ Bugfixes:
|
|
877
884
|
[6.4.0]: https://github.com/pivotal/LicenseFinder/compare/v6.3.0...v6.4.0
|
878
885
|
[6.5.0]: https://github.com/pivotal/LicenseFinder/compare/v6.4.0...v6.5.0
|
879
886
|
[6.6.0]: https://github.com/pivotal/LicenseFinder/compare/v6.5.0...v6.6.0
|
887
|
+
[6.6.1]: https://github.com/pivotal/LicenseFinder/compare/v6.6.0...v6.6.1
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.6.
|
1
|
+
6.6.1
|
@@ -123,21 +123,31 @@ jobs:
|
|
123
123
|
|
124
124
|
- name: bump-major
|
125
125
|
plan:
|
126
|
-
-
|
126
|
+
- get: semver-version
|
127
127
|
tags: ["private-worker"]
|
128
128
|
params: {bump: major}
|
129
|
+
- put: semver-version
|
130
|
+
tags: ["private-worker"]
|
131
|
+
params: {file: semver-version/version}
|
132
|
+
|
129
133
|
|
130
134
|
- name: bump-minor
|
131
135
|
plan:
|
132
|
-
-
|
136
|
+
- get: semver-version
|
133
137
|
tags: ["private-worker"]
|
134
138
|
params: {bump: minor}
|
139
|
+
- put: semver-version
|
140
|
+
tags: ["private-worker"]
|
141
|
+
params: {file: semver-version/version}
|
135
142
|
|
136
143
|
- name: bump-patch
|
137
144
|
plan:
|
138
|
-
-
|
145
|
+
- get: semver-version
|
139
146
|
tags: ["private-worker"]
|
140
147
|
params: {bump: patch}
|
148
|
+
- put: semver-version
|
149
|
+
tags: ["private-worker"]
|
150
|
+
params: {file: semver-version/version}
|
141
151
|
|
142
152
|
- name: release
|
143
153
|
disable_manual_trigger: true
|
@@ -20,6 +20,15 @@ module LicenseFinder
|
|
20
20
|
say "Added #{decision_files.join(', ')} to the inherited decisions"
|
21
21
|
end
|
22
22
|
|
23
|
+
auditable
|
24
|
+
desc 'add_with_auth URL AUTH_TYPE TOKEN_OR_ENV', 'Add a remote decision file that needs authentication'
|
25
|
+
def add_with_auth(*params)
|
26
|
+
url, auth_type, token_or_env = params
|
27
|
+
auth_info = { 'url' => url, 'authorization' => "#{auth_type} #{token_or_env}" }
|
28
|
+
modifying { decisions.add_decision [:inherit_from, auth_info] }
|
29
|
+
say "Added #{url} to the inherited decisions"
|
30
|
+
end
|
31
|
+
|
23
32
|
auditable
|
24
33
|
desc 'remove DECISION_FILE...', 'Remove one or more decision files from the inherited decisions'
|
25
34
|
def remove(*decision_files)
|
@@ -27,6 +36,15 @@ module LicenseFinder
|
|
27
36
|
modifying { decision_files.each { |filepath| decisions.remove_inheritance(filepath) } }
|
28
37
|
say "Removed #{decision_files.join(', ')} from the inherited decisions"
|
29
38
|
end
|
39
|
+
|
40
|
+
auditable
|
41
|
+
desc 'remove_with_auth URL AUTH_TYPE TOKEN_OR_ENV', 'Add a remote decision file that needs authentication'
|
42
|
+
def remove_with_auth(*params)
|
43
|
+
url, auth_type, token_or_env = params
|
44
|
+
auth_info = { 'url' => url, 'authorization' => "#{auth_type} #{token_or_env}" }
|
45
|
+
modifying { decisions.remove_inheritance(auth_info) }
|
46
|
+
say "Removed #{url} from the inherited decisions"
|
47
|
+
end
|
30
48
|
end
|
31
49
|
end
|
32
50
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'open-uri'
|
4
|
+
require 'license_finder/license'
|
4
5
|
|
5
6
|
module LicenseFinder
|
6
7
|
class Decisions
|
@@ -39,6 +40,9 @@ module LicenseFinder
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def permitted?(lic)
|
43
|
+
return lic.sub_licenses.any? { |sub_lic| @permitted.include?(sub_lic) } if lic.is_a?(OrLicense)
|
44
|
+
return lic.sub_licenses.all? { |sub_lic| @permitted.include?(sub_lic) } if lic.is_a?(AndLicense)
|
45
|
+
|
42
46
|
@permitted.include?(lic)
|
43
47
|
end
|
44
48
|
|
@@ -183,16 +187,18 @@ module LicenseFinder
|
|
183
187
|
self
|
184
188
|
end
|
185
189
|
|
186
|
-
def inherit_from(
|
190
|
+
def inherit_from(filepath_info)
|
187
191
|
decisions =
|
188
|
-
if
|
189
|
-
open_uri(
|
192
|
+
if filepath_info.is_a?(Hash)
|
193
|
+
open_uri(filepath_info['url'], filepath_info['authorization']).read
|
194
|
+
elsif filepath_info =~ %r{^https?://}
|
195
|
+
open_uri(filepath_info).read
|
190
196
|
else
|
191
|
-
Pathname(
|
197
|
+
Pathname(filepath_info).read
|
192
198
|
end
|
193
199
|
|
194
|
-
add_decision [:inherit_from,
|
195
|
-
@inherited_decisions <<
|
200
|
+
add_decision [:inherit_from, filepath_info]
|
201
|
+
@inherited_decisions << filepath_info
|
196
202
|
restore_inheritance(decisions)
|
197
203
|
end
|
198
204
|
|
@@ -213,17 +219,31 @@ module LicenseFinder
|
|
213
219
|
self
|
214
220
|
end
|
215
221
|
|
216
|
-
def open_uri(uri)
|
222
|
+
def open_uri(uri, auth = nil)
|
223
|
+
header = {}
|
224
|
+
auth_header = resolve_authorization(auth)
|
225
|
+
header['Authorization'] = auth_header if auth_header
|
226
|
+
|
217
227
|
# ruby < 2.5.0 URI.open is private
|
218
228
|
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5.0')
|
219
229
|
# rubocop:disable Security/Open
|
220
|
-
open(uri)
|
230
|
+
open(uri, header)
|
221
231
|
# rubocop:enable Security/Open
|
222
232
|
else
|
223
|
-
URI.open(uri)
|
233
|
+
URI.open(uri, header)
|
224
234
|
end
|
225
235
|
end
|
226
236
|
|
237
|
+
def resolve_authorization(auth)
|
238
|
+
return unless auth
|
239
|
+
|
240
|
+
token_env = auth.match(/\$(\S.*)/)
|
241
|
+
return auth unless token_env
|
242
|
+
|
243
|
+
token = ENV[token_env[1]]
|
244
|
+
auth.sub(token_env[0], token)
|
245
|
+
end
|
246
|
+
|
227
247
|
#########
|
228
248
|
# PERSIST
|
229
249
|
#########
|
@@ -19,6 +19,9 @@ module LicenseFinder
|
|
19
19
|
|
20
20
|
def find_by_name(name)
|
21
21
|
name ||= 'unknown'
|
22
|
+
return OrLicense.new(name) if name.include?(OrLicense.operator)
|
23
|
+
return AndLicense.new(name) if name.include?(AndLicense.operator)
|
24
|
+
|
22
25
|
all.detect { |l| l.matches_name? l.stripped_name(name) } || Definitions.build_unrecognized(name)
|
23
26
|
end
|
24
27
|
|
@@ -61,6 +64,10 @@ module LicenseFinder
|
|
61
64
|
name.hash
|
62
65
|
end
|
63
66
|
|
67
|
+
def unrecognized_matcher?
|
68
|
+
matcher.is_a?(NoneMatcher)
|
69
|
+
end
|
70
|
+
|
64
71
|
private
|
65
72
|
|
66
73
|
attr_reader :short_name, :pretty_name, :other_names
|
@@ -70,4 +77,33 @@ module LicenseFinder
|
|
70
77
|
([short_name, pretty_name] + other_names).uniq
|
71
78
|
end
|
72
79
|
end
|
80
|
+
class AndLicense < License
|
81
|
+
def self.operator
|
82
|
+
' AND '
|
83
|
+
end
|
84
|
+
|
85
|
+
def initialize(name, operator = AndLicense.operator)
|
86
|
+
@short_name = name
|
87
|
+
@pretty_name = name
|
88
|
+
@url = nil
|
89
|
+
@matcher = NoneMatcher.new
|
90
|
+
# removes heading and trailing parentesis and splits
|
91
|
+
names = name[1..-2].split(operator)
|
92
|
+
@sub_licenses = names.map do |sub_name|
|
93
|
+
License.find_by_name(sub_name)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
attr_reader :sub_licenses
|
98
|
+
end
|
99
|
+
|
100
|
+
class OrLicense < AndLicense
|
101
|
+
def self.operator
|
102
|
+
' OR '
|
103
|
+
end
|
104
|
+
|
105
|
+
def initialize(name)
|
106
|
+
super(name, OrLicense.operator)
|
107
|
+
end
|
108
|
+
end
|
73
109
|
end
|
@@ -90,29 +90,42 @@ module LicenseFinder
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def prepare
|
93
|
-
|
94
|
-
|
95
|
-
|
93
|
+
Dir.chdir(project_path) do
|
94
|
+
cmd = prepare_command
|
95
|
+
stdout, stderr, status = Cmd.run(cmd)
|
96
|
+
return if status.success?
|
96
97
|
|
97
|
-
|
98
|
+
log_errors stderr
|
98
99
|
|
99
|
-
|
100
|
-
|
100
|
+
if stderr.include?('-PackagesDirectory')
|
101
|
+
logger.info cmd, 'trying fallback prepare command', color: :magenta
|
101
102
|
|
102
|
-
|
103
|
-
|
104
|
-
|
103
|
+
cmd = "#{cmd} -PackagesDirectory /#{Dir.home}/.nuget/packages"
|
104
|
+
stdout, stderr, status = Cmd.run(cmd)
|
105
|
+
return if status.success?
|
105
106
|
|
106
|
-
|
107
|
-
|
107
|
+
log_errors_with_cmd(cmd, stderr)
|
108
|
+
end
|
108
109
|
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
error_message = "Prepare command '#{cmd}' failed\n#{stderr}"
|
111
|
+
error_message += "\n#{stdout}\n" if !stdout.nil? && !stdout.empty?
|
112
|
+
raise error_message unless @prepare_no_fail
|
113
|
+
end
|
112
114
|
end
|
113
115
|
|
114
116
|
def prepare_command
|
115
|
-
|
117
|
+
cmd = package_management_command
|
118
|
+
sln_files = Dir['*.sln']
|
119
|
+
cmds = []
|
120
|
+
if sln_files.count > 1
|
121
|
+
sln_files.each do |sln|
|
122
|
+
cmds << "#{cmd} restore #{sln}"
|
123
|
+
end
|
124
|
+
else
|
125
|
+
cmds << "#{cmd} restore"
|
126
|
+
end
|
127
|
+
|
128
|
+
cmds.join(' && ')
|
116
129
|
end
|
117
130
|
|
118
131
|
def installed?(logger = Core.default_logger)
|
@@ -8,9 +8,16 @@ module LicenseFinder
|
|
8
8
|
INVALID_LICENSES = ['', 'UNKNOWN'].to_set
|
9
9
|
|
10
10
|
def self.license_names_from_spec(spec)
|
11
|
-
|
11
|
+
license_names = spec['license'].to_s.strip.split(' or ')
|
12
|
+
has_unrecognized_license = false
|
12
13
|
|
13
|
-
|
14
|
+
license_names.each do |license_name|
|
15
|
+
license = License.find_by_name(license_name.strip)
|
16
|
+
|
17
|
+
has_unrecognized_license ||= license.unrecognized_matcher?
|
18
|
+
end
|
19
|
+
|
20
|
+
return license_names if !license_names.empty? && !has_unrecognized_license
|
14
21
|
|
15
22
|
spec
|
16
23
|
.fetch('classifiers', [])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: license_finder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.6.
|
4
|
+
version: 6.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Collins
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2020-06-
|
30
|
+
date: 2020-06-30 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: bundler
|