)]}'
{
  "commit": "b57aae9defbc3e3ce7daed74b0c4d7a57550c933",
  "tree": "42d5dfeddbc29d357da462981414e13157426733",
  "parents": [
    "a5526f012912f9297c3613ccd0364d5c5668e000"
  ],
  "author": {
    "name": "Joe Tsai",
    "email": "joetsai@digital-static.net",
    "time": "Wed Apr 22 13:49:10 2020 -0700"
  },
  "committer": {
    "name": "Joe Tsai",
    "email": "thebrokentoaster@gmail.com",
    "time": "Thu Apr 23 06:01:13 2020 +0000"
  },
  "message": "all: improve extension validation\n\nChanges made:\n* Ensure protoreflect.ExtensionType.IsValidInterface never panics,\nespecially if given a nil interface value.\n* Have protoreflect.ExtensionType.IsValid{Interface,Value} only\nperform type-checks. It does not do value checks (i.e., whether the\nvalue itself is valid). Value validity is left to when an actual\nprotoreflect.Message.Set operation is performed.\n* Add special-casing on proto.SetExtension to treat an invalid\nmessage or list as functionally equivalent to Clear. This is to\nbe more consistent with the legacy SetExtension implementation\nwhich never panicked when given such values.\n* Add special-casing on proto.HasExtension to treat a mismatched\nextension descriptor as simply not being present in the message.\nThis is also to be more consistent with the legacy HasExtension\nimplementation which did the same thing.\n\nChange-Id: Idf0419abf27b9f85d9b92bd2ff8088e25b7990cc\nReviewed-on: https://go-review.googlesource.com/c/protobuf/+/229558\nReviewed-by: Damien Neil \u003cdneil@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9fc384a7a584cfff82538e764d76d5ae0323c8a9",
      "old_mode": 33188,
      "old_path": "internal/impl/convert.go",
      "new_id": "36a90dff381644456a5abd378e0fb5912d9cd3ef",
      "new_mode": 33188,
      "new_path": "internal/impl/convert.go"
    },
    {
      "type": "modify",
      "old_id": "fe9384aba3fd5ef782e5f30a760c0c606e7c3d0a",
      "old_mode": 33188,
      "old_path": "internal/impl/convert_list.go",
      "new_id": "6fccab520e59a4e55f76c3e14a02f5b748a6d6b4",
      "new_mode": 33188,
      "new_path": "internal/impl/convert_list.go"
    },
    {
      "type": "modify",
      "old_id": "3ef36d3f23cf88d8206bcc8a0f5f9a77c2180527",
      "old_mode": 33188,
      "old_path": "internal/impl/convert_map.go",
      "new_id": "de06b2593f89ac7ce22b66a1fadeec7b0ccee030",
      "new_mode": 33188,
      "new_path": "internal/impl/convert_map.go"
    },
    {
      "type": "modify",
      "old_id": "aac55ee8d803a0a989d51b57dbab4b51afff2053",
      "old_mode": 33188,
      "old_path": "internal/impl/message_reflect.go",
      "new_id": "28114ffac0f9b996428e240c032be617ce2d35ad",
      "new_mode": 33188,
      "new_path": "internal/impl/message_reflect.go"
    },
    {
      "type": "modify",
      "old_id": "94af03fd417f23c3e97c5b4a7184eacdaa0a4d36",
      "old_mode": 33188,
      "old_path": "proto/extension.go",
      "new_id": "5f293cda86996b5e903d68c7bb838cc3427790bb",
      "new_mode": 33188,
      "new_path": "proto/extension.go"
    },
    {
      "type": "modify",
      "old_id": "113160f8d2047b32ae49dbcb5f9f01df6d31a7a8",
      "old_mode": 33188,
      "old_path": "proto/extension_test.go",
      "new_id": "212a6f73ecb11c8385d466c2e9662faff9ec3623",
      "new_mode": 33188,
      "new_path": "proto/extension_test.go"
    },
    {
      "type": "modify",
      "old_id": "9d13b2b49ec4ba774af51e889723b50804b8c3c6",
      "old_mode": 33188,
      "old_path": "proto/nil_test.go",
      "new_id": "29d259d7d2e94f6cbff904985f4a49ab82caabcf",
      "new_mode": 33188,
      "new_path": "proto/nil_test.go"
    },
    {
      "type": "modify",
      "old_id": "2a41fc87ffc6886250b9b686555f815eacd22939",
      "old_mode": 33188,
      "old_path": "types/dynamicpb/dynamic.go",
      "new_id": "7046ef208859989e167e6e8d4cf0b76b7f4bd9ba",
      "new_mode": 33188,
      "new_path": "types/dynamicpb/dynamic.go"
    }
  ]
}
