license_finder 4.0.2 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -2
  3. data/CHANGELOG.md +16 -1
  4. data/CONTRIBUTING.md +23 -5
  5. data/Gemfile +0 -1
  6. data/README.md +6 -1
  7. data/Rakefile +2 -2
  8. data/ci/pipelines/pipeline.yml.erb +1 -1
  9. data/ci/pipelines/release.yml +14 -23
  10. data/ci/scripts/pushscript.sh +1 -2
  11. data/ci/scripts/run-rubocop.sh +1 -1
  12. data/ci/scripts/updateChangelog.sh +77 -0
  13. data/ci/tasks/build.yml +1 -1
  14. data/ci/tasks/update-changelog.yml +15 -0
  15. data/lib/license_finder/cli/base.rb +19 -13
  16. data/lib/license_finder/cli/main.rb +54 -37
  17. data/lib/license_finder/cli/makes_decisions.rb +3 -2
  18. data/lib/license_finder/configuration.rb +68 -15
  19. data/lib/license_finder/core.rb +17 -7
  20. data/lib/license_finder/decisions_factory.rb +11 -0
  21. data/lib/license_finder/license/templates/SimplifiedBSD.txt +1 -1
  22. data/lib/license_finder/license_aggregator.rb +11 -6
  23. data/lib/license_finder/logger.rb +2 -2
  24. data/lib/license_finder/package.rb +18 -16
  25. data/lib/license_finder/package_manager.rb +40 -47
  26. data/lib/license_finder/package_managers/bower.rb +8 -4
  27. data/lib/license_finder/package_managers/bundler.rb +8 -5
  28. data/lib/license_finder/package_managers/carthage.rb +4 -4
  29. data/lib/license_finder/package_managers/cocoa_pods.rb +2 -2
  30. data/lib/license_finder/package_managers/conan.rb +1 -1
  31. data/lib/license_finder/package_managers/gradle.rb +1 -1
  32. data/lib/license_finder/package_managers/maven.rb +1 -3
  33. data/lib/license_finder/package_managers/mix.rb +8 -4
  34. data/lib/license_finder/package_managers/npm.rb +5 -1
  35. data/lib/license_finder/package_managers/pip.rb +2 -2
  36. data/lib/license_finder/package_managers/rebar.rb +4 -4
  37. data/lib/license_finder/package_managers/yarn.rb +2 -2
  38. data/lib/license_finder/{packages → package_utils}/activation.rb +0 -0
  39. data/lib/license_finder/{package_managers → package_utils}/conan_info_parser.rb +1 -1
  40. data/lib/license_finder/{package_managers → package_utils}/gradle_dependency_finder.rb +0 -0
  41. data/lib/license_finder/{packages → package_utils}/license_files.rb +1 -1
  42. data/lib/license_finder/{packages → package_utils}/licensing.rb +1 -1
  43. data/lib/license_finder/{package_managers → package_utils}/maven_dependency_finder.rb +0 -0
  44. data/lib/license_finder/{packages → package_utils}/possible_license_file.rb +0 -0
  45. data/lib/license_finder/{package_managers → packages}/bower_package.rb +0 -0
  46. data/lib/license_finder/{package_managers → packages}/bundler_package.rb +0 -0
  47. data/lib/license_finder/{package_managers → packages}/carthage_package.rb +0 -0
  48. data/lib/license_finder/{package_managers → packages}/cocoa_pods_package.rb +0 -0
  49. data/lib/license_finder/{package_managers → packages}/conan_package.rb +0 -0
  50. data/lib/license_finder/{package_managers → packages}/go_package.rb +0 -0
  51. data/lib/license_finder/{package_managers → packages}/gradle_package.rb +0 -0
  52. data/lib/license_finder/{package_managers → packages}/maven_package.rb +0 -0
  53. data/lib/license_finder/packages/merged_package.rb +42 -0
  54. data/lib/license_finder/{package_managers → packages}/mix_package.rb +0 -0
  55. data/lib/license_finder/{package_managers → packages}/npm_package.rb +0 -0
  56. data/lib/license_finder/{package_managers → packages}/nuget_package.rb +0 -0
  57. data/lib/license_finder/{package_managers → packages}/pip_package.rb +0 -0
  58. data/lib/license_finder/{package_managers → packages}/rebar_package.rb +0 -0
  59. data/lib/license_finder/packages/yarn_package.rb +7 -0
  60. data/lib/license_finder/project_finder.rb +1 -1
  61. data/lib/license_finder/reports/csv_report.rb +1 -0
  62. data/lib/license_finder/reports/merged_report.rb +2 -0
  63. data/lib/license_finder/reports/templates/html_report.erb +8 -0
  64. data/lib/license_finder/reports/templates/markdown_report.erb +7 -0
  65. data/lib/license_finder/scanner.rb +38 -0
  66. data/lib/license_finder/version.rb +1 -1
  67. data/license_finder.gemspec +9 -2
  68. metadata +37 -101
  69. data/ci/tasks/get-version-and-tag.yml +0 -20
  70. data/features/features/cli/cli_spec.rb +0 -63
  71. data/features/features/configure/add_dependencies_spec.rb +0 -54
  72. data/features/features/configure/approve_dependencies_spec.rb +0 -61
  73. data/features/features/configure/assign_licenses_spec.rb +0 -35
  74. data/features/features/configure/blacklist_licenses_spec.rb +0 -30
  75. data/features/features/configure/ignore_dependencies_spec.rb +0 -35
  76. data/features/features/configure/ignore_groups_spec.rb +0 -46
  77. data/features/features/configure/name_project_spec.rb +0 -33
  78. data/features/features/configure/set_project_path_spec.rb +0 -17
  79. data/features/features/configure/whitelist_licenses_spec.rb +0 -38
  80. data/features/features/package_managers/bower_spec.rb +0 -14
  81. data/features/features/package_managers/carthage_spec.rb +0 -14
  82. data/features/features/package_managers/cocoapods_spec.rb +0 -14
  83. data/features/features/package_managers/conan_spec.rb +0 -11
  84. data/features/features/package_managers/dep_spec.rb +0 -15
  85. data/features/features/package_managers/glide_spec.rb +0 -26
  86. data/features/features/package_managers/godep_spec.rb +0 -17
  87. data/features/features/package_managers/govendor_spec.rb +0 -15
  88. data/features/features/package_managers/gradle_spec.rb +0 -34
  89. data/features/features/package_managers/gvt_spec.rb +0 -14
  90. data/features/features/package_managers/maven_spec.rb +0 -22
  91. data/features/features/package_managers/mix_spec.rb +0 -16
  92. data/features/features/package_managers/npm_spec.rb +0 -14
  93. data/features/features/package_managers/nuget_spec.rb +0 -14
  94. data/features/features/package_managers/pip_spec.rb +0 -14
  95. data/features/features/package_managers/rebar_spec.rb +0 -14
  96. data/features/features/package_managers/yarn_spec.rb +0 -14
  97. data/features/features/report/composite_spec.rb +0 -28
  98. data/features/features/report/csv_spec.rb +0 -18
  99. data/features/features/report/diff_spec.rb +0 -203
  100. data/features/features/report/html_spec.rb +0 -51
  101. data/features/features/report/java_groups_spec.rb +0 -11
  102. data/features/features/report/subproject_spec.rb +0 -63
  103. data/features/fixtures/Cartfile +0 -1
  104. data/features/fixtures/Podfile +0 -3
  105. data/features/fixtures/alternate-build-file-gradle/build-alt.gradle +0 -16
  106. data/features/fixtures/alternate-build-file-gradle/settings.gradle +0 -1
  107. data/features/fixtures/build.gradle +0 -16
  108. data/features/fixtures/conanfile.txt +0 -11
  109. data/features/fixtures/file-based-libs-gradle/build.gradle +0 -16
  110. data/features/fixtures/file-based-libs-gradle/libs/data.json-0.2.3.jar +0 -0
  111. data/features/fixtures/gopath/src/github.com/pivotal/foo/Godeps/Godeps.json +0 -16
  112. data/features/fixtures/gopath/src/github.com/pivotal/foo/Godeps/Readme +0 -5
  113. data/features/fixtures/gopath/src/github.com/pivotal/foo/foo.go +0 -6
  114. data/features/fixtures/gopath_dep/src/foo-dep/Gopkg.lock +0 -14
  115. data/features/fixtures/gopath_dep/src/foo-dep/Gopkg.toml +0 -7
  116. data/features/fixtures/gopath_dep/src/foo-dep/bar/bar.go +0 -10
  117. data/features/fixtures/gopath_dep/src/foo-dep/foo.go +0 -7
  118. data/features/fixtures/gopath_dep/src/foo-dep/vendor/a/b/LICENSE +0 -1
  119. data/features/fixtures/gopath_glide/src/glide.lock +0 -9
  120. data/features/fixtures/gopath_glide/src/glide.yaml +0 -6
  121. data/features/fixtures/gopath_glide_without_src/glide.lock +0 -9
  122. data/features/fixtures/gopath_glide_without_src/glide.yaml +0 -6
  123. data/features/fixtures/gopath_govendor/src/vendor/vendor.json +0 -19
  124. data/features/fixtures/gopath_gvt/src/vendor/manifest +0 -22
  125. data/features/fixtures/gradle-wrapper/build.gradle +0 -16
  126. data/features/fixtures/gradle-wrapper/gradlew +0 -8
  127. data/features/fixtures/gradle-wrapper/gradlew.bat +0 -9
  128. data/features/fixtures/maven-wrapper/mvnw +0 -3
  129. data/features/fixtures/maven-wrapper/mvnw.cmd +0 -7
  130. data/features/fixtures/maven-wrapper/pom.xml +0 -37
  131. data/features/fixtures/mix.exs +0 -22
  132. data/features/fixtures/multi-module-gradle/build.gradle +0 -12
  133. data/features/fixtures/multi-module-gradle/module1/build.gradle +0 -3
  134. data/features/fixtures/multi-module-gradle/module2/build.gradle +0 -3
  135. data/features/fixtures/multi-module-gradle/settings.gradle +0 -1
  136. data/features/fixtures/nuget/.nuget/.keep +0 -0
  137. data/features/fixtures/nuget/Fun.Test/packages.config +0 -4
  138. data/features/fixtures/nuget/Fun/packages.config +0 -5
  139. data/features/fixtures/pom.xml +0 -19
  140. data/features/fixtures/rebar.config +0 -12
  141. data/features/fixtures/single-module-gradle/build.gradle +0 -16
  142. data/features/support/feature_helper.rb +0 -15
  143. data/features/support/testing_dsl.rb +0 -564
  144. data/lib/license_finder/package_managers/merged_package.rb +0 -95
  145. data/license_finder-2.1.2.gem +0 -0
@@ -24,8 +24,9 @@ module LicenseFinder
24
24
  }
25
25
  end
26
26
 
27
- def modifying(&block)
28
- license_finder.modifying(&block)
27
+ def modifying
28
+ yield
29
+ decisions.save!(config.decisions_file_path)
29
30
  end
30
31
  end
31
32
  end
@@ -19,6 +19,44 @@ module LicenseFinder
19
19
  true
20
20
  end
21
21
 
22
+ def mix_command
23
+ get(:mix_command) || 'mix'
24
+ end
25
+
26
+ def merge(other_hash)
27
+ dup_with other_hash
28
+ end
29
+
30
+ def rebar_deps_dir
31
+ path = get(:rebar_deps_dir) || 'deps'
32
+ project_path.join(path).expand_path
33
+ end
34
+
35
+ def mix_deps_dir
36
+ path = get(:mix_deps_dir) || 'deps'
37
+ project_path.join(path).expand_path
38
+ end
39
+
40
+ def decisions_file_path
41
+ path = File.join(project_path, 'doc/dependency_decisions.yml') unless project_path.nil?
42
+ path = get(:decisions_file) unless get(:decisions_file).nil?
43
+ path = 'doc/dependency_decisions.yml' if path.nil?
44
+ Pathname.new(path)
45
+ end
46
+
47
+ def log_directory
48
+ path = get(:log_directory) || 'lf_logs'
49
+ project_path.join(path).expand_path
50
+ end
51
+
52
+ def project_path
53
+ Pathname(path_prefix).expand_path
54
+ end
55
+
56
+ def logger_mode
57
+ get(:logger)
58
+ end
59
+
22
60
  def gradle_command
23
61
  get(:gradle_command)
24
62
  end
@@ -47,31 +85,41 @@ module LicenseFinder
47
85
  get(:rebar_command)
48
86
  end
49
87
 
50
- def mix_command
51
- get(:mix_command) || 'mix'
88
+ def prepare
89
+ get(:prepare) || prepare_no_fail
52
90
  end
53
91
 
54
- def rebar_deps_dir
55
- path = get(:rebar_deps_dir) || 'deps'
56
- project_path.join(path).expand_path
92
+ def prepare_no_fail
93
+ get(:prepare_no_fail)
57
94
  end
58
95
 
59
- def mix_deps_dir
60
- path = get(:mix_deps_dir) || 'deps'
61
- project_path.join(path).expand_path
96
+ def save_file
97
+ get(:save)
62
98
  end
63
99
 
64
- def decisions_file_path
65
- path = get(:decisions_file) || 'doc/dependency_decisions.yml'
66
- project_path.join(path).expand_path
100
+ def aggregate_paths
101
+ get(:aggregate_paths)
67
102
  end
68
103
 
69
- def project_path
70
- Pathname(path_prefix).expand_path
104
+ def recursive
105
+ get(:recursive)
71
106
  end
72
107
 
73
- def prepare
74
- get(:prepare)
108
+ def format
109
+ get(:format)
110
+ end
111
+
112
+ def columns
113
+ get(:columns)
114
+ end
115
+
116
+ protected
117
+
118
+ attr_accessor :primary_config
119
+ def dup_with(other_hash)
120
+ dup.tap do |dup|
121
+ dup.primary_config.merge!(other_hash)
122
+ end
75
123
  end
76
124
 
77
125
  private
@@ -82,6 +130,11 @@ module LicenseFinder
82
130
  @primary_config[key.to_sym] || @saved_config[key.to_s]
83
131
  end
84
132
 
133
+ def initialize_copy(orig)
134
+ super
135
+ @primary_config = @primary_config.dup
136
+ end
137
+
85
138
  def path_prefix
86
139
  get(:project_path) || ''
87
140
  end
@@ -6,7 +6,9 @@ require 'license_finder/license'
6
6
  require 'license_finder/configuration'
7
7
  require 'license_finder/package_manager'
8
8
  require 'license_finder/decisions'
9
+ require 'license_finder/decisions_factory'
9
10
  require 'license_finder/decision_applier'
11
+ require 'license_finder/scanner'
10
12
 
11
13
  module LicenseFinder
12
14
  # Coordinates setup
@@ -26,9 +28,10 @@ module LicenseFinder
26
28
  # rebar_command: "rebar",
27
29
  # rebar_deps_dir: "deps",
28
30
  # }
29
- def initialize(options = {})
30
- @logger = Logger.new(options.fetch(:logger, {}))
31
- @config = Configuration.with_optional_saved_config(options)
31
+ def initialize(configuration)
32
+ @logger = Logger.new(configuration.logger_mode)
33
+ @config = configuration
34
+ @scanner = Scanner.new(options)
32
35
  end
33
36
 
34
37
  def modifying
@@ -48,11 +51,12 @@ module LicenseFinder
48
51
  end
49
52
 
50
53
  def decisions
51
- @decisions ||= Decisions.fetch_saved(config.decisions_file_path)
54
+ @decisions ||= DecisionsFactory.decisions(config.decisions_file_path)
52
55
  end
53
56
 
54
57
  def prepare_projects
55
- package_managers = PackageManager.active_package_managers options
58
+ clear_logs
59
+ package_managers = @scanner.active_package_managers
56
60
  package_managers.each do |manager|
57
61
  logger.debug manager.class, 'Running prepare on project'
58
62
  manager.prepare
@@ -74,13 +78,18 @@ module LicenseFinder
74
78
 
75
79
  def current_packages
76
80
  # lazy, do not move to `initialize`
77
- PackageManager.active_packages options
81
+ @scanner.active_packages
82
+ end
83
+
84
+ def clear_logs
85
+ FileUtils.rmdir config.log_directory if File.directory? config.log_directory
78
86
  end
79
87
 
80
88
  def options
81
89
  {
82
90
  logger: logger,
83
91
  project_path: config.project_path,
92
+ log_directory: File.join(config.log_directory, project_name),
84
93
  ignored_groups: decisions.ignored_groups,
85
94
  go_full_version: config.go_full_version,
86
95
  gradle_command: config.gradle_command,
@@ -92,7 +101,8 @@ module LicenseFinder
92
101
  rebar_deps_dir: config.rebar_deps_dir,
93
102
  mix_command: config.mix_command,
94
103
  mix_deps_dir: config.mix_deps_dir,
95
- prepare: config.prepare
104
+ prepare: config.prepare,
105
+ prepare_no_fail: config.prepare_no_fail
96
106
  }
97
107
  end
98
108
  end
@@ -0,0 +1,11 @@
1
+ module LicenseFinder
2
+ class DecisionsFactory
3
+ @decisions = {}
4
+ class << self
5
+ def decisions(decisions_file_path)
6
+ @decisions[decisions_file_path] = Decisions.fetch_saved(decisions_file_path) if @decisions[decisions_file_path].nil?
7
+ @decisions[decisions_file_path]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -10,7 +10,7 @@ modification, are permitted provided that the following conditions are met:
10
10
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
11
11
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
12
12
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
13
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
13
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
14
14
  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15
15
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
16
16
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
@@ -1,7 +1,7 @@
1
1
  module LicenseFinder
2
2
  class LicenseAggregator
3
- def initialize(license_finder_config, aggregate_paths)
4
- @license_finder_config = license_finder_config
3
+ def initialize(config, aggregate_paths)
4
+ @config = config
5
5
  @aggregate_paths = aggregate_paths
6
6
  end
7
7
 
@@ -10,7 +10,10 @@ module LicenseFinder
10
10
  end
11
11
 
12
12
  def any_packages?
13
- finders.map(&:any_packages?).reduce(:|)
13
+ finders.map do |finder|
14
+ finder.prepare_projects if @config.prepare
15
+ finder.any_packages?
16
+ end.reduce(:|)
14
17
  end
15
18
 
16
19
  def unapproved
@@ -26,10 +29,12 @@ module LicenseFinder
26
29
  def finders
27
30
  return @finders unless @finders.nil?
28
31
  @finders = if @aggregate_paths.nil?
29
- [LicenseFinder::Core.new(@license_finder_config)]
32
+ [LicenseFinder::Core.new(@config)]
30
33
  else
31
34
  @aggregate_paths.map do |path|
32
- LicenseFinder::Core.new(@license_finder_config.merge(project_path: path))
35
+ # Passing file paths as values instead of allowing them to evaluate in config
36
+ LicenseFinder::Core.new(@config.merge(project_path: path,
37
+ decisions_file: @config.decisions_file_path))
33
38
  end
34
39
  end
35
40
  end
@@ -37,7 +42,7 @@ module LicenseFinder
37
42
  def aggregate_packages
38
43
  return @packages unless @packages.nil?
39
44
  all_packages = finders.flat_map do |finder|
40
- finder.prepare_projects if @license_finder_config[:prepare]
45
+ finder.prepare_projects if @config.prepare
41
46
  finder.acknowledged.map { |dep| MergedPackage.new(dep, [finder.project_path]) }
42
47
  end
43
48
  @packages = all_packages.group_by { |package| [package.name, package.version] }
@@ -8,13 +8,13 @@ module LicenseFinder
8
8
 
9
9
  attr_reader :mode
10
10
 
11
- def initialize(options = {})
11
+ def initialize(mode = nil)
12
12
  @system_logger = ::Logger.new(STDOUT)
13
13
  @system_logger.formatter = proc do |_, _, _, msg|
14
14
  "#{msg}\n"
15
15
  end
16
16
 
17
- self.mode = options[:mode] || MODE_INFO
17
+ self.mode = mode || MODE_INFO
18
18
  end
19
19
 
20
20
  [MODE_INFO, MODE_DEBUG].each do |level|
@@ -1,5 +1,5 @@
1
- require 'license_finder/packages/licensing'
2
- require 'license_finder/packages/license_files'
1
+ require 'license_finder/package_utils/licensing'
2
+ require 'license_finder/package_utils/license_files'
3
3
 
4
4
  module LicenseFinder
5
5
  # Super-class that adapts data from different package management
@@ -20,6 +20,7 @@ module LicenseFinder
20
20
  def self.license_names_from_standard_spec(spec)
21
21
  licenses = spec['licenses'] || [spec['license']].compact
22
22
  licenses = [licenses] unless licenses.is_a?(Array)
23
+ licenses = licenses.flatten
23
24
  licenses.map do |license|
24
25
  if license.is_a? Hash
25
26
  license['type']
@@ -167,17 +168,18 @@ module LicenseFinder
167
168
  end
168
169
 
169
170
  require 'license_finder/packages/manual_package'
170
- require 'license_finder/package_managers/bower_package'
171
- require 'license_finder/package_managers/go_package'
172
- require 'license_finder/package_managers/bundler_package'
173
- require 'license_finder/package_managers/pip_package'
174
- require 'license_finder/package_managers/npm_package'
175
- require 'license_finder/package_managers/maven_package'
176
- require 'license_finder/package_managers/gradle_package'
177
- require 'license_finder/package_managers/cocoa_pods_package'
178
- require 'license_finder/package_managers/carthage_package'
179
- require 'license_finder/package_managers/rebar_package'
180
- require 'license_finder/package_managers/mix_package'
181
- require 'license_finder/package_managers/merged_package'
182
- require 'license_finder/package_managers/nuget_package'
183
- require 'license_finder/package_managers/conan_package'
171
+ require 'license_finder/packages/bower_package'
172
+ require 'license_finder/packages/go_package'
173
+ require 'license_finder/packages/bundler_package'
174
+ require 'license_finder/packages/pip_package'
175
+ require 'license_finder/packages/npm_package'
176
+ require 'license_finder/packages/maven_package'
177
+ require 'license_finder/packages/gradle_package'
178
+ require 'license_finder/packages/cocoa_pods_package'
179
+ require 'license_finder/packages/carthage_package'
180
+ require 'license_finder/packages/rebar_package'
181
+ require 'license_finder/packages/mix_package'
182
+ require 'license_finder/packages/merged_package'
183
+ require 'license_finder/packages/nuget_package'
184
+ require 'license_finder/packages/conan_package'
185
+ require 'license_finder/packages/yarn_package'
@@ -17,39 +17,6 @@ module LicenseFinder
17
17
  include LicenseFinder::SharedHelpers
18
18
 
19
19
  class << self
20
- def package_managers
21
- [GoDep, GoWorkspace, Go15VendorExperiment, Glide, Gvt, Govendor, Dep, Bundler, NPM, Pip,
22
- Yarn, Bower, Maven, Gradle, CocoaPods, Rebar, Nuget, Carthage, Mix, Conan]
23
- end
24
-
25
- def active_packages(options = { project_path: Pathname.new('') })
26
- package_managers = active_package_managers(options)
27
- installed_package_managers = package_managers.select { |pm| pm.class.installed?(options[:logger]) }
28
- installed_package_managers.flat_map(&:current_packages_with_relations)
29
- end
30
-
31
- def active_package_managers(options = { project_path: Pathname.new('') })
32
- logger = options[:logger]
33
-
34
- active_pm_classes = []
35
- package_managers.each do |pm_class|
36
- active = pm_class.new(options).active?
37
- if active
38
- logger.info pm_class, 'is active', color: :green
39
- active_pm_classes << pm_class
40
- else
41
- logger.debug pm_class, 'is not active', color: :red
42
- end
43
- end
44
-
45
- if active_pm_classes.empty?
46
- logger.info 'License Finder', 'No active and installed package managers found for project.', color: :red
47
- end
48
-
49
- active_pm_classes -= active_pm_classes.map(&:takes_priority_over)
50
- active_pm_classes.map { |pm_class| pm_class.new(options) }
51
- end
52
-
53
20
  def takes_priority_over
54
21
  nil
55
22
  end
@@ -78,9 +45,22 @@ module LicenseFinder
78
45
  end
79
46
  end
80
47
 
48
+ def self.command_exists?(command)
49
+ _stdout, _stderr, status =
50
+ if LicenseFinder::Platform.windows?
51
+ Cmd.run("where #{command}")
52
+ else
53
+ Cmd.run("which #{command}")
54
+ end
55
+
56
+ status.success?
57
+ end
58
+
81
59
  def initialize(options = {})
60
+ @prepare_no_fail = options[:prepare_no_fail]
82
61
  @logger = options[:logger] || Core.default_logger
83
62
  @project_path = options[:project_path]
63
+ @log_directory = options[:log_directory]
84
64
  end
85
65
 
86
66
  def active?
@@ -94,15 +74,24 @@ module LicenseFinder
94
74
 
95
75
  def prepare
96
76
  if self.class.prepare_command
97
- _stdout, _stderr, status = Cmd.run(self.class.prepare_command)
98
- raise "Prepare command '#{self.class.prepare_command}' failed" unless status.success?
77
+ _stdout, stderr, status = Cmd.run(self.class.prepare_command)
78
+ unless status.success?
79
+ log_errors stderr
80
+ raise "Prepare command '#{self.class.prepare_command}' failed" unless @prepare_no_fail
81
+ end
99
82
  else
100
83
  logger.debug self.class, 'no prepare step provided', color: :red
101
84
  end
102
85
  end
103
86
 
104
87
  def current_packages_with_relations
105
- packages = current_packages
88
+ begin
89
+ packages = current_packages
90
+ rescue StandardError => e
91
+ raise e unless @prepare_no_fail
92
+ packages = []
93
+ end
94
+
106
95
  packages.each do |parent|
107
96
  parent.children.each do |child_name|
108
97
  child = packages.detect { |child_package| child_package.name == child_name }
@@ -112,20 +101,24 @@ module LicenseFinder
112
101
  packages
113
102
  end
114
103
 
115
- def self.command_exists?(command)
116
- _stdout, _stderr, status =
117
- if LicenseFinder::Platform.windows?
118
- Cmd.run("where #{command}")
119
- else
120
- Cmd.run("which #{command}")
121
- end
122
-
123
- status.success?
124
- end
125
-
126
104
  private
127
105
 
128
106
  attr_reader :logger, :project_path
107
+
108
+ def log_errors(stderr)
109
+ logger.info self.class.prepare_command, 'did not succeed.', color: :red
110
+ logger.info self.class.prepare_command, stderr, color: :red
111
+ log_to_file stderr
112
+ end
113
+
114
+ def log_to_file(contents)
115
+ FileUtils.mkdir_p @log_directory
116
+ log_file = File.join(@log_directory, "prepare_#{self.class.package_management_command || 'errors'}.log")
117
+ File.open(log_file, 'w') do |f|
118
+ f.write("Prepare command \"#{self.class.prepare_command}\" failed with:\n")
119
+ f.write("#{contents}\n\n")
120
+ end
121
+ end
129
122
  end
130
123
  end
131
124