Enable displaying code and varmap information for if/while conditions.

Currently when a check fails where the call trace involves frames in
the condition of an if or a while, those frames will have no code
information displayed, only the file and line number. This is
especially bad if the check is used as a condition as the failing
expression is omitted and no variable information is provided.

Given the following:
def my_check(check, steps_dict, foo, bar):
  if check_arguments(check, foo, bar):
     check(foo in steps_dict and bar in steps_dict)

def check_arguments(check, foo, bar):
  if check(foo) and check(bar):
     check(foo != bar)

Before my_check(check, steps_dict, '', 'x') would result in a check
failure similar to:
      .../my_file.py:14 - my_check()
      .../my_file.py:18 - check_arguments()
      added .../my_file.py:29
        my_check('', 'foo')

Now my_check(check, steps_dict, '', 'x') would result in a check
failure similar to:
      .../my_file.py:14 - my_check()
        `check_arguments(check, foo, bar)`
      .../my_file.py:18 - check_arguments()
        `(check(foo) and check(bar))`
          foo: ''
          bar: 'foo'
      added .../my_file.py:29
        my_check('', 'foo')

Change-Id: Ib14c8f7ff0cb98827ef3c1bfe6f8c955b94f899b
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/recipes-py/+/1526366
Commit-Queue: Garrett Beaty <gbeaty@chromium.org>
Reviewed-by: Robbie Iannucci <iannucci@chromium.org>
2 files changed
tree: fc7affba157008e03d6699973e8bd38573e98fd3
  1. .gitattributes
  2. .gitignore
  3. .vpython
  9. README.md
  10. README.recipes.md
  11. codereview.settings
  12. doc/
  13. infra/
  14. misc/
  15. recipe_engine/
  16. recipe_modules/
  17. recipe_proto/
  18. recipes.py
  19. recipes/
  20. unittests/


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


  • README.md

    This file!

  • doc/

    Documentation for the recipe engine (including this file!). See the design doc for more detailed design information about the recipe engine.

  • infra/

    Chrome infra config files.

  • recipes.py

    The main entry point to the recipe engine. It has many subcommands and flags; run recipes.py -h to see them. Include this in your repository to start using recipes.

  • recipes/

    Recipes in the recipe engine. These are either example recipes, or recipes which are used to test the engine (see run_test.py to see these run)

  • recipe_modules/

    Built in recipe modules. These are very useful when writing recipes; take a look in there, and look at each of their examples subfolders to get an idea how to use them in a recipe.

  • recipe_engine/

    The core functionality of the recipe engine. Noteworthy files include:

    • main.py -- The main entrypoint for the recipe engine.
    • recipes_cfg.proto -- The protobuf file which defines the format of a recipes.cfg file.
    • third_party/ -- third_party code which is vendored into the recipe engine.
    • recipe_api.py -- The api exposed to a recipe module.
    • unittests -- Unittests for the engine.

    There are also several files which correspond to a subcommand of recipes.py; run, and autoroll are some examples.

  • unittests/

    Somewhat poorly named, these are higher level integration tests.


  • 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:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git $HOME/src/depot_tools
export PATH="$PATH:$HOME/src/depot_tools"
git checkout -b work origin/master

# 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.