summaryrefslogtreecommitdiff
path: root/lib/license/finder/ext/maven.rb
blob: ed78f076f5ebb4b5a7e09d9d477292f18d529438 (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
72
73
74
# frozen_string_literal: true

module LicenseFinder
  class Maven
    XML_PARSE_OPTIONS = {
      'ForceArray' => %w[license dependency],
      'GroupTags' => {
        'licenses' => 'license',
        'dependencies' => 'dependency'
      }
    }.freeze

    def active?
      project_path.join('pom.xml').exist?
    end

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

    def current_packages
      within_project_path do
        return [] unless shell.execute(detect_licenses_command, env: default_env)[-1].success?

        resource_files.flat_map { |file| map_from(file.read) }.uniq
      end
    end

    private

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

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

    def detect_licenses_command
      [
        package_management_command,
        "-e",
        "org.codehaus.mojo:license-maven-plugin:aggregate-download-licenses",
        "-Dlicense.excludedScopes=#{@ignored_groups.to_a.join(',')}",
        "-Dorg.slf4j.simpleLogger.log.org.codehaus.mojo.license=debug",
        ENV.fetch('MAVEN_CLI_OPTS', '-DskipTests')
      ]
    end

    def resource_files
      Pathname.glob(project_path.join('**', 'target', 'generated-resources', 'licenses.xml'))
    end

    def map_from(xml)
      log.debug(xml)
      XmlSimple
        .xml_in(xml, XML_PARSE_OPTIONS)['dependencies']
        .map { |dependency| Dependency.from(MavenPackage.new(dependency), detected_package_path) }
    end

    def package_management_command
      wrapper? ? project_path.join('mvnw') : :mvn
    end

    def wrapper?
      project_path.join('mvnw').exist?
    end
  end
end