)]}'
{
  "commit": "147dc99ce47e379f69faaa39476bfe528e02f6b0",
  "tree": "d43c5a5cad37696025fa840bbb66a02c8745f700",
  "parents": [
    "ec30d16b7c1e77689e5e51deabb7974d2565d83a"
  ],
  "author": {
    "name": "tianyizhuang",
    "email": "tianyizhuang@tianyizhuangs-Mac-mini.local",
    "time": "Tue Apr 28 02:42:19 2026 +0800"
  },
  "committer": {
    "name": "tianyizhuang",
    "email": "tianyizhuang@tianyizhuangs-Mac-mini.local",
    "time": "Tue Apr 28 02:42:19 2026 +0800"
  },
  "message": "feat(bindings/python): expose if_not_exists option for copy\n\nRust core supports copy_with_if_not_exists, but Python bindings did\nnot expose the option. This commit:\n\n- Adds copy_options to the blocking Rust operator\n- Adds if_not_exists keyword argument to sync and async Operator.copy\n- Exposes copy_with_if_not_exists in Python Capability\n- Updates operator.pyi stubs\n- Adds behavior tests for sync and async copy with if_not_exists\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "259de3ea8b1438481d2637358a50b2f5bff9d3fd",
      "old_mode": 33188,
      "old_path": "bindings/python/python/opendal/capability.pyi",
      "new_id": "8ac72b0f8ab518912d4b49534e2bf3ae80542dd5",
      "new_mode": 33188,
      "new_path": "bindings/python/python/opendal/capability.pyi"
    },
    {
      "type": "modify",
      "old_id": "7136720b0bac2ccf81512a039244de6b98ba813b",
      "old_mode": 33188,
      "old_path": "bindings/python/python/opendal/operator.pyi",
      "new_id": "136d43fe85e0229e96c4d907a283c963f9d6d3ee",
      "new_mode": 33188,
      "new_path": "bindings/python/python/opendal/operator.pyi"
    },
    {
      "type": "modify",
      "old_id": "39c10d75c742813aebe53226c142e02e84424c48",
      "old_mode": 33188,
      "old_path": "bindings/python/src/capability.rs",
      "new_id": "da7d6f79ebffff446e9c931844a5720612d4d4d2",
      "new_mode": 33188,
      "new_path": "bindings/python/src/capability.rs"
    },
    {
      "type": "modify",
      "old_id": "abf1bd71b6173925d94aa5abe5da7642e0122f41",
      "old_mode": 33188,
      "old_path": "bindings/python/src/operator.rs",
      "new_id": "65330d9b1e05f8477cdedc6e877693ee213e3d65",
      "new_mode": 33188,
      "new_path": "bindings/python/src/operator.rs"
    },
    {
      "type": "modify",
      "old_id": "dacf1721486d8f8669ce2f55d36c21a54f18381d",
      "old_mode": 33188,
      "old_path": "bindings/python/tests/test_async_copy.py",
      "new_id": "a246d1e281539d52a01acc3d51f664601b467c13",
      "new_mode": 33188,
      "new_path": "bindings/python/tests/test_async_copy.py"
    },
    {
      "type": "modify",
      "old_id": "a68e9fd8c72e42ee59cc0f0cb36af9bd92f284c0",
      "old_mode": 33188,
      "old_path": "bindings/python/tests/test_sync_copy.py",
      "new_id": "9698ced3c413763e57eafece2fb4e983ab19a6bd",
      "new_mode": 33188,
      "new_path": "bindings/python/tests/test_sync_copy.py"
    },
    {
      "type": "modify",
      "old_id": "0b2627243ee021e8b44137e961ca7f4077fef34c",
      "old_mode": 33188,
      "old_path": "core/core/src/blocking/operator.rs",
      "new_id": "4b8f0621342d46a54454b84870151e6841b4ebfe",
      "new_mode": 33188,
      "new_path": "core/core/src/blocking/operator.rs"
    }
  ]
}
