summaryrefslogtreecommitdiff
path: root/scalalib/src/publish/Ivy.scala
blob: e06efadd4c8599b01a6b9bd99043335866fcfcf1 (plain) (blame)
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
package mill.scalalib.publish

import mill.api.Loose.Agg

import scala.xml.PrettyPrinter

object Ivy {

  val head = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"

  def apply(
      artifact: Artifact,
      dependencies: Agg[Dependency]
  ): String = {
    val xml =
      <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
        <info
        organisation={artifact.group} module={artifact.id} revision={artifact.version} status="release">
          <description/>
        </info>
        <configurations>
          <conf name="pom" visibility="public" description=""/>
          <conf extends="runtime" name="test" visibility="public" description=""/>
          <conf name="provided" visibility="public" description=""/>
          <conf name="optional" visibility="public" description=""/>
          <conf name="compile" visibility="public" description=""/>
          <conf extends="compile" name="runtime" visibility="public" description=""/>
        </configurations>

        <publications>
          <artifact name={artifact.id} type="pom" ext="pom" conf="pom"/>
          <artifact name={artifact.id} type="jar" ext="jar" conf="compile"/>
          <artifact name={artifact.id} type="src" ext="jar" conf="compile" e:classifier="sources"/>
          <artifact name={artifact.id} type="doc" ext="jar" conf="compile" e:classifier="javadoc"/>
        </publications>
        <dependencies>{dependencies.map(renderDependency).toSeq}</dependencies>
      </ivy-module>

    val pp = new PrettyPrinter(120, 4)
    head + pp.format(xml).replaceAll("&gt;", ">")
  }

  private def renderDependency(dep: Dependency) = {
    if (dep.exclusions.isEmpty)
      <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"${scopeToConf(dep.scope)}->${dep.configuration.getOrElse("default(compile)")}"} />
    else
      <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"${scopeToConf(dep.scope)}->${dep.configuration.getOrElse("default(compile)")}"}>
        {dep.exclusions.map(ex => <exclude org={ex._1} name={ex._2} matcher="exact"/>)}
      </dependency>
  }

  private def scopeToConf(s: Scope): String = s match {
    case Scope.Compile  => "compile"
    case Scope.Provided => "provided"
    case Scope.Test     => "test"
    case Scope.Runtime  => "runtime"
  }

}