)]}'
{
  "commit": "3d9ff4d736475bc74ed249c579b3ad7322e22b85",
  "tree": "7dee633b55a1d20362451ba878830d879b0f6a8c",
  "parents": [
    "79891cb90a4e5b2680308ba2b757a218b9aaa14c"
  ],
  "author": {
    "name": "Nguyễn Thái Ngọc Duy",
    "email": "pclouds@gmail.com",
    "time": "Sun Jun 12 17:53:57 2016 +0700"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Mon Jun 13 14:38:16 2016 -0700"
  },
  "message": "shallow.c: implement a generic shallow boundary finder based on rev-list\n\nInstead of a custom commit walker like get_shallow_commits(), this new\nfunction uses rev-list to mark NOT_SHALLOW to all reachable commits,\nexcept borders. The definition of reachable is to be defined by the\nprotocol later. This makes it more flexible to define shallow boundary.\n\nThe way we find border is paint all reachable commits NOT_SHALLOW.  Any\nof them that \"touches\" commits without NOT_SHALLOW flag are considered\nshallow (e.g. zero parents via grafting mechanism). Shallow commits and\ntheir true parents are all marked SHALLOW. Then NOT_SHALLOW is removed\nfrom shallow commits at the end.\n\nThere is an interesting observation. With a generic walker, we can\nproduce all kinds of shallow cutting. In the following graph, every\ncommit but \"x\" is reachable. \"b\" is a parent of \"a\".\n\n           x -- a -- o\n          /    /\n    x -- c -- b -- o\n\nAfter this function is run, \"a\" and \"c\" are both considered shallow\ncommits. After grafting occurs at the client side, what we see is\n\n                a -- o\n                    /\n         c -- b -- o\n\nNotice that because of grafting, \"a\" has zero parents, so \"b\" is no\nlonger a parent of \"a\".\n\nThis is unfortunate and may be solved in two ways. The first is change\nthe way shallow grafting works and keep \"a -- b\" connection if \"b\"\nexists and always ends at shallow commits (iow, no loose ends). This is\nhard to detect, or at least not cheap to do.\n\nThe second way is mark one \"x\" as shallow commit instead of \"a\" and\nproduce this graph at client side:\n\n           x -- a -- o\n               /    /\n         c -- b -- o\n\nMore commits, but simpler grafting rules.\n\nSigned-off-by: Nguyễn Thái Ngọc Duy \u003cpclouds@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5d58be0017a8eb26cd3f58c1e3b0b610f684beba",
      "old_mode": 33188,
      "old_path": "commit.h",
      "new_id": "b717be1eb1f06a12619feb5baee4f1d58766d5e3",
      "new_mode": 33188,
      "new_path": "commit.h"
    },
    {
      "type": "modify",
      "old_id": "60f1505d9791bc92a283d02183da35e7542ad2dc",
      "old_mode": 33188,
      "old_path": "shallow.c",
      "new_id": "40c2485d0d303c7249f13a1dcda0786579a6fc8d",
      "new_mode": 33188,
      "new_path": "shallow.c"
    }
  ]
}
