)]}'
{
  "log": [
    {
      "commit": "34c9473539b8d7c62273a8f4acb27c0c32295330",
      "tree": "7724fb26ac01140d4f60b6b282438011814e081b",
      "parents": [
        "8b25e2f7a4d5fb7fdb999c5ce0da16ca7e05204b"
      ],
      "author": {
        "name": "Will Beason",
        "email": "willbeason@gmail.com",
        "time": "Tue Mar 10 22:00:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 10 22:00:54 2026"
      },
      "message": "Update calls to deprecated methods (#389)\n\nThese functions are deprecated, and this change updates them to their new\nversions:\n1. ioutil.ReadFile -\u003e os.ReadFile\n2. ioutil.WriteFile -\u003e os.WriteFile\n3. reflect.PtrTo -\u003e reflect.PointerTo"
    },
    {
      "commit": "8b25e2f7a4d5fb7fdb999c5ce0da16ca7e05204b",
      "tree": "59302b4ecd9b56541256e61386b784448a8fd363",
      "parents": [
        "9b12f366a942ebc7254abc7f32ca05068b455fb7"
      ],
      "author": {
        "name": "Damien Neil",
        "email": "neild@users.noreply.github.com",
        "time": "Fri Jan 16 20:59:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 16 20:59:35 2026"
      },
      "message": "Add .gitattributes (prevent eol conversion on Windows) (#386)\n\nCopy the .gitattributes from x/net."
    },
    {
      "commit": "9b12f366a942ebc7254abc7f32ca05068b455fb7",
      "tree": "59f3bc4ef5b3ab68dd5e19d4e8cd0b0734377bba",
      "parents": [
        "4dd3d63d6987c0f84fce8e1d1c5bb59f0badc220"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jan 14 18:15:44 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 14 18:15:44 2025"
      },
      "message": "Detect proto.Message types when failing to export a field (#370)\n\nWhile we do not provide 1st class handling of protobuf messages,\r\nwe can at least detect whether the type is a proto.Message\r\nand refer the user to the correct package to use to handle\r\nprotobuf messages with cmp.Equal."
    },
    {
      "commit": "4dd3d63d6987c0f84fce8e1d1c5bb59f0badc220",
      "tree": "36a0d63831f44a786ed321cb10ed64339d7d71ae",
      "parents": [
        "391980c4b2e1cc2c30d2bfae6039815350490495"
      ],
      "author": {
        "name": "Mitch Burton",
        "email": "mitch.burton@canonical.com",
        "time": "Thu Dec 12 21:24:31 2024"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 12 21:24:31 2024"
      },
      "message": "fix: type \u0027aribica\u0027 \u003d\u003e \u0027arabica\u0027 (#368)\n\n"
    },
    {
      "commit": "391980c4b2e1cc2c30d2bfae6039815350490495",
      "tree": "a342fe1d68d79a6e3c436b9d39cf40a93c7396a9",
      "parents": [
        "c3ad8435e7bef96af35732bc0789e5a2278c6d5f"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Oct 23 16:54:16 2024"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 23 16:54:16 2024"
      },
      "message": "Support compare functions with SortSlices and SortMaps (#367)\n\nThe SortSlices and SortMaps options predate generics and\r\naccept an interface{}, so it is possible with reflection\r\nto support other function signatures than \"func(T, T) bool\".\r\n\r\nIn particular, the Go ecosystem is increasingly moving towards\r\n\"func(T, T) int\" as the signature for ordering as evidenced\r\nby the newer slices.SortFunc function in stdlib.\r\n\r\nThus, modernize cmpopts by supporting \"func(T, T) int\".\r\n\r\nAlso, bump the minimum version to Go 1.21 to match\r\nthe minimum supported version of google.golang.org/protobuf.\r\n\r\nFixes #365"
    },
    {
      "commit": "c3ad8435e7bef96af35732bc0789e5a2278c6d5f",
      "tree": "a56d226234088bb5c9cf3105bb8cfa12adf6c21b",
      "parents": [
        "e250a55e913727afa4a4ccf87d716232288d9b5f"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Aug 31 17:32:40 2023"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 31 17:32:40 2023"
      },
      "message": "Add cmpopts.EquateComparable (#340)\n\nThis helper function makes it easier to specify that comparable types\r\nare safe to directly compare with the \u003d\u003d operator in Go.\r\n\r\nThe API does not use generics as it follows existing options like\r\ncmp.AllowUnexported, cmpopts.IgnoreUnexported, or cmpopts.IgnoreTypes.\r\n\r\nWhile generics provides type safety, the user experience is not as nice.\r\nOur current API allows multiple types to be specified:\r\n\tcmpopts.EquateComparable(netip.Addr{}, netip.Prefix{})\r\nWhile generics would not allow variadic arguments:\r\n\tcmpopts.EquateComparable[netip.Addr]()\r\n\tcmpopts.EquateComparable[netip.Prefix]()\r\n\r\nBump mininimum supported Go to 1.18 for net/netip type.\r\nStart testing on Go 1.21.\r\n\r\nFixes #339"
    },
    {
      "commit": "e250a55e913727afa4a4ccf87d716232288d9b5f",
      "tree": "447aa01319aa2580f1a425729b8654133e573db7",
      "parents": [
        "8a3e8dd7458e5d9ba6b4317a4b1423b4910d4014"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Aug 31 06:29:42 2023"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 31 06:29:42 2023"
      },
      "message": "Use of hotlinking of Go identifiers (#337)\n\nGoDoc now supports hot linking to specific Go identifiers.\r\nUse that feature to enhance the usability of cmp docs.\r\n\r\nSince cmp lacks a direct dependency on cmpopts,\r\nyou are forced to use the fully-qualified import path\r\nto references identifiers in the cmpopts package.\r\n\r\nIt can future improvements to the go/doc to handle this case,\r\neither by rendering the doc with short form,\r\nor by detecting the use of cmpopts from the unit tests as well\r\n(since those can break circular dependencies)."
    },
    {
      "commit": "8a3e8dd7458e5d9ba6b4317a4b1423b4910d4014",
      "tree": "2064fbe4cd4aa1552ebb4e819cd47b400055a311",
      "parents": [
        "8cea5de50d284888e0abcdab4c2c65b6e73acb32"
      ],
      "author": {
        "name": "Russ Cox",
        "email": "rsc@swtch.com",
        "time": "Mon Jun 05 21:24:49 2023"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 05 21:24:49 2023"
      },
      "message": "set workflow permission to read-only (#327)\n\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "8cea5de50d284888e0abcdab4c2c65b6e73acb32",
      "tree": "39ca0d2d8d2dc75b3a5221658b2aa728565e2621",
      "parents": [
        "3bb304a85447513e496f9784afc52189e5bf41e9"
      ],
      "author": {
        "name": "Damien Neil",
        "email": "neild@users.noreply.github.com",
        "time": "Mon Jun 05 21:12:30 2023"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 05 21:12:30 2023"
      },
      "message": "Pin GitHub action versions (#332)\n\n"
    },
    {
      "commit": "3bb304a85447513e496f9784afc52189e5bf41e9",
      "tree": "d0fd5d15da9d9c54fe749b56e03d69629272cc79",
      "parents": [
        "571a56ba783fe6ec6c9f3aa12166e8e33652e4c5"
      ],
      "author": {
        "name": "Bəxtiyar",
        "email": "bakhtiyar.garashov@gmail.com",
        "time": "Wed Feb 22 23:29:36 2023"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 22 23:29:36 2023"
      },
      "message": "Run tests for Go 1.20 version (#322)\n\n"
    },
    {
      "commit": "571a56ba783fe6ec6c9f3aa12166e8e33652e4c5",
      "tree": "9df73ee7a42e753f11722abbaa30e208c6a24bfb",
      "parents": [
        "a97318bf6562f2ed2632c5f985db51b1bc5bdcd0"
      ],
      "author": {
        "name": "Caleb Spare",
        "email": "cespare@gmail.com",
        "time": "Wed Feb 22 22:28:49 2023"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 22 22:28:49 2023"
      },
      "message": "Remove purego fallbacks (#325)\n\nHaving go-cmp panic when using the purego build tag makes it hard to use\r\ngo-cmp for testing packages that themselves have purego fallbacks.\r\n\r\nSince go-cmp can\u0027t implement its functionality without unsafe (the\r\n\"fallback\" panics) and since environments that prohibit unsafe are much\r\nless common these days anyway, simply remove purego code entirely.\r\n\r\nFixes #283."
    },
    {
      "commit": "a97318bf6562f2ed2632c5f985db51b1bc5bdcd0",
      "tree": "dac641335569a526f52aa826617c4b578ae9b4e7",
      "parents": [
        "377d28384c85781079e04aab3937170479da8cd6"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Sep 02 22:41:56 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 02 22:41:56 2022"
      },
      "message": "Adjust heuristic for line-based versus byte-based diffing (#299)\n\nIf the string has many characters that require escape sequences to print,\r\nthen we need to take that into consideration and avoid byte-by-byte diffing.\r\n\r\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "377d28384c85781079e04aab3937170479da8cd6",
      "tree": "5f6b786e0f68821f9a9ae6058515b03eee988cea",
      "parents": [
        "6606d4d51e3239f038565f525940ac6043aff53e"
      ],
      "author": {
        "name": "Aoang",
        "email": "aoang@x2oe.com",
        "time": "Wed Aug 31 01:25:27 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 31 01:25:27 2022"
      },
      "message": "Run tests on Go 1.19 (#309)\n\n* Run tests on Go 1.19\r\n\r\n* Format comment\r\n\r\nFinish the rest of the work for https://github.com/google/go-cmp/pull/304\r\n\r\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "6606d4d51e3239f038565f525940ac6043aff53e",
      "tree": "d1732c169d4a2460d9c42af5b490e10735568110",
      "parents": [
        "f36a68d19a9bca43e070954ab9170a8305662d15"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Aug 30 23:39:27 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 30 23:39:27 2022"
      },
      "message": "Use value.TypeString in PathStep.String (#306)\n\nThe value.TypeString function is what the rest of the package uses\r\nand is slightly cleaner than using reflect.Type.String.\r\n\r\nUpdates #305\r\n\r\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "f36a68d19a9bca43e070954ab9170a8305662d15",
      "tree": "f5cf3256507539d69bd311897110455415dbe580",
      "parents": [
        "5dac6aa44b75666a956f67df1b5bd4e2e044e1f8"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Aug 30 23:06:02 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 30 23:06:02 2022"
      },
      "message": "Pre-declare global type variables (#302)\n\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "5dac6aa44b75666a956f67df1b5bd4e2e044e1f8",
      "tree": "d9e21359ec750159180cb6073414796ca9020737",
      "parents": [
        "14ad8a02f30ba66e7e19f9814e69daab44219cb8"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Aug 30 22:55:16 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 30 22:55:16 2022"
      },
      "message": "Fix typo in Result documentation (#300)\n\n"
    },
    {
      "commit": "14ad8a02f30ba66e7e19f9814e69daab44219cb8",
      "tree": "7aceb978960d0bc9ce57c8f9d815d6485abe02a5",
      "parents": [
        "a53d7e09b000ee6e0ca9f2676820299b5de8e89f"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jul 13 18:10:07 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 13 18:10:07 2022"
      },
      "message": "Format with Go 1.19 formatter (#304)\n\nThis allows the GoDoc to take advantage of new markup syntax\r\nintroduced in Go 1.19. This does not require that our minimum\r\nsupported version be bumped to Go 1.19 since the pkgsite renders\r\nour godoc regardless of supported Go version."
    },
    {
      "commit": "a53d7e09b000ee6e0ca9f2676820299b5de8e89f",
      "tree": "91ce2c668a03edcd03a106a12388eb6caae9c488",
      "parents": [
        "f144a35ed4ac538fae93fa3783175108738f71b9"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jun 06 17:31:27 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 06 17:31:27 2022"
      },
      "message": "Use reflect.Value.IsZero (#297)\n\nNow that Go 1.13 is the minimum version, we can use the reflect.Value.IsZero\r\nmethod instead of our own internal/value.IsZero function.\r\nInterestingly, our IsZero function pre-dates the IsZero method,\r\nbut fortunately has the exact same semantics, since both are targetting\r\nsemantics defined by the Go language specification."
    },
    {
      "commit": "f144a35ed4ac538fae93fa3783175108738f71b9",
      "tree": "29a8c6189f7b06e9136562c12f874fc0ef738c63",
      "parents": [
        "63c2960be651bb95aaf14535bd5e36e86b6b5458"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Apr 26 20:49:16 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 26 20:49:16 2022"
      },
      "message": "Additional cleanup with Go 1.13 as minimal version (#295)\n\n"
    },
    {
      "commit": "63c2960be651bb95aaf14535bd5e36e86b6b5458",
      "tree": "430505cad88a42ded8e0324d042ff7d15002c9ef",
      "parents": [
        "71220fc3ca5513eaf3583d10fd18da893bc332d8"
      ],
      "author": {
        "name": "Tatsuya Kaneko",
        "email": "catatsuy@catatsuy.org",
        "time": "Tue Apr 26 19:24:26 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 26 19:24:26 2022"
      },
      "message": "remove xerrors (#292)\n\nVersions older than Go 1.13 are no longer in use. Remove unnecessary\r\ndependencies."
    },
    {
      "commit": "71220fc3ca5513eaf3583d10fd18da893bc332d8",
      "tree": "1e2ed5310b608cd4b411d1e90d24d408005db2fd",
      "parents": [
        "4664e24d52beca933d6f5378d36e1d405099115d"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Apr 25 16:32:19 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 25 16:32:19 2022"
      },
      "message": "Use string formatting for slice of bytes (#294)\n\nIf a slice of bytes is mostly text, format them as text\r\ninstead of as []byte literal with hexadecimal digits.\r\n\r\nAvoid always printing the type. This is technically invalid Go code,\r\nbut is unnecessary in many cases since the type is inferred\r\nfrom the parent concrete type.\r\n\r\nFixes #272"
    },
    {
      "commit": "4664e24d52beca933d6f5378d36e1d405099115d",
      "tree": "b7041615027f7a26586f40b4ef14cf17ef62604a",
      "parents": [
        "79433ace284e1270988886ec120ec5aa3d1d1776"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Apr 25 16:26:47 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 25 16:26:47 2022"
      },
      "message": "Fix printing of types in reporter output (#293)\n\nWhen printing a pointer, only elide the type for unnamed pointers.\r\nOtherwise, we can run into situations where named and unnamed pointers\r\nformat the same way in indistinguishable ways.\r\n\r\nWhen printing an interview, never skip the interface type.\r\nWhether we skip printing the type should be determined by the\r\nparent containers, and not locally determined.\r\nFor examples, interface values within a struct, slice, or map\r\nwill always be elided since they can be inferred."
    },
    {
      "commit": "79433ace284e1270988886ec120ec5aa3d1d1776",
      "tree": "8557b3c2683e3a86582ef33040011410d472d614",
      "parents": [
        "039e37cba1f3e52c48404633d6960421b369a19a"
      ],
      "author": {
        "name": "Aoang",
        "email": "aoang@x2ox.com",
        "time": "Tue Mar 22 14:05:27 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 22 14:05:27 2022"
      },
      "message": "Run tests on Go 1.18 (#290)\n\n"
    },
    {
      "commit": "039e37cba1f3e52c48404633d6960421b369a19a",
      "tree": "6ed017b3d1ab8190bf3ea035f9399b6552604c5f",
      "parents": [
        "3242228551a7556abc624443ef03a6dbfeeacd22"
      ],
      "author": {
        "name": "Tobias Klauser",
        "email": "tklauser@distanz.ch",
        "time": "Tue Jan 04 17:50:40 2022"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 04 17:50:40 2022"
      },
      "message": "Add //go:build lines (#285)\n\nStarting with Go 1.17, //go:build lines are preferred over // +build\r\nlines, see https://golang.org/doc/go1.17#build-lines and\r\nhttps://golang.org/design/draft-gobuild for details.\r\n\r\nThis change was generated by running Go 1.17 go fmt ./... which\r\nautomatically adds //go:build lines based on the existing // +build\r\nlines.\r\n\r\nAlso update the corresponding GitHub action to use Go 1.17 gofmt."
    },
    {
      "commit": "3242228551a7556abc624443ef03a6dbfeeacd22",
      "tree": "be5bceb63176bfcd525b25b0aaf7f1126b4e0810",
      "parents": [
        "f59cd61478ea347f01124caa5fe7cafe512a4c8f"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Dec 07 21:01:18 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 07 21:01:18 2021"
      },
      "message": "Drop hacks to work around Go reflection bugs in Go1.9 (#282)\n\nNow that Go 1.11 is the minimally supported version,\r\nwe can drop some local hacks to work around bugs in\r\nreflect that were present in Go1.9."
    },
    {
      "commit": "f59cd61478ea347f01124caa5fe7cafe512a4c8f",
      "tree": "8cc64064736296c769e9832fbc1c21d23f4edf2e",
      "parents": [
        "6faefd0594fae82639a62c23f0aed1451509dcc0"
      ],
      "author": {
        "name": "Damien Neil",
        "email": "neild@users.noreply.github.com",
        "time": "Tue Dec 07 19:10:08 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 07 19:10:08 2021"
      },
      "message": "Update minimum supported version to go1.11 (#281)\n\n"
    },
    {
      "commit": "6faefd0594fae82639a62c23f0aed1451509dcc0",
      "tree": "7f30ca1ff28938cd6a4eec7f6189d4e233579295",
      "parents": [
        "f1773ad7bdb1ddccb1801c5b8ca4311cf0d301e4"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Oct 12 18:15:02 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 12 18:15:02 2021"
      },
      "message": "Reduce minimum length for specialize string diffing (#275)\n\nThe original threshold of 64 was chosen without much thought.\r\nLower it to 32 now that we have some concrete examples\r\nthat it is aesthetically better.\r\n\r\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "f1773ad7bdb1ddccb1801c5b8ca4311cf0d301e4",
      "tree": "9970edec5338ceb8d0565588c2ffbe8ad641672c",
      "parents": [
        "9094ef9afacbd93e9f232d0ccadaf8530f353441"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Oct 12 17:46:09 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 12 17:46:09 2021"
      },
      "message": "Use any alias instead of interface{} (#276)\n\nSee golang/go#33232."
    },
    {
      "commit": "9094ef9afacbd93e9f232d0ccadaf8530f353441",
      "tree": "3553f9631dcc94cf5895029298101226683b3f4a",
      "parents": [
        "3ee52c8a5607a16505c9c7141153ff82d360817a"
      ],
      "author": {
        "name": "Jake Son",
        "email": "sonjeabin@gmail.com",
        "time": "Thu Sep 16 23:00:29 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 16 23:00:29 2021"
      },
      "message": "Change build status badge (#269)\n\nCo-authored-by: Damien Neil \u003cneild@users.noreply.github.com\u003e"
    },
    {
      "commit": "3ee52c8a5607a16505c9c7141153ff82d360817a",
      "tree": "e48cdb34a535cd122e9162f8773fa63604232a53",
      "parents": [
        "395a0ac549058d781199661ca2e37cc636db43e4"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Sep 16 22:55:50 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 16 22:55:50 2021"
      },
      "message": "Fix spelling mistakes (#271)\n\n"
    },
    {
      "commit": "395a0ac549058d781199661ca2e37cc636db43e4",
      "tree": "db4392a8a97c8e946c405f06405d60c0de0977a8",
      "parents": [
        "402949e8139bb890c71a707b6faf6dd05c92f4e5"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 22 23:14:42 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 22 23:14:42 2021"
      },
      "message": "Use sha256 in test (#268)\n\nSome aggressive dependency checks flag the use of md5.\r\nSwitch to sha256 as it accomplishes the same purpose."
    },
    {
      "commit": "402949e8139bb890c71a707b6faf6dd05c92f4e5",
      "tree": "1e5142823aaab3313e67cd9a47309a1a47cd438e",
      "parents": [
        "290a6a23966f9edffe2a0a4a1d8dd065cc0753fd",
        "d5fcb386864232c4b315ea7f9838e455a2ce3cda"
      ],
      "author": {
        "name": "Damien Neil",
        "email": "neild@users.noreply.github.com",
        "time": "Mon Jul 19 17:12:14 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 19 17:12:14 2021"
      },
      "message": "Merge pull request #266 from dsnet/fix-format\n\nFix textual printing of byte slices"
    },
    {
      "commit": "d5fcb386864232c4b315ea7f9838e455a2ce3cda",
      "tree": "1e5142823aaab3313e67cd9a47309a1a47cd438e",
      "parents": [
        "290a6a23966f9edffe2a0a4a1d8dd065cc0753fd"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jul 19 00:32:48 2021"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jul 19 00:32:48 2021"
      },
      "message": "Fix textual printing of byte slices\n\nThere are two bugs being fixed:\n\n1.  The hueristic for whether a slice of byte looks like text\n    should check whether a rune IsPrint OR IsSpace, and not both.\n    Only a single rune (i.e., U+0020) ever satisfies both conditions.\n\n    Previously, it would print as:\n        MyBytes{0x68, 0x65, 0x6c, 0x6c, 0x6f}\n    and now it would now print as:\n        MyBytes(MyBytes(\"hello\"))\n\n2.  If we\u0027re printing as string, then we should set skipType\u003dtrue\n    since we already explicitly format the value with the type.\n\n    Previously, it would print as:\n        MyBytes(MyBytes(\"hello\"))\n    and now it would now print as:\n        MyBytes(\"hello\")\n"
    },
    {
      "commit": "290a6a23966f9edffe2a0a4a1d8dd065cc0753fd",
      "tree": "d47dea10d02481a11a0da62b8e8031ae384e6655",
      "parents": [
        "248ccfffa4b8906ebc7f9ab720fe5b6012bb7745"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu May 27 17:48:29 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 27 17:48:29 2021"
      },
      "message": "Avoid shadowing variable (#263)\n\nRename the shadowed variable i to j for better readability."
    },
    {
      "commit": "248ccfffa4b8906ebc7f9ab720fe5b6012bb7745",
      "tree": "a907336285c284211c2454d24f50da064ebc0177",
      "parents": [
        "d103655696d8ae43c4125ee61454dbf03d8e8324"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu May 27 16:45:01 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 27 16:45:01 2021"
      },
      "message": "Fix staticcheck findings (#262)\n\nAddress some minor issues flagged by staticcheck.\r\nNone of these affect the correctness of the package."
    },
    {
      "commit": "d103655696d8ae43c4125ee61454dbf03d8e8324",
      "tree": "098522dcb65980569606ba11b7c0b27bc982b660",
      "parents": [
        "9181d1e7c97613e12da2beec65ca4bd834a7a7da"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue May 25 02:50:45 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 25 02:50:45 2021"
      },
      "message": "Print as text if mostly text (#258)\n\nThe previous heuristic of treating strings as binary data\r\nif it contains any invalid UTF-8 was too strict.\r\nLoosen the heuristic to check if most of the characters\r\nare printable text.\r\n\r\nFixes #257"
    },
    {
      "commit": "9181d1e7c97613e12da2beec65ca4bd834a7a7da",
      "tree": "ad0fe1282e52157dc3f81764c8740ad9feda39df",
      "parents": [
        "c5c3378d8544789f76de8a338a95307b0854e816"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue May 25 01:23:32 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 25 01:23:32 2021"
      },
      "message": "Avoid diffing by lines if inefficient (#260)\n\nAvoid diffing by lines if it turns out to be significantly less\r\nefficient than diffing by bytes.\r\n\r\nBefore this change:\r\n    (\r\n    \t\"\"\"\r\n  - \td5c14bdf6bac81c27afc5429500ed750\r\n  - \t25483503b557c606dad4f144d27ae10b\r\n  - \t90bdbcdbb6ea7156068e3dcfb7459244\r\n  - \t978f480a6e3cced51e297fbff9a506b7\r\n  + \tXd5c14bdf6bac81c27afc5429500ed750\r\n  + \tX25483503b557c606dad4f144d27ae10b\r\n  + \tX90bdbcdbb6ea7156068e3dcfb7459244\r\n  + \tX978f480a6e3cced51e297fbff9a506b7\r\n    \t\"\"\"\r\n    )\r\n\r\nAfter this change:\r\n    strings.Join({\r\n  + \t\"X\",\r\n    \t\"d5c14bdf6bac81c27afc5429500ed750\\n\",\r\n  + \t\"X\",\r\n    \t\"25483503b557c606dad4f144d27ae10b\\n\",\r\n  + \t\"X\",\r\n    \t\"90bdbcdbb6ea7156068e3dcfb7459244\\n\",\r\n  + \t\"X\",\r\n    \t\"978f480a6e3cced51e297fbff9a506b7\\n\",\r\n    }, \"\")"
    },
    {
      "commit": "c5c3378d8544789f76de8a338a95307b0854e816",
      "tree": "ebad9f45dd4ec4b3354ba3a599806f475c096466",
      "parents": [
        "1ee4af8b89b19a908a39ae7281c93dcc59eeb4d3"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue May 25 00:33:36 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 25 00:33:36 2021"
      },
      "message": "Cleanup edit groups after coalescing (#259)\n\nEven with an optimal diffing algoritm, coalescing adjacent edit groups\r\nmay cause the corresponding pair of strings for an edit group to have\r\nleading or trailing spans of equal elements.\r\n\r\nWhile this is technically a correct representation of a diff,\r\nit is a suboptimal outcome. As such, scan through all unequal groups and\r\nmove leading/trailing equal spans to the preceding/succeeding equal group.\r\n\r\nBefore this change:\r\n    strings.Join({\r\n      \"org-4747474747474747,bucket-4242424242424242:m,tag1\u003da,tag2\u003daa\",\r\n  -   \",#\u003d_value _value\u003d2 \",\r\n  +   \" _value\u003d2 \",\r\n      `11 org-4747474747474747,bucket-4242424242424242:m,tag1\u003da,tag2\u003dbb`,\r\n  -   \",#\u003d_value _value\u003d2 2\",\r\n  +   \" _value\u003d2 2\",\r\n      `1  org-4747474747474747,bucket-4242424242424242:m,tag1\u003db,tag2\u003dcc`,\r\n  -   \",#\u003d_value\",\r\n      ` _value\u003d1 21 org-4747474747474747,bucket-4242424242424242:m,tag1`,\r\n      \"\u003da,tag2\",\r\n  -   \"\u003ddd,#\u003d_value\",\r\n  +   \"\u003ddd\",\r\n      ` _value\u003d3 31 org-4747474747474747,bucket-4242424242424242:m,tag1`,\r\n  -   \"\u003dc,#\u003d_value\",\r\n  +   \"\u003dc\",\r\n      ` _value\u003d4 41 `,\r\n    }, \"\")\r\n\r\nAfter this change:\r\n    strings.Join({\r\n      \"org-4747474747474747,bucket-4242424242424242:m,tag1\u003da,tag2\u003daa\",\r\n  -   \",#\u003d_value\",\r\n      ` _value\u003d2 11 org-4747474747474747,bucket-4242424242424242:m,tag1`,\r\n      \"\u003da,tag2\u003dbb\",\r\n  -   \",#\u003d_value\",\r\n      ` _value\u003d2 21 org-4747474747474747,bucket-4242424242424242:m,tag1`,\r\n      \"\u003db,tag2\u003dcc\",\r\n  -   \",#\u003d_value\",\r\n      ` _value\u003d1 21 org-4747474747474747,bucket-4242424242424242:m,tag1`,\r\n      \"\u003da,tag2\u003ddd\",\r\n  -   \",#\u003d_value\",\r\n      ` _value\u003d3 31 org-4747474747474747,bucket-4242424242424242:m,tag1`,\r\n      \"\u003dc\",\r\n  -   \",#\u003d_value\",\r\n      ` _value\u003d4 41 `,\r\n    }, \"\")"
    },
    {
      "commit": "1ee4af8b89b19a908a39ae7281c93dcc59eeb4d3",
      "tree": "186728c3ff09c516273258cbd1c7d9f11ced3cb5",
      "parents": [
        "8fa37b4dd109f12e42b131e485268768f18bcbf8"
      ],
      "author": {
        "name": "Ikko Ashimine",
        "email": "eltociear@gmail.com",
        "time": "Mon Apr 12 16:47:06 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 12 16:47:06 2021"
      },
      "message": "Fix typo in path.go (#256)\n\ns/seperate/separate/"
    },
    {
      "commit": "8fa37b4dd109f12e42b131e485268768f18bcbf8",
      "tree": "32c062a5d5870c9b8e98f35986c9da930da4f3ce",
      "parents": [
        "dc6435e426906757e7c944f74758028d3d2edc3c"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Mar 03 20:48:37 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 03 20:48:37 2021"
      },
      "message": "Fix reporter verbosity bug (#253)\n\nFormatDiff should only set the verbosity to 3 if the current verbosity\nis lower than 3. Otherwise, it may remove an intended higher verbosity\nsetting causing the reporter output to not differentiate between\ntwo large values that are different at the end.\n\nWhile we are at it, increase the maxVerbosityPreset to 6."
    },
    {
      "commit": "dc6435e426906757e7c944f74758028d3d2edc3c",
      "tree": "2b6613be1b2619f379cfa87ca461889f7865cc4f",
      "parents": [
        "e9947a2e1dee9e355ae5d2f794787ad215aff039"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Mar 03 17:41:45 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 03 17:41:45 2021"
      },
      "message": "De-virtualize interfaces for specialized diffing (#254)\n\nSpecialized diffing strings and slices should occur for\r\ninterface types where both values have the same concrete type.\r\nThis is especially relevant for protocmp.Transform,\r\nwhich transforms every proto.Message as a map[string]interface{}."
    },
    {
      "commit": "e9947a2e1dee9e355ae5d2f794787ad215aff039",
      "tree": "06a91d87ae5a0855ac52cfeb836cc008a7535b90",
      "parents": [
        "3a98a11b2c6d5ad66696f2954b3811f0244fb71d"
      ],
      "author": {
        "name": "Tobias Klauser",
        "email": "tklauser@distanz.ch",
        "time": "Sat Feb 20 22:00:13 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Feb 20 22:00:13 2021"
      },
      "message": "Run tests on Go 1.16 (#252)\n\nAdd Go 1.16 to the GitHub actions test coverage matrix.\r\n\r\nAlso switch the gofmt check to only run on Go 1.16, i.e. the latest\r\nsupported version."
    },
    {
      "commit": "3a98a11b2c6d5ad66696f2954b3811f0244fb71d",
      "tree": "2972e86b2fa9017d82023f79485bc2026c69e2dc",
      "parents": [
        "ec71d6d790538ad88c95a192fd059e11afb45b6f"
      ],
      "author": {
        "name": "Tobias Klauser",
        "email": "tobias.klauser@gmail.com",
        "time": "Fri Feb 05 00:08:49 2021"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 05 00:08:49 2021"
      },
      "message": "cmp/cmpopts: use errors.Is with ≥go1.13 in compareErrors (#251)\n\nUse the standard definition of errors.Is to implement compareErrors with\r\n≥go1.13. Retain the implementation using golang.org/x/xerrors for versions \u003cgo1.13.\r\n\r\nThis will allow packages using newer Go versions and already relying on\r\nthe errors package to get rid of the transitive dependency on\r\ngolang.org/x/xerrors."
    },
    {
      "commit": "ec71d6d790538ad88c95a192fd059e11afb45b6f",
      "tree": "fbd3e5242869d4ca3b168066201a8014e71a1694",
      "parents": [
        "449e17c6c9daf9b0c84a35fef7d79321b9535763"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Nov 24 18:26:02 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 24 18:26:02 2020"
      },
      "message": "Impose verbosity limit when formatting map keys (#248)\n\nMap keys should have a sensible verbosity limit imposed,\r\notherwise the reporter can end up printing a massive data structure\r\nthat cannot reasonably fit in memory."
    },
    {
      "commit": "449e17c6c9daf9b0c84a35fef7d79321b9535763",
      "tree": "11323fda8d7dab06915dc2c8c0206dafa28a4cf6",
      "parents": [
        "ade6b74536ea3af0d70b4ebd51c08c5d31313078"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Nov 24 17:53:22 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 24 17:53:22 2020"
      },
      "message": "Fix non-determinism in diffing algorithm (#247)\n\nA previous attempt to add non-determinism to the diffing algorithm\r\nunfortunately broke the algorithm for half the cases.\r\n\r\nThis change modifies the algorithm to truly switch between starting\r\nwith a forward search versus a reverse search.\r\nThe main for-loop of Difference would switch repeatedly between\r\nperforming a forward search, then a reverse search, and vice-versa.\r\nSince we can\u0027t jump into the middle of a for-loop to start with the\r\nreverse search first, we use a series of labels and goto statements\r\nto accomplish the same effect.\r\n\r\nFixes #238"
    },
    {
      "commit": "ade6b74536ea3af0d70b4ebd51c08c5d31313078",
      "tree": "1a1d340fab802ddd6eacdbc93e3a8288c50e0ff8",
      "parents": [
        "0a3ecd384c2ae80de757e4b62138949ab721f02e"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Nov 23 18:51:54 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 23 18:51:54 2020"
      },
      "message": "Use GitHub actions for testing (#246)\n\nUse a GitHub action to run test on each push and pull request.\r\nWe test across a matrix covering Linux and MacOSX, and Go 1.8 to 1.15."
    },
    {
      "commit": "0a3ecd384c2ae80de757e4b62138949ab721f02e",
      "tree": "e48fdbba36ff356179f103069e923bf8b3794288",
      "parents": [
        "d3c8501c1f408298cf94082d6774e0a5b77c3ce0"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Nov 12 20:24:02 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 12 20:24:02 2020"
      },
      "message": "Fix Diff documentation (#237)\n\nThe description inaccurately describes the operation of Diff,\r\nwhich is y - x, where a \u0027+\u0027 prefix denotes elements added from y\r\nand a \u0027-\u0027 prefix denotes elements removed from x.\r\n\r\nFor example:\r\n\t// Consider this call to Diff and its result.\r\n\t                  x  y\r\n\tcmp.Diff({b:2, c:3}, {a:1, b:2}) \u003d\u003e {+a:1, b:2, -c:3}\r\n\r\n\t// Consider the same in mathematical notation.\r\n\t         y - x\r\n\t{a:1, b:2} - {b:2, c:3} \u003d {+a:1, b:2, -c:3}"
    },
    {
      "commit": "d3c8501c1f408298cf94082d6774e0a5b77c3ce0",
      "tree": "e977ecf12af7027bcb2fa5b7ec1062172a623e2c",
      "parents": [
        "ab46b8bd0abd4c4557cc4709ad7ae12d47570603"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Nov 12 20:17:33 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 12 20:17:33 2020"
      },
      "message": "Revert \"Adjust for reflect.Type.NumMethod change in Go1.16 (#240)\" (#242)\n\nThis reverts commit ab46b8bd0abd4c4557cc4709ad7ae12d47570603.\r\nThe upstream change in Go1.16 has been rolled back.\r\nSee golang/go#42123"
    },
    {
      "commit": "ab46b8bd0abd4c4557cc4709ad7ae12d47570603",
      "tree": "676a12f25232d6df9c129bfac17eacf15c1f8e9f",
      "parents": [
        "566225a2554cf156c7af1006dc3a0940e1e02b09"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Oct 20 21:23:13 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 21:23:13 2020"
      },
      "message": "Adjust for reflect.Type.NumMethod change in Go1.16 (#240)\n\nIn Go1.16, the reflect.Type.NumMethod method will no longer report\r\nunexported fields, matching the documented behavior on the method.\r\nThis means that t.NumMethod() \u003d\u003d 0 is no longer a reliable means\r\nto detect whether an interface type is the empty interface or not.\r\nFix the code to check whether the empty interface itself implements\r\nthe target type."
    },
    {
      "commit": "566225a2554cf156c7af1006dc3a0940e1e02b09",
      "tree": "e977ecf12af7027bcb2fa5b7ec1062172a623e2c",
      "parents": [
        "d713870ac17fdb9ee5e2ee48ff6562dfb1c0157b"
      ],
      "author": {
        "name": "colinnewell",
        "email": "colin.newell@gmail.com",
        "time": "Sun Oct 04 08:16:17 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 08:16:17 2020"
      },
      "message": "Add an example for IgnoreFields (#205)\n\nAdd an example for IgnoreFields. This resuses the test data from the example\r\nin the cmp package to provide consistency between examples."
    },
    {
      "commit": "d713870ac17fdb9ee5e2ee48ff6562dfb1c0157b",
      "tree": "170cc3a5a0a0eb4f330b2413b9d857393c565c22",
      "parents": [
        "d2fcc899bdc2d134b7c00e36137260db963e193c"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Sep 23 20:30:54 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 20:30:54 2020"
      },
      "message": "Fix license headers (#236)\n\nThere is no LICENSE.md file, but there is a LICENSE file."
    },
    {
      "commit": "d2fcc899bdc2d134b7c00e36137260db963e193c",
      "tree": "c8b2079fb7f32dab92d072a80cfb45688b9a0f94",
      "parents": [
        "db9de4321f4e5db7c6f996d170ebce7953f22f8e"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Aug 18 19:37:11 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 19:37:11 2020"
      },
      "message": "Suggest use of cmpopts.EquateErrors (#234)\n\nIf cmp panics because it is trying to access an unexported field,\r\nspecially suggest the use of cmpopts.EquateErrors if the parent type\r\nimplements the error interface.\r\n\r\nFixes #233"
    },
    {
      "commit": "db9de4321f4e5db7c6f996d170ebce7953f22f8e",
      "tree": "fc82223a2a4c39f4dda3c4df2ea5eaf1bd1ad08b",
      "parents": [
        "036ffc7f24c0d0eda6ce580168fdaec194a1561f"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Aug 12 19:30:49 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 19:30:49 2020"
      },
      "message": "Add testing for Go1.15 (#232)\n\n"
    },
    {
      "commit": "036ffc7f24c0d0eda6ce580168fdaec194a1561f",
      "tree": "eb6459ec821f856aad294350d1d085be6b3f0f06",
      "parents": [
        "9680bfaf28748393e28e00238d94070fb9972fd8"
      ],
      "author": {
        "name": "Ernest Galbrun",
        "email": "ernest.galbrun@gmail.com",
        "time": "Wed Jul 29 15:27:27 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 15:27:27 2020"
      },
      "message": "Fix Diff documentation (#231)\n\nFix the documentation on Diff. It was mentioning the plus or minus sign being printed if the field was added to y or removed from y, but both are the same. Fix it so that it properly mentions the use of a minus sign for elements removed from x."
    },
    {
      "commit": "9680bfaf28748393e28e00238d94070fb9972fd8",
      "tree": "9f8a03427f925add3844d2b40237c84f4514f318",
      "parents": [
        "1536a0c407e000815ccef10665d81cef0c855cd1"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jul 21 19:17:14 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 19:17:14 2020"
      },
      "message": "Use triple-quote formatting for multiline strings (#229)\n\nFor strings, []bytes containing text data, Error method output, and\r\nString method output, use the triple-quoted syntax.\r\nThis improves readability by presenting the data more naturally\r\ncompared to a single-line quoted string with many escaped characters."
    },
    {
      "commit": "1536a0c407e000815ccef10665d81cef0c855cd1",
      "tree": "650ae88be1a93ae4c109d181a738345075380bb3",
      "parents": [
        "d669b046d12237b504e86b93d6b25ec551e8c349"
      ],
      "author": {
        "name": "k.nakada",
        "email": "36500782+ko30005@users.noreply.github.com",
        "time": "Tue Jul 14 17:35:29 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 17:35:29 2020"
      },
      "message": "Adjust panic for IgnoreUnexported and IgnoreFields (#228)\n\nAdjust the panic message to be more specific about what the user should do, and reduces the need for the user to look at the source code."
    },
    {
      "commit": "d669b046d12237b504e86b93d6b25ec551e8c349",
      "tree": "090251d27fd2c0c311c6e965c52ba4db44d73550",
      "parents": [
        "77ae86f624cb174e21763cffcbbf070eb06cb016"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jun 22 16:53:17 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 16:53:17 2020"
      },
      "message": "Swallow panic when calling String or Error (#221)\n\nIf a panic occurs while calling String or Error,\r\nthe reporter recovers from it and ignores it, proceeding with\r\nits usual functionality for formatting a value."
    },
    {
      "commit": "77ae86f624cb174e21763cffcbbf070eb06cb016",
      "tree": "dd32bd59eb58b50d44dee2efa06ac36f8daa92a1",
      "parents": [
        "c49bfce0ac9115b09320b47c3b9534cc5afd4579"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jun 18 00:25:47 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 00:25:47 2020"
      },
      "message": "Improve reporting of values with cycles (#217)\n\nPreviously, the reporter could handle formatting values with cycles\r\nin that it did not crash with a stack overflow. However, the output\r\nwas not particularly understandable as it did not surface to the user\r\nwhy a particular value was truncated, and if it was truncated due\r\nto a cyclic reference, what was the referent.\r\n\r\nThis change annotates the reporter tree with pointer information\r\nso that a later pass can inject reference information if it is needed\r\nto produce more understandable output.\r\n\r\nConsider the following example:\r\n  map[string]*cmp_test.CycleAlpha{\r\n  \t\"Foo\": \u0026⟪ref#0⟫{\r\n  \t\tName: \"Foo\",\r\n  \t\tBravos: map[string]*cmp_test.CycleBravo{\r\n  \t\t\t\"FooBravo\": \u0026{\r\n- \t\t\t\tID:     101,\r\n+ \t\t\t\tID:     0,\r\n  \t\t\t\tName:   \"FooBravo\",\r\n  \t\t\t\tMods:   100,\r\n  \t\t\t\tAlphas: {\"Foo\": \u0026⟪ref#0⟫(...)},\r\n  \t\t\t},\r\n  \t\t},\r\n  \t},\r\n  }\r\n\r\nThis graph contains a cycle. To ensure that a graph can be formatted,\r\nthe cycle is truncated as indicated with: \u0026⟪ref#0⟫(...).\r\nThe referent was identified earlier with: \u0026⟪ref#0⟫{...}."
    },
    {
      "commit": "c49bfce0ac9115b09320b47c3b9534cc5afd4579",
      "tree": "b644e2fd16ed59d1fb4f89a74b1233d65d907ea7",
      "parents": [
        "12277310d373db3799bcc3f14684adee17319122"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 17 21:41:50 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 21:41:50 2020"
      },
      "message": "Update test case names (#218)\n\nProvide a unique name for every test case.\r\nProvide a reason for every test case.\r\nThe purpose of a unique name is so that insertion/removal of a\r\ncase does not cause all subsequent names to suddenly shift,\r\ncausing a larger number of differences in testdata/diffs."
    },
    {
      "commit": "12277310d373db3799bcc3f14684adee17319122",
      "tree": "f04dc1c9614a9ac2f448b86629cbb720d67189c9",
      "parents": [
        "44914b370698a5a9ce868549d62d79473faebacc"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 17 21:23:43 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 21:23:43 2020"
      },
      "message": "Fix documentation on IgnoreFields (#220)\n\nThe function now handles unexported fields since #203."
    },
    {
      "commit": "44914b370698a5a9ce868549d62d79473faebacc",
      "tree": "04b9b2f2bc3a703c4515b20f64ffa10880358c1b",
      "parents": [
        "f1780cfdde930250f45fbe0bb6e107be5b4e9514"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jun 12 22:29:35 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 22:29:35 2020"
      },
      "message": "Disambiguate reporter output (#216)\n\nThe reporter tries to aggresively elide data that is not interesting\r\nto the user. However, doing so many result in an output that does not\r\nvisually indicate the difference between semantically different objects.\r\nThis CL modifies the reporter to try increasingly verbose presets until\r\ntwo different objects are formatted differently.\r\n\r\nThis CL includes a custom implementation of reflect.Type.String that\r\ncan print the type with fully qualified names to disambiguate types\r\nthat happen to have the same base package name.\r\n\r\nFixes #194"
    },
    {
      "commit": "f1780cfdde930250f45fbe0bb6e107be5b4e9514",
      "tree": "a5256e2020fb407731bd2ac71d6e8695f861a384",
      "parents": [
        "0d296f9f534978cc25de69216b23b74bbc10fad9"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jun 12 01:28:52 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 01:28:52 2020"
      },
      "message": "Limit verbosity of reporter output (#215)\n\nA common complaint is that the reporter it prints out too much\r\nirrelevant information, resulting in a low signal-to-noise ratio.\r\nImprove this metric by imposing a verbosity limit. For nodes that\r\nare equal, we set the verbosity level is a lower value than when\r\nthe nodes are inequal.\r\n\r\nOther minor changes:\r\n* Adjust heuristic for triple-quote usage to operate on more cases.\r\n* Elide type more aggressively for equal nodes.\r\n* Printing the address for a slice includes the length and capacity.\r\n* The pointed-at value for map keys are printed."
    },
    {
      "commit": "0d296f9f534978cc25de69216b23b74bbc10fad9",
      "tree": "fd8ce943ae7021a0cb6930782d985f2d17f148c9",
      "parents": [
        "7c9a834557ca73ca54b2f367316f4bd747217741"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 23:51:30 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 23:51:30 2020"
      },
      "message": "Limit number of printed differences for variable-length composites (#213)\n\nFor large slices, arrays, and maps, the reporter can be unreadable\r\nif there are many differences. Limit the number of results to some\r\nreasonable maximum."
    },
    {
      "commit": "7c9a834557ca73ca54b2f367316f4bd747217741",
      "tree": "c9c67ee05c7eecf6f60d737675d1c1e60f8cef43",
      "parents": [
        "0cd6169de14f4f3dc7550a908d8e4a5c69f85fd2"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 23:44:26 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 23:44:26 2020"
      },
      "message": "Introduce deliberate instability to difference output (#214)\n\nThe reporter output is documented as unstable.\r\nThe API for custom reporters also specifies that the diffing of\r\nslices is unstable.\r\n\r\nIntroduce deliberate instability to the diffing algorithm so that\r\nwe have the flexibility to improve it in the future.\r\nThe current algorithm optimizes for speed, rather than optimality,\r\nso there is much room for improvement."
    },
    {
      "commit": "0cd6169de14f4f3dc7550a908d8e4a5c69f85fd2",
      "tree": "944804821580175fba2b1feedd7fafd0432a679b",
      "parents": [
        "a171aa74446ac6ce47f4f09b10deb7d9afc7dc20"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 19:12:46 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 19:12:46 2020"
      },
      "message": "Use custom triple-quote syntax for diffing string literals (#212)\n\nUsing strings.Join to denote differences in a multi-line string is\r\nvisually noisy due to extensive use of quotes and escape sequences.\r\nAdd a custom triple-quote syntax that unambiguously shows line\r\ndifferences with less visual noise.\r\n\r\nIf the triple-quote syntax cannot unmabiguously show differences,\r\nthen the reporter falls back on using the strings.Join format,\r\nwhich is never ambiguous.\r\n\r\nFixes #195"
    },
    {
      "commit": "a171aa74446ac6ce47f4f09b10deb7d9afc7dc20",
      "tree": "f7a14d0a558eafba4aa1b449569d54562fe7891e",
      "parents": [
        "88849e8bc9a647e7dde31569a79f5ea1f624ef2b"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 18:11:33 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:11:33 2020"
      },
      "message": "Use raw string literal syntax only for valid UTF-8 (#211)\n\n"
    },
    {
      "commit": "88849e8bc9a647e7dde31569a79f5ea1f624ef2b",
      "tree": "360cacc6f6d753d6882b1cc0101fd7cf8e98b2cd",
      "parents": [
        "9b300311a803504267fb9fc5040a430aa7013956"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 18:08:11 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:08:11 2020"
      },
      "message": "Allow batched diffing of slices with a custom comparer (#210)\n\nFor correctness, cmp checks applicability of the options for every\r\nelement in a slice. For large []byte, this is a significant performance\r\ndetriment. The workaround is to specify Comparer(bytes.Equal).\r\nHowever, we would still like to have the batched diffing if the\r\nslices are different. Specialize for this situation."
    },
    {
      "commit": "9b300311a803504267fb9fc5040a430aa7013956",
      "tree": "1ad0851b6a1214bb1c5b54e49eba2b42f8bb82ce",
      "parents": [
        "367e530b4ed74b514889e7945f0b18145337eff3"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 18:00:30 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:00:30 2020"
      },
      "message": "Batch reporter output for simple lists of textLine elements (#208)\n\nRather than having a single element on each line,\r\nwhich hurts readability due to the need for scrolling quite a bit.\r\nBatch multiple elements for simple lists to be on a single line.\r\n\r\nFixes #170"
    },
    {
      "commit": "367e530b4ed74b514889e7945f0b18145337eff3",
      "tree": "c6846784f8044fb6f23ba770f25b98fe836d14ea",
      "parents": [
        "23a2b5646fe0b6a0b4b19b6ef0b0965b182f2e83"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jun 10 17:36:17 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 17:36:17 2020"
      },
      "message": "Mention minimally supported Go version in TODO (#209)\n\nSpecify the exact minimumally supported version of Go required\r\nin order to address certain TODOs. This makes it easier to filter\r\nout inactionable TODOs."
    },
    {
      "commit": "23a2b5646fe0b6a0b4b19b6ef0b0965b182f2e83",
      "tree": "21c425ddc481a70bd2e9d2e6a753a6591c41124a",
      "parents": [
        "11c4583a280337c7ac34c591b4321552981a7cc0"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jun 09 07:21:01 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 07:21:01 2020"
      },
      "message": "Fix exporter to handle nil interface values (#207)\n\nA shallow copy with reflect.ValueOf(v.Interface()) does not work\r\nif v is a nil interface value. Special case the edge case by\r\nchecking for a nil value and create a new one use reflect.Zero."
    },
    {
      "commit": "11c4583a280337c7ac34c591b4321552981a7cc0",
      "tree": "665edc6d6efa7416baba1daa03dfb819c41da76a",
      "parents": [
        "1776240f8f841dfa00cb72d811301dbb0298f983"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jun 08 23:37:31 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 23:37:31 2020"
      },
      "message": "Avoid leaking implementation details of the exporter (#206)\n\nThe current implementation for forcibly exporting fields relies on\r\nthe reflect.Value.Addr method for the parent struct value,\r\nwhere it copies a non-addressable struct onto to the heap so\r\nthat it is addressable. However, this action leaks a subtle detail\r\nof how the internal implementation works since the accessed field\r\nfor within a struct is only addressable if and only if the\r\nparent struct is also addressable.\r\n\r\nModify the implementation to avoid leaking this implementation detail\r\nby shallow copying the accessed unexported field to remove any\r\nnotion of addressability if the parent struct is also unaddressable.\r\n\r\nFixes #181"
    },
    {
      "commit": "1776240f8f841dfa00cb72d811301dbb0298f983",
      "tree": "8602116c49002a2359e257525bc1f4afebae1fab",
      "parents": [
        "4a83f562775624b78b8b83b7492758099439ca10"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jun 08 21:41:23 2020"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jun 08 21:41:23 2020"
      },
      "message": "Forcibly export fields for use by the reporter\n\nThe choice to avoid traversing unexported fields by default makes\nsense for the semantics of normal comparisons. However, the goal\nof the reporter is to prioritize humanly readable output.\nAs such, it seems appropriate to forcibly export fields.\nThis allows the String method to be called on such values.\n"
    },
    {
      "commit": "4a83f562775624b78b8b83b7492758099439ca10",
      "tree": "dd7dca1bd4467d506c74afac09aa2af698b82cdb",
      "parents": [
        "d08c604e6f3e6b88ac9497ab252e6488f268d260"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue May 26 20:29:20 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 20:29:20 2020"
      },
      "message": "Optimize Diff for frequent equality (#204)\n\nDiff is most often used in tests where the expected outcome\r\nis equality (and thus no reported difference). Optimize for this\r\nsituation by performing a fast-pass equality check and only fall\r\nback on constructing a report if inequal."
    },
    {
      "commit": "d08c604e6f3e6b88ac9497ab252e6488f268d260",
      "tree": "491df96406d41b825ef38e3992573e67fa2bd491",
      "parents": [
        "aa7c82a3f2093118656c72614a55b7746c369301"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed May 20 20:22:30 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 20:22:30 2020"
      },
      "message": "Permit use of IgnoreFields with unexported fields (#203)\n\nModify IgnoreFields to permit the specification of unexported fields.\r\nTo avoid a bug with reflect.Type.FieldByName, we disallow forwarding\r\non unexported fields. See https://golang.org/issue/4876 for details.\r\n\r\nFixes #196"
    },
    {
      "commit": "aa7c82a3f2093118656c72614a55b7746c369301",
      "tree": "a652ed5c92e1467b9be446bf4a00952c4087d4e4",
      "parents": [
        "7e5cb83929c528b29e5a8ac1244eab0436f79bce"
      ],
      "author": {
        "name": "A. Ishikawa",
        "email": "a.ishikawa810@gmail.com",
        "time": "Sun May 17 04:11:53 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 04:11:53 2020"
      },
      "message": "Do not use custom format for nil slice (#201)\n\nThe custom diff output for slices does not accurately reflect the minute\r\ndifferences between a nil slice and an empty slice.\r\nAvoid the custom diffing if either value is nil."
    },
    {
      "commit": "7e5cb83929c528b29e5a8ac1244eab0436f79bce",
      "tree": "310dec21b0187cbe52b2252dfb615e55d4546f50",
      "parents": [
        "0c08307de36daab62772d2ef30aa623780f80c5d"
      ],
      "author": {
        "name": "178inaba",
        "email": "178inaba.git@gmail.com",
        "time": "Fri May 15 04:39:44 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 04:39:44 2020"
      },
      "message": "Format units in decimal except bytes (#199)\n\nIn general, decimal formatting is preferred except for []byte\r\nwhere hexadecimal is preferred for individual elements.\r\n\r\nFixes #185"
    },
    {
      "commit": "0c08307de36daab62772d2ef30aa623780f80c5d",
      "tree": "61b19fc06f0d815e88ab61b8d2c1c2d130f13454",
      "parents": [
        "049b73f65ccf77e9b278cef9beb6a20a9f55f8e7"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed May 13 22:08:07 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 22:08:07 2020"
      },
      "message": "Refactor tests to use golden test files (#200)\n\nRefactor the unit tests to read the diffs from a file\r\nrather than being stored as a Go string literal.\r\nThe advantage of using a golden file is to ease\r\nupdating the diffs whenever the reporter output is changed."
    },
    {
      "commit": "049b73f65ccf77e9b278cef9beb6a20a9f55f8e7",
      "tree": "344e21bfea021a2795179d883235533c07a2b76a",
      "parents": [
        "cb8c7f84fcfb230736f1e5922b3132f47bc88500"
      ],
      "author": {
        "name": "178inaba",
        "email": "178inaba.git@gmail.com",
        "time": "Wed May 13 19:00:48 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 19:00:48 2020"
      },
      "message": "Add reporterTests to TestDiff (#198)\n\n"
    },
    {
      "commit": "cb8c7f84fcfb230736f1e5922b3132f47bc88500",
      "tree": "8aa90d625a05bcfda3c542193a24bc5b99184381",
      "parents": [
        "f6dc95b586bc4e5c03cc308129693d9df2819e1c"
      ],
      "author": {
        "name": "Chris Morrow",
        "email": "morrowc@ops-netman.net",
        "time": "Sun Mar 29 01:24:57 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 01:24:57 2020"
      },
      "message": "Fix typo on example (#193)\n\nRemove redundant \"be\"."
    },
    {
      "commit": "f6dc95b586bc4e5c03cc308129693d9df2819e1c",
      "tree": "03cb9620642ee2bd00432d10c059709b15879bc3",
      "parents": [
        "6fdcbe1f13348761e9b660308f95e71af072ae48"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Feb 27 18:53:46 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 27 18:53:46 2020"
      },
      "message": "Document the test-only intentions of this package (#189)\n\nThis package was never intended to be used in production code.\r\nDocument the expectation that this package was only intended\r\nto be used for writing tests."
    },
    {
      "commit": "6fdcbe1f13348761e9b660308f95e71af072ae48",
      "tree": "8e74a45208b6ff26713b94584b55eb80dfafe410",
      "parents": [
        "5915021f6d960523d973d5e6d745bebcbd684cc3"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Feb 27 18:37:02 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 27 18:37:02 2020"
      },
      "message": "Update tested Go versions (#188)\n\n"
    },
    {
      "commit": "5915021f6d960523d973d5e6d745bebcbd684cc3",
      "tree": "f6b08d0c9b99717517bba744d4954fad35251c9f",
      "parents": [
        "5a6f75716e1203a923a78c9efb94089d857df0f6"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Feb 27 18:32:33 2020"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 27 18:32:33 2020"
      },
      "message": "Update README.md to use go.dev for documentation (#190)\n\nThe color of the shield banner is \"Gopher Blue\" as defined by\r\nbrand book referenced by the Go blog. See https://blog.golang.org/go-brand"
    },
    {
      "commit": "5a6f75716e1203a923a78c9efb94089d857df0f6",
      "tree": "19a1b334d759761879443b465761a2337075f3ad",
      "parents": [
        "340f1ebe299ef6712c79da23ad5bc6e3efad8250"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Dec 16 21:18:14 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 16 21:18:14 2019"
      },
      "message": "Add support for comparing graphs (#85)\n\nPreviously, trying to call Equal on a graph would result in a stack-overflow\r\ndue to infinite recursion traversing cycles on a graph.\r\nWhile a vast majority of Go values are trees or acyclic graphs, there exist\r\na small number of cases where graph equality is required.\r\n\r\nAs such, we add cycle detection to Equal and define what it means for two graphs\r\nto be equal. Contrary to reflect.DeepEqual, which declares two graphs to be\r\nequal so long any cycle were encountered, we require two graphs to have\r\nequivalent graph structures.\r\n\r\nMathematically speaking, a graph G is a tuple (V, E) consisting of the set of\r\nvertices and edges in that graph. Graphs G1 and G2 are equal if V1 \u003d\u003d V2,\r\nE1 \u003d\u003d E2, and both have the same root vertex (entry point into the graph).\r\nWhen traversing G1 and G2, we remember a stack of previously visited edges\r\nES1 and ES2. If the current edge e1 is in ES1 or e2 is in ES2, then we know that\r\na cycle exists. The graphs have the same structure when the previously\r\nencountered edge ep1 and ep2 were encountered together.\r\nNote that edges and vertices unreachable from the root vertex are ignored.\r\n\r\nAppreciation goes to Eyal Posener (@posener), who proposed a different\r\n(but semantically equivalent) approach in #79, which served as inspiration.\r\n\r\nFixes #74"
    },
    {
      "commit": "340f1ebe299ef6712c79da23ad5bc6e3efad8250",
      "tree": "0b8618df2e9f563d358f9b4a0869cf3272310e7a",
      "parents": [
        "3838af334ff48ab62a68998c9a4ee9d847017617"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Dec 16 17:05:41 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 16 17:05:41 2019"
      },
      "message": "Add EquateErrors helper (#178)\n\nThe EquateErrors helper equates errors according to errors.Is.\r\nWe also declare a sentinel AnyError value that matches any\r\nnon-nil error value.\r\n\r\nThis adds a dependency on golang.org/x/xerrors so that we can\r\ncontinue to suppport go1.8, which is our current minimally\r\nsupported version of Go.\r\n\r\nFixes #89"
    },
    {
      "commit": "3838af334ff48ab62a68998c9a4ee9d847017617",
      "tree": "6130153edce3c2f881f49f1c3353d5c83e365a3a",
      "parents": [
        "e1f03df4dcb7b99f29424fd98901b73dc1102937"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Dec 16 16:58:15 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 16 16:58:15 2019"
      },
      "message": "Adjust style of EquateApproxTime (#177)\n\nAdjust coding style of EquateApproxTime to match EquateApprox."
    },
    {
      "commit": "e1f03df4dcb7b99f29424fd98901b73dc1102937",
      "tree": "8fa08cb4eb19be7af62a3bc9ae37452687f65ae8",
      "parents": [
        "776445f29feeb6041579ae3df3c5615aba0fa128"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Dec 16 16:56:48 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 16 16:56:48 2019"
      },
      "message": "Add Exporter option (#176)\n\nAdd an Exporter option that accepts a function to determine\r\nwhich struct types to permit access to unexported fields.\r\nTreat this as a first-class option and implement AllowUnexported\r\nin terms of the new Exporter option.\r\n\r\nThe new Exporter option:\r\n* Better matches the existing style of top-level options\r\nboth by name (e.g., Comparer, Transformer, and Reporter)\r\nand by API style (all accept a function).\r\n* Is more flexible as it enables users to functionally\r\nimplement AllowAllUnexported by simply doing:\r\n\tExporter(func(reflect.Type) bool { return true })\r\n\r\nFixes #40 "
    },
    {
      "commit": "776445f29feeb6041579ae3df3c5615aba0fa128",
      "tree": "d772b318ad2e89397c5ca00414bb3134e9583393",
      "parents": [
        "481baca67f935f7af3911c083738e47e583d4be5"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Nov 05 00:03:44 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 05 00:03:44 2019"
      },
      "message": "Print type name in unexported panic (#171)\n\nIn the panic message when accessing an unexported field,\r\nprint the full name of the type for user convenience."
    },
    {
      "commit": "481baca67f935f7af3911c083738e47e583d4be5",
      "tree": "6dc5594339ebc421d5b29e03458bb75becebdc11",
      "parents": [
        "b1c9c4891a6525d98001fea424c8926c6d77bb56"
      ],
      "author": {
        "name": "Brad Fitzpatrick",
        "email": "brad@danga.com",
        "time": "Mon Oct 28 17:26:31 2019"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Oct 28 17:26:31 2019"
      },
      "message": "Make retrieveUnexportedField pass Go 1.14\u0027s checkptr validation (#169)\n\nFixes #167"
    },
    {
      "commit": "b1c9c4891a6525d98001fea424c8926c6d77bb56",
      "tree": "916d9bb570740fd541c0a918a4bd40af1b0094d9",
      "parents": [
        "2d0692c2e9617365a95b295612ac0d4415ba4627"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "rogpeppe@gmail.com",
        "time": "Thu Aug 29 22:54:27 2019"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Aug 29 22:54:27 2019"
      },
      "message": "cmpopts: add EquateApproxTime (#158)\n\n"
    },
    {
      "commit": "2d0692c2e9617365a95b295612ac0d4415ba4627",
      "tree": "9bd3b4696752c835f0fd24c9b54ecf8207feff90",
      "parents": [
        "208900aad7b7057a89131f7e63836689b675a042"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Aug 05 20:51:40 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 20:51:40 2019"
      },
      "message": "cmp/internal/value: fix handling of negative zero for floats (#152)\n\n* Fix IsZero to properly report false for IsZero(-0.0) since\r\nwe define IsZero as whether it is equal to the zero memory value.\r\n* Add note to isLess that we don\u0027t need to handle -0.0 since\r\nwe can\u0027t possibly have both keys present in the same map.\r\n* Use sort.SliceStable in SortedKeys for deterministic output since\r\nit is possible to have both -0.0 and +0.0 from two different maps.\r\nThe zero key from the left left map will be taken over the right map."
    },
    {
      "commit": "208900aad7b7057a89131f7e63836689b675a042",
      "tree": "6ec4e2d59e75ea2fac970cd1a15f747071ab2b2e",
      "parents": [
        "6d8cafd2f64fe3cd66b7530d95df066b00bdd777"
      ],
      "author": {
        "name": "Christian Muehlhaeuser",
        "email": "muesli@gmail.com",
        "time": "Mon Aug 05 16:16:46 2019"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Aug 05 16:16:46 2019"
      },
      "message": "Fix updating of maxLineLen (#147)\n\nPreviously, the line pointlessly updated the lastLineIdx variable\r\nsince the subsequent line always assigned to it.\r\nChange it to update maxLineLen, which was the original intention. "
    },
    {
      "commit": "6d8cafd2f64fe3cd66b7530d95df066b00bdd777",
      "tree": "6f4fc42ed92094d521d9a962b2e23b60dd5dab14",
      "parents": [
        "00cb0dc383d0b3bc6ef9b8be55dc8c11f7d2f20a"
      ],
      "author": {
        "name": "Christian Muehlhaeuser",
        "email": "muesli@gmail.com",
        "time": "Thu Aug 01 21:37:55 2019"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Aug 01 21:37:55 2019"
      },
      "message": "Simplify code (#149)\n\n- No need to wrap ToUpper \u0026 Fields\r\n- Simpler concatenation\r\n- Easier pointer access"
    },
    {
      "commit": "00cb0dc383d0b3bc6ef9b8be55dc8c11f7d2f20a",
      "tree": "10b26a82d98eda2a2a4f64a222bd69463b8812cb",
      "parents": [
        "1b316004397f1f336546ca058ddb5b95c41a8772"
      ],
      "author": {
        "name": "Christian Muehlhaeuser",
        "email": "muesli@gmail.com",
        "time": "Thu Aug 01 21:29:06 2019"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Aug 01 21:29:06 2019"
      },
      "message": "Fixed typo in formatDiffList (#148)\n\nI assume this is a typo, as the left and right side of the boolean-or were\r\nidentical."
    },
    {
      "commit": "1b316004397f1f336546ca058ddb5b95c41a8772",
      "tree": "a04035d8e4a4098d19a5893a7bca072054ed7030",
      "parents": [
        "917e382dab80060fd1f094402bfbb5137ec3c4ff"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jun 06 18:30:24 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 06 18:30:24 2019"
      },
      "message": "Document the reason for output instability (#145)\n\n"
    },
    {
      "commit": "917e382dab80060fd1f094402bfbb5137ec3c4ff",
      "tree": "a59eb016822aaae5ce56470024341019ee656af0",
      "parents": [
        "6f77996f0c42f7b84e5a2b252227263f93432e9b"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "crawshaw@golang.org",
        "time": "Mon May 27 16:30:12 2019"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon May 27 16:30:12 2019"
      },
      "message": "Invoke String when formatting map keys (#142)\n\nThis reverts a change introduced in commit 2940eda701 where cmp \r\nstopped calling the String method when printing map keys.\r\n\r\nFixes #141"
    },
    {
      "commit": "6f77996f0c42f7b84e5a2b252227263f93432e9b",
      "tree": "f48083e4441213aac72f1980ecea446ae618d515",
      "parents": [
        "b5cce8991b5672867358e36b3821ab1f778c1871"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Mar 12 03:24:27 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 12 03:24:27 2019"
      },
      "message": "Improve clarity of compareAny (#132)\n\n"
    },
    {
      "commit": "b5cce8991b5672867358e36b3821ab1f778c1871",
      "tree": "8b8468de9b36b4b2cd1001a536594b6ee0a71d9e",
      "parents": [
        "49488b41f63c15271003a50efdc3ddd17171911c"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Mar 12 03:15:12 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 12 03:15:12 2019"
      },
      "message": "Implement specialized diffing for slices (#131)\n\nLists of primitives are a common-enough data structure that\r\nit is worth providing specialized diffing for.\r\n\r\nThis provides significantly better readability for strings\r\nand byte slices. There is also a heuristic for detecting\r\nwhat a string should be diffed as a multiline string."
    },
    {
      "commit": "49488b41f63c15271003a50efdc3ddd17171911c",
      "tree": "b535dad1a74657e2f38af13d73226439ed08e1f9",
      "parents": [
        "0376dcf9bae3ad0cad70a17edc2a21e0afd667e7"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Mar 12 01:19:40 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 12 01:19:40 2019"
      },
      "message": "Use concrete types for path steps (#129)\n\nRather than representing each path step as an interface,\r\nuse concrete types instead. This provides some performance benefits as\r\nit reduces the amount of virtual function calls and also provides the\r\nability for the compiler to inline method calls.\r\n\r\nThis is technically a breaking change, but since each of the path step\r\ninterfaces were explicitly implemented in such a way that they couldn\u0027t\r\nbe implemented directly (due to the presence of an unexported method),\r\nthe only way someone could have been depending on these as interfaces is\r\nif they embedded the interface into another interface. Static analysis of\r\nall code at Google and publicly available on GitHub shows that this is\r\nnot a problem.\r\n\r\nThe performance benefits of this change is significant:\r\n\r\nbenchmark                               old ns/op     new ns/op     delta\r\nBenchmarkBytes/64KiB/EqualFilter0-4     80551394      46592605      -42.16%\r\nBenchmarkBytes/64KiB/EqualFilter1-4     102922132     69974509      -32.01%\r\nBenchmarkBytes/64KiB/EqualFilter2-4     159009935     94474812      -40.59%\r\nBenchmarkBytes/64KiB/EqualFilter3-4     181231264     124601102     -31.25%\r\nBenchmarkBytes/64KiB/EqualFilter4-4     189775228     148864070     -21.56%\r\nBenchmarkBytes/64KiB/EqualFilter5-4     285065469     175198907     -38.54%\r\n\r\nbenchmark                               old MB/s     new MB/s     speedup\r\nBenchmarkBytes/64KiB/EqualFilter0-4     1.63         2.81         1.72x\r\nBenchmarkBytes/64KiB/EqualFilter1-4     1.27         1.87         1.47x\r\nBenchmarkBytes/64KiB/EqualFilter2-4     0.82         1.39         1.70x\r\nBenchmarkBytes/64KiB/EqualFilter3-4     0.72         1.05         1.46x\r\nBenchmarkBytes/64KiB/EqualFilter4-4     0.69         0.88         1.28x\r\nBenchmarkBytes/64KiB/EqualFilter5-4     0.46         0.75         1.63x\r\n\r\nbenchmark                               old allocs     new allocs     delta\r\nBenchmarkBytes/64KiB/EqualFilter0-4     133            134            +0.75%\r\nBenchmarkBytes/64KiB/EqualFilter1-4     134            134            +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter2-4     135            135            +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter3-4     135            135            +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter4-4     136            136            +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter5-4     136            136            +0.00%\r\n\r\nbenchmark                               old bytes     new bytes     delta\r\nBenchmarkBytes/64KiB/EqualFilter0-4     6632417       6632523       +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter1-4     6632416       6632464       +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter2-4     6632464       6632507       +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter3-4     6632502       6632483       -0.00%\r\nBenchmarkBytes/64KiB/EqualFilter4-4     6632652       6632668       +0.00%\r\nBenchmarkBytes/64KiB/EqualFilter5-4     6632604       6632659       +0.00%"
    },
    {
      "commit": "0376dcf9bae3ad0cad70a17edc2a21e0afd667e7",
      "tree": "42056bbe1b9162bcaf9827a0c51ec59895483287",
      "parents": [
        "3177a94b4e99d833e6c0d9f864faeb482f8a7f6d"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Mar 12 01:15:13 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 12 01:15:13 2019"
      },
      "message": "Add IgnoreSliceElements and IgnoreMapEntries helpers (#126)\n\nThese helper options ignore slice elements or map entries based\r\non a user-provided predicate function. These are especially useful\r\nfor ignoring missing elements or entries."
    },
    {
      "commit": "3177a94b4e99d833e6c0d9f864faeb482f8a7f6d",
      "tree": "6ee4458d84d5f5724989dc9b65ec646909418cb8",
      "parents": [
        "2940eda701e08ed0bd3cda4a6c69efb50af6db51"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Mar 12 01:07:37 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 12 01:07:37 2019"
      },
      "message": "Export the Reporter API (#123)\n\nThe Reporter option allows users to hook in their own custom reporters\r\nto programatically interpret the diff structure.\r\n\r\nThe Reporter API uses a push/pop mechanism, which is strictly more powerful\r\nthan an API that only calls report on leaf nodes.\r\nThe Reporter.Report method takes in a Result type to provide flexibility in\r\nwhat properties can be reported in the future since new properties can be added,\r\nbut new methods cannot be easily added to the reporter interface."
    }
  ],
  "next": "2940eda701e08ed0bd3cda4a6c69efb50af6db51"
}
