)]}'
{
  "commit": "e4fcb9f7e7c36aaa416adf03713d3911a3d98b99",
  "tree": "a99653ab9034f3f5b7cfedb9547c4d64319657f3",
  "parents": [
    "31610fd9139106e5b7432e3533ca1254bfa32433"
  ],
  "author": {
    "name": "Joe Tsai",
    "email": "joetsai@digital-static.net",
    "time": "Mon May 11 17:47:32 2020 -0700"
  },
  "committer": {
    "name": "Joe Tsai",
    "email": "joetsai@digital-static.net",
    "time": "Thu Apr 01 23:09:19 2021 +0000"
  },
  "message": "reflect: add protopath and protorange packages\n\nThe protopath package provides a means to programmatically represent\na sequence of protobuf reflection operations.\nThe protorange package traverses through a message and\ncalls a user-provided function as it iterates.\n\nThis feature sets the groundwork for the often requested feature\nof being able to exclude certain fields when merging or serializing.\n\npackage protopath\n    type Path []Step\n    type Step struct{ ... }\n        func Root(protoreflect.MessageDescriptor) Step\n        func FieldAccess(protoreflect.FieldDescriptor) Step\n        func UnknownAccess() Step\n        func ListIndex(int) Step\n        func MapIndex(protoreflect.MapKey) Step\n        func AnyExpand(protoreflect.MessageDescriptor) Step\n        func (Step) Kind() StepKind\n        func (Step) FieldDescriptor() protoreflect.FieldDescriptor\n        func (Step) MessageDescriptor() protoreflect.MessageDescriptor\n        func (Step) ListIndex() int\n        func (Step) MapIndex() protoreflect.MapKey\n        func (Step) String() string\n    type StepKind int\n        const RootStep StepKind\n        const FieldAccessStep StepKind\n        const UnknownAccessStep StepKind\n        const ListIndexStep StepKind\n        const MapIndexStep StepKind\n        const AnyExpandStep StepKind\n    type Values struct {\n        Path   Path\n        Values []protoreflect.Value\n    }\n    func (Values) Index(int) (out struct{ ... })\n    func (Values) Len() int\n    func (Values) String() string\n\npackage protorange\n    var Break error\n    var Terminate error\n    func Range(protoreflect.Message, func(protopath.Values) error) error\n    type Options struct {\n        Stable bool\n        Resolver interface { ... }\n    }\n    func (Options) Range(m protoreflect.Message, push, pop func(protopath.Values) error) error\n\nChange-Id: I29cbd5142fe169d78367d54a95d37801888b64f4\nReviewed-on: https://go-review.googlesource.com/c/protobuf/+/236540\nTrust: Joe Tsai \u003cjoetsai@digital-static.net\u003e\nReviewed-by: Damien Neil \u003cdneil@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "aa66bdd06a3a0c682736d04bbe53a6be150540d5",
      "old_mode": 33188,
      "old_path": "internal/encoding/text/encode.go",
      "new_id": "da289ccce6e23976e1edac56765cf935fd3b00c3",
      "new_mode": 33188,
      "new_path": "internal/encoding/text/encode.go"
    },
    {
      "type": "modify",
      "old_id": "6561b8b79b5843340d9d3b95da97bc17132f8401",
      "old_mode": 33188,
      "old_path": "internal/msgfmt/format.go",
      "new_id": "a319550f69e111025d3168d8e6c7e41eb233c4bb",
      "new_mode": 33188,
      "new_path": "internal/msgfmt/format.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bb728a69af0ea5912d5192bafcfb7a05d28215c8",
      "new_mode": 33188,
      "new_path": "internal/testprotos/news/news.pb.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bf56f3b89e0bace1904e61b9dddc033b1783bd7c",
      "new_mode": 33188,
      "new_path": "internal/testprotos/news/news.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "07f839d727ddf13e56260c3f30d83c6512913493",
      "new_mode": 33188,
      "new_path": "reflect/protopath/path.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "95ae85c5b1dbb1aa25715b1e09f2ea2739583936",
      "new_mode": 33188,
      "new_path": "reflect/protopath/step.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "90ceec6c2de8df2351cd434901f1937a315c46f8",
      "new_mode": 33188,
      "new_path": "reflect/protorange/example_test.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "01750f77870f0d60ba6e8a341ab437a99b7757ea",
      "new_mode": 33188,
      "new_path": "reflect/protorange/range.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a8ca6a0b6230611561863ec340a82b16f362f84b",
      "new_mode": 33188,
      "new_path": "reflect/protorange/range_test.go"
    }
  ]
}
