2010-06-14 04:59:29 +02:00
|
|
|
/* sbt -- Simple Build Tool
|
|
|
|
|
* Copyright 2009 Mark Harrah
|
|
|
|
|
*/
|
|
|
|
|
package sbt
|
2009-08-16 20:29:08 +02:00
|
|
|
|
|
|
|
|
import java.io.{File, IOException}
|
|
|
|
|
import sbinary.{DefaultProtocol, Format}
|
|
|
|
|
import DefaultProtocol._
|
2009-08-30 19:01:02 +02:00
|
|
|
import scala.reflect.Manifest
|
2009-08-16 20:29:08 +02:00
|
|
|
|
|
|
|
|
sealed trait FileInfo extends NotNull
|
|
|
|
|
{
|
|
|
|
|
val file: File
|
|
|
|
|
}
|
|
|
|
|
sealed trait HashFileInfo extends FileInfo
|
|
|
|
|
{
|
|
|
|
|
val hash: List[Byte]
|
|
|
|
|
}
|
|
|
|
|
sealed trait ModifiedFileInfo extends FileInfo
|
|
|
|
|
{
|
|
|
|
|
val lastModified: Long
|
|
|
|
|
}
|
2010-06-07 16:50:51 +02:00
|
|
|
sealed trait PlainFileInfo extends FileInfo
|
2009-08-16 20:29:08 +02:00
|
|
|
sealed trait HashModifiedFileInfo extends HashFileInfo with ModifiedFileInfo
|
|
|
|
|
|
2010-06-07 16:50:51 +02:00
|
|
|
private final case class PlainFile(file: File) extends PlainFileInfo
|
2009-08-16 20:29:08 +02:00
|
|
|
private final case class FileHash(file: File, hash: List[Byte]) extends HashFileInfo
|
|
|
|
|
private final case class FileModified(file: File, lastModified: Long) extends ModifiedFileInfo
|
|
|
|
|
private final case class FileHashModified(file: File, hash: List[Byte], lastModified: Long) extends HashModifiedFileInfo
|
|
|
|
|
|
|
|
|
|
object FileInfo
|
|
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
sealed trait Style extends NotNull
|
2009-08-16 20:29:08 +02:00
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
type F <: FileInfo
|
2009-08-16 20:29:08 +02:00
|
|
|
implicit def apply(file: File): F
|
|
|
|
|
implicit def unapply(info: F): File = info.file
|
|
|
|
|
implicit val format: Format[F]
|
|
|
|
|
import Cache._
|
|
|
|
|
implicit def infoInputCache: InputCache[File] = wrapInputCache[File,F]
|
|
|
|
|
implicit def infoOutputCache: OutputCache[File] = wrapOutputCache[File,F]
|
|
|
|
|
}
|
2009-08-30 19:01:02 +02:00
|
|
|
object full extends Style
|
2009-08-16 20:29:08 +02:00
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
type F = HashModifiedFileInfo
|
2009-08-16 20:29:08 +02:00
|
|
|
implicit def apply(file: File): HashModifiedFileInfo = make(file, Hash(file).toList, file.lastModified)
|
|
|
|
|
def make(file: File, hash: List[Byte], lastModified: Long): HashModifiedFileInfo = FileHashModified(file.getAbsoluteFile, hash, lastModified)
|
2010-06-14 04:59:29 +02:00
|
|
|
implicit val format: Format[HashModifiedFileInfo] = wrap(f => (f.file, f.hash, f.lastModified), (make _).tupled)
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|
2009-08-30 19:01:02 +02:00
|
|
|
object hash extends Style
|
2009-08-16 20:29:08 +02:00
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
type F = HashFileInfo
|
2010-06-14 04:59:29 +02:00
|
|
|
implicit def apply(file: File): HashFileInfo = make(file, computeHash(file))
|
2009-08-16 20:29:08 +02:00
|
|
|
def make(file: File, hash: List[Byte]): HashFileInfo = FileHash(file.getAbsoluteFile, hash)
|
2010-06-14 04:59:29 +02:00
|
|
|
implicit val format: Format[HashFileInfo] = wrap(f => (f.file, f.hash), (make _).tupled)
|
|
|
|
|
private def computeHash(file: File): List[Byte] = try { Hash(file).toList } catch { case e: Exception => Nil }
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|
2009-08-30 19:01:02 +02:00
|
|
|
object lastModified extends Style
|
2009-08-16 20:29:08 +02:00
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
type F = ModifiedFileInfo
|
2009-08-16 20:29:08 +02:00
|
|
|
implicit def apply(file: File): ModifiedFileInfo = make(file, file.lastModified)
|
|
|
|
|
def make(file: File, lastModified: Long): ModifiedFileInfo = FileModified(file.getAbsoluteFile, lastModified)
|
2010-06-14 04:59:29 +02:00
|
|
|
implicit val format: Format[ModifiedFileInfo] = wrap(f => (f.file, f.lastModified), (make _).tupled)
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|
2010-06-07 16:50:51 +02:00
|
|
|
object exists extends Style
|
|
|
|
|
{
|
|
|
|
|
type F = PlainFileInfo
|
|
|
|
|
implicit def apply(file: File): PlainFileInfo = make(file)
|
|
|
|
|
def make(file: File): PlainFileInfo = PlainFile(file.getAbsoluteFile)
|
|
|
|
|
implicit val format: Format[PlainFileInfo] = wrap(_.file, make)
|
|
|
|
|
}
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final case class FilesInfo[F <: FileInfo] private(files: Set[F]) extends NotNull
|
|
|
|
|
object FilesInfo
|
|
|
|
|
{
|
2009-08-31 03:53:38 +02:00
|
|
|
sealed abstract class Style extends NotNull
|
2009-08-16 20:29:08 +02:00
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
val fileStyle: FileInfo.Style
|
|
|
|
|
type F = fileStyle.F
|
|
|
|
|
//def manifest: Manifest[F] = fileStyle.manifest
|
2009-08-29 16:19:00 +02:00
|
|
|
implicit def apply(files: Set[File]): FilesInfo[F]
|
|
|
|
|
implicit def unapply(info: FilesInfo[F]): Set[File] = info.files.map(_.file)
|
|
|
|
|
implicit val formats: Format[FilesInfo[F]]
|
2009-08-30 19:01:02 +02:00
|
|
|
val manifest: Manifest[Format[FilesInfo[F]]]
|
2009-08-31 03:53:38 +02:00
|
|
|
def empty: FilesInfo[F] = new FilesInfo(Set.empty)
|
2009-08-29 16:19:00 +02:00
|
|
|
import Cache._
|
|
|
|
|
implicit def infosInputCache: InputCache[Set[File]] = wrapInputCache[Set[File],FilesInfo[F]]
|
|
|
|
|
implicit def infosOutputCache: OutputCache[Set[File]] = wrapOutputCache[Set[File],FilesInfo[F]]
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|
2009-08-30 19:01:02 +02:00
|
|
|
private final class BasicStyle[FI <: FileInfo](val fileStyle: FileInfo.Style { type F = FI })
|
|
|
|
|
(implicit val manifest: Manifest[Format[FilesInfo[FI]]]) extends Style
|
2009-08-16 20:29:08 +02:00
|
|
|
{
|
2009-08-30 19:01:02 +02:00
|
|
|
private implicit val infoFormat: Format[FI] = fileStyle.format
|
2009-08-29 16:19:00 +02:00
|
|
|
implicit def apply(files: Set[File]): FilesInfo[F] = FilesInfo( files.map(_.getAbsoluteFile).map(fileStyle.apply) )
|
|
|
|
|
implicit val formats: Format[FilesInfo[F]] = wrap(_.files, (fs: Set[F]) => new FilesInfo(fs))
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|
2009-08-30 19:01:02 +02:00
|
|
|
lazy val full: Style = new BasicStyle(FileInfo.full)
|
|
|
|
|
lazy val hash: Style = new BasicStyle(FileInfo.hash)
|
|
|
|
|
lazy val lastModified: Style = new BasicStyle(FileInfo.lastModified)
|
2010-06-07 16:50:51 +02:00
|
|
|
lazy val exists: Style = new BasicStyle(FileInfo.exists)
|
2009-08-16 20:29:08 +02:00
|
|
|
}
|