in sources/java-incremental-compilation/intellij-build-zip/src/ZipArchiveOutputStream.kt [435:488]
override fun close() {
if (finished) {
return
}
try {
try {
val packageIndexBuilder = zipIndexWriter.packageIndexBuilder
val indexDataEnd = if (packageIndexBuilder == null || zipIndexWriter.isEmpty()) {
-1
}
else {
packageIndexBuilder.writePackageIndex {
addDirEntries(it)
}
val indexWriter = packageIndexBuilder.indexWriter
// ditto on macOS doesn't like arbitrary data in zip file - wrap into zip entry
val indexDataSize = indexWriter.dataSize()
val indexDataEnd = flushBufferIfNeeded() + indexDataSize + 30 + INDEX_FILENAME_BYTES.size
writeIndex(indexWriter, indexDataSize, this)
indexDataEnd.toInt()
}
val unwrittenDataSize = buffer.readableBytes()
// write central directory file header
val zipIndexData = zipIndexWriter.finish(centralDirectoryOffset = channelPosition + unwrittenDataSize, indexDataEnd = indexDataEnd)
if (unwrittenDataSize != 0 && buffer.writableBytes() >= zipIndexData.readableBytes()) {
buffer.writeBytes(zipIndexData)
writeBuffer(buffer)
}
else {
if (unwrittenDataSize != 0) {
writeBuffer(buffer)
}
writeBuffer(zipIndexData)
}
finished = true
}
finally {
dataWriter.close(channelPosition)
}
}
finally {
try {
zipIndexWriter.release()
}
finally {
buffer.release()
}
}
}