Skip to content

Commit

Permalink
[Changed] Exclude Gradle subprojects from project roots
Browse files Browse the repository at this point in the history
Signed-off-by: Vikram Yadav <vyadav@pivotal.io>
Signed-off-by: Debbie Chen <dechen@pivotal.io>
Signed-off-by: Peter Tran <ptran@pivotal.io>
Signed-off-by: Jeff Jun <jjun@pivotal.io>
Signed-off-by: Jason Smith <jsmith@pivotal.io>

[#168445715]
  • Loading branch information
xtreme-jason-smith authored and Pivotal committed Oct 15, 2019
1 parent a98eaba commit 4efea4c
Show file tree
Hide file tree
Showing 26 changed files with 610 additions and 47 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.bundle
.gradle/
.idea/*
.idea/
.pairs
.rvmrc
Gemfile.lock
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,8 @@ downloadLicenses {
}
```

**A note on Gradle Subprojects**: `license_finder` does not report Gradle subprojects as project roots when generating reports. However, if there is a non-Gradle package definition file in a subproject, then it will be included in the report.

### Conan Projects

`license_finder` supports Conan. You need to have the following lines in your conanfile.txt for `license_finder` to retrieve dependencies' licenses.
Expand Down
46 changes: 36 additions & 10 deletions features/features/cli/cli_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -102,27 +102,53 @@
end

describe 'running project_roots' do
before do
@project = LicenseFinder::TestingDSL::CompositeProject.create
end

context 'with --recursive flag' do
let(:license_finder_command) { 'license_finder project_roots --recursive' }
context 'when called in root project' do
let(:license_finder_command) { 'license_finder project_roots --recursive' }

before do
@project = LicenseFinder::TestingDSL::GradleProject::MultiModule.create
end

it 'returns all project paths excluding subprojects' do
developer.execute_command(license_finder_command)

expect(developer).to be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle\"}
expect(developer).to_not be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module1\"}
expect(developer).to_not be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module2\"}
expect(developer).to_not be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module3\"}
expect(developer).to be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module1/module4/src/github.com/pivotal/foo\"}
end
end

specify 'returns all project paths' do
developer.execute_command(license_finder_command)
context "when called in subproject directory" do
let(:license_finder_command) { "license_finder project_roots --project_path=#{@project.project_dir.to_s}/multi-module-gradle/module1 --recursive" }

expect(developer).to be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle\"}
expect(developer).to be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/single-module-gradle\"}
before do
@project = LicenseFinder::TestingDSL::GradleProject::MultiModule.create
end

it 'returns all project paths excluding subprojects including current directory' do
developer.execute_command(license_finder_command)

expect(developer).to be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module1\"}
expect(developer).to_not be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module3\"}
expect(developer).to be_seeing_something_like %r{\"#{Regexp.escape(@project.project_dir.to_s)}/multi-module-gradle/module1/module4/src/github.com/pivotal/foo\"}
end
end

end

context 'without flags' do
let(:license_finder_command) { 'license_finder project_roots' }

before do
@project = LicenseFinder::TestingDSL::CompositeProject.create
end

specify 'returns current path' do
developer.execute_command(license_finder_command)
expect(developer).to be_seeing_something_like /^#{Regexp.escape(@project.project_dir.to_s)}$/
expect(developer).to be_seeing_something_like /^\["#{Regexp.escape(@project.project_dir.to_s)}"\]\n$/
end
end
end
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package foo

import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
2 changes: 1 addition & 1 deletion features/fixtures/multi-module-gradle/settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1 @@
include ':module1', ':module2'
include ':module1', ':module2', ':module1:module3'
18 changes: 13 additions & 5 deletions lib/license_finder/cli/main.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,13 @@ def self.shared_options
shared_options
def project_roots
config.strict_matching = true
aggregate_paths
project_path = config.project_path.to_s || Pathname.pwd.to_s
paths = aggregate_paths
filtered_project_roots = Scanner.remove_subprojects(paths)

filtered_project_roots << project_path if aggregate_paths.include?(project_path) && !filtered_project_roots.include?(project_path)

say(filtered_project_roots)
end

desc 'action_items', 'List unapproved dependencies (the default action for `license_finder`)'
Expand Down Expand Up @@ -175,12 +181,14 @@ def check_valid_project_path
def aggregate_paths
check_valid_project_path
aggregate_paths = config.aggregate_paths
project_path = config.project_path || Pathname.pwd
project_path = config.project_path.to_s || Pathname.pwd.to_s
aggregate_paths = ProjectFinder.new(project_path, config.strict_matching).find_projects if config.recursive
say(aggregate_paths || project_path) if config.strict_matching
return aggregate_paths unless aggregate_paths.nil? || aggregate_paths.empty?

[config.project_path] unless config.project_path.nil?
if aggregate_paths.nil? || aggregate_paths.empty?
[project_path]
else
aggregate_paths
end
end

def save_report(content, file_name)
Expand Down
4 changes: 4 additions & 0 deletions lib/license_finder/package_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ def active?
path&.exist?
end

def project_root?
active?
end

def detected_package_path
possible_package_paths.find(&:exist?)
end
Expand Down
13 changes: 13 additions & 0 deletions lib/license_finder/package_managers/gradle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,21 @@ def package_management_command
File.exist?(File.join(project_path, wrapper)) ? wrapper : gradle
end

def project_root?
active? && root_module?
end

private

def root_module?
command = "#{package_management_command} properties | grep 'parent: '"
stdout, stderr, status = Dir.chdir(project_path) { Cmd.run(command) }
raise "Command '#{command}' failed to execute: #{stderr}" unless status.success?

root_project_name = stdout.gsub(/\s|parent:|\n/, '')
root_project_name == 'null'
end

def detected_package_path
alternate_build_file = build_file_from_settings(project_path)
return alternate_build_file if alternate_build_file
Expand Down
6 changes: 4 additions & 2 deletions lib/license_finder/project_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@ def project_root?(pathname)
end

def active_project?(project_path)
active_project = @package_managers.map do |pm|
pm.new(project_path: project_path, strict_matching: @strict_matching).active?
active_project = @package_managers.map do |pm_class|
pm = pm_class.new(project_path: project_path, strict_matching: @strict_matching)
pm.active?
end

active_project.include?(true)
end

Expand Down
17 changes: 17 additions & 0 deletions lib/license_finder/scanner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,23 @@ class Scanner
PACKAGE_MANAGERS = [GoModules, GoDep, GoWorkspace, Go15VendorExperiment, Glide, Gvt, Govendor, Trash, Dep, Bundler, NPM, Pip,
Yarn, Bower, Maven, Gradle, CocoaPods, Rebar, Nuget, Carthage, Mix, Conan, Sbt, Cargo, Dotnet, Composer].freeze

class << self
def remove_subprojects(paths)
paths.reject { |path| subproject?(Pathname(path)) }
end

private

def subproject?(path)
subproject = true
PACKAGE_MANAGERS.each do |package_manager_class|
package_manager = package_manager_class.new(project_path: path)
subproject &&= !package_manager.project_root?
end
subproject
end
end

def initialize(config = { project_path: Pathname.new('') })
@config = config
@project_path = @config[:project_path]
Expand Down
16 changes: 16 additions & 0 deletions spec/fixtures/gradle-with-subprojects/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
plugins {
id 'java'
}

group 'test-gradle-project'
version '1.0-oslo-test'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading

0 comments on commit 4efea4c

Please sign in to comment.