[config_types.Path] Refactor Path implementation.

This CL significantly simplifies the implementation of the Path
object by removing it's dependency on API, tightening the type and
lifetime of it's global variables, making Path sanitize and
normalize all incoming arguments, and removes the bogus 'config' for
the path module, and makes Path objects no longer special 'config types'.

The new implementation also correctly splits up incoming path arguments
into pieces (so `a.join('some/thing')` and `a.join('some', 'thing')`
now produce identical Paths).

This also finally makes it possible to add a way to get a Path for
an arbitrary string, known to the recipe to be an absolute string.
This is implemented as `cast_to_path` in both the API and TestAPI
subclasses here.

Recipe-Nontrivial-Roll: build_limited
Recipe-Nontrivial-Roll: fuchsia
Recipe-Nontrivial-Roll: infra
Recipe-Nontrivial-Roll: build
Recipe-Nontrivial-Roll: chromiumos
Recipe-Nontrivial-Roll: chrome_release
Recipe-Nontrivial-Roll: pigweed
Change-Id: I69c80bb40b3a62b78bb3873a807da08093d6c63f
Bug: 329113288, 40270001, 40274272
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/recipes-py/+/5121425
Reviewed-by: Rob Mohr <mohrr@google.com>
Commit-Queue: Robbie Iannucci <iannucci@chromium.org>
26 files changed
tree: b19a27adc66db86e14ce8248e2ce5874bcf6c0b8
  1. doc/
  2. infra/
  3. misc/
  4. recipe_engine/
  5. recipe_modules/
  6. recipe_proto/
  7. recipes/
  8. unittests/
  9. .editorconfig
  10. .gitattributes
  11. .gitignore
  12. .pycharm.vpython3
  13. .style.yapf
  14. .vpython3
  15. .vscode.vpython3
  17. codereview.settings
  20. OWNERS
  21. PRESUBMIT.py
  22. pyproject.toml
  23. README.md
  24. README.recipes.md
  25. recipe.warnings
  26. recipes.py


Recipes are a domain-specific language (embedded in Python) for specifying sequences of subprocess calls in a cross-platform and testable way.

They allow writing build flows which integrate with the rest of LUCI.

Documentation for the recipe engine (including this file!). Take a look at the user guide for some hints on how to get started. See the implementation details doc for more detailed implementation information about the recipe engine.


  • Sign the Google CLA.
  • Make sure your user.email and user.name are configured in git config.

Run the following to setup the code review tool and create your first review:

# Get `depot_tools` in $PATH if you don't have it
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git $HOME/src/depot_tools
export PATH="$PATH:$HOME/src/depot_tools"

# Check out the recipe engine repo
git clone https://chromium.googlesource.com/infra/luci/recipes-py $HOME/src/recipes-py

# make your change
cd $HOME/src/recipes-py
git new-branch cool_feature
# hack hack
git commit -a -m "This is awesome"

# This will ask for your Google Account credentials.
git cl upload -s -r joe@example.com
# Wait for approval over email.
# Click "Submit to CQ" button or ask reviewer to do it for you.
# Wait for the change to be tested and landed automatically.

Use git cl help and git cl help <cmd> for more details.