)]}'
{
  "commit": "ee07ef85f6f5ffca57f961fc84b57ec600b24750",
  "tree": "cba715314cc144a833cf192ac9b9b835887d611d",
  "parents": [
    "d871abc7ed56912002057b6f1f9e3e1b0c42a045"
  ],
  "author": {
    "name": "Joshua Haberman",
    "email": "haberman@google.com",
    "time": "Wed Oct 28 00:30:11 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Thu Nov 05 12:27:30 2026 -0800"
  },
  "message": "Add `FieldContainer`, guard `ContainerBase::parent`, and migrate pyext containers to `TreeLockable`.\n\n- Add `FieldContainer : public TreeLockable\u003cFieldContainer\u003e` in new `field_container.h`/`.cc` (with `Owner(access)` returning `parent.Get(access)`; `DeepCopy()` and `RemoveFromParentCache()` move there from `message.cc`) and guard `ContainerBase::parent` with `Guarded\u003cCMessage*\u003e`.\n- Migrate `RepeatedScalarContainer`, `RepeatedCompositeContainer`, `MapContainer` (`ScalarMapContainer` / `MessageMapContainer` / `MapIterator`), `ExtensionDict` (`ExtensionIterator`), and `PyContainerIterator` to `FieldContainer` and `TreeLockable`.\n- Remove `CMessage::DeprecatedUnguardedMessage()` and the transitional un-tokenized overloads on `CMessage` and `cmessage::`.\n\nPiperOrigin-RevId: 1008691457\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9beaca37b2588293e984b9e8cfa2e77924f858f7",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/breaking_changes.h",
      "new_id": "1773837a0c6d65953d142d9ab371b95522fd6ab0",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/breaking_changes.h"
    },
    {
      "type": "modify",
      "old_id": "4f903a99c4b6d9a0764b0f6ee78bd5bc0ea4865c",
      "old_mode": 33261,
      "old_path": "python/google/protobuf/internal/containers.py",
      "new_id": "de3d0adc3595debb405eef0e10e80a8fad36ede1",
      "new_mode": 33261,
      "new_path": "python/google/protobuf/internal/containers.py"
    },
    {
      "type": "modify",
      "old_id": "afec4a285d766234aeeed0326acde28416c11419",
      "old_mode": 33261,
      "old_path": "python/google/protobuf/internal/message_test.py",
      "new_id": "b2767effd21841abe80a757f5dc05a4e8aa76078",
      "new_mode": 33261,
      "new_path": "python/google/protobuf/internal/message_test.py"
    },
    {
      "type": "modify",
      "old_id": "64f379cf0fda40a8b0d0529852800ea5efbd459d",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/container_base.h",
      "new_id": "7315456b64c5ba46a906f1ffd2569b8e588c8406",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/container_base.h"
    },
    {
      "type": "modify",
      "old_id": "a6175a143ef5fe1c7739eae5691c1f327b3721ea",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/descriptor.cc",
      "new_id": "8f90e99692e7dfecc19a1fb168200bcde0f6b8f6",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/descriptor.cc"
    },
    {
      "type": "modify",
      "old_id": "67cf059d14907866dacb2df4825367dde2512484",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/descriptor_containers.cc",
      "new_id": "277b3aaf8e685940ef9ad4a7b062e6b7bfb9e12f",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/descriptor_containers.cc"
    },
    {
      "type": "modify",
      "old_id": "a9447c021fa58fced95d40d96808cd3effdffa47",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/descriptor_database.cc",
      "new_id": "21aca9c31da689dbfd76efb821d7b81404261bc3",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/descriptor_database.cc"
    },
    {
      "type": "modify",
      "old_id": "fe4da34497edaa499465f42bf6d0e869ba5d9b71",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/descriptor_pool.cc",
      "new_id": "dc99679710fdaba41229d118382b1a9cfd2a9c09",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/descriptor_pool.cc"
    },
    {
      "type": "modify",
      "old_id": "c141ebb59e84c50bd8b80b63e5105352e02b1ac8",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/extension_dict.cc",
      "new_id": "9e6377ace4b357fa796d62c0dec5c069a91f485a",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/extension_dict.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e404d7c2d1f1a93b8a8dadf7db6c5934778cb02f",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/field_container.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce2a2d16b28564ca7df5e1fdd1c6746538b98cdf",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/field_container.h"
    },
    {
      "type": "modify",
      "old_id": "a9db2bd3aeaeb17c5d736439cf2014287747d594",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/map_container.cc",
      "new_id": "3c9bb4e1de874697816f8b8223e6abb3dd4f40ff",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/map_container.cc"
    },
    {
      "type": "modify",
      "old_id": "fed569d9bf8202c994bbfe01d1d299c701cbd7bd",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/map_container.h",
      "new_id": "db1170406930e613a51e4089a4b228a3028dcd62",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/map_container.h"
    },
    {
      "type": "modify",
      "old_id": "bd4190b1c670cd49562f93d85c8d7879b4fd401c",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/message.cc",
      "new_id": "7d82d280fbf147e2d7a43c0d6c11d224fed8f06c",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/message.cc"
    },
    {
      "type": "modify",
      "old_id": "d2031836023b7cf5eb655bb85088f7156d4c868c",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/message.h",
      "new_id": "cbd0f0e9378964534aa897ed9a432487a73e1fb9",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/message.h"
    },
    {
      "type": "modify",
      "old_id": "11783aa96fca090b54fc4e34855815f9c1b08819",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_composite_container.cc",
      "new_id": "c04679256dadb7dcd735065fceec6ada86e645d1",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_composite_container.cc"
    },
    {
      "type": "modify",
      "old_id": "2a040d115190d909d8c767f34ded242fe69eddd7",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_composite_container.h",
      "new_id": "dda520a1f9bc6f84b6441592d51bc3b62906ccb8",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_composite_container.h"
    },
    {
      "type": "modify",
      "old_id": "e5ea091d896fcd42db58dd7d2448751fb6bfbb59",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_scalar_container.cc",
      "new_id": "48f65d2079b5124edd5d1e5c0555bee02d4fa0ef",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_scalar_container.cc"
    },
    {
      "type": "modify",
      "old_id": "71d068b350e5bb40f5bfd791526af9177f05bbc4",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_scalar_container.h",
      "new_id": "aaab64cc4174b0ec7887f916db0bcaddb86c1517",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_scalar_container.h"
    },
    {
      "type": "modify",
      "old_id": "fd9a81a1a658e3a39e11d7204ac9599bc70eb173",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/unknown_field_set.cc",
      "new_id": "0242ca999f5121d7c6cffb78bae310cd43a3bd4e",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/unknown_field_set.cc"
    },
    {
      "type": "modify",
      "old_id": "2e1d4d59762442f672ef643709e7a25b4a8e1a25",
      "old_mode": 33188,
      "old_path": "python/repeated.c",
      "new_id": "99eb102cc6cc99bb401f0981837903485a099122",
      "new_mode": 33188,
      "new_path": "python/repeated.c"
    }
  ]
}
