From 5e65beb1455b91c96b7b24ed1e0bfb3531667ec9 Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Wed, 24 Sep 2014 14:37:26 -0400 Subject: [PATCH] Fix URL resolver so that we can push Maven artifacts to local maven repositories. * Hook "LocalIfFile" repository to also handle publishing * Add test to ensure mavne publishign works. --- ivy/src/main/scala/sbt/ConvertResolver.scala | 35 +++++++++++++++++-- .../publish-to-maven-local-file/build.sbt | 27 ++++++++++++++ .../publish-to-maven-local-file/test | 2 ++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/build.sbt create mode 100644 sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/test diff --git a/ivy/src/main/scala/sbt/ConvertResolver.scala b/ivy/src/main/scala/sbt/ConvertResolver.scala index 70a0530e1..35cfb669f 100644 --- a/ivy/src/main/scala/sbt/ConvertResolver.scala +++ b/ivy/src/main/scala/sbt/ConvertResolver.scala @@ -9,12 +9,13 @@ import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.ivy.core.module.descriptor.DependencyDescriptor import org.apache.ivy.core.resolve.ResolveData import org.apache.ivy.core.settings.IvySettings +import org.apache.ivy.plugins.repository.{ RepositoryCopyProgressListener, TransferEvent } import org.apache.ivy.plugins.resolver.{ BasicResolver, DependencyResolver, IBiblioResolver, RepositoryResolver } import org.apache.ivy.plugins.resolver.{ AbstractPatternsBasedResolver, AbstractSshBasedResolver, FileSystemResolver, SFTPResolver, SshResolver, URLResolver } import org.apache.ivy.plugins.repository.url.{ URLRepository => URLRepo } import org.apache.ivy.plugins.repository.file.{ FileRepository => FileRepo, FileResource } -import java.io.File -import org.apache.ivy.util.ChecksumHelper +import java.io.{ IOException, File } +import org.apache.ivy.util.{ FileUtil, ChecksumHelper } import org.apache.ivy.core.module.descriptor.{ Artifact => IArtifact } private[sbt] object ConvertResolver { @@ -216,6 +217,7 @@ private[sbt] object ConvertResolver { */ private[this] final class LocalIfFileRepo extends URLRepo { private[this] val repo = new WarnOnOverwriteFileRepo() + private[this] val progress = new RepositoryCopyProgressListener(this); override def getResource(source: String) = { val url = new URL(source) if (url.getProtocol == IO.FileScheme) @@ -223,6 +225,35 @@ private[sbt] object ConvertResolver { else super.getResource(source) } + + override def put(source: File, destination: String, overwrite: Boolean): Unit = { + val url = new URL(destination) + if (url.getProtocol != IO.FileScheme) super.put(source, destination, overwrite) + else { + // Here we duplicate the put method for files so we don't just bail on trying ot use Http handler + val resource = getResource(destination) + if (!overwrite && resource.exists()) { + throw new IOException("destination file exists and overwrite == false"); + } + fireTransferInitiated(resource, TransferEvent.REQUEST_PUT); + try { + var totalLength = source.length + if (totalLength > 0) { + progress.setTotalLength(totalLength); + } + FileUtil.copy(source, new java.io.File(url.toURI), progress) + } catch { + case ex: IOException => + fireTransferError(ex) + throw ex + case ex: RuntimeException => + fireTransferError(ex) + throw ex + } finally { + progress.setTotalLength(null); + } + } + } } private[this] final class WarnOnOverwriteFileRepo extends FileRepo() { diff --git a/sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/build.sbt b/sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/build.sbt new file mode 100644 index 000000000..d2fda41f7 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/build.sbt @@ -0,0 +1,27 @@ + + +lazy val localRemote = + MavenRepository("remote-repo", "file:///tmp/remote-repo") + +lazy val common = + project + .settings( + name := "published-maven", + organization := "com.example", + version := "1.0.0-SNAPSHOT", + publishTo := Some(localRemote) + ) + +lazy val analyze = + project + .dependsOn(common) + .settings( + name := "bad-dependency", + organization := "com.example", + version := "1.0.0-SNAPSHOT", + resolvers += localRemote, + fullResolvers := fullResolvers.value.filterNot(_.name == "inter-project") + ) + + + diff --git a/sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/test b/sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/test new file mode 100644 index 000000000..152da2cfd --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/publish-to-maven-local-file/test @@ -0,0 +1,2 @@ +> common/publishM2 +> analyze/update