mirror of https://github.com/sbt/sbt.git
Merge pull request #1254 from gkossakowski/classFileManager-logging
Add debug logging in ClassfileManager
This commit is contained in:
commit
b665b7ecee
|
|
@ -29,29 +29,45 @@ object ClassfileManager
|
||||||
def generated(classes: Iterable[File]) {}
|
def generated(classes: Iterable[File]) {}
|
||||||
def complete(success: Boolean) {}
|
def complete(success: Boolean) {}
|
||||||
}
|
}
|
||||||
|
@deprecated("Use overloaded variant that takes additional logger argument, instead.", "0.13.5")
|
||||||
|
def transactional(tempDir0: File): () => ClassfileManager =
|
||||||
|
transactional(tempDir0, sbt.Logger.Null)
|
||||||
/** When compilation fails, this ClassfileManager restores class files to the way they were before compilation.*/
|
/** When compilation fails, this ClassfileManager restores class files to the way they were before compilation.*/
|
||||||
def transactional(tempDir0: File): () => ClassfileManager = () => new ClassfileManager
|
def transactional(tempDir0: File, logger: sbt.Logger): () => ClassfileManager = () => new ClassfileManager
|
||||||
{
|
{
|
||||||
val tempDir = tempDir0.getCanonicalFile
|
val tempDir = tempDir0.getCanonicalFile
|
||||||
IO.delete(tempDir)
|
IO.delete(tempDir)
|
||||||
IO.createDirectory(tempDir)
|
IO.createDirectory(tempDir)
|
||||||
|
logger.debug(s"Created transactional ClassfileManager with tempDir = $tempDir")
|
||||||
|
|
||||||
private[this] val generatedClasses = new mutable.HashSet[File]
|
private[this] val generatedClasses = new mutable.HashSet[File]
|
||||||
private[this] val movedClasses = new mutable.HashMap[File, File]
|
private[this] val movedClasses = new mutable.HashMap[File, File]
|
||||||
|
|
||||||
|
private def showFiles(files: Iterable[File]): String = files.map(f => s"\t$f").mkString("\n")
|
||||||
def delete(classes: Iterable[File])
|
def delete(classes: Iterable[File])
|
||||||
{
|
{
|
||||||
for(c <- classes) if(c.exists && !movedClasses.contains(c) && !generatedClasses(c))
|
logger.debug(s"About to delete class files:\n${showFiles(classes)}")
|
||||||
|
val toBeBackedUp = classes.filter(c => c.exists && !movedClasses.contains(c) && !generatedClasses(c))
|
||||||
|
logger.debug(s"We backup classs files:\n${showFiles(toBeBackedUp)}")
|
||||||
|
for(c <- toBeBackedUp) {
|
||||||
movedClasses.put(c, move(c))
|
movedClasses.put(c, move(c))
|
||||||
|
}
|
||||||
IO.deleteFilesEmptyDirs(classes)
|
IO.deleteFilesEmptyDirs(classes)
|
||||||
}
|
}
|
||||||
def generated(classes: Iterable[File]): Unit = generatedClasses ++= classes
|
def generated(classes: Iterable[File]): Unit = {
|
||||||
|
logger.debug(s"Registering generated classes:\n${showFiles(classes)}")
|
||||||
|
generatedClasses ++= classes
|
||||||
|
}
|
||||||
def complete(success: Boolean)
|
def complete(success: Boolean)
|
||||||
{
|
{
|
||||||
if(!success) {
|
if(!success) {
|
||||||
|
logger.debug("Rolling back changes to class files.")
|
||||||
|
logger.debug(s"Removing generated classes:\n${showFiles(generatedClasses)}")
|
||||||
IO.deleteFilesEmptyDirs(generatedClasses)
|
IO.deleteFilesEmptyDirs(generatedClasses)
|
||||||
|
logger.debug(s"Restoring class files: \n${showFiles(movedClasses.map(_._1))}")
|
||||||
for( (orig, tmp) <- movedClasses ) IO.move(tmp, orig)
|
for( (orig, tmp) <- movedClasses ) IO.move(tmp, orig)
|
||||||
}
|
}
|
||||||
|
logger.debug(s"Removing the temporary directory used for backing up class files: $tempDir")
|
||||||
IO.delete(tempDir)
|
IO.delete(tempDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -234,9 +234,12 @@ object IncOptions extends Serializable {
|
||||||
private def readResolve(): Object = IncOptions
|
private def readResolve(): Object = IncOptions
|
||||||
//- EXPANDED CASE CLASS METHOD END -//
|
//- EXPANDED CASE CLASS METHOD END -//
|
||||||
|
|
||||||
def defaultTransactional(tempDir: File): IncOptions = setTransactional(Default, tempDir)
|
@deprecated("Use IncOptions.Default.withNewClassfileManager(ClassfileManager.transactional(tempDir)), instead.", "0.13.5")
|
||||||
|
def defaultTransactional(tempDir: File): IncOptions =
|
||||||
|
setTransactional(Default, tempDir)
|
||||||
|
@deprecated("Use opts.withNewClassfileManager(ClassfileManager.transactional(tempDir)), instead.", "0.13.5")
|
||||||
def setTransactional(opts: IncOptions, tempDir: File): IncOptions =
|
def setTransactional(opts: IncOptions, tempDir: File): IncOptions =
|
||||||
opts.copy(newClassfileManager = ClassfileManager.transactional(tempDir))
|
opts.withNewClassfileManager(ClassfileManager.transactional(tempDir, sbt.Logger.Null))
|
||||||
|
|
||||||
private val transitiveStepKey = "transitiveStep"
|
private val transitiveStepKey = "transitiveStep"
|
||||||
private val recompileAllFractionKey = "recompileAllFraction"
|
private val recompileAllFractionKey = "recompileAllFraction"
|
||||||
|
|
|
||||||
|
|
@ -215,7 +215,8 @@ object Defaults extends BuildCommon
|
||||||
)
|
)
|
||||||
|
|
||||||
def compileBase = inTask(console)(compilersSetting :: Nil) ++ compileBaseGlobal ++ Seq(
|
def compileBase = inTask(console)(compilersSetting :: Nil) ++ compileBaseGlobal ++ Seq(
|
||||||
incOptions := IncOptions.setTransactional(incOptions.value, crossTarget.value / "classes.bak"),
|
incOptions := incOptions.value.withNewClassfileManager(
|
||||||
|
sbt.inc.ClassfileManager.transactional(crossTarget.value / "classes.bak", sbt.Logger.Null)),
|
||||||
scalaInstance <<= scalaInstanceTask,
|
scalaInstance <<= scalaInstanceTask,
|
||||||
crossVersion := (if(crossPaths.value) CrossVersion.binary else CrossVersion.Disabled),
|
crossVersion := (if(crossPaths.value) CrossVersion.binary else CrossVersion.Disabled),
|
||||||
crossTarget := makeCrossTarget(target.value, scalaBinaryVersion.value, sbtBinaryVersion.value, sbtPlugin.value, crossPaths.value)
|
crossTarget := makeCrossTarget(target.value, scalaBinaryVersion.value, sbtBinaryVersion.value, sbtPlugin.value, crossPaths.value)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue