mirror of https://github.com/sbt/sbt.git
47 lines
1.6 KiB
Scala
47 lines
1.6 KiB
Scala
package xsbt
|
|
|
|
import java.io.File
|
|
import scala.reflect.Manifest
|
|
import Task._
|
|
|
|
object Sync
|
|
{
|
|
def sources(inputDirectory: Task[File], outputDirectory: Task[File]) =
|
|
{
|
|
import Paths._
|
|
(inputDirectory, outputDirectory) map { (in, out) =>
|
|
FileUtilities.assertDirectories(in, out)
|
|
(in ***) x FileMapper.rebase(in, out)
|
|
}
|
|
}
|
|
def apply(inputDirectory: Task[File], outputDirectory: Task[File], cacheFile: File): Sync =
|
|
apply(sources(inputDirectory, outputDirectory), cacheFile)
|
|
def apply(inputDirectory: Task[File], outputDirectory: Task[File], style: FilesInfo.Style, cacheFile: File): Sync =
|
|
apply(sources(inputDirectory, outputDirectory), style, cacheFile)
|
|
def apply(sources: Task[Iterable[(File,File)]], cacheDirectory: File): Sync =
|
|
apply(sources, FilesInfo.hash, cacheDirectory)
|
|
def apply(sources: Task[Iterable[(File,File)]], style: FilesInfo.Style, cacheDirectory: File): Sync =
|
|
new Sync(sources, style, cacheDirectory)
|
|
}
|
|
class Sync(val sources: Task[Iterable[(File,File)]], val style: FilesInfo.Style, val cacheDirectory: File) extends TrackedTaskDefinition[Set[File]]
|
|
{
|
|
val tracking = new BasicTracked(sources.map(Set() ++ _.map(_._1)), style, cacheFile("sources"))
|
|
val tracked = Seq(tracking)
|
|
|
|
lazy val task =
|
|
sources bind { srcs =>
|
|
val sourcesTargets = srcs.toSeq
|
|
tracking { (sourceChanges, report, tracking) =>
|
|
Task
|
|
{
|
|
val changed = report.invalid ** sourceChanges.allInputs
|
|
for((source,target) <- sourcesTargets if changed(source))
|
|
{
|
|
FileUtilities.copyFile(source, target)
|
|
tracking.product(source, target)
|
|
}
|
|
Set( sourcesTargets.map(_._2) : _*)
|
|
}
|
|
}
|
|
}
|
|
} |