summaryrefslogtreecommitdiff
path: root/scalalib/src/mill/scalalib/publish/Ivy.scala
blob: 644e2c53099a12cbdb4311dd37025347a316f21c (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
package mill.scalalib.publish

import mill.util.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) = {
    val scope = scopeToConf(dep.scope)
    <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"$scope->default(compile)"}></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"
  }

}