aboutsummaryrefslogtreecommitdiff
path: root/stage2/Lib.scala
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2017-03-08 23:48:41 -0500
committerChristopher Vogt <oss.nsp@cvogt.org>2017-03-08 23:55:11 -0500
commitc45c8f241d6b2c268fd18341cf80d5467f9b50c6 (patch)
tree491a8065981f1244c8bd9f6e3fed869678e80bf4 /stage2/Lib.scala
parent43424cd959e9f0c66788f035e05232ffc8057e4a (diff)
downloadcbt-c45c8f241d6b2c268fd18341cf80d5467f9b50c6.tar.gz
cbt-c45c8f241d6b2c268fd18341cf80d5467f9b50c6.tar.bz2
cbt-c45c8f241d6b2c268fd18341cf80d5467f9b50c6.zip
atomic move and error handling for transform helper
Diffstat (limited to 'stage2/Lib.scala')
-rw-r--r--stage2/Lib.scala27
1 files changed, 20 insertions, 7 deletions
diff --git a/stage2/Lib.scala b/stage2/Lib.scala
index c95ee2a..db1ee6d 100644
--- a/stage2/Lib.scala
+++ b/stage2/Lib.scala
@@ -4,7 +4,7 @@ import java.io._
import java.net._
import java.lang.reflect.InvocationTargetException
import java.nio.file.{Path =>_,_}
-import java.nio.file.Files.{readAllBytes, deleteIfExists, delete}
+import java.nio.file.Files._
import java.security.MessageDigest
import java.util.jar._
import java.lang.reflect.Method
@@ -539,13 +539,26 @@ final class Lib(val logger: Logger) extends Stage1Lib(logger){
}
def transformFiles( files: Seq[File], transform: String => String ): Seq[File] = {
- files.flatMap{ file =>
+ transformFilesOrError( files, s => Right(transform(s)) )._1
+ }
+
+ def transformFilesOrError[T]( files: Seq[File], transform: String => Either[T,String] ): ( Seq[File], Seq[(File, T)] ) = {
+ val results = files.map{ file =>
val string = file.readAsString
- val replaced = transform( string )
- if( string != replaced ) {
- write( file, replaced )
- Some(file)
- } else None
+ transform( string ).left.map(
+ file -> _
+ ).right.map(
+ replaced =>
+ if( string != replaced ) {
+ val tmpFile = file ++ ".cbt-tmp"
+ assert( !tmpFile.exists )
+ write( tmpFile, replaced )
+ move( tmpFile.toPath, file.toPath, StandardCopyOption.REPLACE_EXISTING )
+ Some( file )
+ } else None
+ )
}
+
+ ( results.map(_.right.toOption).flatten.flatten, results.map(_.left.toOption).flatten )
}
}