diff --git a/build/tasks/src/org/jetbrains/intellij/build/io/ZipArchiveOutputStream.kt b/build/tasks/src/org/jetbrains/intellij/build/io/ZipArchiveOutputStream.kt index 588ac4b20dc3..8bda9f67f198 100644 --- a/build/tasks/src/org/jetbrains/intellij/build/io/ZipArchiveOutputStream.kt +++ b/build/tasks/src/org/jetbrains/intellij/build/io/ZipArchiveOutputStream.kt @@ -93,14 +93,7 @@ internal class ZipArchiveOutputStream( } buffer.clear() - writeZipLocalFileHeader( - name = name, - size = size, - compressedSize = size, - crc32 = crc, - method = ZipEntry.STORED, - buffer = buffer, - ) + writeZipLocalFileHeader(name = name, size = size, compressedSize = compressedSize, crc32 = crc, method = method, buffer = buffer) val localFileHeaderOffset = channelPosition val dataOffset = localFileHeaderOffset + buffer.readableBytes() @@ -121,14 +114,7 @@ internal class ZipArchiveOutputStream( fun writeEmptyFile(name: ByteArray) { buffer.clear() - writeZipLocalFileHeader( - name = name, - size = 0, - compressedSize = 0, - crc32 = 0, - method = ZipEntry.STORED, - buffer = buffer, - ) + writeZipLocalFileHeader(name = name, size = 0, compressedSize = 0, crc32 = 0, method = ZipEntry.STORED, buffer = buffer) writeRawEntry( data = buffer, name = name, @@ -184,7 +170,7 @@ internal class ZipArchiveOutputStream( val method = ZipEntry.STORED buffer.clear() - writeZipLocalFileHeader(name = name, size = size, compressedSize = size, crc32 = 0, method = ZipEntry.STORED, buffer = buffer) + writeZipLocalFileHeader(name = name, size = size, compressedSize = size, crc32 = 0, method = method, buffer = buffer) assert(buffer.readableBytes() == headerSize) writeBuffer() @@ -211,7 +197,7 @@ internal class ZipArchiveOutputStream( val dataOffset = position + headerSize buffer.clear() - writeZipLocalFileHeader(name = name, size = size, compressedSize = size, crc32 = crc, method = ZipEntry.STORED, buffer = buffer) + writeZipLocalFileHeader(name = name, size = size, compressedSize = compressedSize, crc32 = crc, method = method, buffer = buffer) assert(buffer.readableBytes() == headerSize) if (fileChannel == null) { diff --git a/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/ZipTest.kt b/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/ZipTest.kt index de3fa2481806..de80c50da797 100644 --- a/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/ZipTest.kt +++ b/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/ZipTest.kt @@ -236,11 +236,24 @@ class ZipTest { } @Test - fun compression(@TempDir tempDir: Path) { + fun `compress small`(@TempDir tempDir: Path) { + doCompressTest(tempDir = tempDir, fileSize = 12 * 1024) + } + + @Test + fun `compress large`(@TempDir tempDir: Path) { + doCompressTest(tempDir = tempDir, fileSize = 15 * 1024 * 1024) + } + + private fun doCompressTest(tempDir: Path, fileSize: Int) { val dir = tempDir.resolve("dir") Files.createDirectories(dir) - val data = Random(42).nextBytes(4 * 1024) - Files.write(dir.resolve("file"), data + data + data) + val random = Random(42) + Files.newOutputStream(dir.resolve("file")).use { + for (chunkSize in splitIntoChunks(size = fileSize, chunkSize = 32 * 1024)) { + it.write(random.nextBytes(chunkSize)) + } + } val archiveFile = tempDir.resolve("archive.zip") zipWithCompression(archiveFile, mapOf(dir to "")) @@ -343,3 +356,12 @@ private fun runInThread(block: () -> Unit): Thread { thread.start() return thread } + +private fun splitIntoChunks(size: Int, @Suppress("SameParameterValue") chunkSize: Int): Sequence = sequence { + var remaining = size + while (remaining > 0) { + val chunk = if (remaining >= chunkSize) chunkSize else remaining + yield(chunk) + remaining -= chunk + } +} \ No newline at end of file