32
32
import java .io .RandomAccessFile ;
33
33
import java .nio .channels .FileChannel ;
34
34
import java .nio .channels .FileLock ;
35
+ import java .nio .file .Files ;
35
36
import java .nio .file .Path ;
37
+ import java .nio .file .StandardCopyOption ;
36
38
import java .security .MessageDigest ;
37
39
import java .security .NoSuchAlgorithmException ;
38
40
import java .util .Base64 ;
@@ -86,19 +88,32 @@ static File doUnpackNar(final File nar, final File baseWorkingDirectory, Runnabl
86
88
try (FileChannel channel = new RandomAccessFile (lockFile , "rw" ).getChannel ();
87
89
FileLock lock = channel .lock ()) {
88
90
File narWorkingDirectory = new File (parentDirectory , md5Sum );
89
- if (narWorkingDirectory .mkdir ()) {
91
+ if (!narWorkingDirectory .exists ()) {
92
+ File narExtractionTempDirectory = new File (parentDirectory , md5Sum + ".tmp" );
93
+ if (narExtractionTempDirectory .exists ()) {
94
+ FileUtils .deleteFile (narExtractionTempDirectory , true );
95
+ }
96
+ if (!narExtractionTempDirectory .mkdir ()) {
97
+ throw new IOException ("Cannot create " + narExtractionTempDirectory );
98
+ }
90
99
try {
91
- log .info ("Extracting {} to {}" , nar , narWorkingDirectory );
100
+ log .info ("Extracting {} to {}" , nar , narExtractionTempDirectory );
92
101
if (extractCallback != null ) {
93
102
extractCallback .run ();
94
103
}
95
- unpack (nar , narWorkingDirectory );
104
+ unpack (nar , narExtractionTempDirectory );
96
105
} catch (IOException e ) {
97
106
log .error ("There was a problem extracting the nar file. Deleting {} to clean up state." ,
98
- narWorkingDirectory , e );
99
- FileUtils .deleteFile (narWorkingDirectory , true );
107
+ narExtractionTempDirectory , e );
108
+ try {
109
+ FileUtils .deleteFile (narExtractionTempDirectory , true );
110
+ } catch (IOException e2 ) {
111
+ log .error ("Failed to delete temporary directory {}" , narExtractionTempDirectory , e2 );
112
+ }
100
113
throw e ;
101
114
}
115
+ Files .move (narExtractionTempDirectory .toPath (), narWorkingDirectory .toPath (),
116
+ StandardCopyOption .ATOMIC_MOVE );
102
117
}
103
118
return narWorkingDirectory ;
104
119
}
@@ -166,7 +181,7 @@ private static void makeFile(final InputStream inputStream, final File file) thr
166
181
* @throws IOException
167
182
* if cannot read file
168
183
*/
169
- private static byte [] calculateMd5sum (final File file ) throws IOException {
184
+ protected static byte [] calculateMd5sum (final File file ) throws IOException {
170
185
try (final FileInputStream inputStream = new FileInputStream (file )) {
171
186
final MessageDigest md5 = MessageDigest .getInstance ("md5" );
172
187
@@ -183,4 +198,4 @@ private static byte[] calculateMd5sum(final File file) throws IOException {
183
198
throw new IllegalArgumentException (nsae );
184
199
}
185
200
}
186
- }
201
+ }
0 commit comments