)]}'
{
  "commit": "ec265e7778245ab4c1f4b889afacb36061390a47",
  "tree": "b0e62bb48e4ff30886fb41b122bb2acdd405083d",
  "parents": [
    "82ea18f340f977bc8f42e503043f4eb054a6d2e7"
  ],
  "author": {
    "name": "James Graham",
    "email": "james@hoppipolla.co.uk",
    "time": "Thu Sep 12 18:37:44 2019"
  },
  "committer": {
    "name": "James Graham",
    "email": "james@hoppipolla.co.uk",
    "time": "Thu Nov 21 23:04:40 2019"
  },
  "message": "Implement a decision task for taskcluster jobs\n\nA decision task is the first task run, and ensures that we only\nschedule subsequent tasks which are relevant to the current push or\npull request. This dynamic scheduling helps reduce load since we avoid\nspinning up workers for tasks that ultimately don\u0027t run, and unlocks\nnew possibilities since we are able to schedule tasks that are\ndependent on other tasks.\n\nThe tasks, their scheduling criteria and their dependnecies are\nspecified in a a YAML format configuration file in\ntools/ci/tc/tasks/test.yml. This has a bespoke format, adopting some\nideas from Azure and Gecko\u0027s taskcluster integration. The format is\ndocumented in `tools/ci/tc/README.md`. The data in that file undergoes\ntrandformations to produce a set of tasks, which are then filtered\naccording to the event that caused the decision task to run.\n\nTo initially prove out the implementation of dependent tasks we make\nthe Firefox tasks depend on a download task. But this does not yet\ninclude the work to actually make the dependent tasks download Firefox\nfrom the parent task.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "6bc9253ec2055645981206620ecdee3d1becb792",
      "old_mode": 33188,
      "old_path": ".taskcluster.yml",
      "new_id": "3813d47fdb2ffc1ce9966cdbca6d370625ed48fa",
      "new_mode": 33188,
      "new_path": ".taskcluster.yml"
    },
    {
      "type": "modify",
      "old_id": "841fd855c8056829afd347e3067e55804ca65139",
      "old_mode": 33188,
      "old_path": "tools/ci/commands.json",
      "new_id": "c9cd7c458989ec77bacd645cd5145351443ff73c",
      "new_mode": 33188,
      "new_path": "tools/ci/commands.json"
    },
    {
      "type": "modify",
      "old_id": "be7dbe082a1709493b62316d15668ea10ae93607",
      "old_mode": 33261,
      "old_path": "tools/ci/run_tc.py",
      "new_id": "da4e18ae8c6660f1507f2fe5efe43a82755c7d77",
      "new_mode": 33261,
      "new_path": "tools/ci/run_tc.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "11f367f986f97fdbfe40f09b2ae4114f263916f7",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/README.md"
    },
    {
      "type": "rename",
      "old_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "old_mode": 33188,
      "old_path": "tools/taskcluster/__init__.py",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/__init__.py",
      "score": 100
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f3ef34b557eafac68f85b68c5ce8c7f58f9c8015",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/decision.py"
    },
    {
      "type": "rename",
      "old_id": "256726da7b568f32115dfeaa6bc1407490c0d076",
      "old_mode": 33188,
      "old_path": "tools/ci/tcdownload.py",
      "new_id": "359ec33405048c134ddcfac7a564ea9a17ac1b14",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/download.py",
      "score": 99
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6a6cb497f2d406862d18bc214d36c1ea2ecd7c3e",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/taskgraph.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3a71ab3a0a1bebb9141f92b639acbc8ccf318c6a",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/tasks/test.yml"
    },
    {
      "type": "rename",
      "old_id": "8e79f7537349a79fd70746ab6e371897acc4d5e1",
      "old_mode": 33188,
      "old_path": "tools/taskcluster/testdata/master_push_event.json",
      "new_id": "8e79f7537349a79fd70746ab6e371897acc4d5e1",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/testdata/master_push_event.json",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "5acc1a6010291c88d26f8c12573aeeb9d0b33e97",
      "old_mode": 33188,
      "old_path": "tools/taskcluster/testdata/pr_event.json",
      "new_id": "5acc1a6010291c88d26f8c12573aeeb9d0b33e97",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/testdata/pr_event.json",
      "score": 100
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "425b5829edd360b145acebf249f4b1ac3f6d1396",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/tests/test_decision.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dd8535bb6470ff919251973b073d24489edfff8b",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/tests/test_taskgraph.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f51a633b537ff5a71daa8daed5569ac1b586db9a",
      "new_mode": 33188,
      "new_path": "tools/ci/tc/tests/test_valid.py"
    },
    {
      "type": "delete",
      "old_id": "a72dcfe5cfdd516528312488c0d731557fb85492",
      "old_mode": 33188,
      "old_path": "tools/ci/tests/test_run_tc.py",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "dcbd8961fc2efbb800565b927a3e5d9314d6aba6",
      "old_mode": 33188,
      "old_path": "tools/taskcluster/commands.json",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "b37e45ec74cfbccffee84319fc8b94512f170dca",
      "old_mode": 33188,
      "old_path": "tools/taskcluster/verify.py",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "7a5c1eb648a97aebc718912cb22492385c588439",
      "old_mode": 33188,
      "old_path": "tools/tox.ini",
      "new_id": "e8673db0a69ae4695e7b1fa152c533aa1b0f98d1",
      "new_mode": 33188,
      "new_path": "tools/tox.ini"
    },
    {
      "type": "modify",
      "old_id": "e7d57d8638c231f9c3c65e932bdc0209ba3cb021",
      "old_mode": 33188,
      "old_path": "tools/wpt/browser.py",
      "new_id": "a94d5509cc8ba1bfcc4cbceafd9f511a4f9804ab",
      "new_mode": 33188,
      "new_path": "tools/wpt/browser.py"
    },
    {
      "type": "modify",
      "old_id": "8215dfe09161ad49ba3975e1eacc927c61715acf",
      "old_mode": 33188,
      "old_path": "tools/wpt/install.py",
      "new_id": "24915f0c98d0be3a864a3a515ba0e162dc37da8c",
      "new_mode": 33188,
      "new_path": "tools/wpt/install.py"
    },
    {
      "type": "modify",
      "old_id": "093a71568920a944b0b8361165f5ea5fa002ee14",
      "old_mode": 33188,
      "old_path": "tools/wpt/paths",
      "new_id": "35867c4ccbfe95c4e71a8d71ce90a7b378951fd5",
      "new_mode": 33188,
      "new_path": "tools/wpt/paths"
    }
  ]
}
