)]}'
{
  "commit": "12da1d1f6ffcd546a892a33302bb34fd37169022",
  "tree": "a70c5244b7b27d77c9c58d48a4e88215a956d731",
  "parents": [
    "c7edcae06ed90ec0567179a78d7d1170e610c042"
  ],
  "author": {
    "name": "Thomas Rast",
    "email": "trast@student.ethz.ch",
    "time": "Thu Mar 28 17:47:32 2013 +0100"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Thu Mar 28 10:29:22 2013 -0700"
  },
  "message": "Implement line-history search (git log -L)\n\nThis is a rewrite of much of Bo\u0027s work, mainly in an effort to split\nit into smaller, easier to understand routines.\n\nThe algorithm is built around the struct range_set, which encodes a\nseries of line ranges as intervals [a,b).  This is used in two\ncontexts:\n\n* A set of lines we are tracking (which will change as we dig through\n  history).\n* To encode diffs, as pairs of ranges.\n\nThe main routine is range_set_map_across_diff().  It processes the\ndiff between a commit C and some parent P.  It determines which diff\nhunks are relevant to the ranges tracked in C, and computes the new\nranges for P.\n\nThe algorithm is then simply to process history in topological order\nfrom newest to oldest, computing ranges and (partial) diffs.  At\nbranch points, we need to merge the ranges we are watching.  We will\nfind that many commits do not affect the chosen ranges, and mark them\nTREESAME (in addition to those already filtered by pathspec limiting).\nAnother pass of history simplification then gets rid of such commits.\n\nThis is wired as an extra filtering pass in the log machinery.  This\ncurrently only reduces code duplication, but should allow for other\nsimplifications and options to be used.\n\nFinally, we hook a diff printer into the output chain.  Ideally we\nwould wire directly into the diff logic, to optionally use features\nlike word diff.  However, that will require some major reworking of\nthe diff chain, so we completely replace the output with our own diff\nfor now.\n\nAs this was a GSoC project, and has quite some history by now, many\npeople have helped.  In no particular order, thanks go to\n\n  Jakub Narebski \u003cjnareb@gmail.com\u003e\n  Jens Lehmann \u003cJens.Lehmann@web.de\u003e\n  Jonathan Nieder \u003cjrnieder@gmail.com\u003e\n  Junio C Hamano \u003cgitster@pobox.com\u003e\n  Ramsay Jones \u003cramsay@ramsay1.demon.co.uk\u003e\n  Will Palmer \u003cwmpalmer@gmail.com\u003e\n\nApologies to everyone I forgot.\n\nSigned-off-by: Bo Yang \u003cstruggleyb.nku@gmail.com\u003e\nSigned-off-by: Thomas Rast \u003ctrast@student.ethz.ch\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "69db5783cef46dedabd1169f962fbcc92a028e4e",
      "old_mode": 33188,
      "old_path": "Documentation/git-log.txt",
      "new_id": "8727c60ab36365c88040c17e7e487013bc5ac461",
      "new_mode": 33188,
      "new_path": "Documentation/git-log.txt"
    },
    {
      "type": "modify",
      "old_id": "89242f59294d72304dbd52a25ef0a9a3fc2421ed",
      "old_mode": 33188,
      "old_path": "Makefile",
      "new_id": "761c698a62c8d67a9820783e9b43893dffa357a0",
      "new_mode": 33188,
      "new_path": "Makefile"
    },
    {
      "type": "modify",
      "old_id": "8f0b2e84fef5d1b9c07ea8846c9fbc1318d8d51b",
      "old_mode": 33188,
      "old_path": "builtin/log.c",
      "new_id": "d584ff1a39209a656581b347f645c93fbaf26996",
      "new_mode": 33188,
      "new_path": "builtin/log.c"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "624423142ef99e4ad0a008b738c5978bb9521467",
      "new_mode": 33188,
      "new_path": "line-log.c"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9acd12361ad79186d1ce0bf2502e50f926cf4499",
      "new_mode": 33188,
      "new_path": "line-log.h"
    },
    {
      "type": "modify",
      "old_id": "5a226abdd02fb4553adf4bce47cde76bb72f83a5",
      "old_mode": 33188,
      "old_path": "line-range.c",
      "new_id": "7a7ca3c2bde9c7bf6b1ae29537b42389c11bd8e9",
      "new_mode": 33188,
      "new_path": "line-range.c"
    },
    {
      "type": "modify",
      "old_id": "830f25b501df5aa5960d1c654aa767335f7f506b",
      "old_mode": 33188,
      "old_path": "line-range.h",
      "new_id": "88aaf08b7f7f56f6ea7b1ed57490682e133874d6",
      "new_mode": 33188,
      "new_path": "line-range.h"
    },
    {
      "type": "modify",
      "old_id": "5dc45c4812bdfd0d7a6b71d529eaa37df8178186",
      "old_mode": 33188,
      "old_path": "log-tree.c",
      "new_id": "793d2c8e9963b22e8684a318d8cd854e0a324857",
      "new_mode": 33188,
      "new_path": "log-tree.c"
    },
    {
      "type": "modify",
      "old_id": "46319d52b491eb55077cc3fe13a4db0c85012d01",
      "old_mode": 33188,
      "old_path": "revision.c",
      "new_id": "3ad9d08c7fc02cd8d346715cb0a8b88fecfdbb36",
      "new_mode": 33188,
      "new_path": "revision.c"
    },
    {
      "type": "modify",
      "old_id": "640110d73efcc8a98d2109a328ced67e055ed5a3",
      "old_mode": 33188,
      "old_path": "revision.h",
      "new_id": "6b2870ca10d4b057453f39320ab7d67535b490cc",
      "new_mode": 33188,
      "new_path": "revision.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3d074b0e413a0cb5b3df58296385cfdfbefbcaf7",
      "new_mode": 33261,
      "new_path": "t/perf/p4211-line-log.sh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9f36f17384ca751bc6708fc62dc363bd4fcd73e3",
      "new_mode": 33261,
      "new_path": "t/t4211-line-log.sh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "91b405489892bd7f18525c5d82a28a7b6f1ffe00",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.beginning-of-file"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bd25bb2f591f0d0c9a06f70c3f0302e72f511bc8",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.end-of-file"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "78a8cf1afddb4595718bbc67b94e647fdb78dfc3",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.move-support-f"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a1f5bc49c879e427f132f86c98134d0564005709",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.simple-f"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "39ce39bebed75bbcebf423b3e5007c2b06d5971b",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.simple-main"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6109aa0dcee7599486ab83ff552986d3a738dc17",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.two-ranges"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1f7cd06941495a49d3bf4c177a25fdb27e6043a4",
      "new_mode": 33188,
      "new_path": "t/t4211/expect.vanishes-early"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c1597947402229ee388fd9ef1fd5f3a5b97fb88b",
      "new_mode": 33188,
      "new_path": "t/t4211/history.export"
    }
  ]
}
