All Downloads are FREE. Search and download functionalities are using the official Maven repository.

coursier.Cache.scala Maven / Gradle / Ivy

The newest version!
package coursier

import java.io.{ File, PrintWriter }
import scala.io.Source

object Cache {

  def mavenRepository(lines: Seq[String]): Option[MavenRepository] = {
    def isMaven =
      lines
        .find(_.startsWith("maven:"))
        .map(_.stripPrefix("maven:").trim)
        .toSeq
        .contains("true")

    def ivyLike =
      lines
        .find(_.startsWith("ivy-like:"))
        .map(_.stripPrefix("ivy-like:").trim)
        .toSeq
        .contains("true")

    def base =
      lines
        .find(_.startsWith("base:"))
        .map(_.stripPrefix("base:").trim)
        .filter(_.nonEmpty)

    if (isMaven)
      base.map(MavenRepository(_, ivyLike = ivyLike))
    else
      None
  }

  lazy val default = Cache(new File(sys.props("user.home") + "/.coursier/cache"))

}

case class Cache(cache: File) {

  import Cache._

  lazy val repoDir = new File(cache, "repositories")
  lazy val fileBase = new File(cache, "cache")

  lazy val defaultFile = new File(repoDir, ".default")

  def add(id: String, base: String, ivyLike: Boolean): Unit = {
    repoDir.mkdirs()
    val f = new File(repoDir, id)
    val w = new PrintWriter(f)
    try w.println((Seq("maven: true", s"base: $base") ++ (if (ivyLike) Seq("ivy-like: true") else Nil)).mkString("\n"))
    finally w.close()
  }

  def addCentral(): Unit =
    add("central", "https://repo1.maven.org/maven2/", ivyLike = false)

  def addIvy2Local(): Unit =
    add("ivy2local", new File(sys.props("user.home") + "/.ivy2/local/").toURI.toString, ivyLike = true)

  def init(
    ifEmpty: Boolean = true,
    verbose: Boolean = false
  ): Unit =
    if (!ifEmpty || !repoDir.exists() || !fileBase.exists()) {
      if (verbose)
        Console.err.println(s"Initializing $cache")
      repoDir.mkdirs()
      fileBase.mkdirs()
      addCentral()
      addIvy2Local()
      setDefault("ivy2local", "central")
    }

  def setDefault(ids: String*): Unit = {
    defaultFile.getParentFile.mkdirs()
    val w = new PrintWriter(defaultFile)
    try w.println(ids.mkString("\n"))
    finally w.close()
  }

  def list(): Seq[(String, MavenRepository, (String, File))] =
    Option(repoDir.listFiles())
      .map(_.toSeq)
      .getOrElse(Nil)
      .filter(f => f.isFile && !f.getName.startsWith("."))
      .flatMap { f =>
        val name = f.getName
        val lines = Source.fromFile(f).getLines().toList
        mavenRepository(lines).map(repo =>
          (name, repo, (repo.root, new File(fileBase, name)))
        )
      }

  def map(): Map[String, (MavenRepository, (String, File))] =
    list()
      .map{case (id, repo, fileCache) => id -> (repo, fileCache) }
      .toMap


  def repositories(): Seq[MavenRepository] =
    list().map(_._2)

  def repositoryMap(): Map[String, MavenRepository] =
    list()
      .map{case (id, repo, _) => id -> repo}
      .toMap

  def fileCaches(): Seq[(String, File)] =
    list().map(_._3)

  def default(withNotFound: Boolean = false): Seq[String] =
    if (defaultFile.exists()) {
      val default0 =
        Source.fromFile(defaultFile)
          .getLines()
          .map(_.trim)
          .filter(_.nonEmpty)
          .toList

      val found = list()
        .map(_._1)
        .toSet

      default0
        .filter(found)
    } else
      Nil

  def files(): Files =
    new Files(list().map{case (_, _, matching) => matching }, () => ???)

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy