)]}'
{
  "commit": "b3dfeebb92630c54db1e4f03dbcff0e05208c4c1",
  "tree": "c994a03fe0911554245be1e40f4f68c2764ae922",
  "parents": [
    "3e8e32c32ef8e49bcfd715837d51aca30925fdfe"
  ],
  "author": {
    "name": "Kevin Willford",
    "email": "kewillf@microsoft.com",
    "time": "Fri Jul 29 12:19:20 2016 -0400"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Thu Aug 11 14:39:16 2016 -0700"
  },
  "message": "rebase: avoid computing unnecessary patch IDs\n\nThe `rebase` family of Git commands avoid applying patches that were\nalready integrated upstream. They do that by using the revision walking\noption that computes the patch IDs of the two sides of the rebase\n(local-only patches vs upstream-only ones) and skipping those local\npatches whose patch ID matches one of the upstream ones.\n\nIn many cases, this causes unnecessary churn, as already the set of\npaths touched by a given commit would suffice to determine that an\nupstream patch has no local equivalent.\n\nThis hurts performance in particular when there are a lot of upstream\npatches, and/or large ones.\n\nTherefore, let\u0027s introduce the concept of a \"diff-header-only\" patch ID,\ncompare those first, and only evaluate the \"full\" patch ID lazily.\n\nPlease note that in contrast to the \"full\" patch IDs, those\n\"diff-header-only\" patch IDs are prone to collide with one another, as\nadjacent commits frequently touch the very same files. Hence we now\nhave to be careful to allow multiple hash entries with the same hash.\nWe accomplish that by using the hashmap_add() function that does not even\ntest for hash collisions.  This also allows us to evaluate the full patch ID\nlazily, i.e. only when we found commits with matching diff-header-only\npatch IDs.\n\nWe add a performance test that demonstrates ~1-6% improvement.  In\npractice this will depend on various factors such as how many upstream\nchanges and how big those changes are along with whether file system\ncaches are cold or warm.  As Git\u0027s test suite has no way of catching\nperformance regressions, we also add a regression test that verifies\nthat the full patch ID computation is skipped when the diff-header-only\ncomputation suffices.\n\nSigned-off-by: Kevin Willford \u003ckcwillford@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "099f4f7be92c6d4371dcc8cba1322351c6840439",
      "old_mode": 33188,
      "old_path": "builtin/log.c",
      "new_id": "e36457288a71035cbcdd8b57f5ef0145204be512",
      "new_mode": 33188,
      "new_path": "builtin/log.c"
    },
    {
      "type": "modify",
      "old_id": "69a14a3b50eeb62d4ec4561fe5395db12b06b366",
      "old_mode": 33188,
      "old_path": "patch-ids.c",
      "new_id": "082412aca66be6ce826034c5177e2f7f4b3bda58",
      "new_mode": 33188,
      "new_path": "patch-ids.c"
    },
    {
      "type": "modify",
      "old_id": "dea1ecda48ba7a43cc56e103eec61d8e12bedd10",
      "old_mode": 33188,
      "old_path": "patch-ids.h",
      "new_id": "0f34ea11eadffea14620ea2ad45d69894469aef7",
      "new_mode": 33188,
      "new_path": "patch-ids.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b3e7d525d277c339b4f9d821fb6d18dfb2aa2621",
      "new_mode": 33188,
      "new_path": "t/perf/p3400-rebase.sh"
    },
    {
      "type": "modify",
      "old_id": "28d4f6b259c1696435698cb3826c837c8eaf90e3",
      "old_mode": 33261,
      "old_path": "t/t6007-rev-list-cherry-pick-file.sh",
      "new_id": "1408b608eb030f0e6bcc3d531aad426da5f06b12",
      "new_mode": 33261,
      "new_path": "t/t6007-rev-list-cherry-pick-file.sh"
    }
  ]
}
