From 8a202109e942316434978befd33854aa985dd872 Mon Sep 17 00:00:00 2001 From: Dwayne Forde Date: Tue, 25 Sep 2018 14:02:21 -0400 Subject: [PATCH] Adds Go Module support --- Dockerfile | 2 +- .../features/package_managers/dep_spec.rb | 1 + .../package_managers/go_modules_spec.rb | 13 ++++ features/fixtures/go_modules/go.mod | 3 + features/fixtures/go_modules/go.sum | 4 ++ features/fixtures/go_modules/main.go | 5 ++ features/support/testing_dsl.rb | 14 +++++ lib/license_finder/package_manager.rb | 1 + .../package_managers/go_modules.rb | 52 ++++++++++++++++ lib/license_finder/scanner.rb | 2 +- spec/fixtures/all_pms/go.sum | 0 spec/fixtures/config/go.sum | 4 ++ .../package_managers/go_modules_spec.rb | 60 +++++++++++++++++++ 13 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 features/features/package_managers/go_modules_spec.rb create mode 100644 features/fixtures/go_modules/go.mod create mode 100644 features/fixtures/go_modules/go.sum create mode 100644 features/fixtures/go_modules/main.go create mode 100644 lib/license_finder/package_managers/go_modules.rb create mode 100644 spec/fixtures/all_pms/go.sum create mode 100644 spec/fixtures/config/go.sum create mode 100644 spec/lib/license_finder/package_managers/go_modules_spec.rb diff --git a/Dockerfile b/Dockerfile index 3029312de..c7e899020 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:xenial # Versioning ENV PIP_INSTALL_VERSION 10.0.1 -ENV GO_LANG_VERSION 1.10.2 +ENV GO_LANG_VERSION 1.11 ENV MAVEN_VERSION 3.5.3 ENV SBT_VERSION 1.1.1 ENV GRADLE_VERSION 4.2 diff --git a/features/features/package_managers/dep_spec.rb b/features/features/package_managers/dep_spec.rb index 4137e3290..20fda2ed7 100644 --- a/features/features/package_managers/dep_spec.rb +++ b/features/features/package_managers/dep_spec.rb @@ -4,6 +4,7 @@ let(:go_developer) { LicenseFinder::TestingDSL::User.new } specify 'are shown in reports for a project' do + ENV['DEPNOLOCK'] = '1' project = LicenseFinder::TestingDSL::DepProject.create ENV['GOPATH'] = "#{project.project_dir}/gopath_dep" diff --git a/features/features/package_managers/go_modules_spec.rb b/features/features/package_managers/go_modules_spec.rb new file mode 100644 index 000000000..665c82c58 --- /dev/null +++ b/features/features/package_managers/go_modules_spec.rb @@ -0,0 +1,13 @@ +require_relative '../../support/feature_helper' + +describe 'Go Modules Dependencies' do + let(:go_developer) { LicenseFinder::TestingDSL::User.new } + + specify 'are shown in reports for a project' do + LicenseFinder::TestingDSL::GoModulesProject.create + go_developer.run_license_finder('go_modules') + + expect(go_developer).to be_seeing_line 'gopkg.in/check.v1, v0.0.0-20161208181325-20d25e280405, "Apache 2.0, MIT"' + expect(go_developer).to be_seeing_line 'gopkg.in/yaml.v2, v2.2.1, "Apache 2.0, MIT"' + end +end diff --git a/features/fixtures/go_modules/go.mod b/features/fixtures/go_modules/go.mod new file mode 100644 index 000000000..ed1e9af19 --- /dev/null +++ b/features/fixtures/go_modules/go.mod @@ -0,0 +1,3 @@ +module foo + +require gopkg.in/yaml.v2 v2.2.1 diff --git a/features/fixtures/go_modules/go.sum b/features/fixtures/go_modules/go.sum new file mode 100644 index 000000000..774a9a13b --- /dev/null +++ b/features/fixtures/go_modules/go.sum @@ -0,0 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/features/fixtures/go_modules/main.go b/features/fixtures/go_modules/main.go new file mode 100644 index 000000000..bbe4b868b --- /dev/null +++ b/features/fixtures/go_modules/main.go @@ -0,0 +1,5 @@ +package foo + +import ( + "gopkg.in/yaml.v2" +) diff --git a/features/support/testing_dsl.rb b/features/support/testing_dsl.rb index 015931252..5b0ba4ced 100644 --- a/features/support/testing_dsl.rb +++ b/features/support/testing_dsl.rb @@ -222,6 +222,20 @@ def shell_out(command) end end + class GoModulesProject < Project + def add_dep + clone('go_modules') + end + + def install + shell_out('go mod vendor') + end + + def shell_out(command) + ProjectDir.new(Paths.root.join('tmp', 'projects', 'my_app', 'go_modules')).shell_out(command) + end + end + class GlideProject < Project def add_dep clone('gopath_glide') diff --git a/lib/license_finder/package_manager.rb b/lib/license_finder/package_manager.rb index ccdf9c8ca..66fba3025 100644 --- a/lib/license_finder/package_manager.rb +++ b/lib/license_finder/package_manager.rb @@ -130,6 +130,7 @@ def log_to_file(contents) require 'license_finder/package_managers/gvt' require 'license_finder/package_managers/glide' require 'license_finder/package_managers/govendor' +require 'license_finder/package_managers/go_modules' require 'license_finder/package_managers/bundler' require 'license_finder/package_managers/npm' require 'license_finder/package_managers/yarn' diff --git a/lib/license_finder/package_managers/go_modules.rb b/lib/license_finder/package_managers/go_modules.rb new file mode 100644 index 000000000..0fd8da604 --- /dev/null +++ b/lib/license_finder/package_managers/go_modules.rb @@ -0,0 +1,52 @@ +module LicenseFinder + class GoModules < PackageManager + PACKAGES_FILE = 'go.sum'.freeze + + class << self + def takes_priority_over + Go15VendorExperiment + end + + def prepare_command + 'go mod vendor' + end + end + + def active? + sum_files? + end + + def current_packages + sum_file_paths.uniq.map do |file_path| + read_sum(file_path) + end.flatten + end + + private + + def sum_files? + sum_file_paths.any? + end + + def sum_file_paths + Dir[project_path.join(PACKAGES_FILE)] + end + + def read_sum(file_path) + contents = File.read(file_path) + contents.each_line.map do |line| + line.include?('go.mod') ? nil : read_package(file_path, line) + end.compact + end + + def read_package(file_path, line) + parts = line.split(' ') + install_path = File.dirname(file_path) + + name = parts[0] + version = parts[1] + + Package.new(name, version, install_path: install_path) + end + end +end diff --git a/lib/license_finder/scanner.rb b/lib/license_finder/scanner.rb index ad083f47b..70e03043f 100644 --- a/lib/license_finder/scanner.rb +++ b/lib/license_finder/scanner.rb @@ -1,6 +1,6 @@ module LicenseFinder class Scanner - PACKAGE_MANAGERS = [GoDep, GoWorkspace, Go15VendorExperiment, Glide, Gvt, Govendor, Dep, Bundler, NPM, Pip, + PACKAGE_MANAGERS = [GoModules, GoDep, GoWorkspace, Go15VendorExperiment, Glide, Gvt, Govendor, Dep, Bundler, NPM, Pip, Yarn, Bower, Maven, Gradle, CocoaPods, Rebar, Nuget, Carthage, Mix, Conan, Sbt, Cargo].freeze def initialize(config = { project_path: Pathname.new('') }) diff --git a/spec/fixtures/all_pms/go.sum b/spec/fixtures/all_pms/go.sum new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/config/go.sum b/spec/fixtures/config/go.sum new file mode 100644 index 000000000..774a9a13b --- /dev/null +++ b/spec/fixtures/config/go.sum @@ -0,0 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/spec/lib/license_finder/package_managers/go_modules_spec.rb b/spec/lib/license_finder/package_managers/go_modules_spec.rb new file mode 100644 index 000000000..3c003054a --- /dev/null +++ b/spec/lib/license_finder/package_managers/go_modules_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' +require 'fakefs/spec_helpers' + +module LicenseFinder + describe GoModules do + it_behaves_like 'a PackageManager' + + let(:src_path) { '/workspace/code' } + let(:sum_path) { "#{src_path}/go.sum" } + let(:vendor_path) { "#{src_path}/vendor" } + + subject { GoModules.new(project_path: Pathname(src_path), logger: double(:logger, active: nil)) } + + describe '#current_packages' do + before do + FakeFS.activate! + end + + after do + FakeFS.deactivate! + end + + let(:src_path) { '/workspace/code' } + let(:sum_path) { "#{src_path}/go.sum" } + + let(:content) do + FakeFS.without do + fixture_from('go.sum') + end + end + + it 'finds all the packages all go.sum files' do + FileUtils.mkdir_p(vendor_path) + File.write(sum_path, content) + + packages = subject.current_packages + + expect(packages.length).to eq 2 + + expect(packages.first.name).to eq 'gopkg.in/check.v1' + expect(packages.first.version).to eq 'v0.0.0-20161208181325-20d25e280405' + + expect(packages.last.name).to eq 'gopkg.in/yaml.v2' + expect(packages.last.version).to eq 'v2.2.1' + end + end + + describe '.prepare_command' do + it 'returns the correct package management command' do + expect(described_class.prepare_command).to eq('go mod vendor') + end + end + + describe '.takes_priority_over' do + it 'returns the package manager it takes priority over' do + expect(described_class.takes_priority_over).to eq(Go15VendorExperiment) + end + end + end +end