diff --git a/README.md b/README.md index a9eca37d6..b9bb21260 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ A pure Scala substitute for [Aether](http://www.eclipse.org/aether/) [![Build Status](https://travis-ci.org/alexarchambault/coursier.svg?branch=master)](https://travis-ci.org/alexarchambault/coursier) +[![Build status (Windows)](https://ci.appveyor.com/api/projects/status/trtum5b7washfbj9?svg=true)](https://ci.appveyor.com/project/alexarchambault/coursier) [![Join the chat at https://gitter.im/alexarchambault/coursier](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/alexarchambault/coursier?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) See [Scala JS demo](https://alexarchambault.github.io/coursier/index.html#demo) and [usage](https://github.com/alexarchambault/coursier/blob/master/USAGE.md). diff --git a/core-jvm/src/main/scala/coursier/core/MavenRepository.scala b/core-jvm/src/main/scala/coursier/core/MavenRepository.scala index 9fb150d84..c7665d1ed 100644 --- a/core-jvm/src/main/scala/coursier/core/MavenRepository.scala +++ b/core-jvm/src/main/scala/coursier/core/MavenRepository.scala @@ -80,7 +80,13 @@ case class MavenRepository( ) } - EitherT(cachePolicy.saving(locally(localFile))(remote)(save)) + EitherT( + cachePolicy[String \/ String]( + _.isLeft )( + locally(localFile) )( + _ => CachePolicy.saving(remote)(save) + ) + ) } } diff --git a/core/src/main/scala/coursier/core/Repository.scala b/core/src/main/scala/coursier/core/Repository.scala index 7283f244c..e0e570920 100644 --- a/core/src/main/scala/coursier/core/Repository.scala +++ b/core/src/main/scala/coursier/core/Repository.scala @@ -455,18 +455,18 @@ abstract class BaseMavenRepository( } sealed trait CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] - - def saving[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]) - (save: => T => Task[Unit]): Task[E \/ T] = - apply(local)(CachePolicy.saving(remote)(save)) + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] } object CachePolicy { - def saving[E,T](remote: => Task[E \/ T]) - (save: T => Task[Unit]): Task[E \/ T] = { + def saving[E,T]( + remote: => Task[E \/ T] )( + save: T => Task[Unit] + ): Task[E \/ T] = { for { res <- remote _ <- res.fold(_ => Task.now(()), t => save(t)) @@ -474,19 +474,28 @@ object CachePolicy { } case object Default extends CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] = + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] = local - .flatMap(res => if (res.isLeft) remote else Task.now(res)) + .flatMap(res => if (tryRemote(res)) remote(Some(res)) else Task.now(res)) } case object LocalOnly extends CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] = + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] = local } case object ForceDownload extends CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] = - remote + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] = + remote(None) } } diff --git a/files/src/main/scala/coursier/Files.scala b/files/src/main/scala/coursier/Files.scala index 1bc4b8ed3..e64e0e690 100644 --- a/files/src/main/scala/coursier/Files.scala +++ b/files/src/main/scala/coursier/Files.scala @@ -143,8 +143,11 @@ case class Files( val tasks = for ((f, url) <- pairs if url != ("file:" + f) && url != ("file://" + f)) yield { val file = new File(f) - cachePolicy(locally(file))(remote(file, url)) - .map(e => (file, url) -> e.map(_ => ())) + cachePolicy[FileError \/ File]( + _.isLeft )( + locally(file) )( + _ => remote(file, url) + ).map(e => (file, url) -> e.map(_ => ())) } Nondeterminism[Task].gather(tasks)