From 2f683ef81db95c6da5f4b2c84d176e6d1bee3a00 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Fri, 8 Nov 2013 20:40:44 -0500 Subject: [PATCH] Generate an error when the incremental compiler is given relative source files. Fixes #923. Review by @gkossakowski --- .../inc/src/main/scala/sbt/inc/Incremental.scala | 14 ++++++++++++++ .../relative-source-error/changes/absolute.sbt | 1 + .../relative-source-error/changes/relative.sbt | 1 + .../relative-source-error/src/A.scala | 1 + .../source-dependencies/relative-source-error/test | 4 ++++ 5 files changed, 21 insertions(+) create mode 100644 sbt/src/sbt-test/source-dependencies/relative-source-error/changes/absolute.sbt create mode 100644 sbt/src/sbt-test/source-dependencies/relative-source-error/changes/relative.sbt create mode 100644 sbt/src/sbt-test/source-dependencies/relative-source-error/src/A.scala create mode 100644 sbt/src/sbt-test/source-dependencies/relative-source-error/test diff --git a/compile/inc/src/main/scala/sbt/inc/Incremental.scala b/compile/inc/src/main/scala/sbt/inc/Incremental.scala index aaa6d3410..8d6442ab2 100644 --- a/compile/inc/src/main/scala/sbt/inc/Incremental.scala +++ b/compile/inc/src/main/scala/sbt/inc/Incremental.scala @@ -226,6 +226,7 @@ object Incremental val byProduct = changes.removedProducts.flatMap(previous.produced) val byBinaryDep = changes.binaryDeps.flatMap(previous.usesBinary) val byExtSrcDep = invalidateByExternal(previous, changes.external.modified, log) //changes.external.modified.flatMap(previous.usesExternal) // ++ scopeInvalidations + checkAbsolute(srcChanges.added.toList) log.debug( "\nInitial source changes: \n\tremoved:" + srcChanges.removed + "\n\tadded: " + srcChanges.added + "\n\tmodified: " + srcChanges.changed + "\nRemoved products: " + changes.removedProducts + @@ -240,6 +241,19 @@ object Incremental srcDirect ++ byProduct ++ byBinaryDep ++ byExtSrcDep } + private[this] def checkAbsolute(addedSources: List[File]): Unit = + if(addedSources.nonEmpty) { + addedSources.filterNot(_.isAbsolute) match { + case first :: more => + val fileStrings = more match { + case Nil => first.toString + case x :: Nil => s"$first and $x" + case _ => s"$first and ${more.size} others" + } + sys.error(s"The incremental compiler requires absolute sources, but some were relative: $fileStrings") + case Nil => + } + } /** Sources invalidated by `external` sources in other projects according to the previous `relations`. */ def invalidateByExternal(relations: Relations, external: Set[String], log: Logger): Set[File] = diff --git a/sbt/src/sbt-test/source-dependencies/relative-source-error/changes/absolute.sbt b/sbt/src/sbt-test/source-dependencies/relative-source-error/changes/absolute.sbt new file mode 100644 index 000000000..a5f2d007a --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/relative-source-error/changes/absolute.sbt @@ -0,0 +1 @@ +scalaSource in Compile := baseDirectory.value / "src" \ No newline at end of file diff --git a/sbt/src/sbt-test/source-dependencies/relative-source-error/changes/relative.sbt b/sbt/src/sbt-test/source-dependencies/relative-source-error/changes/relative.sbt new file mode 100644 index 000000000..8e898fe02 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/relative-source-error/changes/relative.sbt @@ -0,0 +1 @@ +scalaSource in Compile := file("src") \ No newline at end of file diff --git a/sbt/src/sbt-test/source-dependencies/relative-source-error/src/A.scala b/sbt/src/sbt-test/source-dependencies/relative-source-error/src/A.scala new file mode 100644 index 000000000..528ffce71 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/relative-source-error/src/A.scala @@ -0,0 +1 @@ +object A \ No newline at end of file diff --git a/sbt/src/sbt-test/source-dependencies/relative-source-error/test b/sbt/src/sbt-test/source-dependencies/relative-source-error/test new file mode 100644 index 000000000..3012aeda3 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/relative-source-error/test @@ -0,0 +1,4 @@ +$ copy-file changes/relative.sbt build.sbt +-> compile +$ copy-file changes/absolute.sbt build.sbt +> compile