diff options
| author | mo khan <mo.khan@gmail.com> | 2020-06-04 08:53:19 +0000 |
|---|---|---|
| committer | Can Eldem <celdem@gitlab.com> | 2020-06-04 08:53:19 +0000 |
| commit | cd9cd852dac41980169f0521eb795e460994367b (patch) | |
| tree | b58db2991d16737d4942cad4b63949bc1330ba28 /lib | |
| parent | a49e935ee3e2e07d90da7c78b543a5592a3b1a4a (diff) | |
List all dependencies that appear in go.mod
* Update CHANGELOG and fix typo
* Render severity based on exit code
* Explicitly specify the default GOPROXY
* Default to -mod=readonly and allow override
* Do not modify `vendor` directory if it exists.
* Skip `go mod tidy` to prevent modifying projects files.
* Include dependencies that appear in go.mod but are not present in the
vendor directory.
* Remove severity from log output
* Wipe golang module cache before each spec
```plaintext
The -mod build flag provides additional control over updating and use of
go.mod.
If invoked with -mod=readonly, the go command is disallowed from the
implicit automatic updating of go.mod described above. Instead, it fails
when any changes to go.mod are needed. This setting is most useful to
check that go.mod does not need updates, such as in a continuous
integration and testing system. The "go get" command remains permitted
to update go.mod even with -mod=readonly, and the "go mod" commands do
not take the -mod flag (or any other build flags).
If invoked with -mod=vendor, the go command loads packages from the main
module's vendor directory instead of downloading modules to and loading
packages from the module cache. The go command assumes the vendor
directory holds correct copies of dependencies, and it does not compute
the set of required module versions from go.mod files. However, the go
command does check that vendor/modules.txt (generated by 'go mod
vendor') contains metadata consistent with go.mod.
If invoked with -mod=mod, the go command loads modules from the module
cache even if there is a vendor directory present.
If the go command is not invoked with a -mod flag and the vendor
directory is present and the "go" version in go.mod is 1.14 or higher,
the go command will act as if it were invoked with -mod=vendor.
```
- https://golang.org/cmd/go/#hdr-Maintaining_module_requirements
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/license/finder/ext/go_modules.rb | 87 | ||||
| -rw-r--r-- | lib/license/management.rb | 4 | ||||
| -rw-r--r-- | lib/license/management/shell.rb | 12 | ||||
| -rw-r--r-- | lib/license/management/version.rb | 2 |
4 files changed, 80 insertions, 25 deletions
diff --git a/lib/license/finder/ext/go_modules.rb b/lib/license/finder/ext/go_modules.rb index e2f025f..d22c59c 100644 --- a/lib/license/finder/ext/go_modules.rb +++ b/lib/license/finder/ext/go_modules.rb @@ -2,42 +2,91 @@ module LicenseFinder class GoModules + FORMAT = "'{{.Main}},{{.Path}},{{.Version}},{{.Dir}}'" + HEADER = [:main_module, :name, :version, :dir].freeze + def prepare - shell.execute([:go, :env]) - shell.execute([:go, :mod, :tidy, '-v', '&&', :go, :mod, :vendor, '-v']) - end + return if vendored? - def active? - sum_files.any? + shell.execute([:go, :mod, :download, '-json']) end def current_packages - stdout, _stderr, status = shell.execute(go_list_command) + modules = vendored? ? parse_go_sum : go_list_all + modules.map { |hash| map_from(hash) }.compact + end + + private + + def go_list_all + env = { 'GOFLAGS' => ENV.fetch('GOFLAGS', '-mod=readonly') } + command = [:go, :list, '-m', '-f', FORMAT, :all] + stdout, _stderr, status = shell.execute(command, env: env) return [] unless status.success? - stdout.each_line.map { |line| map_from(line) }.compact + stdout.each_line.map { |line| Hash[HEADER.zip(line.chomp.split(','))] } end - private + def parse_go_sum + go_sum_path + .each_line.map { |x| x.split(' ') } + .each_with_object({}) do |(name, version), memo| + next unless module_path?(name) - def sum_files - Pathname.glob(project_path.join('go.sum')) + memo["#{name}:#{version}"] = { + name: name, + version: version.split('/')[0], + dir: vendored_path_to(name) + } + end.values end - def go_list_command - [:go, :list, '-m', '-f', "'{{.Path}},{{.Version}},{{.Dir}}'", :all] + def map_from(hash) + return if hash[:main_module] == "true" + + Dependency.new( + 'Go', + hash[:name], + hash[:version], + install_path: install_dir_for(hash), + detection_path: go_sum_path + ) end - def absolute_project_path - @absolute_project_path ||= Pathname(project_path).cleanpath + def go_sum_path + @go_sum_path ||= Pathname.glob(project_path.join('go.sum')).find(&:exist?) end - def map_from(line) - name, version, dir = line.chomp.split(',') - return if dir.nil? - return if Pathname(dir).cleanpath == absolute_project_path + def vendor_path + @vendor_path ||= go_sum_path.parent.join('vendor') + end + + def vendored? + vendor_path.exist? && vendor_path.directory? + end + + def vendored_path_to(module_name) + vendor_path.join(module_name) + end + + def install_dir_for(hash) + dir = hash[:dir] + pathname = dir && !dir.empty? ? Pathname.new(dir) : vendored_path_to(hash[:name]) + pathname.exist? ? pathname : nil + end + + # https://golang.org/ref/mod#tmp_9 + def module_path?(module_path) + !module_path.start_with?('/') && + !module_path.end_with?('/') && + module_path.split('/').all? { |x| element?(x) } + end - Dependency.new('Go', name, version, install_path: dir, detection_path: sum_files.find(&:exist?)) + def element?(element) + !element.empty? && + !element.start_with?('.') && + !element.end_with?('.') && + element.match?(/\A[A-Za-z0-9+-._~]+\Z/) end end end diff --git a/lib/license/management.rb b/lib/license/management.rb index 6306faf..3b8cb69 100644 --- a/lib/license/management.rb +++ b/lib/license/management.rb @@ -24,8 +24,8 @@ module License def self.logger @logger ||= Logger.new(STDOUT, level: ENV.fetch('LOG_LEVEL', Logger::WARN)).tap do |x| - x.formatter = proc do |severity, _datetime, _progname, message| - "#{severity} -- : #{message}\n" + x.formatter = proc do |_severity, _datetime, _progname, message| + "#{message}\n" end end end diff --git a/lib/license/management/shell.rb b/lib/license/management/shell.rb index 9ea66ca..9868f1e 100644 --- a/lib/license/management/shell.rb +++ b/lib/license/management/shell.rb @@ -18,7 +18,7 @@ module License stdout, stderr, status = Open3.capture3(env, expanded_command) - record(stdout, stderr) + record(stdout, stderr, status) [stdout, stderr, status] end @@ -76,9 +76,15 @@ module License !item.nil? && !item.empty? end - def record(stdout, stderr) + def record(stdout, stderr, status) logger.debug(stdout) if present?(stdout) - logger.error(stderr) if present?(stderr) + return unless present?(stderr) + + if status.success? + logger.debug(stderr) + else + logger.error(stderr) + end end end end diff --git a/lib/license/management/version.rb b/lib/license/management/version.rb index e53a751..bf992e9 100644 --- a/lib/license/management/version.rb +++ b/lib/license/management/version.rb @@ -2,6 +2,6 @@ module License module Management - VERSION = '3.11.0' + VERSION = '3.11.1' end end |
