)]}'
{
  "commit": "cd2bdc5309461034e5cc58e1d3e87535ed9e093b",
  "tree": "96db666727aa12e1999e3be0ed2a844950d5997d",
  "parents": [
    "afcb536f288f28bb37acf11a5666a219b8f20200"
  ],
  "author": {
    "name": "Linus Torvalds",
    "email": "torvalds@osdl.org",
    "time": "Fri Apr 14 16:52:13 2006 -0700"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "junkio@cox.net",
    "time": "Fri Apr 14 21:56:55 2006 -0700"
  },
  "message": "Common option parsing for \"git log --diff\" and friends\n\nThis basically does a few things that are sadly somewhat interdependent,\nand nontrivial to split out\n\n - get rid of \"struct log_tree_opt\"\n\n   The fields in \"log_tree_opt\" are moved into \"struct rev_info\", and all\n   users of log_tree_opt are changed to use the rev_info struct instead.\n\n - add the parsing for the log_tree_opt arguments to \"setup_revision()\"\n\n - make setup_revision set a flag (revs-\u003ediff) if the diff-related\n   arguments were used. This allows \"git log\" to decide whether it wants\n   to show diffs or not.\n\n - make setup_revision() also initialize the diffopt part of rev_info\n   (which we had from before, but we just didn\u0027t initialize it)\n\n - make setup_revision() do all the \"finishing touches\" on it all (it will\n   do the proper flag combination logic, and call \"diff_setup_done()\")\n\nNow, that was the easy and straightforward part.\n\nThe slightly more involved part is that some of the programs that want to\nuse the new-and-improved rev_info parsing don\u0027t actually want _commits_,\nthey may want tree\u0027ish arguments instead. That meant that I had to change\nsetup_revision() to parse the arguments not into the \"revs-\u003ecommits\" list,\nbut into the \"revs-\u003epending_objects\" list.\n\nThen, when we do \"prepare_revision_walk()\", we walk that list, and create\nthe sorted commit list from there.\n\nThis actually cleaned some stuff up, but it\u0027s the less obvious part of the\npatch, and re-organized the \"revision.c\" logic somewhat. It actually paves\nthe way for splitting argument parsing _entirely_ out of \"revision.c\",\nsince now the argument parsing really is totally independent of the commit\nwalking: that didn\u0027t use to be true, since there was lots of overlap with\nget_commit_reference() handling etc, now the _only_ overlap is the shared\n(and trivial) \"add_pending_object()\" thing.\n\nHowever, I didn\u0027t do that file split, just because I wanted the diff\nitself to be smaller, and show the actual changes more clearly. If this\ngets accepted, I\u0027ll do further cleanups then - that includes the file\nsplit, but also using the new infrastructure to do a nicer \"git diff\" etc.\n\nEven in this form, it actually ends up removing more lines than it adds.\n\nIt\u0027s nice to note how simple and straightforward this makes the built-in\n\"git log\" command, even though it continues to support all the diff flags\ntoo. It doesn\u0027t get much simpler that this.\n\nI think this is worth merging soonish, because it does allow for future\ncleanup and even more sharing of code. However, it obviously touches\n\"revision.c\", which is subtle. I\u0027ve tested that it passes all the tests we\nhave, and it passes my \"looks sane\" detector, but somebody else should\nalso give it a good look-over.\n\n[jc: squashed the original and three \"oops this too\" updates, with\n another fix-up.]\n\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\nSigned-off-by: Junio C Hamano \u003cjunkio@cox.net\u003e\n\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2b79dd0a68c30343d74e3e82c056fef6a355e82e",
      "old_mode": 33188,
      "old_path": "diff-tree.c",
      "new_id": "54157e40dd8b2a3596f73284ffe0a1511f6c0952",
      "new_mode": 33188,
      "new_path": "diff-tree.c"
    },
    {
      "type": "modify",
      "old_id": "78ed403ed121a84c3efe3a57fa7c24486d724953",
      "old_mode": 33188,
      "old_path": "git.c",
      "new_id": "437e9b57d0918175bf1e6d9ce7d500ace1e892b2",
      "new_mode": 33188,
      "new_path": "git.c"
    },
    {
      "type": "modify",
      "old_id": "3d404824a172c34c7ce0224de3b355f6c97eb52f",
      "old_mode": 33188,
      "old_path": "log-tree.c",
      "new_id": "04a68e0f570dee3701c1879c4190473880aa540b",
      "new_mode": 33188,
      "new_path": "log-tree.c"
    },
    {
      "type": "modify",
      "old_id": "da166c6f2c7b3a0fae80fbe63c8cde38eb609054",
      "old_mode": 33188,
      "old_path": "log-tree.h",
      "new_id": "91a909be73130b8542ed9092e120084bb263105b",
      "new_mode": 33188,
      "new_path": "log-tree.h"
    },
    {
      "type": "modify",
      "old_id": "0505f3f455151ac2fafc7fe2df2e6fd147d20f08",
      "old_mode": 33188,
      "old_path": "revision.c",
      "new_id": "1d26e0d911a884ab20eea29f801b7fbf69b017eb",
      "new_mode": 33188,
      "new_path": "revision.c"
    },
    {
      "type": "modify",
      "old_id": "8970b57e3c7e2ca8d213258f1befb84ac06e3a13",
      "old_mode": 33188,
      "old_path": "revision.h",
      "new_id": "6eaa9048a93ec152346a335de8af604aafa0faf5",
      "new_mode": 33188,
      "new_path": "revision.h"
    }
  ]
}
