license_scout 0.1.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +13 -5
  3. data/bin/license_scout +39 -1
  4. data/bin/rebar_lock_json +0 -0
  5. data/erl_src/rebar_lock_json/README.md +17 -0
  6. data/erl_src/rebar_lock_json/rebar.config +19 -0
  7. data/erl_src/rebar_lock_json/rebar.lock +36 -0
  8. data/erl_src/rebar_lock_json/src/rebar_lock_json.app.src +17 -0
  9. data/erl_src/rebar_lock_json/src/rebar_lock_json.erl +20 -0
  10. data/lib/license_scout/canonical_licenses/BSD-2-Clause.txt +19 -0
  11. data/lib/license_scout/canonical_licenses/BSD-3-Clause.txt +27 -0
  12. data/lib/license_scout/canonical_licenses/Chef-MLSA.txt +5 -0
  13. data/lib/license_scout/collector.rb +1 -1
  14. data/lib/license_scout/dependency_manager/base.rb +8 -1
  15. data/lib/license_scout/dependency_manager/berkshelf.rb +1 -1
  16. data/lib/license_scout/dependency_manager/bundler.rb +1 -1
  17. data/lib/license_scout/dependency_manager/cpanm.rb +160 -0
  18. data/lib/license_scout/dependency_manager/dep.rb +87 -0
  19. data/lib/license_scout/dependency_manager/glide.rb +79 -0
  20. data/lib/license_scout/dependency_manager/godep.rb +71 -0
  21. data/lib/license_scout/dependency_manager/rebar.rb +6 -35
  22. data/lib/license_scout/dependency_manager.rb +5 -2
  23. data/lib/license_scout/license_file_analyzer/definitions.rb +8 -1
  24. data/lib/license_scout/license_file_analyzer/templates/Apache2.txt +0 -2
  25. data/lib/license_scout/license_file_analyzer/templates/Chef-MLSA.txt +5 -0
  26. data/lib/license_scout/net_fetcher.rb +1 -0
  27. data/lib/license_scout/options.rb +1 -1
  28. data/lib/license_scout/overrides.rb +553 -19
  29. data/lib/license_scout/version.rb +1 -1
  30. metadata +45 -13
  31. data/.gitignore +0 -9
  32. data/.rspec +0 -3
  33. data/.rubocop.yml +0 -4
  34. data/.travis.yml +0 -11
  35. data/Gemfile +0 -24
  36. data/Rakefile +0 -39
  37. data/appveyor.yml +0 -19
  38. data/bin/config_to_json +0 -0
  39. data/lib/license_scout/dependency_manager/cpan.rb +0 -322
  40. data/license_scout.gemspec +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 83b949a77e7dcd991b2de72715882700e160e0eb
4
- data.tar.gz: 0f5275681d5db4fe0f6ea19db30131a739d63de1
2
+ SHA256:
3
+ metadata.gz: e457b9a208151ac27a602231842b51bbb238ab63f8e89352e731e2ccf375dd1b
4
+ data.tar.gz: 5c77592e6f9a5781ab16e5348abb9246d56056345e363e96a77040b043de99b3
5
5
  SHA512:
6
- metadata.gz: 6835e670ec069a60fee4b27e5042217c79b59470103d62a4b3c316733edcbf2e12b9bc024250bad67f0a7e6b11cb537449e74ff1a4c55d6ea66e3d61985705a3
7
- data.tar.gz: bc383bdc559ad4dc050564647a14674c5667d63fcf64722dac82e201ec08c114cbc277591c9417b25b6b31a10018ec9c1774e1b5648cff9e74f426a666424a11
6
+ metadata.gz: 892170c7c155c080d93917c3bca10006c812c3fd8becc014b3918d26032533520d056349bf909d9bb7ecc245ae1eb2f7d503c4d4bdaaa7833852ce4ea9af526f
7
+ data.tar.gz: 62691f59c045e70555cfc5dba3e0d6f5e3eeceb6161f945f84d8b5c4ce96042b61050098b12e15a55f47be9b394a394ba18c7d310174abd9b5411138a224a6e2
data/README.md CHANGED
@@ -5,16 +5,24 @@ dependencies, including transitive dependencies.
5
5
 
6
6
  Currently supported project types are:
7
7
 
8
- * Ruby - bundler
8
+ * Chef - Berkshelf
9
9
  * Erlang - rebar
10
- * CPAN - perl
11
- * Berkshelf - chef
10
+ * Golang - godeps
11
+ * Javascript - npm
12
+ * Perl - CPAN
13
+ * Ruby - bundler
12
14
 
13
15
  ## Usage
14
16
 
15
- ## Thanks
17
+ ```bash
18
+ $ bin/license_scout /dir/to/scout/successfully/
19
+
20
+ $ bin/license_scout /dir/to/scout/unsuccessfully/
21
+ Dependency 'gopkg.in_yaml.v2' version '53feefa2559fb8dfa8d81baad31be332c97d6c77' under 'go_godep' is missing license information.
22
+ >> Found 41 dependencies for go_godep. 40 OK, 1 with problems
23
+ ```
16
24
 
17
- Thanks to https://github.com/basho for `config_to_json` binary which helps with parsing Erlang config files. From: https://github.com/basho/erlang_template_helper
25
+ Detailed instructions for fixing licensing failures found by license_scout are now provided in the script's output. See [bin/license_scout](bin/license_scout) for more details.
18
26
 
19
27
  ## Contributing
20
28
 
data/bin/license_scout CHANGED
@@ -38,4 +38,42 @@ collector = LicenseScout::Collector.new(project_name, project_dir, output_dir, o
38
38
  collector.run
39
39
  report = collector.issue_report
40
40
 
41
- puts report
41
+ unless report.empty?
42
+ puts report
43
+
44
+ puts <<-EXPLANATION
45
+
46
+ How to fix this depends on what information license_scout was unable to
47
+ determine:
48
+
49
+ * If the package is missing license information, that means license_scout was
50
+ unable to determine which license the package was released under. Depending
51
+ on the package manager, this is usually specified in the package's metadata,
52
+ for example, in the gemspec file for rubygems or in the package.json for npm.
53
+ If you know which license a package was released under, MIT for example, you
54
+ can add an override in license_scout's overrides.rb file in the section for
55
+ the appropriate package manager like this:
56
+ ["package-name", "MIT", nil]
57
+
58
+ * If the package is missing the license file, that means license_scout could not
59
+ find the license text in any of the places the license is typically found, for
60
+ example, in a file named LICENSE in the root of the package. If the package
61
+ includes the license text in a non standard location or in its source repo,
62
+ you can indicate this by adding an override in license_scout's overrides.rb
63
+ file in the section for the appropriate package manager like this:
64
+ ["package-name", nil, ["https://example.com/foocorp/package-name/master/LICENSE"]],
65
+
66
+ If you know that the package was released under one of the common software
67
+ licenses, MIT for example, but does not include the license text in packaged
68
+ releases or in its source repo, you can add an override in license_scout's
69
+ overrides.rb file in the section for the appropriate package manager like
70
+ this:
71
+ ["package-name", nil, [canonical("MIT")]]
72
+
73
+ See the closed pull requests on the license_scout repo for examples of how to
74
+ do this:
75
+ https://github.com/chef/license_scout/pulls?q=is%3Apr+is%3Aclosed
76
+ EXPLANATION
77
+
78
+ exit 2
79
+ end
Binary file
@@ -0,0 +1,17 @@
1
+ rebar_lock_json
2
+ ===============
3
+
4
+ A minimal escript converting a rebar.lock file to json output.
5
+
6
+ Should work with any version of rebar (2 or 3)'s rebar.lock file.
7
+
8
+ Build
9
+ -----
10
+
11
+ $ rebar3 escriptize # this also copies the escript file to bin/
12
+
13
+ Run
14
+ ---
15
+
16
+ $ bin/rebar_lock_json path/to/rebar.lock
17
+ {"amqp_client":{"type":"git","git_url":"git:\/\/github.com\/seth\/amqp_client.git","git_ref":"7622ad8093a41b7288a1aa44dd16d3e92ce8f833"}}
@@ -0,0 +1,19 @@
1
+ {erl_opts, [no_debug_info]}.
2
+ {deps, [
3
+ jsone,
4
+ {rebar3, {git, "https://github.com/erlang/rebar3", {branch, "master"}}}
5
+ ]}.
6
+
7
+ {escript_incl_apps,
8
+ [rebar_lock_json]}.
9
+ {escript_main_app, rebar_lock_json}.
10
+ {escript_name, rebar_lock_json}.
11
+ {escript_emu_args, "%%! +sbtu +A0\n"}.
12
+
13
+ {post_hooks, [
14
+ {escriptize, "cp $REBAR_BUILD_DIR/bin/rebar_lock_json ../../bin/"}
15
+ ]}.
16
+
17
+ {profiles, [{test,
18
+ [{erl_opts, [debug_info]}
19
+ ]}]}.
@@ -0,0 +1,36 @@
1
+ {"1.1.0",
2
+ [{<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.3.0">>},1},
3
+ {<<"certifi">>,{pkg,<<"certifi">>,<<"0.4.0">>},1},
4
+ {<<"cf">>,{pkg,<<"cf">>,<<"0.2.2">>},1},
5
+ {<<"cth_readable">>,{pkg,<<"cth_readable">>,<<"1.2.3">>},1},
6
+ {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"1.0.0">>},1},
7
+ {<<"eunit_formatters">>,{pkg,<<"eunit_formatters">>,<<"0.3.1">>},1},
8
+ {<<"getopt">>,{pkg,<<"getopt">>,<<"0.8.2">>},1},
9
+ {<<"jiffy">>,{pkg,<<"jiffy">>,<<"0.14.11">>},0},
10
+ {<<"jsone">>,{pkg,<<"jsone">>,<<"1.4.1">>},0},
11
+ {<<"providers">>,{pkg,<<"providers">>,<<"1.6.0">>},1},
12
+ {<<"rebar">>,
13
+ {git,"https://github.com/erlang/rebar3",
14
+ {ref,"4725d363c5b5583c9910f078da38c5b3a1d97aab"}},
15
+ 0},
16
+ {<<"rebar3">>,
17
+ {git,"https://github.com/erlang/rebar3",
18
+ {ref,"86e883b8d8d1d16487e245fff02eba8c83da2cdd"}},
19
+ 0},
20
+ {<<"relx">>,{pkg,<<"relx">>,<<"3.22.2">>},1},
21
+ {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.1">>},1}]}.
22
+ [
23
+ {pkg_hash,[
24
+ {<<"bbmustache">>, <<"2010ADAE78830992A4C69680115ECD7D475DD03A72C076BBADDCCBF2D4B32035">>},
25
+ {<<"certifi">>, <<"A7966EFB868B179023618D29A407548F70C52466BF1849B9E8EBD0E34B7EA11F">>},
26
+ {<<"cf">>, <<"7F2913FFF90ABCABD0F489896CFEB0B0674F6C8DF6C10B17A83175448029896C">>},
27
+ {<<"cth_readable">>, <<"293120673DFF82F0768612C5282E35C40CACC1B6F94FE99077438FD3749D0E27">>},
28
+ {<<"erlware_commons">>, <<"087467DE5833C0BB5B3CCDD387F9E9C1FB816A75B7A709629BF24B5ED3246C51">>},
29
+ {<<"eunit_formatters">>, <<"7A6FC351EB5B873E2356B8852EB751E20C13A72FBCA03393CF682B8483509573">>},
30
+ {<<"getopt">>, <<"B17556DB683000BA50370B16C0619DF1337E7AF7ECBF7D64FBF8D1D6BCE3109B">>},
31
+ {<<"jiffy">>, <<"919A87D491C5A6B5E3BBC27FAFEDC3A0761CA0B4C405394F121F582FD4E3F0E5">>},
32
+ {<<"jsone">>, <<"10ECFB2E2FD216D6451AF71CF14F276E063A096E15B685DE7535FD680466C9B5">>},
33
+ {<<"providers">>, <<"DB0E2F9043AE60C0155205FCD238D68516331D0E5146155E33D1E79DC452964A">>},
34
+ {<<"relx">>, <<"AEE2EF6E9AC6D21D6661133B7A0BE6E81424DE9CDCA0012FC008BC677297C469">>},
35
+ {<<"ssl_verify_fun">>, <<"28A4D65B7F59893BC2C7DE786DEC1E1555BD742D336043FE644AE956C3497FBE">>}]}
36
+ ].
@@ -0,0 +1,17 @@
1
+ {application, rebar_lock_json,
2
+ [{description, "An escript util returning json representation of rebar.lock"},
3
+ {vsn, "0.1.0"},
4
+ {registered, []},
5
+ {applications,
6
+ [kernel,
7
+ stdlib,
8
+ rebar,
9
+ jsone
10
+ ]},
11
+ {env,[]},
12
+ {modules, []},
13
+
14
+ {maintainers, []},
15
+ {licenses, []},
16
+ {links, []}
17
+ ]}.
@@ -0,0 +1,20 @@
1
+ -module(rebar_lock_json).
2
+
3
+ -export([main/1]).
4
+
5
+ main([LockPath|_]) ->
6
+ Deps = rebar_config:consult_lock_file(LockPath),
7
+ Ejson = lists:map(fun dep_to_ejson/1, Deps),
8
+ io:format("~s~n", [jsone:encode({Ejson})]).
9
+
10
+ dep_to_ejson({Name, {pkg, PkgName, PkgVersion, Hash}, Lvl}) ->
11
+ {Name, {[{<<"type">>, <<"pkg">>},
12
+ {<<"level">>, Lvl},
13
+ {<<"pkg_name">>, PkgName},
14
+ {<<"pkg_version">>, PkgVersion},
15
+ {<<"pkg_hash">>, Hash}]}};
16
+ dep_to_ejson({Name, {git, GitUrl, {ref, GitRef}}, Lvl}) ->
17
+ {Name, {[{<<"type">>, <<"git">>},
18
+ {<<"level">>, Lvl},
19
+ {<<"git_url">>, erlang:iolist_to_binary(GitUrl)},
20
+ {<<"git_ref">>, erlang:iolist_to_binary(GitRef)}]}}.
@@ -0,0 +1,19 @@
1
+ Redistribution and use in source and binary forms, with or without
2
+ modification, are permitted provided that the following conditions are met:
3
+
4
+ 1. Redistributions of source code must retain the above copyright notice, this
5
+ list of conditions and the following disclaimer.
6
+ 2. Redistributions in binary form must reproduce the above copyright notice,
7
+ this list of conditions and the following disclaimer in the documentation
8
+ and/or other materials provided with the distribution.
9
+
10
+ THIS SOFTWARE IS PROVIDED BY THE <COPYRIGHT HOLDERS> "AS IS" AND
11
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
12
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
13
+ DISCLAIMED. IN NO EVENT SHALL THE <COPYRIGHT HOLDERS> BE LIABLE FOR
14
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
16
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
17
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
18
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,27 @@
1
+ Copyright (c) <year> <owner> . All rights reserved. Redistribution and use in
2
+ source and binary forms, with or without modification, are permitted provided
3
+ that the following conditions are met:
4
+
5
+ 1. Redistributions of source code must retain the above copyright notice, this
6
+ list of conditions and the following disclaimer.
7
+
8
+ 2. Redistributions in binary form must reproduce the above copyright notice,
9
+ this list of conditions and the following disclaimer in the documentation
10
+ and/or other materials provided with the distribution.
11
+
12
+ 3. Neither the name of the copyright holder nor the names of its contributors
13
+ may be used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+
@@ -0,0 +1,5 @@
1
+ Use of this Software is subject to the terms of the Chef Online Master
2
+ License and Services Agreement. You can find the latest copy of the
3
+ agreement here:
4
+
5
+ https://www.chef.io/online-master-agreement
@@ -44,7 +44,7 @@ module LicenseScout
44
44
  def run
45
45
  reset_license_manifest
46
46
 
47
- if !File.exists?(project_dir)
47
+ if !File.exist?(project_dir)
48
48
  raise LicenseScout::Exceptions::ProjectDirectoryMissing.new(project_dir)
49
49
  end
50
50
  FileUtils.mkdir_p(output_dir) unless File.exist?(output_dir)
@@ -16,6 +16,7 @@
16
16
  #
17
17
 
18
18
  require "license_scout/dependency"
19
+ require "license_scout/license_file_analyzer"
19
20
 
20
21
  module LicenseScout
21
22
  module DependencyManager
@@ -24,7 +25,9 @@ module LicenseScout
24
25
  POSSIBLE_LICENSE_FILES = %w{
25
26
  LICENSE
26
27
  LICENSE.txt
28
+ LICENSE.TXT
27
29
  LICENSE.md
30
+ LICENSE.mkd
28
31
  LICENSE.rdoc
29
32
  License
30
33
  License.text
@@ -36,6 +39,9 @@ module LicenseScout
36
39
  license
37
40
  LICENCE
38
41
  licence
42
+ license.md
43
+ licence.md
44
+ APACHE.LICENSE
39
45
  MIT-LICENSE
40
46
  MIT-LICENSE.txt
41
47
  LICENSE.MIT
@@ -46,6 +52,7 @@ module LicenseScout
46
52
  COPYING
47
53
  BSD_LICENSE
48
54
  LICENSE.BSD
55
+ UNLICENSE
49
56
  }
50
57
 
51
58
  attr_reader :project_dir
@@ -56,7 +63,7 @@ module LicenseScout
56
63
  @options = options
57
64
  end
58
65
 
59
- def create_dependency(dep_name, version, license, license_files, dep_mgr_name = self.name)
66
+ def create_dependency(dep_name, version, license, license_files, dep_mgr_name = name)
60
67
  # add name of the dependency manager `name` to the dependency we are
61
68
  # creating.
62
69
  Dependency.new(dep_name, version, license, license_files, dep_mgr_name)
@@ -36,7 +36,7 @@ module LicenseScout
36
36
  end
37
37
 
38
38
  def detected?
39
- File.exists?(berksfile_path) && File.exists?(lockfile_path)
39
+ File.exist?(berksfile_path) && File.exist?(lockfile_path)
40
40
  end
41
41
 
42
42
  def dependencies
@@ -39,7 +39,7 @@ module LicenseScout
39
39
  # that created issues with projects like oc_bifrost which is a rebar
40
40
  # project but have a Gemfile at its root to be able to run some rake
41
41
  # commands.
42
- File.exists?(gemfile_path) && File.exists?(lockfile_path)
42
+ File.exist?(gemfile_path) && File.exist?(lockfile_path)
43
43
  end
44
44
 
45
45
  def dependency_data
@@ -0,0 +1,160 @@
1
+ #
2
+ # Copyright:: Copyright 2016, Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "ffi_yajl"
19
+ require "psych"
20
+ require "mixlib/shellout"
21
+
22
+ require "license_scout/dependency_manager/base"
23
+ require "license_scout/exceptions"
24
+ require "license_scout/dependency"
25
+
26
+ module LicenseScout
27
+ module DependencyManager
28
+ class Cpanm < Base
29
+
30
+ class CpanmDependency
31
+
32
+ LICENSE_TYPE_MAP = {
33
+ "perl_5" => "Perl-5",
34
+ "perl" => "Perl-5",
35
+ "apache_2_0" => "Apache-2.0",
36
+ "artistic_2" => "Artistic-2.0",
37
+ "gpl_3" => "GPL-3.0",
38
+ }.freeze
39
+
40
+ attr_reader :unpack_path
41
+ attr_reader :overrides
42
+ attr_reader :metadata
43
+
44
+ def initialize(unpack_path, overrides)
45
+ @unpack_path = unpack_path
46
+ @overrides = overrides
47
+ end
48
+
49
+ def to_dep
50
+ parse_metadata!
51
+
52
+ Dependency.new(
53
+ name,
54
+ version.to_s,
55
+ license,
56
+ license_files,
57
+ "perl_cpanm"
58
+ )
59
+ end
60
+
61
+ def parse_metadata!
62
+ # Packages can contain metadata files named META.yml, META.json,
63
+ # MYMETA.json, MYMETA.yml. META.* files are created by the authors of
64
+ # the plugins whereas MYMETA.* files are created by the build system
65
+ # after dynamic dependencies are resolved. For our purposes META.*
66
+ # files are enough. And for no good reason we prioritize json files
67
+ # over yml files.
68
+ @metadata ||= begin
69
+ json_path = File.join(unpack_path, "META.json")
70
+ yml_path = File.join(unpack_path, "META.yml")
71
+
72
+ if File.exist?(json_path)
73
+ FFI_Yajl::Parser.parse(File.read(json_path))
74
+ elsif File.exist?(yml_path)
75
+ Psych.safe_load(File.read(yml_path))
76
+ else
77
+ raise LicenseScout::Exceptions::Error.new("Can not find a metadata file for the perl package at '#{unpack_path}'.")
78
+ end
79
+ end
80
+ end
81
+
82
+ def name
83
+ metadata["name"]
84
+ end
85
+
86
+ def version
87
+ metadata["version"]
88
+ end
89
+
90
+ def license
91
+ @license ||= begin
92
+ override_license = overrides.license_for("perl_cpanm", name, version)
93
+
94
+ if override_license
95
+ override_license
96
+ elsif metadata && metadata.key?("license")
97
+ given_type = Array(metadata["license"]).reject { |l| l == "unknown" }.first
98
+
99
+ # Normalize the common perl license strings to the strings we commonly use
100
+ LICENSE_TYPE_MAP[given_type] || given_type
101
+ end
102
+ end
103
+ end
104
+
105
+ def license_files
106
+ @license_files ||= begin
107
+ override_license_files = overrides.license_files_for("perl_cpanm", name, version)
108
+
109
+ if override_license_files.empty?
110
+ find_license_files
111
+ else
112
+ override_license_files.resolve_locations(unpack_path)
113
+ end
114
+ end
115
+ end
116
+
117
+ def find_license_files
118
+ Dir["#{unpack_path}/*"].select do |f|
119
+ Cpanm::POSSIBLE_LICENSE_FILES.include?(File.basename(f))
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ def name
126
+ "perl_cpanm"
127
+ end
128
+
129
+ def cpanm_root
130
+ # By default cpanm downloads all the dependencies into ~/.cpanm directory
131
+ File.expand_path("~/.cpanm")
132
+ end
133
+
134
+ def dependencies
135
+ @dependencies ||= begin
136
+ deps = []
137
+
138
+ Dir.glob("#{cpanm_root}/latest-build/*").each do |dep_path|
139
+ next unless File.directory?(dep_path)
140
+
141
+ deps << CpanmDependency.new(dep_path, options.overrides).to_dep
142
+ end
143
+
144
+ deps
145
+ end
146
+ end
147
+
148
+ # NOTE: it's possible that projects won't have a META.yml, but the two
149
+ # that we care about for Chef Server do have one. As of 2015, 84% of perl
150
+ # distribution packages have one: http://neilb.org/2015/10/18/spotters-guide.html
151
+ def detected?
152
+ meta_yml_path = File.join(project_dir, "META.yml")
153
+ meta_json_path = File.join(project_dir, "META.json")
154
+
155
+ File.exist?(meta_yml_path) || File.exist?(meta_json_path)
156
+ end
157
+
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,87 @@
1
+ #
2
+ # Copyright:: Copyright 2016, Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "ffi_yajl"
19
+ require "yaml"
20
+ require "toml-rb"
21
+ require "license_scout/dependency_manager/base"
22
+
23
+ module LicenseScout
24
+ module DependencyManager
25
+ # dep(https://github.com/golang/dep) is a new dependency manger available from go 1.8
26
+ class Dep < Base
27
+
28
+ def name
29
+ "go_dep"
30
+ end
31
+
32
+ def detected?
33
+ File.exist?(root_dep_file)
34
+ end
35
+
36
+ def dependencies
37
+ deps = File.open(root_dep_file) do |f|
38
+ TomlRB.parse(f)
39
+ end
40
+ return [] unless deps.has_key?("projects")
41
+ deps["projects"].map do |pkg_info|
42
+ pkg_import_name = pkg_info["name"]
43
+ pkg_file_name = pkg_import_name.tr("/", "_")
44
+ pkg_version = pkg_info["version"] || pkg_info["revision"]
45
+ license = options.overrides.license_for("go", pkg_import_name, pkg_version)
46
+
47
+ override_license_files = options.overrides.license_files_for("go", pkg_import_name, pkg_version)
48
+ if override_license_files.empty?
49
+ license_files = find_license_files_for_package_in_gopath_or_vendor_dir(pkg_import_name)
50
+ else
51
+ license_files = override_license_files.resolve_locations(gopath(pkg_import_name))
52
+ end
53
+
54
+ if license.nil? && !license_files.empty?
55
+ license = scan_licenses(license_files)
56
+ end
57
+
58
+ create_dependency(pkg_file_name, pkg_version, license, license_files)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def scan_licenses(license_files)
65
+ found_license = LicenseScout::LicenseFileAnalyzer.find_by_text(IO.read(license_files.first))
66
+ found_license && found_license.short_name
67
+ end
68
+
69
+ def root_dep_file
70
+ File.join(project_dir, "Gopkg.lock")
71
+ end
72
+
73
+ def gopath(pkg)
74
+ "#{ENV['GOPATH']}/src/#{pkg}"
75
+ end
76
+
77
+ def vendor_dir(pkg = nil)
78
+ File.join(project_dir, "vendor/#{pkg}")
79
+ end
80
+
81
+ def find_license_files_for_package_in_gopath_or_vendor_dir(pkg)
82
+ root_files = Dir["#{gopath(pkg)}/*"] + Dir["#{vendor_dir(pkg)}/*"]
83
+ root_files.select { |f| POSSIBLE_LICENSE_FILES.include?(File.basename(f)) }
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,79 @@
1
+ #
2
+ # Copyright:: Copyright 2017, Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "yaml"
19
+ require "license_scout/dependency_manager/base"
20
+
21
+ module LicenseScout
22
+ module DependencyManager
23
+ class Glide < Base
24
+
25
+ def name
26
+ "go_glide"
27
+ end
28
+
29
+ def detected?
30
+ File.exist?(glide_yaml)
31
+ end
32
+
33
+ def dependencies
34
+ unless File.file?(glide_yaml_locked)
35
+ raise "Detected Go/Glide project that is missing its \"glide.lock\" "\
36
+ "file in #{project_dir}"
37
+ end
38
+
39
+ deps = YAML.load(File.read(glide_yaml_locked))
40
+ deps["imports"].map { |i| add_glide_dep(i) }
41
+ end
42
+
43
+ private
44
+
45
+ def add_glide_dep(import_field)
46
+ pkg_import_name = import_field["name"]
47
+ pkg_file_name = pkg_import_name.tr("/", "_")
48
+ pkg_version = import_field["version"]
49
+ license = options.overrides.license_for("go", pkg_import_name, pkg_version)
50
+
51
+ override_license_files = options.overrides.license_files_for("go", pkg_import_name, pkg_version)
52
+ if override_license_files.empty?
53
+ license_files = find_license_files_for_package_in_gopath(pkg_import_name)
54
+ else
55
+ license_files = override_license_files.resolve_locations(gopath(pkg_import_name))
56
+ end
57
+
58
+ create_dependency(pkg_file_name, pkg_version, license, license_files)
59
+ end
60
+
61
+ def glide_yaml
62
+ File.join(project_dir, "glide.yaml")
63
+ end
64
+
65
+ def glide_yaml_locked
66
+ File.join(project_dir, "glide.lock")
67
+ end
68
+
69
+ def gopath(pkg)
70
+ "#{ENV['GOPATH']}/src/#{pkg}"
71
+ end
72
+
73
+ def find_license_files_for_package_in_gopath(pkg)
74
+ root_files = Dir["#{gopath(pkg)}/*"]
75
+ root_files.select { |f| POSSIBLE_LICENSE_FILES.include?(File.basename(f)) }
76
+ end
77
+ end
78
+ end
79
+ end