)]}'
{
  "commit": "df8e472cc1bbd14a60d22b0b124f07046c6e1fa2",
  "tree": "4e6c3f6f155605b1b24e299ca4dd1ac1df5ed55a",
  "parents": [
    "ae989a61dad98debe9899823ca987305f8e8020d"
  ],
  "author": {
    "name": "Jeff King",
    "email": "peff@peff.net",
    "time": "Thu Jun 23 13:38:13 2016 -0400"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Thu Jun 23 11:32:51 2016 -0700"
  },
  "message": "color: refactor parse_attr\n\nThe list of attributes we recognize is a bit unwieldy, as we\nactually have two arrays that must be kept in sync. Instead,\nlet\u0027s have a single array-of-struct to represent our\nmapping. That means we can never have an accident that\ncauses us to read off the end of an array, and it makes\ndiffs for adding new attributes much easier to read.\n\nThis also makes it easy to handle the \"no\" cases without\nhaving to repeat each attribute (this shortens the list,\nmaking it easier to read, but also also cuts the size of our\nlinear search in half). Technically this makes it impossible\nfor us to add an attribute that starts with \"no\" (we could\nconfuse \"nobody\" for the negation of \"body\"), but since this\nis a constrained set of attributes, that\u0027s OK.\n\nSince we can also store the length of each name in the\nstruct, that makes it easy for us to avoid reading past the\n\"len\" parameter given to us (though in practice it was not a\nbug, since all of our current callers are interested in a\nsubset of a NUL-terminated buffer, not a true undelimited\nrange of memory).\n\nSigned-off-by: Jeff King \u003cpeff@peff.net\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9027352ad7786746537adea9007bd46f46edbb4e",
      "old_mode": 33188,
      "old_path": "color.c",
      "new_id": "63e7b0c9a1db05aadeda8e920be06a9e3822dc46",
      "new_mode": 33188,
      "new_path": "color.c"
    }
  ]
}
