fun zipWithCompression()

in sources/java-incremental-compilation/intellij-build-zip/src/zip.kt [24:67]


fun zipWithCompression(
  targetFile: Path,
  dirs: Map<Path, String>,
  compressionLevel: Int = Deflater.DEFAULT_COMPRESSION,
  addDirEntriesMode: AddDirEntriesMode = AddDirEntriesMode.NONE,
  overwrite: Boolean = false,
  createFileParentDirs: Boolean = true,
  fileFilter: ((name: String) -> Boolean)? = null,
) {
  if (createFileParentDirs) {
    Files.createDirectories(targetFile.parent)
  }
  ZipFileWriter(
    zipWriter(targetFile = targetFile, packageIndexBuilder = null, overwrite = overwrite),
    deflater = if (compressionLevel == Deflater.NO_COMPRESSION) null else Deflater(compressionLevel, true),
  ).use { zipFileWriter ->
    if (addDirEntriesMode == AddDirEntriesMode.NONE) {
      archiveDirToZipWriter(
        zipFileWriter = zipFileWriter,
        fileAdded = if (fileFilter == null) null else { name, _ -> fileFilter(name) },
        dirs = dirs,
      )
    }
    else {
      val dirNameSetToAdd = LinkedHashSet<String>()
      val fileAdded = { name: String, _: Path ->
        if (fileFilter != null && !fileFilter(name)) {
          false
        }
        else {
          if (addDirEntriesMode == AddDirEntriesMode.ALL ||
              (addDirEntriesMode == AddDirEntriesMode.RESOURCE_ONLY &&
               !name.endsWith(".class") && !name.endsWith("/package.html") && name != "META-INF/MANIFEST.MF")) {
            addDirWithParents(name, dirNameSetToAdd)
          }
          true
        }
      }

      archiveDirToZipWriter(zipFileWriter = zipFileWriter, fileAdded = fileAdded, dirs = dirs)
      zipFileWriter.resultStream.addDirEntries(dirNameSetToAdd)
    }
  }
}