summaryrefslogtreecommitdiff
path: root/lib/license/finder/ext/gradle.rb
blob: 4d6b0007da5c752f1b920fb6688e6efdb55d981c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# frozen_string_literal: true

module LicenseFinder
  class Gradle
    def prepare
      within_project_path do
        tool_box.install(tool: :java, version: java_version, env: default_env)
      end
    end

    def current_packages
      return [] unless download_licenses

      Pathname
        .glob(project_path.join('**', 'dependency-license.xml'))
        .map(&:read)
        .flat_map { |xml_file| parse_from(xml_file) }.uniq
    end

    def package_management_command
      wrapper? ? './gradlew' : 'gradle'
    end

    private

    def java_version(env: ENV)
      @java_version ||= tool_box.version_of(:java, env: env)
    end

    def download_licenses
      _stdout, _stderr, status = within_project_path do
        env = {
          'JAVA_HOME' => ENV.fetch("JAVA_HOME", "/opt/asdf/installs/java/#{java_version}"),
          'TERM' => 'noop'
        }
        shell.execute([
          @command,
          ENV.fetch('GRADLE_CLI_OPTS', '--exclude-task=test --no-daemon --debug'),
          'downloadLicenses'
        ], env: env)
      end

      status.success?
    end

    def wrapper?
      File.exist?(File.join(project_path, 'gradlew'))
    end

    def xml_parsing_options
      @xml_parsing_options ||= { 'GroupTags' => { 'dependencies' => 'dependency' } }
    end

    def parse_from(xml_file)
      XmlSimple
        .xml_in(xml_file, xml_parsing_options)
        .fetch('dependency', []).map { |hash| map_from(hash) }
    end

    def map_from(hash)
      Dependency.from(GradlePackage.new(hash, include_groups: @include_groups), detected_package_path)
    end

    def default_env
      @default_env = {
        'CACHE_DIR' => '/opt/gitlab',
        'JAVA_HOME' => ENV.fetch("JAVA_HOME", "/opt/asdf/installs/java/#{java_version}")
      }
    end
  end
end