)]}'
{
  "commit": "3c2df345feb49c2db840d6fa73ae8141a9ce3ade",
  "tree": "fa8cd6ca3ecfb0010d55bb7985d20dd38aac4fbc",
  "parents": [
    "616db2d343b5e62a5c9e5b471709ec76b9ce800b"
  ],
  "author": {
    "name": "Martin Fick",
    "email": "martin.fick@linaro.org",
    "time": "Mon May 23 12:49:48 2022 -0600"
  },
  "committer": {
    "name": "Martin Fick",
    "email": "martin.fick@linaro.org",
    "time": "Wed Sep 07 14:40:12 2022 -0600"
  },
  "message": "Allow looping task definitions\n\nStop following subtasks when a duplicate task is found. Leave the\nduplicate task mostly empty, set its status to \"DUPLICATE\", add a task\nhint indicating the duplicate, ignore any pass/fail criteria and treat\nthese criteria as if they had not been defined. Make the new \"DUPLICATE\"\nstatus behave similarly to a \"PASS\" status so that it does not block its\nancestors. Since duplicate tasks have no subtasks, task loops are\nprevented from looping infinitely, all while making loops harmless and\nstill making it discoverable that a loop has been encountered and where.\n\nChange-Id: Id0bf27ce267e88e0213082adc089cf0754d139ff\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d01acf79f331128fa634907f6c2344cb11a12f80",
      "old_mode": 33188,
      "old_path": "gr-task-plugin/gr-task-plugin.js",
      "new_id": "8579c93854abf558104f967f578c19333194ee30",
      "new_mode": 33188,
      "new_path": "gr-task-plugin/gr-task-plugin.js"
    },
    {
      "type": "modify",
      "old_id": "41f87d2c4e34b29db9a0ed8c87c93cc625486af5",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java",
      "new_id": "c0ba9d7c5885e013dfcdc8ef21e5b888a1533dd3",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5dc7afd38c2884b0a7b0cb98dfc90709ef36d4ad",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskStatus.java"
    },
    {
      "type": "modify",
      "old_id": "5746c10b71ecd332b1ef04ab999fc5ae10b6293e",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java",
      "new_id": "d08a68ea2b50754ab28425e8a4f3e773ea4367ff",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java"
    },
    {
      "type": "modify",
      "old_id": "fa5e8344dc934499093eadefeebba1c8580c69f0",
      "old_mode": 33188,
      "old_path": "src/main/resources/Documentation/task.md",
      "new_id": "3f2166ee421e7e614221d591b4764f1907a2c8f9",
      "new_mode": 33188,
      "new_path": "src/main/resources/Documentation/task.md"
    },
    {
      "type": "modify",
      "old_id": "1aeb6492ec698a87366b6dfa0f33ca706f19fc49",
      "old_mode": 33188,
      "old_path": "src/main/resources/Documentation/test/preview.md",
      "new_id": "6aff577d05fa6e3044a1483b02a0182908828bff",
      "new_mode": 33188,
      "new_path": "src/main/resources/Documentation/test/preview.md"
    },
    {
      "type": "modify",
      "old_id": "e9cc8b66a9c453f159abee44a2aa88be9516214f",
      "old_mode": 33188,
      "old_path": "src/main/resources/Documentation/test/task_states.md",
      "new_id": "3b5d03431aec0d89604a39281e9c03f8a73cf14b",
      "new_mode": 33188,
      "new_path": "src/main/resources/Documentation/test/task_states.md"
    },
    {
      "type": "modify",
      "old_id": "1ff097a81e1833d4e6b0488bb1ddf419b4647279",
      "old_mode": 33261,
      "old_path": "test/strip_non_applicable.py",
      "new_id": "41c21faa0c0729cca632305641d08a5564fda6b3",
      "new_mode": 33261,
      "new_path": "test/strip_non_applicable.py"
    }
  ]
}
