)]}'
{
  "commit": "e784b031514ad5756f0bd28dcf8cdeae4982a492",
  "tree": "97dcd24f42c2cb3dcb2a5cdfece129143ac7e838",
  "parents": [
    "394c54404a1ea6e9edb5e82d374100a047de5674"
  ],
  "author": {
    "name": "Marc Kupietz",
    "email": "kupietz@ids-mannheim.de",
    "time": "Sat Jul 11 12:01:54 2026 +0200"
  },
  "committer": {
    "name": "Marc Kupietz",
    "email": "kupietz@ids-mannheim.de",
    "time": "Sat Jul 11 12:01:54 2026 +0200"
  },
  "message": "Add Krill tar merge mode: update existing tars from ZIPs and stand-off metadata\n\nAllow an existing Krill tar as input with -t krill (\"merge mode\"), updated\nfrom the remaining inputs into a new tar (\u003cname\u003e.updated.krill.tar or -o).\nThis covers two scenarios: adding/fixing metadata when the source KorAP-XML\nZIPs are no longer available, and replacing single annotation foundries\n(e.g. an improved wiki-taxonomy topic-domain classification) without a full\nre-export.\n\n- KrillTarMerger streams the input tar; unaffected texts are copied through\n  byte-identically without being decompressed, affected texts are patched\n  and recompressed in parallel with bounded memory. The input tar is never\n  modified.\n- KrillJsonPatcher patches documents surgically at the lexical JSON level:\n  metadata fields replace same-key fields (aware of the legacy/corrected\n  name pairs textClass/dmozDomain, textDomain/idsColumn) or are appended;\n  a supplied annotation foundry replaces its stream annotations, sentence\n  spans/counts and layerInfos/foundries entries entirely. Token offsets are\n  taken from the existing stream, so the base ZIP is not needed.\n- Annotation strings are built by the same code as full generation (helpers\n  extracted from KrillJsonGenerator, behavior-neutral), so patched texts are\n  byte-identical to a full re-export with the same inputs.\n- creationDate/pubDate are only replaced when a new text-level header is\n  supplied, so corpus/doc-level headers cannot clobber per-text dates.\n- Texts present in the new inputs but missing from the tar are ignored with\n  a warning; data/tokens/structure entries (base tokenization) are ignored\n  as well. Tars produced by korapxml2krill (Perl) and LZ4-compressed tars\n  are supported. The regular Krill export path is unchanged.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\nChange-Id: I3850b877eb0fc2eb5bc122ed13a2f60029b03ecf\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d455059ada3051f9ed01a0e7b31ccbd1da25435a",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "650ff91ca51dcbeb188f0405248c702f8a19bcc9",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "2e439769c871c0596b3cd52074558df81eaa8df5",
      "old_mode": 33188,
      "old_path": "Readme.md",
      "new_id": "74ac4c1f6dc373f27200569dce8253bdbbe52bb2",
      "new_mode": 33188,
      "new_path": "Readme.md"
    },
    {
      "type": "modify",
      "old_id": "bfdd882c16bdcb64ffb7f01ac8468fed9d57343c",
      "old_mode": 33188,
      "old_path": "app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt",
      "new_id": "520ad94a0046d98f550913fc5001670d870d63d1",
      "new_mode": 33188,
      "new_path": "app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a1e8134985e1ebeeb46906584bf57386de118081",
      "new_mode": 33188,
      "new_path": "app/src/main/kotlin/de/ids_mannheim/korapxmltools/KrillTarMerger.kt"
    },
    {
      "type": "modify",
      "old_id": "a7540c0a5d1038d746d32b081f1a1d7229e2da85",
      "old_mode": 33188,
      "old_path": "app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonGenerator.kt",
      "new_id": "6568d0bc7ba93899fbdff0185e6e9f562e5adb92",
      "new_mode": 33188,
      "new_path": "app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonGenerator.kt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f437cf257b4d505470f3f37f807fc6e5f4f20e05",
      "new_mode": 33188,
      "new_path": "app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonPatcher.kt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "22b561bf2c6f1c54fa073ec9a3e23fd495607095",
      "new_mode": 33188,
      "new_path": "app/src/test/kotlin/de/ids_mannheim/korapxmltools/KrillTarMergeTest.kt"
    }
  ]
}
