Make sure we're closing and deleting our file objects when we're done with them

I saw some odd behavior with redundant `data.tar.gz` file objects being created
for the same filesystem manager in consecutive iterations. The two ways we
avoid this, now, is by namespacing the data.tar.gz VFS but also by closing and
deleting after we're done.

An alternative would be to create a new FileSystemManager for each gem, but I'm
not sure if that's useful/worth it.
This commit is contained in:
R. Tyler Croy 2015-08-10 05:39:58 -07:00
parent bdbb118c78
commit b4bfafcb45
No known key found for this signature in database
GPG Key ID: 1426C7DC3F51E16F
1 changed files with 8 additions and 4 deletions

View File

@ -55,12 +55,13 @@ class GemInstaller {
cacheGemInInstallDir(installDir, gem)
FileObject gemTar = fileSystemManager.resolveFile("tar:${gem}")
FileObject tempTar = fileSystemManager.resolveFile("ram://data.tar.gz")
FileObject tempTar = fileSystemManager.resolveFile("ram://${gem.name}-data.tar.gz")
/* http://wiki.apache.org/commons/ExtractAndDecompressGzipFiles */
FileObject metadata = fileSystemManager.resolveFile("gz:tar:${gem}!/metadata.gz!metadata")
Gem gemMetadata = Gem.fromFile(metadata.content.inputStream)
logger.info("We've processed metadata for ${gemMetadata.name} at version ${gemMetadata.version}")
metadata.content.close()
long size = gemTar.getChild('data.tar.gz').content.write(tempTar)
logger.info("Extracted data.tar.gz from ${gem} (${size} bytes)")
@ -72,9 +73,10 @@ class GemInstaller {
extractData(installDir, dataTar, gemMetadata)
extractExecutables(installDir, dataTar, gemMetadata)
//FileObject metadata = fileSystemManager.resolveFile("gz:tar:${gem.absolutePath}!/metadata.gz!metadata")
//StringWriter writer = new StringWriter()
//IOUtils.copy(metadata.content.inputStream, writer, null)
gemTar.close()
metadata.close()
tempTar.delete()
dataTar.delete()
return true
}
@ -149,12 +151,14 @@ class GemInstaller {
PrintWriter writer = new PrintWriter(outputFile.content.outputStream)
writer.write(gem.toRuby())
writer.flush()
outputFile.content.close()
}
protected void extractData(File installDir, FileObject dataTarGz, Gem gem) {
String dir = "${gem.name}-${gem.version.version}"
FileObject outputDir = fileSystemManager.resolveFile(new File(installDir, 'gems'), dir)
outputDir.copyFrom(dataTarGz, new AllFileSelector())
outputDir.close()
}
protected void extractExecutables(File installDir, FileObject dataTarGz, Gem gem) {