in modules/core/src/main/scala/org/scalasteward/core/coursier/CoursierAlg.scala [40:109]
def create[F[_]](implicit
logger: Logger[F],
parallel: Parallel[F],
F: Async[F]
): CoursierAlg[F] = {
val fetch: Fetch[F] =
Fetch[F](FileCache[F]())
val cacheNoTtl: FileCache[F] =
FileCache[F]().withTtl(None).withCachePolicies(List(CachePolicy.Update))
new CoursierAlg[F] {
override def getMetadata(
dependency: Dependency,
resolvers: List[Resolver]
): F[DependencyMetadata] =
resolvers.traverseFilter(convertResolver(_).attempt.map(_.toOption)).flatMap {
repositories =>
val csrDependency = toCoursierDependency(dependency)
getMetadataImpl(csrDependency, repositories, DependencyMetadata.empty)
}
private def getMetadataImpl(
dependency: coursier.Dependency,
repositories: List[coursier.Repository],
acc: DependencyMetadata
): F[DependencyMetadata] = {
val fetchArtifacts = fetch
.withArtifactTypes(Set(coursier.Type.pom, coursier.Type.ivy))
.withDependencies(List(dependency))
.withRepositories(repositories)
fetchArtifacts.ioResult.attempt.flatMap {
case Left(throwable) =>
logger.debug(throwable)(s"Failed to fetch artifacts of $dependency").as(acc)
case Right(result) =>
val maybeProject = result.resolution.projectCache
.get(dependency.moduleVersion)
.map { case (_, project) => project }
maybeProject.fold(F.pure(acc)) { project =>
val metadata = acc.enrichWith(metadataFrom(project))
val recurse = Option.when(metadata.repoUrl.isEmpty)(())
(recurse >> parentOf(project)).fold(F.pure(metadata)) { parent =>
getMetadataImpl(parent, repositories, metadata)
}
}
}
}
override def getVersions(dependency: Dependency, resolver: Resolver): F[List[Version]] =
convertResolver(resolver).flatMap { repository =>
val module = toCoursierModule(dependency)
repository.versions(module, cacheNoTtl.fetch).run.flatMap {
case Left(message) =>
logger.debug(message) >> F.raiseError[List[Version]](new Throwable(message))
case Right((versions, _)) =>
F.pure(versions.available.map(Version.apply).sorted)
}
}
private def convertResolver(resolver: Resolver): F[coursier.Repository] =
toCoursierRepository(resolver) match {
case Right(repository) => F.pure(repository)
case Left(message) =>
logger.error(s"Failed to convert $resolver: $message") >>
F.raiseError[coursier.Repository](new Throwable(message))
}
}
}