forked from steppenwells/sbt-sh
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Sh.scala
53 lines (51 loc) · 2.19 KB
/
Sh.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package sbtsh
import sbt._
import Keys._
import java.util.Locale
object Sh {
lazy val noPreprocess: Seq[String] => Seq[String] = identity
lazy val defaultPreprocess: Seq[String] => Seq[String] = {
case commands if onWindows => preprocessForWindows(commands)
case commands => commands
}
lazy val onWindows: Boolean = {
val isCygwin = sys.env.getOrElse("OSTYPE", "").toLowerCase(Locale.ENGLISH).contains("cygwin")
val isWindows = sys.props.getOrElse("os.name", "").toLowerCase(Locale.ENGLISH).contains("windows")
isWindows && !isCygwin
}
lazy val hasShell: Boolean = sys.env.contains("SHELL")
lazy val posixShell: Option[String] = sys.env.get("SHELL")
lazy val binSh = "/bin/sh"
lazy val preprocessForWindows: Seq[String] => Seq[String] = {
case commands => "cmd" +: "/c" +: commands
}
def run(cmd: ShCommand, prep: Seq[String] => Seq[String], log: Logger): Seq[String] =
{
val p = toProcess(cmd, prep)
cmd match {
case AsyncCommand(_) =>
p.run()
Nil
case _ =>
try {
val xs = p.lines(log).toList
xs foreach { x => log.info(x) }
xs
} catch {
case e: Throwable => throw new MessageOnlyException(e.getMessage)
}
}
}
def toProcess(command: ShCommand, prep: Seq[String] => Seq[String]): ProcessBuilder =
command match {
case AsyncCommand(cmd) => toProcess(cmd, prep)
case ListCommand(cmd0, cmd1) => toProcess(cmd0, prep) ### toProcess(cmd1, prep)
case LogicalCommand(cmd0, LogicalOp.||, cmd1) => toProcess(cmd0, prep) #|| toProcess(cmd1, prep)
case LogicalCommand(cmd0, LogicalOp.&&, cmd1) => toProcess(cmd0, prep) #&& toProcess(cmd1, prep)
case RedirectCommand(cmd, RedirectOp.>, f) => toProcess(cmd, prep) #> f
case RedirectCommand(cmd, RedirectOp.>>, f) => toProcess(cmd, prep) #>> f
case RedirectCommand(cmd, RedirectOp.<, f) => toProcess(cmd, prep) #< f
case PipeCommand(cmd0, cmd1) => toProcess(cmd0, prep) #| toProcess(cmd1, prep)
case SimpleCommand(cmd, args) => Process(prep(cmd +: args))
}
}