diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2017-03-08 23:48:41 -0500 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2017-03-08 23:55:11 -0500 |
commit | c45c8f241d6b2c268fd18341cf80d5467f9b50c6 (patch) | |
tree | 491a8065981f1244c8bd9f6e3fed869678e80bf4 /stage2 | |
parent | 43424cd959e9f0c66788f035e05232ffc8057e4a (diff) | |
download | cbt-c45c8f241d6b2c268fd18341cf80d5467f9b50c6.tar.gz cbt-c45c8f241d6b2c268fd18341cf80d5467f9b50c6.tar.bz2 cbt-c45c8f241d6b2c268fd18341cf80d5467f9b50c6.zip |
atomic move and error handling for transform helper
Diffstat (limited to 'stage2')
-rw-r--r-- | stage2/Lib.scala | 27 |
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 ) } } |