)]}'
{
  "commit": "a39045604761f94c40aa8fd7db170c237e8fd64e",
  "tree": "a82de7ea3e5518b3098b1ba38dec99f200531c8c",
  "parents": [
    "50f236aff861ab2a6851eb96cff6fe07b775bb5b"
  ],
  "author": {
    "name": "Shawn O. Pearce",
    "email": "spearce@spearce.org",
    "time": "Fri May 27 15:27:17 2011 -0700"
  },
  "committer": {
    "name": "Chris Aniszczyk",
    "email": "caniszczyk@gmail.com",
    "time": "Tue May 31 14:09:30 2011 -0500"
  },
  "message": "blame: Compute the origin of lines in a result file\n\nBlameGenerator digs through history and discovers the origin of each\nline of some result file.  BlameResult consumes the stream of regions\ncreated by the generator and lays them out in a table for applications\nto display alongside of source lines.\n\nApplications may optionally push in the working tree copy of a file\nusing the push(String, byte[]) method, allowing the application to\nreceive accurate line annotations for the working tree version.  Lines\nthat are uncommitted (difference between HEAD and working tree) will\nshow up with the description given by the application as the author,\nor \"Not Committed Yet\" as a default string.\n\nApplications may also run the BlameGenerator in reverse mode using the\nreverse(AnyObjectId, AnyObjectId) method instead of push().  When\nrunning in the reverse mode the generator annotates lines by the\ncommit they are removed in, rather than the commit they were added in.\nThis allows a user to discover where a line disappeared from when they\nare looking at an older revision in the repository.  For example:\n\n  blame --reverse 16e810b2..master -L 1080, org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java\n           (                                              1080)   }\n  2302a6d3 (Christian Halstrick 2011-05-20 11:18:20 +0200 1081)\n  2302a6d3 (Christian Halstrick 2011-05-20 11:18:20 +0200 1082)   /**\n  2302a6d3 (Christian Halstrick 2011-05-20 11:18:20 +0200 1083)    * Kick the timestamp of a local file.\n\nAbove we learn that line 1080 (a closing curly brace of the prior\nmethod) still exists in branch master, but the Javadoc comment below\nit has been removed by Christian Halstrick on May 20th as part of\ncommit 2302a6d3.  This result differs considerably from that of C\nGit\u0027s blame --reverse feature.  JGit tells the reader which commit\nperformed the delete, while C Git tells the reader the last commit\nthat still contained the line, leaving it an exercise to the reader\nto discover the descendant that performed the removal.\n\nThis is still only a basic implementation.  Quite notably it is\nmissing support for the smart block copy/move detection that the C\nimplementation of `git blame` is well known for.  Despite being\nincremental, the BlameGenerator can only be run once.  After the\ngenerator runs it cannot be reused.  A better implementation would\nsupport applications browsing through history efficiently.\n\nIn regards to CQ 5110, only a little of the original code survives.\n\nCQ: 5110\nBug: 306161\nChange-Id: I84b8ea4838bb7d25f4fcdd540547884704661b8f\nSigned-off-by: Kevin Sawicki \u003ckevin@github.com\u003e\nSigned-off-by: Shawn O. Pearce \u003cspearce@spearce.org\u003e\nSigned-off-by: Chris Aniszczyk \u003ccaniszczyk@gmail.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8ec0b6582fdd8d75eeeb15b8a03e9e96ce1440bf",
      "old_mode": 33188,
      "old_path": "org.eclipse.jgit.test/META-INF/MANIFEST.MF",
      "new_id": "b1736472ee70267a23a195930aec1422a987a68f",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit.test/META-INF/MANIFEST.MF"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1f67807e46e5ff5585e7306f50a2273724784bac",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BlameCommandTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "657cf387080641551a7c1952d8f53cdb2fcf64a8",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit.test/tst/org/eclipse/jgit/api/blame/BlameGeneratorTest.java"
    },
    {
      "type": "modify",
      "old_id": "e2d1a1e0abee100bcaf33a887dd2d0a583bc6465",
      "old_mode": 33188,
      "old_path": "org.eclipse.jgit/META-INF/MANIFEST.MF",
      "new_id": "0788b8c621d5583e6092476a6ddeb8eb37004da9",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/META-INF/MANIFEST.MF"
    },
    {
      "type": "modify",
      "old_id": "8eab4122c630aee4c61c012f4e8da966b127a975",
      "old_mode": 33188,
      "old_path": "org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties",
      "new_id": "5a40edd7dc019dd13ae0daecb37f3644fec15d2d",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties"
    },
    {
      "type": "modify",
      "old_id": "366028a2a7be0644b699881a95ecfd7c3ee9481b",
      "old_mode": 33188,
      "old_path": "org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java",
      "new_id": "02538a2dce26f6c65bcdcb42ea9ca13b70c466aa",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "400d94bc88a8d1e01cb866e29750fe962766922a",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java"
    },
    {
      "type": "modify",
      "old_id": "682455077fdaed7d223ee30d9328b8b94f0e7389",
      "old_mode": 33188,
      "old_path": "org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java",
      "new_id": "4d81e86ef68793025f202020de92326e121c3b9e",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3b8e41eb16321e172e742b9477814ba180155330",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d7a958feeb49cdd9a77380593d511122302ee004",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5f20ce957777d0d83b24efc3a930d3a265e8e1fd",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9ea346b89480e6fb860f9807dec2146531404b8b",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5b59804cf11149e9dffef78169913c304212cdbd",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java"
    }
  ]
}
