Skip to content

Commit c6b8f52

Browse files
committed
Try apache commons compress
1 parent 2d138c1 commit c6b8f52

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

apps/faf-legacy-deployment/scripts/CoopDeployer.kt

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import org.apache.commons.compress.archivers.zip.Zip64Mode
2+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
3+
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
14
import org.eclipse.jgit.api.Git
25
import org.slf4j.LoggerFactory
36
import java.io.IOException
@@ -9,11 +12,13 @@ import java.nio.file.Files
912
import java.nio.file.Path
1013
import java.nio.file.Paths
1114
import java.nio.file.StandardCopyOption
15+
import java.nio.file.attribute.FileTime
1216
import java.nio.file.attribute.PosixFilePermission
1317
import java.security.MessageDigest
1418
import java.sql.Connection
1519
import java.sql.DriverManager
1620
import java.time.Duration
21+
import java.util.zip.CRC32
1722
import java.util.zip.ZipEntry
1823
import java.util.zip.ZipOutputStream
1924
import kotlin.io.path.inputStream
@@ -227,6 +232,9 @@ data class FafDatabase(
227232
}
228233
}
229234

235+
private const val MINIMUM_ZIP_DATE = 315532800000L // 1980-01-01
236+
private val MINIMUM_ZIP_FILE_TIME = FileTime.fromMillis(MINIMUM_ZIP_DATE)
237+
230238
class Patcher(
231239
val patchVersion: Int,
232240
val targetDir: Path,
@@ -355,7 +363,11 @@ class Patcher(
355363

356364
private fun zipPreserveStructure(sources: List<Path>, outputFile: Path, base: Path) {
357365
Files.createDirectories(outputFile.parent)
358-
ZipOutputStream(Files.newOutputStream(outputFile)).use { zos ->
366+
367+
// Never pass a stream here; this will cause extended local headers to be used, making it incompatible to FA!
368+
ZipArchiveOutputStream(outputFile.toFile()).use { zos ->
369+
zos.setMethod(ZipArchiveEntry.DEFLATED)
370+
359371
for (src in sources) {
360372
if (!Files.exists(src)) {
361373
// skip
@@ -375,28 +387,23 @@ class Patcher(
375387
}
376388
}
377389

378-
private fun ZipOutputStream.pushNormalizedFile(base: Path, path: Path) {
390+
private fun ZipArchiveOutputStream.pushNormalizedFile(base: Path, path: Path) {
379391
require(Files.isRegularFile(path)) { "Path $path is not a regular file" }
380392

381393
val archiveName = base.relativize(path).toString().replace("\\", "/")
382394

383-
384-
// Read file fully (FA requires sizes & CRC up front otherwise can't read the zip file)
385-
val bytes = Files.readAllBytes(path)
386-
val crc = java.util.zip.CRC32().apply { update(bytes) }
387-
388-
val entry = ZipEntry(archiveName).apply {
389-
method = ZipEntry.DEFLATED
390-
size = bytes.size.toLong()
391-
compressedSize = -1 // let deflater handle, still no descriptor
392-
this.crc = crc.value
393-
// fix timestamp for determinism (not strictly necessary)
394-
time = 315532800000L // 1980-01-01
395+
// Use the same constructor as the FAF API:
396+
val entry = ZipArchiveEntry(path.toFile(), archiveName).apply {
397+
// Ensure deterministic times
398+
setTime(MINIMUM_ZIP_FILE_TIME)
399+
setCreationTime(MINIMUM_ZIP_FILE_TIME)
400+
setLastModifiedTime(MINIMUM_ZIP_FILE_TIME)
401+
setLastAccessTime(MINIMUM_ZIP_FILE_TIME)
395402
}
396403

397-
this.putNextEntry(entry)
398-
this.write(bytes)
399-
this.closeEntry()
404+
this.putArchiveEntry(entry)
405+
Files.newInputStream(path).use { inp -> inp.copyTo(this) }
406+
this.closeArchiveEntry()
400407
}
401408

402409
}

apps/faf-legacy-deployment/scripts/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ repositories {
1010
dependencies {
1111
implementation("org.mariadb.jdbc:mariadb-java-client:3.5.7")
1212
implementation("org.eclipse.jgit:org.eclipse.jgit:7.5.0.202512021534-r")
13+
implementation("org.apache.commons:commons-compress:1.28.0")
1314
implementation("org.slf4j:slf4j-api:2.0.13")
1415
runtimeOnly("ch.qos.logback:logback-classic:1.5.23")
1516
}

0 commit comments

Comments
 (0)