aboutsummaryrefslogtreecommitdiff
path: root/stage2/Stage2.scala
blob: 05b7c58d9f217603acaf120e9fcf3f75eae87542 (plain) (blame)
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
package cbt
import cbt.paths._
import java.io._
import scala.collection.immutable.Seq

object Stage2{
  def main(args: Array[String]) = {
    import java.time.LocalTime.now
    val init = new Stage1.Init(args)
    import java.time._
    val start = LocalTime.now()
    def timeTaken = Duration.between(start, LocalTime.now()).toMillis
    init.logger.stage2(s"[$now] Stage2 start")

    import init._
    val loop = argsV.lift(1) == Some("loop")
    val direct = argsV.lift(1) == Some("direct")
    val taskIndex = if(loop || direct) 2 else 1
    val task = argsV.lift( taskIndex )

    val lib = new Lib(new Stage1.Init(args).logger)

    val context = Context( cwd, argsV.drop( taskIndex + 1 ), logger )
    val first = lib.loadRoot( context )
    val build = first.finalBuild

    val res = if( loop ){
      // TODO: this should allow looping over task specific files, like test files as well
      val triggerFiles = first.triggerLoopFiles.map(lib.realpath)
      val triggerCbtFiles = Seq( nailgun, stage1, stage2 ).map(lib.realpath _)
      val allTriggerFiles = triggerFiles ++ triggerCbtFiles

      logger.loop("Looping change detection over:\n - "+allTriggerFiles.mkString("\n - "))

      lib.watch(allTriggerFiles){
        case file if triggerCbtFiles.exists(file.toString startsWith _.toString) =>
          logger.loop("Change is in CBT' own source code.")
          logger.loop("Restarting CBT.")
          scala.util.control.Breaks.break
        case file if triggerFiles.exists(file.toString startsWith _.toString) =>
          new lib.ReflectBuild( lib.loadDynamic(context) ).callNullary(task)
      }
    } else new lib.ReflectBuild(build).callNullary(task)
    init.logger.stage2(s"[$now] Stage2 end")
    res
  }
}