)]}'
{
  "commit": "0d8102890ec1a75b4e256ec302fc59f7cd1fa450",
  "tree": "c8faa1d4536126830cd5b129546e8ad66cf137d6",
  "parents": [
    "ec2403eb16ca158ecc60b958033c6cb6a7cb932b"
  ],
  "author": {
    "name": "arteghem",
    "email": "52428902+oliviernotteghem@users.noreply.github.com",
    "time": "Tue Jul 07 01:10:39 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Jul 07 09:10:39 2026 +0100"
  },
  "message": "Normalize KSP2 output jar timestamps for build determinism (#1657)\n\nSummary:\nKSP2 output jars (ksp-kt-gensrc.jar, ksp-genclasses.jar) were\n  non-deterministic across builds: every entry was stamped with the\n  wall-clock time at the moment of execution, even with identical inputs.\n\n  Root cause: packageDirectoriesToJar creates JarEntry objects and calls\n  putNextEntry() without ever calling setTime(). Java\u0027s JarOutputStream\n  then defaults each entry\u0027s timestamp to System.currentTimeMillis(). A\n  second issue is the JarOutputStream(stream, manifest) constructor, which\n  internally writes META-INF/MANIFEST.MF with the same wall-clock stamp\n  before the caller has any opportunity to intervene.\n\n  Because Bazel\u0027s action cache key is computed from the hashes of all\n  action inputs, a target whose KSP output jars change every build will\n  always miss cache for its downstream KotlinCompile action on the next\n  build — even with no source changes. This cascaded through the entire\n  reverse dependency graph of any target using KSP processors, causing\n  hundreds of unnecessary recompilations per build.\n\n  Fix:\n  - Add a FIXED_JAR_TIMESTAMP constant (1980-01-01 00:00:00 UTC),\n    matching the epoch used by Bazel\u0027s JarHelper.DEFAULT_TIMESTAMP for\n    reproducible builds.\n  - Add a jarEntry() helper that creates a JarEntry with the fixed\n    timestamp already set, used at every putNextEntry() call site.\n  - Switch from JarOutputStream(stream, manifest) to JarOutputStream(stream)\n    and write META-INF/MANIFEST.MF manually via jarEntry(), so the manifest\n    entry is also stamped with the fixed epoch rather than wall-clock time.\n\nJIRA Issues: MOBDROID-2959\n\nDifferential Revision: https://code.uberinternal.com/D25376885",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5ffe261596aa60cb1dd959036d9172769a5e673f",
      "old_mode": 33188,
      "old_path": "src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/Ksp2Task.kt",
      "new_id": "0429a52cb4210753e17b07d580dd58ec62131cbc",
      "new_mode": 33188,
      "new_path": "src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/Ksp2Task.kt"
    }
  ]
}
