)]}'
{
  "log": [
    {
      "commit": "e92def4f3c06e6dc65c8d69f6bbb378ccba92546",
      "tree": "e4296096623690d12ddf0aedff4a26a629849092",
      "parents": [
        "e0ddd60a4c230f913a8032eadd3c5a46cb944c42"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Aug 08 21:50:04 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Aug 08 21:50:04 2017"
      },
      "message": "Add source manifest proto to recipe_engine.\n\nThis adds the initial form of the \"source manifest\" proto which will\nallow recipe_engine to communicate structured data about\nstuff-on-disk-that-we-got-from-remote-servers to LUCI services like Milo,\nand will also give us a better option than \u0027got_revision\u0027 properties for\nexporting this data from recipes (i.e. we\u0027ll be able to export all the\ndata and then query/read it instead of hard-coding a few hacks to export\nspecific repos).\n\nThis only covers git, cipd and isolated for now, but could be expanded\nto other data sources, if needed. We don\u0027t currently anticipate a need\nfor that, but the proto is hopefully obviously extensible for this.\n\nClients consuming this proto (like Milo) may have specialized support\nwhen comparing two manifest (e.g. two entries sharing the same git repo\nmay render as a git log), but it should also be somewhat easy to show a\nuseful generic diff when comparing two Manifest protos, even when the\ndeployment type changes (i.e. local path \"foo\" used to be a git checkout,\nbut is now multiple CIPD packages).\n\nR\u003ddnj@chromium.org, hinoka@chromium.org, machenbach@chromium.org\nBUG\u003d468053\n\nReview-Url: https://codereview.chromium.org/2998523002\n"
    },
    {
      "commit": "e0ddd60a4c230f913a8032eadd3c5a46cb944c42",
      "tree": "0550986e8aeacc97ef8f7354d4ff490c6fd27ce9",
      "parents": [
        "3cae8e948be4bd6a43a65e121b2e108111882396"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Tue Aug 08 18:41:09 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Aug 08 18:41:09 2017"
      },
      "message": "Move internal downstream recipe roll trybots to production\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2996663002\n"
    },
    {
      "commit": "3cae8e948be4bd6a43a65e121b2e108111882396",
      "tree": "2a4eb4fb42109c10cdcec76519c280750dc54631",
      "parents": [
        "862f33385b0c24846ea7850b4c1bdf646cafcf60"
      ],
      "author": {
        "name": "tandrii",
        "email": "tandrii@chromium.org",
        "time": "Tue Aug 08 11:45:38 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Aug 08 11:45:38 2017"
      },
      "message": "Add file.filesizes to recipe engine core modules.\n\nR\u003diannucci@chromium.org, machenbach@chromium.org\nBUG\u003dv8:6673\n\nReview-Url: https://codereview.chromium.org/2993713003\n"
    },
    {
      "commit": "862f33385b0c24846ea7850b4c1bdf646cafcf60",
      "tree": "8c643da77bc9b372c4b0170441624ec10c4ebfe2",
      "parents": [
        "6de52416675972312112322e412f84ae741357f2"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Mon Aug 07 19:44:33 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Aug 07 19:44:34 2017"
      },
      "message": "Vendor \u0027luci_context\u0027 library.\n\nTo be used from some recipe module (\u0027context\u0027?) to modify LUCI_CONTEXT of the\nstep (in particular, for switching Goma into using \u0027system\u0027 account).\n\nR\u003diannucci@chromium.org\nBUG\u003d731854\n\nReview-Url: https://codereview.chromium.org/2991053002\n"
    },
    {
      "commit": "6de52416675972312112322e412f84ae741357f2",
      "tree": "ebcb98e4048a1e3a57d0dd477c889600838fe57e",
      "parents": [
        "e183af00ebfb42ec3790682ff35942b86de77914"
      ],
      "author": {
        "name": "stgao",
        "email": "stgao@chromium.org",
        "time": "Fri Aug 04 21:00:39 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Aug 04 21:00:39 2017"
      },
      "message": "Add add_json_log\u003d\u0027on_failure\u0027 to json module.\n\nBUG\u003d752367\n\nReview-Url: https://codereview.chromium.org/2989423002\n"
    },
    {
      "commit": "e183af00ebfb42ec3790682ff35942b86de77914",
      "tree": "ec796cf6c1cc9fdf990582da927dd83f41dd8a1a",
      "parents": [
        "3b99cdd583b999d54712536f1ba9462175dfd3db"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Aug 04 18:47:46 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Aug 04 18:47:46 2017"
      },
      "message": "[recipe_engine] Set presentation.status before OutputPlaceholder.result.\n\nThis allows OutputPlaceholder.result to switch behavior based on the\nresult\u0027s status (i.e. add debugging information when the step fails, but\nbe silent otherwise).\n\nR\u003ddnj@chromium.org, stgao@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2995543003\n"
    },
    {
      "commit": "3b99cdd583b999d54712536f1ba9462175dfd3db",
      "tree": "145cbc18798e54c9ef090ffd3cedf27d353920a4",
      "parents": [
        "8e8339afbdb986a9195a97cb2c173984bdd4b758"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Thu Aug 03 16:25:50 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Aug 03 16:25:50 2017"
      },
      "message": "Fix \"recipes.py test diff\" not raising a failure\n\nThis was discovered by https://chromium-review.googlesource.com/c/596672\npassing build_limited downstream tester, but requiring nontrivial\ndownstream roll.\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2991323002\n"
    },
    {
      "commit": "8e8339afbdb986a9195a97cb2c173984bdd4b758",
      "tree": "edea867391ce72b384a778b3963270872908fb52",
      "parents": [
        "00799cc803d08da72548d3a5dc441771576cd72a"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Jul 24 10:18:10 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jul 24 10:18:10 2017"
      },
      "message": "[path] Fix root path mocking.\n\nCurrently, mocking a root path (e.g., \"/foo/bar\") will result in\ninfinite recursion due to dirname on the root element equalling itself.\nFix this by detecting when a \"dirname\" yields itself and observing this\nas a terminal condition.\n\nBUG\u003dNone\nTEST\u003dexpectations\nR\u003diannucci@chromium.org, vadimsh@chromium.org\n\nReview-Url: https://codereview.chromium.org/2988583002\n"
    },
    {
      "commit": "00799cc803d08da72548d3a5dc441771576cd72a",
      "tree": "156d00a562bda4e583f6d920481461579ea9d005",
      "parents": [
        "0ca88ae4d7e3f2ac99528e415a26bdb6d9835d35"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Tue Jul 18 19:36:40 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jul 18 19:36:40 2017"
      },
      "message": "Add experimental internal downstream recipe trybots\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2984553002\n"
    },
    {
      "commit": "0ca88ae4d7e3f2ac99528e415a26bdb6d9835d35",
      "tree": "b653f4b92ab87cd40054bc528572060e30928b48",
      "parents": [
        "de3238ca6d8320585f5dbcf051cd96cbc72d4684"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Jul 18 19:20:02 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jul 18 19:20:02 2017"
      },
      "message": "Pretty up all recipe_engine documentation.\n\nTBR\u003ddnj@chromium.org, estaab@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2980273003\n"
    },
    {
      "commit": "de3238ca6d8320585f5dbcf051cd96cbc72d4684",
      "tree": "dda528181ee11b155b7234febbb15b6da93bdaf0",
      "parents": [
        "9b47d24929f42cd147df04b66db9e493bea1601c"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Tue Jul 18 03:58:19 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jul 18 03:58:19 2017"
      },
      "message": "Fix UnboundLocalError in find_recipe.\n\nIt can happen instead of NoSuchRecipe if users pass some nonsense instead of\na recipe name.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2983743002\n"
    },
    {
      "commit": "9b47d24929f42cd147df04b66db9e493bea1601c",
      "tree": "d7e58f1bf10f714483a2b7b3432d8c92760ef2f6",
      "parents": [
        "da3467b4dd873c8d9d4858b223dd7aaa64e78670"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Fri Jul 14 20:25:06 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 14 20:25:06 2017"
      },
      "message": "Move downstream recipe roll trybots to production\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2983613002\n"
    },
    {
      "commit": "da3467b4dd873c8d9d4858b223dd7aaa64e78670",
      "tree": "41928597c167f3ed2693c85f1392376ad7c210b0",
      "parents": [
        "3d76281f54f9d0568fcbae1acbf884c86fbb29a7"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Thu Jul 13 06:38:14 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jul 13 06:38:14 2017"
      },
      "message": "Recursively apply recipe overrides\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2974273002\n"
    },
    {
      "commit": "3d76281f54f9d0568fcbae1acbf884c86fbb29a7",
      "tree": "36c79359c1912531de080d9ffabad6dfd92d59f9",
      "parents": [
        "9959b0728785d9f5e7110e4db516f7cf09090bed"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Jul 11 19:35:36 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jul 11 19:35:36 2017"
      },
      "message": "[uuid] Remove unused uuid module\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2980643002\n"
    },
    {
      "commit": "9959b0728785d9f5e7110e4db516f7cf09090bed",
      "tree": "a81cd9d61bc914616c5638f11cac816cf5328921",
      "parents": [
        "26475d6816d9e1f79dc23d0cf5714e6fda5573aa"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jul 07 22:32:54 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 07 22:32:54 2017"
      },
      "message": "Remove shutil module.\n\nR\u003ddnj@chromium.org\nBUG\u003d739984\n\nReview-Url: https://codereview.chromium.org/2975703002\n"
    },
    {
      "commit": "26475d6816d9e1f79dc23d0cf5714e6fda5573aa",
      "tree": "f5ca6aacfbb57f7c95d475022f852c1e18012b93",
      "parents": [
        "5c349eb803f77edd0458b36e41bfdf17ebf4eab9"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Fri Jul 07 19:28:42 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 07 19:28:42 2017"
      },
      "message": "Add more experimental downstream trybots\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2965293003\n"
    },
    {
      "commit": "5c349eb803f77edd0458b36e41bfdf17ebf4eab9",
      "tree": "4c5ed7d9b683a4613e872b5e3ebf5446f563936b",
      "parents": [
        "12e7ca450489763234b7380edddfddc8d9e3cb8f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jul 07 17:58:14 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 07 17:58:14 2017"
      },
      "message": "[file] allow glob to handle nested patterns\n\nR\u003ddnj@chromium.org, martiniss@google.com\nBUG\u003d739984\n\nReview-Url: https://codereview.chromium.org/2968353002\n"
    },
    {
      "commit": "12e7ca450489763234b7380edddfddc8d9e3cb8f",
      "tree": "089cdb468d2dec27f39d9b91b539614140bb74ba",
      "parents": [
        "241ddc299faa009b8842f95d40fdd7760b81791e"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Fri Jul 07 06:31:35 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 07 06:31:35 2017"
      },
      "message": "recipes.py test: enforce recipe expectations literally\n\nThis matches raw string contents of recipe expectations,\nrather than just parsed JSON equivalence.\n\nThis will help prevent spurious recipe expectation changes\non training when e.g. some expectations were changed manually,\nbut did not follow canonical formatting.\n\nBUG\u003dnone\n\nReview-Url: https://codereview.chromium.org/2968263002\n"
    },
    {
      "commit": "241ddc299faa009b8842f95d40fdd7760b81791e",
      "tree": "a7f8a88afa7b00eda667623eccd053d2d3489fec",
      "parents": [
        "11d7598fa760017f168aec1c53a9ced74b2fc8a6"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jul 06 20:29:46 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jul 06 20:29:46 2017"
      },
      "message": "[file] fix glob_paths when NO paths match, add tests.\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2973133002\n"
    },
    {
      "commit": "11d7598fa760017f168aec1c53a9ced74b2fc8a6",
      "tree": "072c417f84666e7c23cb4dc366d968b53763a020",
      "parents": [
        "9419a0e2ea6ab618b33a1e962ce62b36664e5234"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jul 06 02:06:43 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jul 06 02:06:43 2017"
      },
      "message": "[file] Allow placeholders in file.copy\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2971493002\n"
    },
    {
      "commit": "9419a0e2ea6ab618b33a1e962ce62b36664e5234",
      "tree": "2d4039693393fbe1a6657934c4bfd21be213e762",
      "parents": [
        "4b6b21e529889fcb3f4b1128ddd0fb941210012a"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed Jul 05 19:03:37 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Jul 05 19:03:37 2017"
      },
      "message": "[doc] Put all external URLs in a single section.\n\nThis has the effect of de-duplicating links to common external modules,\nreducing the churn on a recipe roll, and improving the readability of\nthe generated markdown source.\n\nR\u003ddnj@chromium.org, jbudorick@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2971863002\n"
    },
    {
      "commit": "4b6b21e529889fcb3f4b1128ddd0fb941210012a",
      "tree": "047086f13782ce0ba0ffe505bb83977296a67491",
      "parents": [
        "3ac778ec88ee4a878bd75ab8a89162c848b3d1db"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed Jul 05 18:21:01 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Jul 05 18:21:02 2017"
      },
      "message": "[doc] Fix randomization of DEPS link order, give DEPS links fully qualified names\n\nR\u003ddnj@chromium.org, jbudorick@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2970073004\n"
    },
    {
      "commit": "3ac778ec88ee4a878bd75ab8a89162c848b3d1db",
      "tree": "2a1f32c9a387c18e343fa73be8bdf8ac2acf8f88",
      "parents": [
        "c8d78bf15c065b5a35ccfc5798d1498d0899bb68"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jul 03 23:25:53 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jul 03 23:25:53 2017"
      },
      "message": "[recipe_autoroller] regen docs on trivial rolls too.\n\nOtherwise docs will only get regenerated on non-trivial rolls.\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2971623002\n"
    },
    {
      "commit": "c8d78bf15c065b5a35ccfc5798d1498d0899bb68",
      "tree": "f99544e5e7ab094dbdb49f0eb58747789fc34431",
      "parents": [
        "5873ef21cc9f2a9d9d6de868608c51976fdca20a"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jul 03 22:35:52 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jul 03 22:35:52 2017"
      },
      "message": "[doc] Automatically generate and update cross-indexed recipe markdown files.\n\nThis will automatically generate `\u003crecipes_path\u003e/README.recipes.md` during test\ntraining (assuming the rest of the training was successful). The generated docs\ninclude documentation on all modules and recipes within the repo, including\nlinks to source, docstrings, function signatures and pinned links to the\nREADME.recipes.md of any upstream module dependencies.\n\nThe markdown generated will be in the flavor of whatever the recipes.cfg\u0027s\ncanonical URL indicates (based on the simple heuristic of `\u0027github\u0027 in url`).\n\nDownstream READMEs will generate upstream-appropriate links even if the\nupstream and downstream repos have differing sources of truth.\n\nGenerating markdown for our largest repo (build.git) takes .9s, so the\naddition of the documentation generation to the `test train` command should\nbe negligible.\n\nAt some point in the future we may want to move all generation functionality\nto a dedicated \u0027gen\u0027 subcommand (i.e. \u0027gen expectations\u0027, \u0027gen doc\u0027,\n\u0027gen all\u0027), but for now \u0027test train\u0027 is part of everyone\u0027s workflow, so\nputting it there for now.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org, nodir@chromium.org\nBUG\u003d593545\n\nReview-Url: https://codereview.chromium.org/2972563002\n"
    },
    {
      "commit": "5873ef21cc9f2a9d9d6de868608c51976fdca20a",
      "tree": "0d81d865ed7183832a596fbf5b3763b51e89f53c",
      "parents": [
        "49d884b8bf92c358eab83cf2da43ef9863a89bbb"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@google.com",
        "time": "Fri Jun 30 02:32:29 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jun 30 02:32:29 2017"
      },
      "message": "Fix \"env_prefixes\" rendering.\n\nCurrently, \"env_prefixes\" renders the repr of the object, which is an\nugly set of namedtuple internals. Replace this with a nice formatted\nvalue.\n\nBUG\u003dNone\nTEST\u003dlocal\n  - ./recipes.py --package ./infra/config/recipes.cfg run context:tests/env\n\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2962253002\n"
    },
    {
      "commit": "49d884b8bf92c358eab83cf2da43ef9863a89bbb",
      "tree": "12e9f1066a7403576bfe964aaa9729618cb06609",
      "parents": [
        "097a0dbe9f6b8eae39e690de848aea5c3d8ea38b"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Thu Jun 29 14:07:57 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 29 14:07:57 2017"
      },
      "message": "file: correctly pass --symlinks after the command name\n\nThis fixes errors reported in https://codereview.chromium.org/2918463002/diff/180001/recipe_modules/file/api.py#newcode82\n\nBUG\u003dnone\n\nReview-Url: https://codereview.chromium.org/2963993002\n"
    },
    {
      "commit": "097a0dbe9f6b8eae39e690de848aea5c3d8ea38b",
      "tree": "6341b405a7a70b8f39cd5cba42328869dccaa777",
      "parents": [
        "8c0fd220f89fdee4865b016def85a4ad8d04fec5"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Jun 27 18:33:28 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 27 18:33:28 2017"
      },
      "message": "[test] minor refactoring.\n\nThis collapes the boolean flags `train` and `debug` into a single `mode`\nargument. Although `train` and `debug` were booleans, they are really\nmutually exclusive.\n\nThis also deletes the deprecated `--train` option on the run subcommand\n(we\u0027ve been using `test train` for a while now).\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2955973003\n"
    },
    {
      "commit": "8c0fd220f89fdee4865b016def85a4ad8d04fec5",
      "tree": "9da96d710ede7d768da51232f943294b40e237af",
      "parents": [
        "d732be8c982f015796f0e620b7b46cff161b137f"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Mon Jun 26 19:08:53 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 26 19:08:53 2017"
      },
      "message": "Add experimental downstream trybots\n\nBUG\u003d644609\n\nReview-Url: https://codereview.chromium.org/2956933002\n"
    },
    {
      "commit": "d732be8c982f015796f0e620b7b46cff161b137f",
      "tree": "0bc4b50f6867b1b85bf4daf0331804509c19e4b9",
      "parents": [
        "a8816c7cb46f98d0becd31d3338b97088fc10c17"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Jun 13 21:57:33 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 13 21:57:33 2017"
      },
      "message": "[context] Split \"env\" values and prefixes.\n\nCurrently, \"context.env\" coalesces the string and prefix values for an\nenviornment. This results in the environment flattening prefixes, and\nrecipes that pull the environment and tweak it having lots of duplicate\nprefix values.\n\nNow, we split the \"env\" property into two properties, \"env\", which\nreturns just the environment strings map, and \"env_prefixes\", which\nreturns prefix tuples. \"env_prefixes\" will only be applied when a setep\nrenders the enviornment to a string, meaning that prefixes will not\naccumulate during flattening.\n\nAlong these lines, remove improper context handling from \"python\" module.\n\nBUG\u003dNone\nTEST\u003dexpectations\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2933473002\n"
    },
    {
      "commit": "a8816c7cb46f98d0becd31d3338b97088fc10c17",
      "tree": "04b5cac26d6f1e9adaf9eda54845b557ffdbadc7",
      "parents": [
        "e089e513602ea7f98d0c6478686c0919b97497fc"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Jun 13 21:49:14 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 13 21:49:14 2017"
      },
      "message": "[path] Add \"base_path\" to __contains__, add get.\n\nCurrently, the \"__contains__\" check only returns whether a key is in\n\"dynamic_paths\". If the key is in \"base_paths\", it returns False.\nUnfortunately, this means that different keys are treated differently,\neven though users standard users aren\u0027t exposed to this difference.\n\nSimilary, add a \"get\" method to retrieve the contents of a path. This\nis similar to \"dict\" \"get\", and allows for a default value. At the\nmoment, the only equivalent is to do a try/catch on KeyError, which is\nnot optimal.\n\nBUG\u003dNone\nTEST\u003dexpectations\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2925373002\n"
    },
    {
      "commit": "e089e513602ea7f98d0c6478686c0919b97497fc",
      "tree": "28a0972f81733e4484c06cf47476c9d064d46f45",
      "parents": [
        "264e3cab40de2ee04e33850810188e20d249f9d2"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Jun 13 19:11:26 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 13 19:11:26 2017"
      },
      "message": "[url] Update vpython spec protobuf.\n\nUpdate the \"vpython\" spec protobuf to accommodate the template parameter\nname change that was recently pushed to \"vpython\".\n\nBUG\u003dNone\nTEST\u003dlocal\n  - Ran `./recipes.py run url:examples/full` successfully.\n\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2933483003\n"
    },
    {
      "commit": "264e3cab40de2ee04e33850810188e20d249f9d2",
      "tree": "0a52c59147d70ba6f2216863135329b15aeea089",
      "parents": [
        "cfff93afa16e61285e295d49f6aa2ba64642f330"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Jun 13 18:41:58 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 13 18:41:58 2017"
      },
      "message": "[step] Remove config indirection.\n\nCurrently, the path to poplating a recipe engine Step includes the\ngeneration of a \"step\" module config, a dict, JSON, and finally a\nStepConfig named tuple. Shift most of this logic out of the recipe\nengine and into the \"step\" recipe module, and remove the config.\n\nBUG\u003dNone\nTEST\u003dexpectations\n  - Simulation passes, no changes to expectations.\n\nReview-Url: https://codereview.chromium.org/2934583003\n"
    },
    {
      "commit": "cfff93afa16e61285e295d49f6aa2ba64642f330",
      "tree": "6ba95f56afb7134d4b90e9a657fa6d03b94b8360",
      "parents": [
        "96221bce29d908b951812550036f42520f085dec"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jun 12 20:52:42 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 12 20:52:42 2017"
      },
      "message": "[path] bring PLATFORM back to config.\n\nPartial revert of 060325b14d5a63ce65e65d93052b265ee310a828. PLATFORM is used\ndownstream in depot_tools.\n\nTBR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2940463002\n"
    },
    {
      "commit": "96221bce29d908b951812550036f42520f085dec",
      "tree": "5066f974c431b3baf07dbb8547fa34409152478e",
      "parents": [
        "060325b14d5a63ce65e65d93052b265ee310a828"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jun 12 20:04:13 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 12 20:04:13 2017"
      },
      "message": "[generator_script] Make allowed keys strict and improve error handling.\n\nThis prevents the accidental inclusion of ignored/misspelled keys in the\noutput of a generator_script.\n\nNow all malformed generator script output will show up as a StepFailure,\nnot an AssertionError.\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2931343003\n"
    },
    {
      "commit": "060325b14d5a63ce65e65d93052b265ee310a828",
      "tree": "6e2e846abd833cd922962ed4fa8442189b896855",
      "parents": [
        "6d2596f2b4183b3abc59b92d0298e781e02d1687"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Jun 12 18:00:56 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 12 18:00:56 2017"
      },
      "message": "[path] Cleanup and use \"C:\\\" for test Windows base\n\nDo some cleanup in the \"path\" module.\n\nOn Windows, use \"C:\\\" as the root for simulation instead of \"/\",\nyielding more accurate simulation results.\n\nBUG\u003dNone\nTEST\u003dexpectations\n\nReview-Url: https://codereview.chromium.org/2931263002\n"
    },
    {
      "commit": "6d2596f2b4183b3abc59b92d0298e781e02d1687",
      "tree": "0eef48a610fe4adf80df18380f3fda2a7c2b7163",
      "parents": [
        "c7595ad0dd704f72e4765e2645501c553bef3af1"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jun 12 17:42:35 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 12 17:42:35 2017"
      },
      "message": "[generator_script] constrain generator_script to have a stricter API.\n\nThis constrains the API to exactly match the production usage so that\ninternal refactoring of the \u0027step\u0027 API doesn\u0027t accidentally leak out to the\ngenerator_script API. As we refactor \u0027step\u0027, the generator_script API\nshould remain constant.\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2934663003\n"
    },
    {
      "commit": "c7595ad0dd704f72e4765e2645501c553bef3af1",
      "tree": "0bd15e5dadec9635d9be8c9fda25c276c368d238",
      "parents": [
        "154ef7e5d8f964ef30b1250dd33751582705f6f2"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Jun 12 14:37:33 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 12 14:37:33 2017"
      },
      "message": "[file] fix \"rmtree\" on non-dir path\n\nCurrently, \"rmtree\" on a non-directory path will attempt to recurse that\ndirectory and remove it, resulting in an error if the target is a file\ninstead of a directory. For ease of use, enable \"rmtree\" to be called on\na single non-directory (file, link, etc.)\n\nBUG\u003dNone\nTEST\u003dlocal\n  - Ran the script on a file, no longer returns an error.\n\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2931343002\n"
    },
    {
      "commit": "154ef7e5d8f964ef30b1250dd33751582705f6f2",
      "tree": "928019731ef64caa2313d0fe72cacb01ddfea54d",
      "parents": [
        "c916898b8189866a0bf43fe15c800e4fe6d4a19e"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Jun 08 18:53:00 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 08 18:53:00 2017"
      },
      "message": "[path] Add concept of a \"cleanup\" directory.\n\nSome recipe code, such as \"bot_update\", expect a directory to exist such\nthat files placed in that directory will be purged in between build\nexecutions. This delayed deletion mechanism is important, as it offers a\nfacililty for files to be purged, which is potentially time-consuming,\nwithout counting against actual scheduled build time.\n\nBUG\u003dchromium:725631\nTEST\u003dexpectations\nR\u003dhinoka@chromium.org, iannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2931893003\n"
    },
    {
      "commit": "c916898b8189866a0bf43fe15c800e4fe6d4a19e",
      "tree": "8c37c1b6bd5fd620ddfd6bf684880532051dd775",
      "parents": [
        "c40412cbc4e1b8ee1e6eba2e88328ca71c6ec1e4"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 08 01:06:01 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 08 01:06:01 2017"
      },
      "message": "[context] fix treatment of None in env.\n\nhttps://codereview.chromium.org/2925453002 introduced a bug where setting\nan envvar to None would set its value to \"\" instead of removing it from the\nenvironment. This CL restores that behavior.\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2920223011\n"
    },
    {
      "commit": "c40412cbc4e1b8ee1e6eba2e88328ca71c6ec1e4",
      "tree": "280868455e7e1e2628e835b035dfecce3506d179",
      "parents": [
        "db920908bf51fcdb0e30f686a528b25cd4876ca7"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Jun 07 23:53:18 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Jun 07 23:53:18 2017"
      },
      "message": "[context] Add path prefix/suffix manipulation.\n\nAdd the ability to manipulate pathsep-delimited environment variables\nmore easily with specific helper functions targeting the prefixing and\nsuffixing of values to those variables.\n\nPreviously, the supported way to augment path environment variables was\nto manually construct them, referencing the current value:\n\nnew_path \u003d \"%s%%(PATH)s%s\" % (api.path.pathsep, api.path.pathsep)\n\nNot only is this very verbose, but it is also error-prone, as the user\nmay not use OS-specific path separators, can add the same entries\nmultiple times, and can forget the double-percent to escape the\ninner substitition.\n\nThis patch adds the concept of path prefixes and suffixes to the\n\"context\" recipe module. Path elements can be added to either, and will\nbe compiled into properly-delimited prefix and suffix values on the\ncontext\u0027s environment.\n\nBUG\u003dNone\nTEST\u003dexpectations,run\n\nReview-Url: https://codereview.chromium.org/2925453002\n"
    },
    {
      "commit": "db920908bf51fcdb0e30f686a528b25cd4876ca7",
      "tree": "2d575351bb9a33b63a1bbc4286d875c58fc9bdf1",
      "parents": [
        "1ec7ad4df3efbdd7224f249179390aab4a66c562"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Jun 07 23:18:22 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Jun 07 23:18:22 2017"
      },
      "message": "Update vpython and spec to new text protobuf.\n\n\"vpython\" has corrected its PEP425 tag nomenclature:\nhttps://codereview.chromium.org/2927573002/\n\nBump \"vpython\" and update the text proto accordingly.\n\nTEST\u003dNone\nBUG\u003dNone\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2926943002\n"
    },
    {
      "commit": "1ec7ad4df3efbdd7224f249179390aab4a66c562",
      "tree": "a541f2b1c72f6e8a77df80ec5f864400936ff322",
      "parents": [
        "267b9221c5fbd2712527852550d86f9e2e3874ff"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Jun 06 17:20:15 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 06 17:20:15 2017"
      },
      "message": "[file] add log listings to file.listdir and file.glob_paths.\n\nR\u003ddnj@chromium.org, machenbach@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2920353004\n"
    },
    {
      "commit": "267b9221c5fbd2712527852550d86f9e2e3874ff",
      "tree": "e7c9e2ee671dccc0a73b988bde65fb1d1c2675f4",
      "parents": [
        "ddd199058ea23f965a1a6b276d76cf5c3723baaf"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jun 05 19:56:50 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 05 19:56:50 2017"
      },
      "message": "[file] Derive user-facing error from StepFailure and set FAILURE status on step.\n\nR\u003dnodir@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2921323002\n"
    },
    {
      "commit": "ddd199058ea23f965a1a6b276d76cf5c3723baaf",
      "tree": "4c017c1293b8ddb36292edc8c1658208783111b5",
      "parents": [
        "a64a4d4ad8e4844cb81868a2b24df4d836d5caca"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jun 05 18:58:00 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 05 18:58:00 2017"
      },
      "message": "[bundle] switch implimentation to use git 2.13 attr pathspec.\n\nThis is several hundred times faster, less code, more flexible, more standard,\nand gives us the potential to do bundling fully remotely (by adding pathspec\nsupport to gitiles\u0027 tarball API).\n\nNow that git is handling the \u0027which files are included\u0027 stuff, this also relaxes\nthe bundle logic to allow uncommitted changes to be picked up (previously\nyou would need to actually create a local git commit with the changes).\n\nR\u003ddnj@chromium.org,borenet@google.com\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2920063003\n"
    },
    {
      "commit": "a64a4d4ad8e4844cb81868a2b24df4d836d5caca",
      "tree": "eb18d85261051d522b363998979875ae448df1a4",
      "parents": [
        "e7ce42597641397a594380f0d5edd6fd7ade1037"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jun 02 21:09:07 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jun 02 21:09:07 2017"
      },
      "message": "[file] No error in remove if file does not exist\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2916373002\n"
    },
    {
      "commit": "e7ce42597641397a594380f0d5edd6fd7ade1037",
      "tree": "b4d60d9b0cfdcde548cdfb885759926a737da2c5",
      "parents": [
        "09efd6f1bfd7040872c894fa6f70294a9575036a"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 01 23:34:08 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 01 23:34:08 2017"
      },
      "message": "[test] only clean up expectations if training was otherwise successful.\n\nThis prevents the removal of entire .expected directories when there\u0027s\nsome internal failure during training. This is important because those\ndirectories sometimes contain other files (namely OWNERS files), which\nare annoying to get back.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2916653004\n"
    },
    {
      "commit": "09efd6f1bfd7040872c894fa6f70294a9575036a",
      "tree": "08351d0996f374d1ece6957455911bd74fe1726f",
      "parents": [
        "d878bba594c81c7ba4cc16b8bf078097b00a102d"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 01 22:33:55 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 01 22:33:55 2017"
      },
      "message": "Remove all mentions of example.py\n\nEverything is in the examples/ subdir now :)\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2914213004\n"
    },
    {
      "commit": "d878bba594c81c7ba4cc16b8bf078097b00a102d",
      "tree": "ed45c6775c34923d7c183f6b23245e50669814c1",
      "parents": [
        "8ff178b2ec0c099d49ecb1df1c411f487c6bc657"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 01 03:10:45 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 01 03:10:45 2017"
      },
      "message": "[recipe_modules/file] add real file module to engine.\n\nIncluding docs, mocks and more :)\n\nR\u003dborenet@chromium.org, dnj@chromium.org, nodir@chromium.org, phajdan.jr@chromium.org\nBUG\u003dskia:6628\n\nReview-Url: https://codereview.chromium.org/2918463002\n"
    },
    {
      "commit": "8ff178b2ec0c099d49ecb1df1c411f487c6bc657",
      "tree": "b2e5d84231312e4ae33efd518fdee56d19f36c99",
      "parents": [
        "458ce956c9d91d184e0107c5fa6b34a8267b8e9b"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 01 01:32:43 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 01 01:32:43 2017"
      },
      "message": "[context] simplify step context implementation\n\nThis removes the userspace \u0027context\u0027 from recipe_engine.recipe_api,\nreducing _STEP_CONTEXT to just handling deferred data (with a dedicated\nimplementation).\n\nThis refactors the context module to be its own implementation.\n\nR\u003ddnj@chromium.org\nBUG\u003d685746\n\nReview-Url: https://codereview.chromium.org/2885703002\n"
    },
    {
      "commit": "458ce956c9d91d184e0107c5fa6b34a8267b8e9b",
      "tree": "72110d30195a9c153f7e3e501f6ccab7ab2eb2ee",
      "parents": [
        "8d7bd42ec1713294cf6cb36127c96a1f439f9419"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 31 22:10:27 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 31 22:10:27 2017"
      },
      "message": "[step_runner] run _merge_envs in simulation too.\n\nThis should catch envvar %-formatting weirdness much earlier.\n\nR\u003ddnj@chromium.org, nodir@chromium.org\nBUG\u003d727493\n\nReview-Url: https://codereview.chromium.org/2913203002\n"
    },
    {
      "commit": "8d7bd42ec1713294cf6cb36127c96a1f439f9419",
      "tree": "d35ad6909ef6879f4526b7374763ea7b5caebca4",
      "parents": [
        "84a695b241eb61b3b6d1a0fa9d63ef572d26cdbd"
      ],
      "author": {
        "name": "benjaminwagner",
        "email": "benjaminwagner@google.com",
        "time": "Wed May 31 21:20:14 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 31 21:20:14 2017"
      },
      "message": "Enable unbuffered output for bundled recipes.\n\nBUG\u003dhttps://github.com/luci/luci-py/issues/297\n\nReview-Url: https://codereview.chromium.org/2920493002\n"
    },
    {
      "commit": "84a695b241eb61b3b6d1a0fa9d63ef572d26cdbd",
      "tree": "c8747a8b89ccf3104183c691740f69792aa8c0a0",
      "parents": [
        "5da7e1fbc1f0e8b14d0ac6c1dc770ce9ca39d6ac"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 31 16:48:05 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 31 16:48:05 2017"
      },
      "message": "[loader] Make recipe engine support examples/ module subdir\n\nThis makes the example recipes mirror the tests recipes. After this lands\nI\u0027ll make similar transformations to the other repos and remove support\nfor the bare example.py.\n\nR\u003ddnj@chromium.org, nodir@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2909983003\n"
    },
    {
      "commit": "5da7e1fbc1f0e8b14d0ac6c1dc770ce9ca39d6ac",
      "tree": "fd3b88263a89592f84500aef01c41864c30f86b9",
      "parents": [
        "2f2d5c663eddcd8b6924a8775aaf88f3600d2ac8"
      ],
      "author": {
        "name": "nodir",
        "email": "nodir@chromium.org",
        "time": "Sat May 27 19:42:05 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat May 27 19:42:05 2017"
      },
      "message": "Remove \"Recipe Roll Downstream Tester\" builder\n\nBuilder \"Recipe Roll Downstream Tester\" is not useful currently.\nRemove until fixed.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2908903002\n"
    },
    {
      "commit": "2f2d5c663eddcd8b6924a8775aaf88f3600d2ac8",
      "tree": "ebb426557f58a636a3e0feeb880a809255696307",
      "parents": [
        "cae7fab7b53f5c739176e95a116401592ff2b9e2"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu May 18 18:10:43 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu May 18 18:10:44 2017"
      },
      "message": "[step_runner] expand try/catch to cover all step preparation functionality\n\nR\u003ddnj@chromium.org, nodir@chromium.org, tandrii@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2887233002\n"
    },
    {
      "commit": "cae7fab7b53f5c739176e95a116401592ff2b9e2",
      "tree": "ae30c8f3c7e722946a4cdffe4ac6406015bc5225",
      "parents": [
        "a819ab06fa3974b0fdee796aa4dd883274f4df2f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 17 21:45:13 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 17 21:45:13 2017"
      },
      "message": "[step_runner] fix error text\n\nR\u003ddnj@chromium.org, nodir@chromium.org, tandrii@chromium.org\nBUG\u003d721466\n\nReview-Url: https://codereview.chromium.org/2888203002\n"
    },
    {
      "commit": "a819ab06fa3974b0fdee796aa4dd883274f4df2f",
      "tree": "f8c673c2d51579bf3496e61094cc4b9ec3a9a4d4",
      "parents": [
        "3b8a0585e3c7390a7c1c339c6b70d042de8f913c"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 17 18:23:37 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 17 18:23:37 2017"
      },
      "message": "[step_runner] do not immediately bail when START_DIR is gone.\n\nThis is still an error in the recipe (it shouldn\u0027t ever delete the cwd...\nthat\u0027s just a bad plan), but this should help give us some more info about\nwhere/when this happens.\n\nR\u003dnodir@chromium.org, tandrii@chromium.org\nBUG\u003d721466\n\nReview-Url: https://codereview.chromium.org/2885293003\n"
    },
    {
      "commit": "3b8a0585e3c7390a7c1c339c6b70d042de8f913c",
      "tree": "b8a3cbbd2f468dff2e55cdef17bef5782156630e",
      "parents": [
        "632d231c826e13b02ade64d77ed2a41e25aa6fb3"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 17 08:59:34 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 17 08:59:34 2017"
      },
      "message": "[engine] make all ad-hoc steps properly colored\n\nR\u003dtandrii@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2885333003\n"
    },
    {
      "commit": "632d231c826e13b02ade64d77ed2a41e25aa6fb3",
      "tree": "1adfb9baaad9cde9bc4c2c89ccb84d8dfbe7bb70",
      "parents": [
        "c2d0f5d807793894df762930bc5d2729297658bf"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 17 08:12:44 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 17 08:12:44 2017"
      },
      "message": "[step_runner] Add a Placeholder Exception step when rendering placeholders raises a StepFailure.\n\nPreviously an exception here would potentially allow the recipe to attempt\nto obtain the active_result in a finally clause, which would obscure the\noriginal error.\n\nWith this change, both exceptions will render.\n\nR\u003dtansell@chromium.org\nBUG\u003d721466\n\nReview-Url: https://codereview.chromium.org/2885023004\n"
    },
    {
      "commit": "c2d0f5d807793894df762930bc5d2729297658bf",
      "tree": "2eb74dbcfbb58244bf1e9fae0d91e0533bae51f0",
      "parents": [
        "3343170e687e1cfa402e70c6e90019f9f88f913f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 16 21:22:51 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 21:22:51 2017"
      },
      "message": "[bundle] do not include the main repo in the overrides.\n\nR\u003ddnj@chromium.org, hinoka@chromum.org, jbudorick@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2888543004\n"
    },
    {
      "commit": "3343170e687e1cfa402e70c6e90019f9f88f913f",
      "tree": "684908bd1db0f18c119a7c71bc4bdbc2b5a66344",
      "parents": [
        "1a90c2644e03337ecfd91dd1e76a7c2713b42808"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 16 08:07:38 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 08:07:38 2017"
      },
      "message": "[package.py] prevent overriding undeclared repo dependency.\n\nR\u003ddnj@chromium.org\nBUG\u003d590083\n\nReview-Url: https://codereview.chromium.org/2885583002\n"
    },
    {
      "commit": "1a90c2644e03337ecfd91dd1e76a7c2713b42808",
      "tree": "ca6f87c9494052281717c8c416cb2105ff9f4d65",
      "parents": [
        "ea1ac7522268ac435550c701790fd1276f3e6a05"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 16 01:44:07 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 01:44:07 2017"
      },
      "message": "[platform] improve testing assertions.\n\nR\u003ddnj@chromium.org\nBUG\u003d603942\n\nReview-Url: https://codereview.chromium.org/2887543002\n"
    },
    {
      "commit": "ea1ac7522268ac435550c701790fd1276f3e6a05",
      "tree": "4302ce3159283f2106a5f2d086061f9ae4cf0297",
      "parents": [
        "def1c0f3b0bc9712e87e58031eb08e967e7ee46c"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 16 01:34:27 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 01:34:27 2017"
      },
      "message": "[post_process] make the check function return True if the expression is\nTrue.\n\nR\u003ddnj@chromium.org\nBUG\u003d701055\n\nReview-Url: https://codereview.chromium.org/2879343002\n"
    },
    {
      "commit": "def1c0f3b0bc9712e87e58031eb08e967e7ee46c",
      "tree": "526e1dd4a4578ecbfafdddd08032eb5fe3ab0d77",
      "parents": [
        "b5078f1d18d40c1e8e073ca0e17c6ac382ddcb57"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 16 01:19:55 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 01:19:55 2017"
      },
      "message": "[test] improve test failure message with retraining instructions.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org,\nBUG\u003d434442\n\nReview-Url: https://codereview.chromium.org/2888433003\n"
    },
    {
      "commit": "b5078f1d18d40c1e8e073ca0e17c6ac382ddcb57",
      "tree": "ce95868f3b7ed16e282a46b059b1e85be01594ae",
      "parents": [
        "9be63aeb7800439b172aaf2d77a156ff5d523947"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@google.com",
        "time": "Tue May 16 01:01:48 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 01:01:49 2017"
      },
      "message": "[test] Don\u0027t print coverage version by default.\n\nOnly print the coverage package version when using debug logging.\n\nThe utility of printing the coverage version is significantly reduced\nnow that we always bootstrap tests.\n\nBUG\u003dNone\nTEST\u003dlocal\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2880203003\n"
    },
    {
      "commit": "9be63aeb7800439b172aaf2d77a156ff5d523947",
      "tree": "9568c85f41e0a3d2682a08a4a0423a93775b71e3",
      "parents": [
        "63fd5fef30ebf0db04266b4f4723f77838979365"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@google.com",
        "time": "Tue May 16 00:48:38 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 16 00:48:38 2017"
      },
      "message": "[context] Fix \"check_type\" error.\n\n\"expect\" is already a type, so getting the type of it returns \"type\",\nresulting in a less useful error message.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2887493002\n"
    },
    {
      "commit": "63fd5fef30ebf0db04266b4f4723f77838979365",
      "tree": "26c42cbfec571e7380fa664080070d565164339b",
      "parents": [
        "e9c7176184ed588bbf66335e834834496f28cf9c"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@google.com",
        "time": "Sun May 14 02:17:07 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sun May 14 02:17:07 2017"
      },
      "message": "[url]: get_file has default (empty) test data\n\nThis avoids the need to install default test data to \"get_file\". When\ntesting, this value isn\u0027t actually returned to the recipe, so this is\nalways going to be useful.\n\nTBR\u003diannucci@chromium.org\nBUG\u003dNone\nTEST\u003dlocal\n\nReview-Url: https://codereview.chromium.org/2882033002\n"
    },
    {
      "commit": "e9c7176184ed588bbf66335e834834496f28cf9c",
      "tree": "0c355d55d11252f257bfd2bdcc8afef0acdc6de7",
      "parents": [
        "0070123d9c8f830d813e6ec1064b9bf24a5b29db"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@google.com",
        "time": "Sat May 13 23:18:21 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat May 13 23:18:21 2017"
      },
      "message": "[url] Cleanup, bugfix, step_test_data.\n\nAdd \"step_test_data\" to the \"url\" module, allowing default text and JSON\nalues to be specified for steps. This is useful to downstream users who\nmay not want to explicitly specify test data for each step.\n\nFix a bug in \"pycurl.py\" where, when stripping prefixes, it applied the\nwrong length.\n\nUse a namedtuple to represent the \"url\" module\u0027s status result JSON.\nThis formally defines the expectation, rather than leaving it up to an\nopen-ended dict.\n\nBUG\u003dNone\nTEST\u003dlocal\n  - ./recipes.py test train\n  - ./recipes.py run url:example\n\nReview-Url: https://codereview.chromium.org/2881993002\n"
    },
    {
      "commit": "0070123d9c8f830d813e6ec1064b9bf24a5b29db",
      "tree": "bd919d0179461c7d811ed1f929d10648413f051c",
      "parents": [
        "c6560f3627af81c9004024079525ef63a223d33a"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat May 13 17:58:27 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat May 13 17:58:27 2017"
      },
      "message": "[context] Fix docstring.\n\nTBR\u003ddnj@chromium.org\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2882833002\n"
    },
    {
      "commit": "c6560f3627af81c9004024079525ef63a223d33a",
      "tree": "ce4bb3c204cf21aaa58cd27161b2c5e335e8b96b",
      "parents": [
        "60cc7f3f49737e8cf852e396b4436c2b6bd3f56d"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri May 12 16:07:31 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri May 12 16:07:31 2017"
      },
      "message": "Add \"url\" recipe module to base.\n\nAdd the \"url\" recipe module, originally from \"depot_tools\", to the base\nrecipe modules. This module has a shiny new API, stronger tests, and\na more efficient and correct backend \"pycurl.py\" resource.\n\nThis also uses \"vpython\" to run URL commands in a VirtualEnv containing all\nof the prerequisites for \"requests\" to perform secure HTTPS transactions.\n\nBUG\u003dNone\nTEST\u003dlocal\n\nReview-Url: https://codereview.chromium.org/2868333004\n"
    },
    {
      "commit": "60cc7f3f49737e8cf852e396b4436c2b6bd3f56d",
      "tree": "562bd8ae729f00b61dd4e954d05f284de20904cc",
      "parents": [
        "b7c18e0258998652eeb302c83680f6a2b1aee398"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri May 12 16:00:47 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri May 12 16:00:47 2017"
      },
      "message": "Add vpython support to Python recipe module.\n\nAdd a keyword argument to the Python recipe module\u0027s \"__call__\" method\nthat can be used to configure the VirtualEnv under which the module is\nrun.\n\nBUG\u003dNone\nTEST\u003dexpectations\n\nReview-Url: https://codereview.chromium.org/2875823002\n"
    },
    {
      "commit": "b7c18e0258998652eeb302c83680f6a2b1aee398",
      "tree": "e489952271c43ff464f7db522c9f62cd59d1cffa",
      "parents": [
        "c7d91ef9861b04e41c6a2381382efd58d111fe19"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri May 12 00:43:46 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri May 12 00:43:46 2017"
      },
      "message": "Revert of include Package proto into Result proto (patchset #3 id:40001 of https://codereview.chromium.org/2802693003/ )\n\nReason for revert:\nbroke the world: https://build.chromium.org/p/chromium.infra/builders/infra-continuous-trusty-32/builds/7475/steps/steps/logs/stdio\n\nOriginal issue\u0027s description:\n\u003e include Package proto into Result proto\n\u003e\n\u003e Kitchen runs recipes using recipe engine and needs to know revisions of\n\u003e recipe dependencies that were used for a run.\n\u003e\n\u003e Export entire contents of recipes.cfg in the new result proto.\n\u003e\n\u003e R\u003diannucci@chromium.org, martiniss@chromium.org\n\u003e BUG\u003d695485\n\u003e\n\u003e Review-Url: https://codereview.chromium.org/2802693003\n\u003e Committed: https://github.com/luci/recipes-py/commit/c7d91ef9861b04e41c6a2381382efd58d111fe19\n\nTBR\u003dmartiniss@chromium.org,nodir@chromium.org\n# Skipping CQ checks because original CL landed less than 1 days ago.\nNOPRESUBMIT\u003dtrue\nNOTREECHECKS\u003dtrue\nNOTRY\u003dtrue\nBUG\u003d695485\n\nReview-Url: https://codereview.chromium.org/2882563002\n"
    },
    {
      "commit": "c7d91ef9861b04e41c6a2381382efd58d111fe19",
      "tree": "c1354bfb2532fed8524d1f211835081ab19196ad",
      "parents": [
        "6eaacf24833ebd2565177157d368da33780fced9"
      ],
      "author": {
        "name": "nodir",
        "email": "nodir@chromium.org",
        "time": "Thu May 11 22:27:56 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu May 11 22:27:57 2017"
      },
      "message": "include Package proto into Result proto\n\nKitchen runs recipes using recipe engine and needs to know revisions of\nrecipe dependencies that were used for a run.\n\nExport entire contents of recipes.cfg in the new result proto.\n\nR\u003diannucci@chromium.org, martiniss@chromium.org\nBUG\u003d695485\n\nReview-Url: https://codereview.chromium.org/2802693003\n"
    },
    {
      "commit": "6eaacf24833ebd2565177157d368da33780fced9",
      "tree": "e489952271c43ff464f7db522c9f62cd59d1cffa",
      "parents": [
        "275cbaae0e81a737ff1be9c73049b2cd124388ad"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu May 11 22:08:17 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu May 11 22:08:17 2017"
      },
      "message": "Fix repeated test \u0027mkdir\u0027 failure.\n\nBUG\u003dNone\nTEST\u003dlocal\nTBR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2876953002\n"
    },
    {
      "commit": "275cbaae0e81a737ff1be9c73049b2cd124388ad",
      "tree": "e95beccf983975a6a74add3dd20a3c37afb0105b",
      "parents": [
        "c594d93e17bd0e32f02620808deed9b1833bd81f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu May 11 02:54:46 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu May 11 02:54:46 2017"
      },
      "message": "[context] Add user-facing context module.\n\nThis is a new type-safe module for interacting with the context stuff.\n\nAfter landing and migrating everything to this, I\u0027m going to re-implement\nit with a much-less-magical implementation where all of these context\nvalues just get pushed onto stacks within the ContextApi (instead of using\n_STEP_CONTEXT).\n\nR\u003ddnj@chromium.org, martiniss@chromium.org, nodir@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2869533002\n"
    },
    {
      "commit": "c594d93e17bd0e32f02620808deed9b1833bd81f",
      "tree": "acc01886d1f1e57f1b0c4e7fbe143e31afd7fad5",
      "parents": [
        "23230785ddaec6e199d3ede6d496131ec178c183"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu May 11 01:21:43 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu May 11 01:21:44 2017"
      },
      "message": "[autoroll] Remove support for \u0027config section\u0027 in doc/recipes.py\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2863323002\n"
    },
    {
      "commit": "23230785ddaec6e199d3ede6d496131ec178c183",
      "tree": "89b5f147c4723ee1da2a35824c9d2273ca203d80",
      "parents": [
        "c93ed98c3c3e6c9be82e88496e55cb1f3dd13372"
      ],
      "author": {
        "name": "nodir",
        "email": "nodir@chromium.org",
        "time": "Wed May 10 19:58:01 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 10 19:58:02 2017"
      },
      "message": "config: fix config.Dict with no value type\n\nDict.set_value crashes in value_type is None (default). Fix that.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2816083003\n"
    },
    {
      "commit": "c93ed98c3c3e6c9be82e88496e55cb1f3dd13372",
      "tree": "ba2a15a8828a5f4be6f59cc9eb75b67e4a756302",
      "parents": [
        "9f2573a386ee07450095cbeb3562df94a644962f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 10 01:59:59 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 10 01:59:59 2017"
      },
      "message": "[recipe_modules/step] do not set cwd if it is start_dir.\n\nThis makes expectations consistent (i.e. steps that are run without cwd\nand steps run in start_dir have the same representation in expectations,\nbecause they have the same behavior).\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2875543002\n"
    },
    {
      "commit": "9f2573a386ee07450095cbeb3562df94a644962f",
      "tree": "f52228a645354404ca1c30ac14729755f2f5c2da",
      "parents": [
        "bf2ff828987549b946135919bd1bffd6e42fd8fd"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue May 09 20:54:46 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 09 20:54:46 2017"
      },
      "message": "bootstrap: show a better missing CIPD error\n\nThe reicpe engine assumes that \"cipd\" is available on PATH. If it is\nnot, the bootstrap currently fails with an obscure OSError. Supplement\nthat with a user-facing explanation.\n\nBUG\u003dchromium:718450\nTEST\u003dlocal\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2867393002\n"
    },
    {
      "commit": "bf2ff828987549b946135919bd1bffd6e42fd8fd",
      "tree": "f705d2dff43ca359b90d640945708ca65fdeefa8",
      "parents": [
        "e7bbbf6cfac944157d80cc92fd78837165e69d3f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 09 17:38:16 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 09 17:38:16 2017"
      },
      "message": "[doc/recipes.py] Add option to recipes.py to allow it to work without .git\n\nThis will allow the per-repo recipes.py script to work with isolated\ncopies of repos (which lack .git directories).\n\nThis also makes the bootstrap script not duplicate the --package option if it\u0027s\npassed.\n\nR\u003dborenet@google.com, dnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2872663003\n"
    },
    {
      "commit": "e7bbbf6cfac944157d80cc92fd78837165e69d3f",
      "tree": "19e2aa36be3ddbe9a3abb631f94f759df373e369",
      "parents": [
        "497f5b7f92cea8e5273d56cc3cba876fb18b42d9"
      ],
      "author": {
        "name": "phajdan.jr",
        "email": "phajdan.jr@chromium.org",
        "time": "Tue May 09 16:41:36 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 09 16:41:37 2017"
      },
      "message": "Fix a race crash when recipe expectations directory exists\n\nBUG\u003dnone\n\nReview-Url: https://codereview.chromium.org/2868033002\n"
    },
    {
      "commit": "497f5b7f92cea8e5273d56cc3cba876fb18b42d9",
      "tree": "50b6ba8bf7f8854aff0fa129ff8b8daa26c07160",
      "parents": [
        "e90c11af854574dd68edd0e7c7a5e04ceb49ffd0"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 09 05:35:06 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 09 05:35:06 2017"
      },
      "message": "[doc/recipes.py] fix issue when running recipes.py from .\n\nTBR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d718450\n\nReview-Url: https://codereview.chromium.org/2867313002\n"
    },
    {
      "commit": "e90c11af854574dd68edd0e7c7a5e04ceb49ffd0",
      "tree": "5b134c49f96f032279bbdd44835020cd101b0fb7",
      "parents": [
        "cfeeb53051e02856a35395a69b09f822ad35e2e5"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 09 03:44:10 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 09 03:44:10 2017"
      },
      "message": "[recipes.cfg] remove support for api_version 1.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2855333006\n"
    },
    {
      "commit": "cfeeb53051e02856a35395a69b09f822ad35e2e5",
      "tree": "1ae886d3786456a1d0ce3936c8d2a7bcb306fcf8",
      "parents": [
        "d6c4a597be2da8be7971b4d5f66e3d95e8fc325c"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 09 02:59:08 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 09 02:59:08 2017"
      },
      "message": "[doc/recipes.py] Improve copypasta bootstrap script.\n\nChanges:\n  * Hard code infra/config/recipes.cfg (it\u0027s hardcoded elsewhere in the recipes\n    repo, and basically fixed anyway; a value other than this will break\n    everything, so might as well be honest about it).\n  * Remove need for per-repo configuration section entirely.\n  * Improve repo fetching code to not rely on remote.origin.url.\n  * Improve repo fetching code to not take index.lock if not needed by doing\n    diff before doing a reset.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2865653004\n"
    },
    {
      "commit": "d6c4a597be2da8be7971b4d5f66e3d95e8fc325c",
      "tree": "75eceff3ce890da92c672b42281f0b737ef00728",
      "parents": [
        "92c5b73ff81fb30c80a33bab91be51551d5e67b7"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon May 08 23:35:13 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon May 08 23:35:13 2017"
      },
      "message": "[recipes.py] refactor PackageContext to remove --no-fetch logic.\n\nThe only time we need to disable fetch is when using bundles, but those\nwork perfectly fine with -O override flags.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2866913002\n"
    },
    {
      "commit": "92c5b73ff81fb30c80a33bab91be51551d5e67b7",
      "tree": "1a5165715a69e38fd6b31da96d14735c3d63673a",
      "parents": [
        "487e5e371bf8140b0467c6366f94042581f5c63c"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon May 08 21:36:09 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon May 08 21:36:09 2017"
      },
      "message": "Bump \"vpython\" bootstrap version.\n\nBUG\u003dNone\nTEST\u003dNone\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2866113002\n"
    },
    {
      "commit": "487e5e371bf8140b0467c6366f94042581f5c63c",
      "tree": "5d8eb85ea2bbeabf4566d70b1d42b0cde0d2b6e8",
      "parents": [
        "66338449f4d727da096422c1df1b6654224d6512"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon May 08 21:34:37 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon May 08 21:34:37 2017"
      },
      "message": "[recipes.py] refactor PackageContext to remove unused --deps-path arg.\n\nNothing uses this argument, it\u0027s broken in a couple ways, and it\ndoesn\u0027t have tests. If we want it back, we should add it back properly.\n\nThis also makes the tests\u0027 directory structure look more like reality.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2868663002\n"
    },
    {
      "commit": "66338449f4d727da096422c1df1b6654224d6512",
      "tree": "7e21e2cfe2729356a60632899afbad2630b08730",
      "parents": [
        "5cdf9803d55420f3ae8d2e0dd524bc2de9c7284b"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon May 08 20:29:29 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon May 08 20:29:29 2017"
      },
      "message": "[bootstrap] don\u0027t change directories when bootstrapping.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2865833002\n"
    },
    {
      "commit": "5cdf9803d55420f3ae8d2e0dd524bc2de9c7284b",
      "tree": "eea71e7ce901d80ea7cbf468e31f7fdd4dc16aa0",
      "parents": [
        "2dc658ad29ce38a0364540d85d05dc3a2ab87f16"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat May 06 02:56:33 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat May 06 02:56:33 2017"
      },
      "message": "Minor loader improvements.\n\nThis allows recipe_modules to do:\n  from recipe_engine.recipe_api import RecipeApi\n\n  class MyApi(RecipeApi):\n    ...\n\nWithout explosion.\n\nThis will also raise a useful exception if a recipe script is missing GenTests\nand/or RunSteps.\n\nR\u003ddnj@chromium.org, martiniss@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2864803003\n"
    },
    {
      "commit": "2dc658ad29ce38a0364540d85d05dc3a2ab87f16",
      "tree": "4f34664d0df615316b17f3d8523f0d475a59d527",
      "parents": [
        "2dba35d569811216433ebd96760f3e9bde78b7e9"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri May 05 22:04:48 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri May 05 22:04:48 2017"
      },
      "message": "[recipe_engine/step] Add ability for recipe engine invocation to inject paths.\n\nThis allows callers (like kitchen / annotated_run) to cause some paths to\nalways appear at the beginning of PATH. This will be used to work around\npathological interactions between us bootstrapping standard tools (like git)\non $PATH when invoking recipes, vs. recipes putting things like depot_tools\ninto $PATH for some subcommands. In particular, this will allow us to use\nan infra-supplied git or python in preference to depot_tools\u0027\nself-bootstrapping logic, which is undesirable on bots.\n\nRecipes DO need to be able to put depot_tools onto PATH so that e.g. the git\nmodule is able to expose things like `git-cl` to recipes (and expose the\nrecipe.cfg pinned version of those tools), but currently doing this ALSO\ncauses the need for things like \u0027ensure git tooling\u0027 steps which are\nundesirable and flaky to boot.\n\nR\u003ddnj@chromium.org, martiniss@chromium.org, nodir@chromium.org, phajdan.jr@chromium.org\nBUG\u003d635421\n\nReview-Url: https://codereview.chromium.org/2863673003\n"
    },
    {
      "commit": "2dba35d569811216433ebd96760f3e9bde78b7e9",
      "tree": "019459a894d80378b9ac9d011e7e6a164047085c",
      "parents": [
        "a582c6db898c82dec83aeb353431fc51d62591e6"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri May 05 21:06:14 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri May 05 21:06:14 2017"
      },
      "message": "[PROPERTIES] Allow declaration of $package_name/module properties.\n\nThis allows properties (like path\u0027s `$recipe_engine/path` property) to\nbe formally supported as normal PROPERTIES declarations.\n\nR\u003ddnj@chromium.org, martiniss@chromium.org, nodir@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2859373002\n"
    },
    {
      "commit": "a582c6db898c82dec83aeb353431fc51d62591e6",
      "tree": "42fae58ffb353bd8eaeeeae572be5cd2357497c1",
      "parents": [
        "af7abb5d24a477ca062c054034fe6b5cd44f17c5"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed May 03 01:12:56 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed May 03 01:12:56 2017"
      },
      "message": "[doc] fix doc to work in all known repos.\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2856003002\n"
    },
    {
      "commit": "af7abb5d24a477ca062c054034fe6b5cd44f17c5",
      "tree": "996288e607f273ad469214f3541842ba8b1cdf4e",
      "parents": [
        "991fdf7d421a863eff087df095d0fd76b1cf3104"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue May 02 00:29:06 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 02 00:29:06 2017"
      },
      "message": "[doc] Initial markdown doc generation.\n\nR\u003ddnj@chromium.org, martiniss@chromium.org, nodir@chromium.org, phajdan.jr@chromium.org\nBUG\u003d593545\n\nReview-Url: https://codereview.chromium.org/2818343002\n"
    },
    {
      "commit": "991fdf7d421a863eff087df095d0fd76b1cf3104",
      "tree": "2fb8703ceda7991a6912cfbc4e8642c799dc3482",
      "parents": [
        "6816f322872665a9646feef369819f9c010b6ba1"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon May 01 19:59:54 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon May 01 19:59:54 2017"
      },
      "message": "[fetch] capture stderr to reduce extraneous noise.\n\nThis should hide scary-looking but innocuous stderr noise under normal\noperation.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2841423002\n"
    },
    {
      "commit": "6816f322872665a9646feef369819f9c010b6ba1",
      "tree": "10349551a895562567222b588e09eb51bf415361",
      "parents": [
        "11737a0978310326dcf0607c7532ade24f696c3d"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@google.com",
        "time": "Mon May 01 18:53:06 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon May 01 18:53:06 2017"
      },
      "message": "vpython: Add pyOpenSSL, pull in Windows bugfix.\n\nAdd pyOpenSSL to wheel spec. This should fully enable OpenSSL w/ SNI and\nremove the warning message.\n\nAdditionally, bump \"vpython\" version to pull in a Windows 64-bit /\n32-bit bugfix:\nhttps://chromium-review.googlesource.com/c/490654/\n\nBUG\u003dNone\nTEST\u003dNone\n\nReview-Url: https://codereview.chromium.org/2849093002\n"
    },
    {
      "commit": "11737a0978310326dcf0607c7532ade24f696c3d",
      "tree": "35d03e4e19ced3a3fd01ba2bed5a4a0d25f8b56a",
      "parents": [
        "974abeac59bf52bfc6e3e9cee01fa729156154f4"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 29 19:46:39 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 29 19:46:39 2017"
      },
      "message": "[lint] Fix lint to not raise an exception at the end.\n\nAlso whitelist \u0027ast\u0027, which is harmless and used in some repos.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2845023002\n"
    },
    {
      "commit": "974abeac59bf52bfc6e3e9cee01fa729156154f4",
      "tree": "7f369b5cd57598f682aa265672d31354c693c694",
      "parents": [
        "67155798c0f28a983602c6c4760cacb82620b9be"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 29 19:38:41 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 29 19:38:41 2017"
      },
      "message": "[recipes.py] use argparse to set command automatically.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2845923002\n"
    },
    {
      "commit": "67155798c0f28a983602c6c4760cacb82620b9be",
      "tree": "25a56c93b7be1de7d32e6f936d37105e566d338c",
      "parents": [
        "b88c9ec7e384c253a3d7839e00281c981f0eb87b"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 29 19:08:25 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 29 19:08:25 2017"
      },
      "message": "[test] add tests for test subcommand parsing.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2844133004\n"
    },
    {
      "commit": "b88c9ec7e384c253a3d7839e00281c981f0eb87b",
      "tree": "2ac2b2753042c1fc0079137f88289aca1b43b1ad",
      "parents": [
        "aa45f3d6a7daaf1d32c1efeda9645e2f134fc959"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 29 18:54:17 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 29 18:54:17 2017"
      },
      "message": "[fetch] add tests for fetch subcommand parsing.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2844203002\n"
    },
    {
      "commit": "aa45f3d6a7daaf1d32c1efeda9645e2f134fc959",
      "tree": "bb20a7d749eeb5a6360c44cfc81a41ebcca1c033",
      "parents": [
        "73d1232b112d420c35023b2c8536f7f473cc61d0"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 29 18:37:28 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 29 18:37:28 2017"
      },
      "message": "[autoroll] add tests for autoroll subcommand parsing.\n\nAlso convert output-json to a argparse.FileType while I\u0027m at it.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2841373002\n"
    },
    {
      "commit": "73d1232b112d420c35023b2c8536f7f473cc61d0",
      "tree": "b4bd520474d46135b16ea37d88686eeb81541f34",
      "parents": [
        "088cc7b5423bcf53a6545ac3483ed2a891ae723f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 29 17:57:41 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 29 17:57:41 2017"
      },
      "message": "[recipes.py] move common arg parsing to separate module.\n\nThis will allow easier testing in upcoming patchsets.\n\nR\u003ddnj@chromium.org, phajdan.jr@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2839423002\n"
    }
  ],
  "next": "088cc7b5423bcf53a6545ac3483ed2a891ae723f"
}
