)]}'
{
  "log": [
    {
      "commit": "97aa668b73e764ccdd786bc3ccd2edffe621150e",
      "tree": "9f6aec139b312c5c24dbf3ecf2fd414b237caff4",
      "parents": [
        "97a1ff3c48253a51c601f6e4420181273b6ca0ea"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jan 03 13:20:46 2018 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 03 13:20:46 2018 -0800"
      },
      "message": "Report with primitive types in diffs (#65)\n\nWhen the formatted strings are identical, the reporter tries to fallback\r\non more exact formatting. This fallback should include the types for\r\nprimitive types since the difference can simply be between\r\nan int and an uint.\r\n\r\nFixes #64"
    },
    {
      "commit": "97a1ff3c48253a51c601f6e4420181273b6ca0ea",
      "tree": "dc0263f3d3719d54ccfe8706f8bac47636f4d7da",
      "parents": [
        "ab3beb0f1673c5cab43e36db4ea73c2613100e69"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Dec 21 13:57:58 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 21 13:57:58 2017 -0800"
      },
      "message": "Document that Equal is called even if x or y is nil (#63)\n\n"
    },
    {
      "commit": "ab3beb0f1673c5cab43e36db4ea73c2613100e69",
      "tree": "a92c01631f81d8af91f7c88dfba87f390087b449",
      "parents": [
        "2809dbc3d6ef202ae00b52b8f2a982862a993f36"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Dec 15 11:45:42 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 15 11:45:42 2017 -0800"
      },
      "message": "Adjust Travis CI script (#60)\n\nRather than running gofmt for every version, leading to version skew\r\nwhen what gofmt considers \"correct\" differs between versions,\r\nonly use one specific version of gofmt.\r\n\r\nAlso, remove the \"-s\" flag from gofmt because it is not backwards compatible.\r\nSuppose Go1.11 allowed for elliding types on struct literals and the \"-s\"\r\nflag strips them, then this would be problematic because it would not compile\r\non Go1.10 and earlier.\r\n\r\nAlso, fix the code so that vet is happy. I am not sure why these checks\r\nwere not triggered before. There seems to be a bug in the caching of\r\n$GOPATH/pkg files. This may be fixed in Go1.10 by the new caching logic.\r\nRunning \"go install\" before running go vet fixes the issue.\r\n\r\nIn other words, the only check we perform for differing versions\r\nis that the tests pass (and implicitly that it builds)."
    },
    {
      "commit": "2809dbc3d6ef202ae00b52b8f2a982862a993f36",
      "tree": "3210259d4fb73b604f3cb5d2ac455b2d3a7a00d4",
      "parents": [
        "2c05626a068f070bd125e5fde5c4eb2acc2539f0"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Dec 14 12:46:35 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 14 12:46:35 2017 -0800"
      },
      "message": "Add Transform.Option helper method (#59)\n\nCurrently there is no easy way to create non-reentrant transformers\r\nwhere they do not recursively apply on their own output.\r\nYou could check for the Transformer name, but the API does not\r\nrequire the names to be unique.\r\n\r\nThe only way to write a helper to do this is to generate some obscure\r\nname that is guaranteed to probabilistic never have a conflict.\r\n\r\nA better approach is to simply return the original Option\r\nas returned by the Transformer constructor.\r\nThus, users can rely on \u003d\u003d to check if a Transform step exactly\r\nmatches a Transformer that they created.\r\n\r\nIt would be useful to a non-reentrant transformer to cmpopts,\r\nbut that can be a future addition. It will also need a better name."
    },
    {
      "commit": "2c05626a068f070bd125e5fde5c4eb2acc2539f0",
      "tree": "46e2fafa32475691e20d0932768e357a319ddf91",
      "parents": [
        "88141e92e9c23e2170e43f88e712138d8009ca76"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Dec 07 22:07:52 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 07 22:07:52 2017 -0800"
      },
      "message": "Fix trivial spelling mistake (#57)\n\n"
    },
    {
      "commit": "88141e92e9c23e2170e43f88e712138d8009ca76",
      "tree": "66908bc2bb143471f96f394cea7ebdbe882f8a91",
      "parents": [
        "009f2cac29b1dc31fdbfa56a4c4183c49808c315"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Dec 01 23:55:51 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 01 23:55:51 2017 -0800"
      },
      "message": "Add Path.Index helper method (#56)\n\nAn analysis of user code shows that Path.Last was not sufficient and\r\nthat what users really wanted was an easy want to do negative indexing\r\nwithout needing to constantly check for out-of-bounds.\r\n\r\nThus, add a generic Index method that does not panic on out-of-bounds\r\naccesses and supports negative indexing."
    },
    {
      "commit": "009f2cac29b1dc31fdbfa56a4c4183c49808c315",
      "tree": "0133a1f8a4aa30680a3815c54e6712f3f7fb7c86",
      "parents": [
        "3f298f31d5756f2fe00ddfbeda978125ad24862e",
        "2cfd585f7b0d542f04e00d763eadd64dfe6abd3e"
      ],
      "author": {
        "name": "Damien Neil",
        "email": "neild@users.noreply.github.com",
        "time": "Wed Nov 29 17:10:19 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 29 17:10:19 2017 -0800"
      },
      "message": "Merge pull request #55 from google/apply-bool\n\nRemove useless return value from applicableOption.apply"
    },
    {
      "commit": "2cfd585f7b0d542f04e00d763eadd64dfe6abd3e",
      "tree": "0133a1f8a4aa30680a3815c54e6712f3f7fb7c86",
      "parents": [
        "3f298f31d5756f2fe00ddfbeda978125ad24862e"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Nov 29 14:34:42 2017 -0800"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Nov 29 14:34:42 2017 -0800"
      },
      "message": "Remove useless return value from apply\n\nFor all implementations of apply, it either returns true or panics.\nThus, the bool return value is a useless piece of information.\nSimplify the interface by removing the return value.\n"
    },
    {
      "commit": "3f298f31d5756f2fe00ddfbeda978125ad24862e",
      "tree": "c9e5f2fb471a1d041a41a8ca5082f1198ed03159",
      "parents": [
        "98232909528519e571b2e69fbe546b6ef35f5780"
      ],
      "author": {
        "name": "ferhat elmas",
        "email": "elmas.ferhat@gmail.com",
        "time": "Fri Nov 24 01:01:45 2017 +0100"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Nov 23 18:01:45 2017 -0600"
      },
      "message": "Fix some typos in comments and readme (#54)\n\n"
    },
    {
      "commit": "98232909528519e571b2e69fbe546b6ef35f5780",
      "tree": "abc0f2a35e00da407a01d9c11439c3e040b80a32",
      "parents": [
        "7ffe1921f7d789634416694ae7145ebbc1ac82b2"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Nov 03 08:45:06 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 03 08:45:06 2017 -0700"
      },
      "message": "Add implicit filter to Transformers (#29)\n\nDeclaring a transformer \"func(T) T\" where T is a concrete type\r\nis a common transformation. However, this is currently problematic\r\nas the transformation now infinitely applies to itself recursively.\r\n\r\nIn order to allow this form of transformation, add a simple\r\n(but subtle) filter to Transformers where a Transformer can only\r\napply if that specific Transformer does not already exist within\r\nthe tail of the current Path since the last non-Transform step.\r\n\r\nThis rule does not prevent more advance usages of Transformers\r\nwhere the user *does* want the Transformer to apply recursively\r\nto previously transformed output, since those situations are\r\nalmost always followed by some path step that is *not* a\r\ntransformation (e.g., pointer indirect, slice indexing, etc)."
    },
    {
      "commit": "7ffe1921f7d789634416694ae7145ebbc1ac82b2",
      "tree": "22c94e3f209a07e03db4ca025b0fa0a5b5f19739",
      "parents": [
        "47d4c626df54478a76c53288bbb8c4be1ddbfa10"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Oct 05 12:31:44 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 05 12:31:44 2017 -0700"
      },
      "message": "Explicitly convert assignable nil interface values (#49)\n\nThe reflect package has a bug (golang/go#22143).\r\nLet R and T both be interface types and R be assignable to T.\r\nLet F be a function that takes T as its argument.\r\n\r\nThe Go language lets you directly call F with a nil T or a nil R\r\n(since R is assignable to T) without any special handling.\r\n\r\nCurrently, reflect allows you to call F with a nil T,\r\nbut panics when calling F with a nil R. To avoid this panic,\r\nwe explicitly check for the condition where a value:\r\n\t* is an interface type\r\n\t* is nil\r\n\t* is not exactly same as type T\r\nand re-create the value as a nil interface of type T."
    },
    {
      "commit": "47d4c626df54478a76c53288bbb8c4be1ddbfa10",
      "tree": "232cf1a29b8045d04c8fc4e25b523a9f3c563086",
      "parents": [
        "8ebdfab36c66d309e67b7799ac97db4e93f59358"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Oct 03 13:16:56 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 03 13:16:56 2017 -0700"
      },
      "message": "Adjust heuristics for using raw literals (#48)\n\nRather than searching for escape sequences, a better measure of whether\r\nto use raw literals or not is whether the raw literal form is shorter\r\nthan the quoted string encoding.\r\nThe assumption is that shorter string length is more readable,\r\nwhich is a reasonable (except for non-printable characters)."
    },
    {
      "commit": "8ebdfab36c66d309e67b7799ac97db4e93f59358",
      "tree": "03c6c6e8b3d2549b5e7a202aa0fd77764298fdc3",
      "parents": [
        "576e243d08a51ea3d1d49ad1b8a6ec4fbf1881d8"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Oct 02 10:17:27 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 02 10:17:27 2017 -0700"
      },
      "message": "Fix reporter difference count (#47)\n\nThe defaultReporter.ndiffs field holds the total number of differences,\r\nwhile the diffs fields holds a truncated list of differences.\r\nThe subtraction math is backwards, resulting in a negative count."
    },
    {
      "commit": "576e243d08a51ea3d1d49ad1b8a6ec4fbf1881d8",
      "tree": "0fa6d416358ee6b97fb84db0a23f302dd0b8917d",
      "parents": [
        "e25c8746f136c5d3731dba1f807b1e50106b3b55"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Sep 28 16:31:28 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 28 16:31:28 2017 -0700"
      },
      "message": "Use raw literal for string formatting (#46)\n\nWhen formatting strings, avoid using strconv.Quote if the string looks\r\nlike it has already been escaped. Instead, use a raw string literal\r\nby wrapping the string with \u0027`\u0027 characters if possible.\r\nFor now, we still use strconv.Quote if the input string contains newlines\r\nto maintain the property that Format outputs a single line.\r\n\r\nAlso, prefix strings obtained by the Stringer.String method with a \u0027s\u0027.\r\nThis allows users to more easily distinguish when an output really is\r\nof type string or if the String method was used."
    },
    {
      "commit": "e25c8746f136c5d3731dba1f807b1e50106b3b55",
      "tree": "4da5833c5a97bb767e4adf2a9ecdd367cb2e5e7e",
      "parents": [
        "f46009a0a1e3526b07f548b2f80f73a4d2d32716"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Sep 28 10:41:56 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 28 10:41:56 2017 -0700"
      },
      "message": "Change diff.Difference to always return an edit-script (#45)\n\nRather than performing the heuristic for whether two slices are\r\n\"too different\" in the diff package, just return the full edit-script\r\nand move the heuristic logic into the cmp package.\r\n\r\nThe main adjustment to the heuristic is that we only print the\r\nfull slice if it is composed of a slice of primitive types (e.g., []byte)\r\nand the difference between the two slices is sufficiently great enough.\r\n\r\nFixes #44"
    },
    {
      "commit": "f46009a0a1e3526b07f548b2f80f73a4d2d32716",
      "tree": "0a8f94963202dc6dc9b51f61f81f9c3eb2fa9324",
      "parents": [
        "ef1ad5f71f8f469505d1c9853a7493042115dcfa"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Sep 27 13:40:59 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 27 13:40:59 2017 -0700"
      },
      "message": "Elide type assertions on unnamed types (#21)\n\nMany of the powerful uses of Transformers produces a significant amount of\r\ninterfaces to anonymous types. For example, a generic JSON unmarshaler\r\ncan unmarshal into a map[string]interface{} or []interface{}.\r\nHowever, the printing of these type assertions can be really noisy.\r\nThus, elide type assertions for these cases."
    },
    {
      "commit": "ef1ad5f71f8f469505d1c9853a7493042115dcfa",
      "tree": "7d9ebae0728a67282f3e59a3689581674787c83d",
      "parents": [
        "a10bc8f09647f956e30b99e8277b6c5f8ef08bc3"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Sep 27 13:40:29 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 27 13:40:29 2017 -0700"
      },
      "message": "Test unexported field access in format logic (#41)\n\nThe format logic should work even if the reflect.Value is in RO mode."
    },
    {
      "commit": "a10bc8f09647f956e30b99e8277b6c5f8ef08bc3",
      "tree": "4bd3dcbf679e0eb255c07e7aaa5c77531f65ceed",
      "parents": [
        "d5735f74713c51f7450a43d0a98d41ce2c1db3cb"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Sep 27 13:39:27 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 27 13:39:27 2017 -0700"
      },
      "message": "Add UID to BUG note (#42)\n\nThe go/doc package requires a UID to be present in order to detect\r\npackage level annotations.\r\n\r\nSee https://golang.org/pkg/go/doc#Note"
    },
    {
      "commit": "d5735f74713c51f7450a43d0a98d41ce2c1db3cb",
      "tree": "5b1039dcaf523333e2531450b30a4c6fada93679",
      "parents": [
        "8099a9787ce5dc5984ed879a3bda47dc730a8e97"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Sep 01 14:42:48 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 01 14:42:48 2017 -0700"
      },
      "message": "Fix panic in sort.go (#39)\n\nAvoid using reflect.Value.Interface to de-duplicate keys since\r\nsome keys may have source from an unexported field,\r\ncausing the logic to panic. Instead, just rely on the isLess function,\r\nwhich is already safe to use on unexported values.\r\n\r\nFixes #38"
    },
    {
      "commit": "8099a9787ce5dc5984ed879a3bda47dc730a8e97",
      "tree": "4eafcf2c12800217e0366ea1db1fd7e8aa918af1",
      "parents": [
        "3fe02156777c9eff14a88826cf3aa495b5db3544"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Aug 03 10:35:09 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 03 10:35:09 2017 -0700"
      },
      "message": "Refactor option evaluation logic (#32)\n\nThe previous implementation of options had a single \"option\" type\r\nthat was used to represent either an Ignore, Comparer, or Transformer\r\nand all of the filters relevant to each of them.\r\n\r\nWe refactor this logic by creating a new type to represent each of\r\nthe fundamental options and filtering options. Construction of\r\nfiltered options is now as simple as wrapping the input option with\r\nthe appropriate filter type.\r\n\r\nEvaluation of filters now takes a top-down two-step approach where\r\n1. We start with the set of all options, and recursively apply the filters\r\nto create the \"applicable\" set S.\r\n2. We apply the set S.\r\n\r\nBoth steps are represented as the filter and apply methods on\r\neach of the core options.\r\n\r\nThis approach has the following advantages:\r\n* It is faster because the same filter that was applied to multiple\r\noptions now only needs to execute once.\r\n* It more closely matches the documented algorithm in cmp.Equal.\r\n* It allows for easier extension of the API to add new fundamental\r\noption types."
    },
    {
      "commit": "3fe02156777c9eff14a88826cf3aa495b5db3544",
      "tree": "5ce399040f003cb90006678f98f9201d211ec56e",
      "parents": [
        "48a041be5648cc13e0c53082193ed105a0aa99e6"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Aug 02 16:32:40 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 02 16:32:40 2017 -0700"
      },
      "message": "Add cmp/internal/function package (#35)\n\nUnify the common logic for identifying the type of function.\r\nThis logic is helpful since Go lacks generics, so it is hard\r\nto query whether a function is of the signature: func(T, T) bool"
    },
    {
      "commit": "48a041be5648cc13e0c53082193ed105a0aa99e6",
      "tree": "226b3eff3114f017543c2aa31b34e748a9969365",
      "parents": [
        "a9cc2ea1d957ce7e952bfdc3efe805184ce85972"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Aug 02 14:30:49 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 02 14:30:49 2017 -0700"
      },
      "message": "Update README.md (#34)\n\n"
    },
    {
      "commit": "a9cc2ea1d957ce7e952bfdc3efe805184ce85972",
      "tree": "7a254c7922dfbc2e1fbcfdc874e96338063faab0",
      "parents": [
        "7645fb3632f8bb5df346d4b17594f48be227d336"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Aug 01 11:43:37 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 01 11:43:37 2017 -0700"
      },
      "message": "Check Value.CanInterface before trying to use fmt.Stringer (#33)\n\n"
    },
    {
      "commit": "7645fb3632f8bb5df346d4b17594f48be227d336",
      "tree": "5d57f8b6399a4a19330e5502a025c3697fcb854f",
      "parents": [
        "a4dcf7614330c5e788565a982c299491a8d8a550"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jul 31 14:50:41 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 31 14:50:41 2017 -0700"
      },
      "message": "Fix cmp tests (#31)\n\nA prior commit changes the tests to run in parallel, but due to shadowing\r\nbug, would only run the last test case. Fix this by creating an explicit\r\nscoping of the variable for each iteration of the loop.\r\n\r\nAlso perform other cleanups."
    },
    {
      "commit": "a4dcf7614330c5e788565a982c299491a8d8a550",
      "tree": "abf97ef6c6a68e34e223adf68835e96a2fff1517",
      "parents": [
        "f94e52cad91c65a63acc1e75d4be223ea22e99bc"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 28 16:36:36 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 28 16:36:36 2017 -0700"
      },
      "message": "Use an Options group instead of copying-append (#22)\n\nA copying-append runs in O(n) where n is the number of options.\r\nInstead, just create a new Options group, which is O(1).\r\n\r\nAlso switch the tests to run in parallel to increase chances of\r\ndetecting races."
    },
    {
      "commit": "f94e52cad91c65a63acc1e75d4be223ea22e99bc",
      "tree": "a6cb1d06858272398b9009329283b08bc9df48c5",
      "parents": [
        "bf7264101727b1948ee27dd768f7ad48c823bca1"
      ],
      "author": {
        "name": "mattdee123",
        "email": "mattdee123@gmail.com",
        "time": "Fri Jul 28 16:24:32 2017 -0400"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 28 13:24:32 2017 -0700"
      },
      "message": "Fix bug with nil fmt.Stringers (#30)\n\n"
    },
    {
      "commit": "bf7264101727b1948ee27dd768f7ad48c823bca1",
      "tree": "5ca9a663dd5cf048ab63f54699dcde288fcbfdee",
      "parents": [
        "d54e85569d47be6e6406055190a66430b6a905b7"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jul 25 14:07:32 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 25 14:07:32 2017 -0700"
      },
      "message": "Trivial documentation fixes for cmp/internal/value (#27)\n\n"
    },
    {
      "commit": "d54e85569d47be6e6406055190a66430b6a905b7",
      "tree": "913c812409efa1d92f133560f2fb5bf6b7499492",
      "parents": [
        "b8dbfba87748393ea3632df42dcc82302adf5cdf"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jul 25 13:30:04 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 25 13:30:04 2017 -0700"
      },
      "message": "Expand dynamic checks of options (#20)\n\nAdd checks for mutations of the input value and non-deterministic\r\ntransformer outputs.\r\n\r\nA prior approach (not shown in this commit) attempted to detect mutations of\r\nthe input by hashing the inputs before and after calling the option functions.\r\nHowever, we deemed this approach too restrictive since there are legitimate\r\ncases where some types lazily update their values upon first access\r\n(for example, accessing extensions on proto2 messages). This would cause the\r\nhashes to mismatch and provide a false-positive panic.\r\n\r\nIn this approach, we accept the reality that lazy evaluators exist, but make\r\nthe assumption that any lazy evaluators are protected by a mutex of some sort.\r\nThus, we simply run the option function twice in parallel, and let the race\r\ndetector detect mutations on the input. We intentionally run the options\r\nin a function named detectRaces to make it obvious from the stack trace\r\nwhat\u0027s going wrong.\r\n\r\nFor the detection of deterministic output of Transformers, we call a special\r\nversion of s.compareAny so that the outputs may be compared according to the\r\nsemantics of what the user provided. The specialized wrapper s.statelessCompare\r\npreserves the comparison state such as the current result and the reporter."
    },
    {
      "commit": "b8dbfba87748393ea3632df42dcc82302adf5cdf",
      "tree": "56b49353f2dcc1be5b1f9d6de3397c55f2d02a3d",
      "parents": [
        "a77394b709bf3eecbbd90fc51bd3d654af78f06b"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jul 25 12:35:49 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 25 12:35:49 2017 -0700"
      },
      "message": "Trivial style changes to cmp/internal/value tests (#25)\n\n"
    },
    {
      "commit": "a77394b709bf3eecbbd90fc51bd3d654af78f06b",
      "tree": "5aececba34ada8ef7b1f1a9f60650f5b3bcaac5c",
      "parents": [
        "18107e6c56edb2d51f965f7d68e59404f0daee54"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Sat Jul 22 16:17:45 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 22 16:17:45 2017 -0700"
      },
      "message": "Remove reporter TODO (#23)\n\nThe default reporter won\u0027t be adding context for equal values.\r\nInstead, we should work on the API for registering custom reporters."
    },
    {
      "commit": "18107e6c56edb2d51f965f7d68e59404f0daee54",
      "tree": "40c1cf2b0a678b8cc4ab021370f080fc5315ceb2",
      "parents": [
        "f9054c6a605e1bb9318d701929105b0fd8a7cac8"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 20 15:59:54 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 20 15:59:54 2017 -0700"
      },
      "message": "Move general reflect logic to internal/value (#15)\n\nThis internal package has the API:\r\n\tFormat(reflect.Value, useStringer bool) string\r\n\tSortKeys(vs []reflect.Value) []reflect.Value\r\n\r\nWhile moving Format and SortKeys, we also tweak the formatting logic\r\nto print the type on named primitive types."
    },
    {
      "commit": "f9054c6a605e1bb9318d701929105b0fd8a7cac8",
      "tree": "824f18b6cd3e3ae6a127757fef23a6ec0a5e4797",
      "parents": [
        "2b1da0b74500c33a0cd25f26b79594b46c816b6d"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 20 15:19:44 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 20 15:19:44 2017 -0700"
      },
      "message": "Add diffing abilities to reporting (#9)\n\nThis adds an internal package with the following API:\r\n    func Difference(nx, ny int, f EqualFunc) (eq bool, es EditScript)\r\n    type EditScript []EditType\r\n    type EditType int8\r\n        const Identity EditType \u003d iota ...\r\n    type EqualFunc func(ix int, iy int) Result\r\n    type Result struct{ ... }\r\n\r\nThe cmp.SliceIndex type has a new method SplitKeys to indicate that\r\nelements are being compared in x and y are in different indexes.\r\n\r\nThe debug visualizer can be run:\r\n\tgo test -tags\u003ddebug -v github.com/google/go-cmp/cmp/internal/diff\r\n\r\nReviewed-By: kevlar@google.com"
    },
    {
      "commit": "2b1da0b74500c33a0cd25f26b79594b46c816b6d",
      "tree": "9955f97bf8caaf894367d6fe415020c57867a6e3",
      "parents": [
        "79b2d888f100ec053545168aa94bcfb322e8bfc8"
      ],
      "author": {
        "name": "Kyle Lemons",
        "email": "kevlar@google.com",
        "time": "Thu Jul 20 14:44:45 2017 -0700"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 20 14:44:45 2017 -0700"
      },
      "message": "Add examples for Diff that show how to use it in tests\n"
    },
    {
      "commit": "79b2d888f100ec053545168aa94bcfb322e8bfc8",
      "tree": "3a54d9936deb2f930b975854559e757c719ca782",
      "parents": [
        "1a281611eb75d66e518c28179118a82d6a9f80f2"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 20 01:56:57 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 20 01:56:57 2017 -0700"
      },
      "message": "Clarify documentation regarding empty slices and maps (#19)\n\nState that a non-nil empty slice is not equal to a nil slice.\r\nSuggest use of cmpopts.EquateEmpty to handle this case.\r\n\r\nFixes #18"
    },
    {
      "commit": "1a281611eb75d66e518c28179118a82d6a9f80f2",
      "tree": "7f4154e82f7c74cf0e13e661145f8fcc986af02b",
      "parents": [
        "f299ad1c37e02b87f050c93c5d86af49a2850fc1"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Tue Jul 18 13:07:28 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 18 13:07:28 2017 -0700"
      },
      "message": "Document cmpopts.IgnoreUnexported and AllowUnexported together (#14)\n\n"
    },
    {
      "commit": "f299ad1c37e02b87f050c93c5d86af49a2850fc1",
      "tree": "e82586d11a5969e5a9e42a54d92519e8873dcaf8",
      "parents": [
        "7d2cf10c6ed3f74ff93df431dceba0babb528303"
      ],
      "author": {
        "name": "Dmitri Shuralyov",
        "email": "shurcooL@gmail.com",
        "time": "Mon Jul 17 23:48:07 2017 -0400"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jul 17 20:48:07 2017 -0700"
      },
      "message": "Travis: Run go vet; use race detector during tests (#16)\n\nThis change augments the Travis CI build to:\r\n* Include -s (simplify) flag when checking that all files follow gofmt style.\r\n* Check that go vet does not report any problems.\r\n* Use race detector when running tests, to help catch data races.\r\n* Include a fast-finish allowed failure build on master (tip). Due to a\r\nchance of false positives, failures on tip are not critical, but manually\r\nlooking over them can help spot issues either in this project, or in the\r\ntip version of Go.\r\n* Use the explicit include job feature of Travis CI to make the Go 1.6\r\nbuild only run tests, and not perform go vet, etc., checks, since they\r\nare already done on new versions and can cause unnecessary failures.\r\n\r\nReference: https://docs.travis-ci.com/user/customizing-the-build#Explicitly-Including-Jobs\r\n"
    },
    {
      "commit": "7d2cf10c6ed3f74ff93df431dceba0babb528303",
      "tree": "00e2ffa9666123c64f0d0bb9153c81078efa4b00",
      "parents": [
        "1537f48bfae70d8cad383352695fbafb68e7d303"
      ],
      "author": {
        "name": "Dmitri Shuralyov",
        "email": "shurcooL@gmail.com",
        "time": "Mon Jul 17 19:53:38 2017 -0400"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jul 17 16:53:38 2017 -0700"
      },
      "message": "Travis: Check for gofmt issues (#12)\n\nThe default test script is `go test -v ./...` according to Travis docs at\r\nhttps://docs.travis-ci.com/user/languages/go/#Default-Test-Script.\r\n\r\nAdd an additional gofmt check to help catch formatting issues in PRs.\r\nThis is motivated by a previous occurrence at https://github.com/google/go-cmp/pull/9#discussion_r127624347.\r\n\r\nAlso swap the order of Go versions 1.x and 1.6. 1.x is higher priority, so it\r\nmakes more sense to run it first and report issues right away. 1.6 is lower\r\npriority, so it\u0027s better to prioritize it lower.\r\n\r\nUse 2 space indent in the .yml file, which is consistent with the formatting\r\nin Travis documentation and examples."
    },
    {
      "commit": "1537f48bfae70d8cad383352695fbafb68e7d303",
      "tree": "ba11d6fcac7278c42913e99201bf1de9c3351476",
      "parents": [
        "e6ff442c1751c5257df71dd2a42b9bcbbd6f01a6"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Mon Jul 17 14:44:14 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 17 14:44:14 2017 -0700"
      },
      "message": "Remove duplicate LICENSE file (#11)\n\n"
    },
    {
      "commit": "e6ff442c1751c5257df71dd2a42b9bcbbd6f01a6",
      "tree": "e6f603665ac5cf8f91c76e44338c5843b7175f3b",
      "parents": [
        "e6ad8e8c6f4959eb2ffe240ab826c76b2fb855fd"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 14 17:49:13 2017 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 14 17:49:13 2017 -0600"
      },
      "message": "Add helpful suggestions to panic message (#10)\n\nUsers find it unhelpful to simply panic saying that unexported fields\r\ncannot be handled. Augment the panic message by pointing the user\r\nto functions that can be used to address the issue."
    },
    {
      "commit": "e6ad8e8c6f4959eb2ffe240ab826c76b2fb855fd",
      "tree": "f18ca2a7d0fd617da2ea0415372a1a673be367b6",
      "parents": [
        "d138b1d10e6659a13f00fe42bd26b8c8fe09f344"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 14 14:42:13 2017 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 14 14:42:13 2017 -0600"
      },
      "message": "Add cmpopts helper package (#8)\n\nThis adds the following API surface:\r\n\tfunc EquateApprox(fraction, margin float64) cmp.Option\r\n\tfunc EquateEmpty() cmp.Option\r\n\tfunc EquateNaNs() cmp.Option\r\n\tfunc IgnoreFields(typ interface{}, names ...string) cmp.Option\r\n\tfunc IgnoreInterfaces(ifaces interface{}) cmp.Option\r\n\tfunc IgnoreTypes(typs ...interface{}) cmp.Option\r\n\tfunc IgnoreUnexported(typs ...interface{}) cmp.Option\r\n\tfunc SortMaps(less interface{}) cmp.Option\r\n\tfunc SortSlices(less interface{}) cmp.Option\r\n\r\nReviewed-By: bcmills@google.com"
    },
    {
      "commit": "d138b1d10e6659a13f00fe42bd26b8c8fe09f344",
      "tree": "53d65e1ae927fd129c554b8599275c60e509a929",
      "parents": [
        "788cdcbba1690b498795e6c8f59c4b3c6be7264f"
      ],
      "author": {
        "name": "Fiisio",
        "email": "liangcszzu@163.com",
        "time": "Sat Jul 15 04:38:38 2017 +0800"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 14 14:38:38 2017 -0600"
      },
      "message": "Use fmt.Sprintf instead of manual string concatenation (#7)\n\n"
    },
    {
      "commit": "788cdcbba1690b498795e6c8f59c4b3c6be7264f",
      "tree": "9a4519bd6098164a1eb87e31bc00aea61404783e",
      "parents": [
        "cfe90e9d6ada42c159478b1fdc5562faf1ac6a60"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 13 14:45:21 2017 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 13 14:45:21 2017 -0600"
      },
      "message": "Add Last helper method (#6)\n\nIt is very common for FilterPath functions to operate on the last step\r\nin a path. However, it is a hindrance to continually write:\r\n    if len(p) \u003d\u003d 0 {\r\n        return false\r\n    }\r\n    return p[len(p)-1].Type() \u003d\u003d ...\r\n\r\nInstead, add a helper method Last that avoids the empty path check\r\nand the indexing to the last element.\r\nThis allows users to simply write:\r\n    return p.Last().Type() \u003d\u003d ...\r\n\r\nThis is more readable and writeable."
    },
    {
      "commit": "cfe90e9d6ada42c159478b1fdc5562faf1ac6a60",
      "tree": "c1b35cb3a597e097d943f315221fc5ade887aa31",
      "parents": [
        "d82a57591e220ab549b0901ee5c6ae024077fc64"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Thu Jul 13 14:36:16 2017 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 13 14:36:16 2017 -0600"
      },
      "message": "Remove warning about status of AllowUnexported (#5)\n\nAt this point, we will not be removing the AllowUnexported option\r\nas there are several use-cases that legitimately benefit from it.\r\nAlso, the current documentation does a good job of explaining\r\nwhat the proper use of it is. Thus, remove the warning as it is\r\nunhelpful and confusing to users.\r\n\r\nThe other (unlikely) alternative I can see in the future is to\r\nmake AllowUnexported the default behavior for all comparisons\r\neffectively making AllowUnexported a noop. That would be a\r\nbackwards compatible change."
    },
    {
      "commit": "d82a57591e220ab549b0901ee5c6ae024077fc64",
      "tree": "ededa2faf9247b96e35135d68e28397e39e8fb95",
      "parents": [
        "5c2f3415b05eca653272685cb8b1fdf4acfb6cd6"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Wed Jul 12 01:21:05 2017 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 12 01:21:05 2017 -0600"
      },
      "message": "Make lack of support for AllowUnexported more obvious (#4)\n\nRather than waiting until the unsafeRetrieveField helper\r\nfunction is actually called, panic at the moment someone tries\r\nto use AllowUnexported to make the failure more obvious."
    },
    {
      "commit": "5c2f3415b05eca653272685cb8b1fdf4acfb6cd6",
      "tree": "4f46f4a62342e6d9020a9410cb8e6df948f83ee5",
      "parents": [
        "df565aecfca1377a64c83df6fb3bc0b7bad9c6f4"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 07 16:30:14 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 07 16:30:14 2017 -0700"
      },
      "message": "Support versions of Go down to Go1.6 (#3)\n\nAvoid any features introduced in newer versions such as:\r\n* testing.T.Run\r\n* sort.Slice\r\n* sort.SliceStable\r\n* sort.IsSliceSorted\r\n\r\nFixes #2"
    },
    {
      "commit": "df565aecfca1377a64c83df6fb3bc0b7bad9c6f4",
      "tree": "9e69d6c0129ad3fee2f50ce28e2cf65b8b2e5102",
      "parents": [
        "1c57fff5373af756ecb7a9aa4860f55ad0782b36",
        "1701c5d26b629150a62d0659e69e59f661534f56"
      ],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 07 15:47:57 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 07 15:47:57 2017 -0700"
      },
      "message": "Merge pull request #1 from zombiezen/travis\n\n.travis.yml: add basic configuration"
    },
    {
      "commit": "1701c5d26b629150a62d0659e69e59f661534f56",
      "tree": "9e69d6c0129ad3fee2f50ce28e2cf65b8b2e5102",
      "parents": [
        "1c57fff5373af756ecb7a9aa4860f55ad0782b36"
      ],
      "author": {
        "name": "Ross Light",
        "email": "light@google.com",
        "time": "Fri Jul 07 15:25:58 2017 -0700"
      },
      "committer": {
        "name": "Ross Light",
        "email": "light@google.com",
        "time": "Fri Jul 07 15:32:24 2017 -0700"
      },
      "message": ".travis.yml: add basic configuration\n"
    },
    {
      "commit": "1c57fff5373af756ecb7a9aa4860f55ad0782b36",
      "tree": "7a855697c51590a5700f27302580c84e64946001",
      "parents": [],
      "author": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 07 12:35:59 2017 -0700"
      },
      "committer": {
        "name": "Joe Tsai",
        "email": "joetsai@digital-static.net",
        "time": "Fri Jul 07 12:35:59 2017 -0700"
      },
      "message": "Add package cmp for performing equality of Go values\n\nThe API of the package is as follows:\n    func Equal(x, y interface{}, opts ...Option) bool\n    func Diff(x, y interface{}, opts ...Option) string\n\n    type Option interface{ ... }\n        func Ignore() Option\n        func Comparer(f interface{}) Option\n        func Transformer(name string, f interface{}) Option\n\n        func FilterPath(f func(Path) bool, opt Option) Option\n        func FilterValues(f interface{}, opt Option) Option\n\n        func AllowUnexported(typs ...interface{}) Option\n    type Options []Option\n\n    type Path []PathStep\n    type PathStep interface{ ... }\n\n    type Indirect interface{ ... }\n    type StructField interface{ ... }\n    type MapIndex interface{ ... }\n    type SliceIndex interface{ ... }\n    type TypeAssertion interface{ ... }\n    type Transform interface{ ... }\n\nSee the package docs in compare.go for a high-level view of this package.\n"
    }
  ]
}
