2009-08-17 16:51:43 +02:00
|
|
|
/* sbt -- Simple Build Tool
|
|
|
|
|
* Copyright 2008, 2009 Mark Harrah
|
|
|
|
|
*/
|
2010-06-09 06:56:07 +02:00
|
|
|
package sbt
|
2009-08-17 16:51:43 +02:00
|
|
|
|
|
|
|
|
import java.io.File
|
|
|
|
|
|
2010-06-14 04:59:29 +02:00
|
|
|
trait Mapper
|
2009-08-17 16:51:43 +02:00
|
|
|
{
|
2010-06-14 04:59:29 +02:00
|
|
|
type PathMap = File => Option[String]
|
|
|
|
|
type FileMap = File => Option[File]
|
2009-08-26 14:38:20 +02:00
|
|
|
|
2010-06-14 04:59:29 +02:00
|
|
|
val basic: PathMap = f => Some(f.getPath)
|
|
|
|
|
def relativeTo(base: File): PathMap = IO.relativize(base, _)
|
|
|
|
|
def rebase(oldBase: File, newBase0: String): PathMap =
|
|
|
|
|
{
|
|
|
|
|
val newBase = normalizeBase(newBase0)
|
|
|
|
|
(file: File) =>
|
|
|
|
|
if(file == oldBase)
|
|
|
|
|
Some( if(newBase.isEmpty) "." else newBase )
|
|
|
|
|
else
|
|
|
|
|
IO.relativize(oldBase, file).map(newBase + _)
|
|
|
|
|
}
|
|
|
|
|
def fail: Any => Nothing = f => error("No mapping for " + f)
|
|
|
|
|
val flat: PathMap = f => Some(f.getName)
|
|
|
|
|
def flatRebase(newBase0: String): PathMap =
|
2009-12-05 16:31:06 +01:00
|
|
|
{
|
2010-06-14 04:59:29 +02:00
|
|
|
val newBase = normalizeBase(newBase0)
|
|
|
|
|
f => Some(newBase + f.getName)
|
2009-12-05 16:31:06 +01:00
|
|
|
}
|
2010-06-14 04:59:29 +02:00
|
|
|
def some[A,B](f: A => B): A => Some[B] = x => Some(f(x))
|
|
|
|
|
|
|
|
|
|
def normalizeBase(base: String) = if(!base.isEmpty && !base.endsWith("/")) base + "/" else base
|
|
|
|
|
|
|
|
|
|
def abs: FileMap = f => Some(f.getAbsoluteFile)
|
|
|
|
|
def resolve(newDirectory: File): FileMap = file => Some(new File(newDirectory, file.getPath))
|
|
|
|
|
def rebase(oldBase: File, newBase: File): FileMap =
|
|
|
|
|
file =>
|
|
|
|
|
if(file == oldBase)
|
|
|
|
|
Some(newBase)
|
|
|
|
|
else
|
|
|
|
|
IO.relativize(oldBase, file) map { r => new File(newBase, r) }
|
|
|
|
|
|
|
|
|
|
def flat(newDirectory: File): FileMap = file => Some(new File(newDirectory, file.getName))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trait Alternative[A,B] { def | (g: A => Option[B]): A => Option[B] }
|
|
|
|
|
trait Alternatives
|
|
|
|
|
{
|
|
|
|
|
implicit def alternative[A,B](f:A => Option[B]): Alternative[A,B] =
|
|
|
|
|
new Alternative[A,B] { def | (g: A => Option[B]) =
|
|
|
|
|
(a: A) => f(a) orElse g(a)
|
|
|
|
|
}
|
2009-08-17 16:51:43 +02:00
|
|
|
}
|