README.recipes.md
1<!--- AUTOGENERATED BY `./recipes.py test train` -->
2# Repo documentation for [skia]()
3## Table of Contents
4
5**[Recipe Modules](#Recipe-Modules)**
6 * [build](#recipe_modules-build) — Build Skia for various platforms.
7 * [builder_name_schema](#recipe_modules-builder_name_schema)
8 * [checkout](#recipe_modules-checkout)
9 * [docker](#recipe_modules-docker)
10 * [doxygen](#recipe_modules-doxygen)
11 * [env](#recipe_modules-env)
12 * [flavor](#recipe_modules-flavor)
13 * [git](#recipe_modules-git)
14 * [gold_upload](#recipe_modules-gold_upload)
15 * [gsutil](#recipe_modules-gsutil)
16 * [infra](#recipe_modules-infra)
17 * [run](#recipe_modules-run)
18 * [vars](#recipe_modules-vars)
19
20**[Recipes](#Recipes)**
21 * [build:examples/full](#recipes-build_examples_full)
22 * [builder_name_schema:examples/full](#recipes-builder_name_schema_examples_full)
23 * [check_generated_files](#recipes-check_generated_files)
24 * [checkout:examples/full](#recipes-checkout_examples_full)
25 * [compile](#recipes-compile)
26 * [compute_buildstats](#recipes-compute_buildstats)
27 * [compute_test](#recipes-compute_test)
28 * [docker:examples/full](#recipes-docker_examples_full)
29 * [doxygen:examples/full](#recipes-doxygen_examples_full)
30 * [env:examples/full](#recipes-env_examples_full)
31 * [flavor:examples/full](#recipes-flavor_examples_full)
32 * [git:examples/full](#recipes-git_examples_full)
33 * [gold_upload:examples/full](#recipes-gold_upload_examples_full)
34 * [gsutil:examples/full](#recipes-gsutil_examples_full)
35 * [housekeeper](#recipes-housekeeper)
36 * [infra](#recipes-infra)
37 * [infra:examples/full](#recipes-infra_examples_full)
38 * [perf](#recipes-perf)
39 * [perf_pathkit](#recipes-perf_pathkit)
40 * [perf_skottietrace](#recipes-perf_skottietrace)
41 * [perf_skottiewasm_lottieweb](#recipes-perf_skottiewasm_lottieweb)
42 * [recreate_skps](#recipes-recreate_skps) — Recipe for the Skia RecreateSKPs Bot.
43 * [run:examples/full](#recipes-run_examples_full)
44 * [skpbench](#recipes-skpbench)
45 * [sync_and_compile](#recipes-sync_and_compile)
46 * [test](#recipes-test)
47 * [test_canvaskit](#recipes-test_canvaskit)
48 * [test_lottie_web](#recipes-test_lottie_web)
49 * [test_pathkit](#recipes-test_pathkit)
50 * [test_skqp_emulator](#recipes-test_skqp_emulator)
51 * [upload_buildstats_results](#recipes-upload_buildstats_results)
52 * [upload_dm_results](#recipes-upload_dm_results)
53 * [upload_nano_results](#recipes-upload_nano_results)
54 * [vars:examples/full](#recipes-vars_examples_full)
55## Recipe Modules
56
57### *recipe_modules* / [build](/infra/bots/recipe_modules/build)
58
59[DEPS](/infra/bots/recipe_modules/build/__init__.py#5): [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [docker](#recipe_modules-docker), [env](#recipe_modules-env), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
60
61Build Skia for various platforms.
62
63#### **class [BuildApi](/infra/bots/recipe_modules/build/api.py#22)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
64
65— **def [\_\_call\_\_](/infra/bots/recipe_modules/build/api.py#55)(self, checkout_root, out_dir):**
66
67Compile the code.
68
69— **def [copy\_build\_products](/infra/bots/recipe_modules/build/api.py#59)(self, out_dir, dst):**
70
71Copy selected build products to dst.
72### *recipe_modules* / [builder\_name\_schema](/infra/bots/recipe_modules/builder_name_schema)
73
74#### **class [BuilderNameSchemaApi](/infra/bots/recipe_modules/builder_name_schema/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
75
76— **def [DictForBuilderName](/infra/bots/recipe_modules/builder_name_schema/api.py#32)(self, \*args, \*\*kwargs):**
77
78— **def [MakeBuilderName](/infra/bots/recipe_modules/builder_name_schema/api.py#29)(self, \*\*kwargs):**
79### *recipe_modules* / [checkout](/infra/bots/recipe_modules/checkout)
80
81[DEPS](/infra/bots/recipe_modules/checkout/__init__.py#5): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
82
83#### **class [CheckoutApi](/infra/bots/recipe_modules/checkout/api.py#13)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
84
85— **def [assert\_git\_is\_from\_cipd](/infra/bots/recipe_modules/checkout/api.py#20)(self):**
86
87Fail if git is not obtained from CIPD.
88
89— **def [bot\_update](/infra/bots/recipe_modules/checkout/api.py#47)(self, checkout_root, gclient_cache=None, checkout_chromium=False, checkout_flutter=False, extra_gclient_env=None, flutter_android=False):**
90
91Run the steps to obtain a checkout using bot_update.
92
93Args:
94 checkout_root: Root directory where the code will be synced.
95 gclient_cache: Optional, directory of the gclient cache.
96 checkout_chromium: If True, will check out chromium/src.git in addition
97 to the primary repo.
98 checkout_flutter: If True, will checkout flutter in addition to the
99 primary repo.
100 extra_gclient_env: Map of extra environment variable names to their values
101 to supply while running gclient.
102 flutter_android: Indicates that we're checking out flutter for Android.
103
104  **@property**<br>— **def [default\_checkout\_root](/infra/bots/recipe_modules/checkout/api.py#15)(self):**
105
106The default location for cached persistent checkouts.
107
108— **def [git](/infra/bots/recipe_modules/checkout/api.py#34)(self, checkout_root):**
109
110Run the steps to perform a pure-git checkout without DEPS.
111### *recipe_modules* / [docker](/infra/bots/recipe_modules/docker)
112
113[DEPS](/infra/bots/recipe_modules/docker/__init__.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env), [run](#recipe_modules-run)
114
115#### **class [DockerApi](/infra/bots/recipe_modules/docker/api.py#15)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
116
117— **def [mount\_out](/infra/bots/recipe_modules/docker/api.py#27)(self):**
118
119— **def [mount\_src](/infra/bots/recipe_modules/docker/api.py#24)(self):**
120
121— **def [run](/infra/bots/recipe_modules/docker/api.py#32)(self, name, docker_image, src_dir, out_dir, script, args=None, docker_args=None, copies=None, recursive_read=None, attempts=1, match_directory_structure=False):**
122### *recipe_modules* / [doxygen](/infra/bots/recipe_modules/doxygen)
123
124[DEPS](/infra/bots/recipe_modules/doxygen/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run)
125
126#### **class [DoxygenApi](/infra/bots/recipe_modules/doxygen/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
127
128— **def [generate\_and\_upload](/infra/bots/recipe_modules/doxygen/api.py#10)(self, skia_dir):**
129### *recipe_modules* / [env](/infra/bots/recipe_modules/env)
130
131[DEPS](/infra/bots/recipe_modules/env/__init__.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context]
132
133#### **class [EnvApi](/infra/bots/recipe_modules/env/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
134### *recipe_modules* / [flavor](/infra/bots/recipe_modules/flavor)
135
136[DEPS](/infra/bots/recipe_modules/flavor/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [docker](#recipe_modules-docker), [env](#recipe_modules-env), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
137
138#### **class [SkiaFlavorApi](/infra/bots/recipe_modules/flavor/api.py#63)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
139
140— **def [cleanup\_steps](/infra/bots/recipe_modules/flavor/api.py#135)(self):**
141
142— **def [copy\_directory\_contents\_to\_device](/infra/bots/recipe_modules/flavor/api.py#91)(self, host_dir, device_dir):**
143
144— **def [copy\_directory\_contents\_to\_host](/infra/bots/recipe_modules/flavor/api.py#94)(self, device_dir, host_dir):**
145
146— **def [copy\_file\_to\_device](/infra/bots/recipe_modules/flavor/api.py#97)(self, host_path, device_path):**
147
148— **def [create\_clean\_device\_dir](/infra/bots/recipe_modules/flavor/api.py#103)(self, path):**
149
150— **def [create\_clean\_host\_dir](/infra/bots/recipe_modules/flavor/api.py#100)(self, path):**
151
152— **def [device\_path\_join](/infra/bots/recipe_modules/flavor/api.py#88)(self, \*args):**
153
154— **def [get\_flavor](/infra/bots/recipe_modules/flavor/api.py#64)(self, vars_api, app_name):**
155
156Return a flavor utils object specific to the given builder.
157
158— **def [install](/infra/bots/recipe_modules/flavor/api.py#112)(self, skps=False, images=False, lotties=False, svgs=False, resources=False, mskps=False, texttraces=False):**
159
160— **def [read\_file\_on\_device](/infra/bots/recipe_modules/flavor/api.py#106)(self, path, \*\*kwargs):**
161
162— **def [remove\_file\_on\_device](/infra/bots/recipe_modules/flavor/api.py#109)(self, path):**
163
164— **def [setup](/infra/bots/recipe_modules/flavor/api.py#79)(self, app_name):**
165
166— **def [step](/infra/bots/recipe_modules/flavor/api.py#85)(self, name, cmd, \*\*kwargs):**
167### *recipe_modules* / [git](/infra/bots/recipe_modules/git)
168
169[DEPS](/infra/bots/recipe_modules/git/__init__.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [env](#recipe_modules-env)
170
171#### **class [GitApi](/infra/bots/recipe_modules/git/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
172
173— **def [env](/infra/bots/recipe_modules/git/api.py#10)(self):**
174
175Add Git to PATH
176
177Requires the infra/git and infra/tools/git CIPD packages to be installed
178in the 'git' relative path.
179### *recipe_modules* / [gold\_upload](/infra/bots/recipe_modules/gold_upload)
180
181[DEPS](/infra/bots/recipe_modules/gold_upload/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [gsutil](#recipe_modules-gsutil), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
182
183#### **class [GoldUploadApi](/infra/bots/recipe_modules/gold_upload/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
184
185— **def [upload](/infra/bots/recipe_modules/gold_upload/api.py#12)(self):**
186
187Attempt to upload files to Gold.
188This module assumes setup has occurred for the vars and flavor modules.
189### *recipe_modules* / [gsutil](/infra/bots/recipe_modules/gsutil)
190
191[DEPS](/infra/bots/recipe_modules/gsutil/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
192
193#### **class [GSUtilApi](/infra/bots/recipe_modules/gsutil/api.py#10)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
194
195— **def [\_\_call\_\_](/infra/bots/recipe_modules/gsutil/api.py#11)(self, step_name, \*args):**
196
197Run gsutil with the given args.
198
199— **def [cp](/infra/bots/recipe_modules/gsutil/api.py#17)(self, name, src, dst, extra_args=None, multithread=False):**
200
201Attempt to upload or download files to/from Google Cloud Storage (GCS).
202
203Args:
204 name: string. Will be used to fill out the step name.
205 src: string. Absolute path for a local file or gcs file (e.g. gs://...)
206 dst: string. Same as src.
207 extra_args: optional list of args to be passed to gsutil. e.g. [-Z] asks
208 all files be compressed with gzip after upload and before download.
209 multi_thread: if the -m argument should be used to copy multiple items
210 at once (e.g. gsutil -m cp foo* gs://bar/dir)
211
212If the operation fails, it will be retried multiple times.
213### *recipe_modules* / [infra](/infra/bots/recipe_modules/infra)
214
215[DEPS](/infra/bots/recipe_modules/infra/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
216
217#### **class [InfraApi](/infra/bots/recipe_modules/infra/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
218
219  **@property**<br>— **def [go\_bin](/infra/bots/recipe_modules/infra/api.py#19)(self):**
220
221  **@property**<br>— **def [go\_env](/infra/bots/recipe_modules/infra/api.py#23)(self):**
222
223  **@property**<br>— **def [gopath](/infra/bots/recipe_modules/infra/api.py#33)(self):**
224
225  **@property**<br>— **def [goroot](/infra/bots/recipe_modules/infra/api.py#15)(self):**
226### *recipe_modules* / [run](/infra/bots/recipe_modules/run)
227
228[DEPS](/infra/bots/recipe_modules/run/__init__.py#5): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env), [vars](#recipe_modules-vars)
229
230#### **class [SkiaStepApi](/infra/bots/recipe_modules/run/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
231
232— **def [\_\_call\_\_](/infra/bots/recipe_modules/run/api.py#69)(self, steptype, name, abort_on_failure=True, fail_build_on_failure=True, \*\*kwargs):**
233
234Run a step. If it fails, keep going but mark the build status failed.
235
236— **def [\_\_init\_\_](/infra/bots/recipe_modules/run/api.py#16)(self, \*args, \*\*kwargs):**
237
238Initialize the recipe module.
239
240— **def [asset\_version](/infra/bots/recipe_modules/run/api.py#54)(self, asset_name, skia_dir, test_data=None):**
241
242Return the contents of VERSION for the given asset as a string.
243
244If test_data is not specified, reads the property
245'test_<asset_name>_version' or if not present, uses
246TEST_DEFAULT_ASSET_VERSION.
247
248— **def [check\_failure](/infra/bots/recipe_modules/run/api.py#25)(self):**
249
250Raise an exception if any step failed.
251
252  **@property**<br>— **def [failed\_steps](/infra/bots/recipe_modules/run/api.py#31)(self):**
253
254— **def [readfile](/infra/bots/recipe_modules/run/api.py#40)(self, filename, \*args, \*\*kwargs):**
255
256Convenience function for reading files.
257
258— **def [rmtree](/infra/bots/recipe_modules/run/api.py#50)(self, path):**
259
260Wrapper around api.file.rmtree.
261
262— **def [run\_once](/infra/bots/recipe_modules/run/api.py#35)(self, fn, \*args, \*\*kwargs):**
263
264— **def [with\_retry](/infra/bots/recipe_modules/run/api.py#81)(self, steptype, name, attempts, between_attempts_fn=None, abort_on_failure=True, fail_build_on_failure=True, \*\*kwargs):**
265
266— **def [writefile](/infra/bots/recipe_modules/run/api.py#45)(self, filename, contents):**
267
268Convenience function for writing files.
269### *recipe_modules* / [vars](/infra/bots/recipe_modules/vars)
270
271[DEPS](/infra/bots/recipe_modules/vars/__init__.py#5): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [builder\_name\_schema](#recipe_modules-builder_name_schema)
272
273#### **class [SkiaVarsApi](/infra/bots/recipe_modules/vars/api.py#16)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
274
275  **@property**<br>— **def [is\_linux](/infra/bots/recipe_modules/vars/api.py#88)(self):**
276
277— **def [setup](/infra/bots/recipe_modules/vars/api.py#18)(self):**
278
279Prepare the variables.
280
281  **@property**<br>— **def [swarming\_bot\_id](/infra/bots/recipe_modules/vars/api.py#96)(self):**
282
283  **@property**<br>— **def [swarming\_task\_id](/infra/bots/recipe_modules/vars/api.py#108)(self):**
284## Recipes
285
286### *recipes* / [build:examples/full](/infra/bots/recipe_modules/build/examples/full.py)
287
288[DEPS](/infra/bots/recipe_modules/build/examples/full.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [build](#recipe_modules-build), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
289
290— **def [RunSteps](/infra/bots/recipe_modules/build/examples/full.py#17)(api):**
291### *recipes* / [builder\_name\_schema:examples/full](/infra/bots/recipe_modules/builder_name_schema/examples/full.py)
292
293[DEPS](/infra/bots/recipe_modules/builder_name_schema/examples/full.py#6): [builder\_name\_schema](#recipe_modules-builder_name_schema)
294
295— **def [RunSteps](/infra/bots/recipe_modules/builder_name_schema/examples/full.py#11)(api):**
296### *recipes* / [check\_generated\_files](/infra/bots/recipes/check_generated_files.py)
297
298[DEPS](/infra/bots/recipes/check_generated_files.py#8): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [build](#recipe_modules-build), [checkout](#recipe_modules-checkout), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
299
300— **def [RunSteps](/infra/bots/recipes/check_generated_files.py#24)(api):**
301### *recipes* / [checkout:examples/full](/infra/bots/recipe_modules/checkout/examples/full.py)
302
303[DEPS](/infra/bots/recipe_modules/checkout/examples/full.py#6): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [checkout](#recipe_modules-checkout), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
304
305— **def [RunSteps](/infra/bots/recipe_modules/checkout/examples/full.py#17)(api):**
306### *recipes* / [compile](/infra/bots/recipes/compile.py)
307
308[DEPS](/infra/bots/recipes/compile.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [build](#recipe_modules-build), [checkout](#recipe_modules-checkout), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
309
310— **def [RunSteps](/infra/bots/recipes/compile.py#25)(api):**
311### *recipes* / [compute\_buildstats](/infra/bots/recipes/compute_buildstats.py)
312
313[DEPS](/infra/bots/recipes/compute_buildstats.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [env](#recipe_modules-env), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
314
315— **def [RunSteps](/infra/bots/recipes/compute_buildstats.py#32)(api):**
316
317— **def [add\_binary\_size\_output\_property](/infra/bots/recipes/compute_buildstats.py#28)(result, source, binary_size):**
318
319— **def [analyze\_cpp\_lib](/infra/bots/recipes/compute_buildstats.py#164)(api, checkout_root, out_dir, files):**
320
321— **def [analyze\_flutter\_lib](/infra/bots/recipes/compute_buildstats.py#192)(api, checkout_root, out_dir, files):**
322
323— **def [analyze\_wasm\_file](/infra/bots/recipes/compute_buildstats.py#231)(api, checkout_root, out_dir, files):**
324
325— **def [analyze\_web\_file](/infra/bots/recipes/compute_buildstats.py#137)(api, checkout_root, out_dir, files):**
326
327— **def [keys\_and\_props](/infra/bots/recipes/compute_buildstats.py#113)(api):**
328
329— **def [make\_treemap](/infra/bots/recipes/compute_buildstats.py#263)(api, checkout_root, out_dir, files):**
330### *recipes* / [compute\_test](/infra/bots/recipes/compute_test.py)
331
332[DEPS](/infra/bots/recipes/compute_test.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
333
334— **def [RunSteps](/infra/bots/recipes/compute_test.py#16)(api):**
335### *recipes* / [docker:examples/full](/infra/bots/recipe_modules/docker/examples/full.py)
336
337[DEPS](/infra/bots/recipe_modules/docker/examples/full.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [docker](#recipe_modules-docker), [vars](#recipe_modules-vars)
338
339— **def [RunSteps](/infra/bots/recipe_modules/docker/examples/full.py#15)(api):**
340### *recipes* / [doxygen:examples/full](/infra/bots/recipe_modules/doxygen/examples/full.py)
341
342[DEPS](/infra/bots/recipe_modules/doxygen/examples/full.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [doxygen](#recipe_modules-doxygen), [vars](#recipe_modules-vars)
343
344— **def [RunSteps](/infra/bots/recipe_modules/doxygen/examples/full.py#14)(api):**
345### *recipes* / [env:examples/full](/infra/bots/recipe_modules/env/examples/full.py)
346
347[DEPS](/infra/bots/recipe_modules/env/examples/full.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env)
348
349— **def [RunSteps](/infra/bots/recipe_modules/env/examples/full.py#13)(api):**
350### *recipes* / [flavor:examples/full](/infra/bots/recipe_modules/flavor/examples/full.py)
351
352[DEPS](/infra/bots/recipe_modules/flavor/examples/full.py#6): [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
353
354— **def [RunSteps](/infra/bots/recipe_modules/flavor/examples/full.py#31)(api):**
355
356— **def [test\_exceptions](/infra/bots/recipe_modules/flavor/examples/full.py#16)(api):**
357### *recipes* / [git:examples/full](/infra/bots/recipe_modules/git/examples/full.py)
358
359[DEPS](/infra/bots/recipe_modules/git/examples/full.py#6): [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/step][recipe_engine/recipe_modules/step], [git](#recipe_modules-git)
360
361— **def [RunSteps](/infra/bots/recipe_modules/git/examples/full.py#13)(api):**
362### *recipes* / [gold\_upload:examples/full](/infra/bots/recipe_modules/gold_upload/examples/full.py)
363
364[DEPS](/infra/bots/recipe_modules/gold_upload/examples/full.py#9): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
365
366— **def [RunSteps](/infra/bots/recipe_modules/gold_upload/examples/full.py#21)(api):**
367### *recipes* / [gsutil:examples/full](/infra/bots/recipe_modules/gsutil/examples/full.py)
368
369[DEPS](/infra/bots/recipe_modules/gsutil/examples/full.py#9): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [gsutil](#recipe_modules-gsutil), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
370
371— **def [RunSteps](/infra/bots/recipe_modules/gsutil/examples/full.py#20)(api):**
372### *recipes* / [housekeeper](/infra/bots/recipes/housekeeper.py)
373
374[DEPS](/infra/bots/recipes/housekeeper.py#12): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [checkout](#recipe_modules-checkout), [doxygen](#recipe_modules-doxygen), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
375
376— **def [RunSteps](/infra/bots/recipes/housekeeper.py#23)(api):**
377### *recipes* / [infra](/infra/bots/recipes/infra.py)
378
379[DEPS](/infra/bots/recipes/infra.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [infra](#recipe_modules-infra), [vars](#recipe_modules-vars)
380
381— **def [RunSteps](/infra/bots/recipes/infra.py#27)(api):**
382
383— **def [git\_init](/infra/bots/recipes/infra.py#19)(api, repo_root, env):**
384### *recipes* / [infra:examples/full](/infra/bots/recipe_modules/infra/examples/full.py)
385
386[DEPS](/infra/bots/recipe_modules/infra/examples/full.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
387
388— **def [RunSteps](/infra/bots/recipe_modules/infra/examples/full.py#22)(api):**
389### *recipes* / [perf](/infra/bots/recipes/perf.py)
390
391[DEPS](/infra/bots/recipes/perf.py#14): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
392
393— **def [RunSteps](/infra/bots/recipes/perf.py#103)(api):**
394
395— **def [perf\_steps](/infra/bots/recipes/perf.py#30)(api):**
396
397Run Skia benchmarks.
398### *recipes* / [perf\_pathkit](/infra/bots/recipes/perf_pathkit.py)
399
400[DEPS](/infra/bots/recipes/perf_pathkit.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
401
402— **def [RunSteps](/infra/bots/recipes/perf_pathkit.py#26)(api):**
403### *recipes* / [perf\_skottietrace](/infra/bots/recipes/perf_skottietrace.py)
404
405[DEPS](/infra/bots/recipes/perf_skottietrace.py#15): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
406
407— **def [RunSteps](/infra/bots/recipes/perf_skottietrace.py#221)(api):**
408
409— **def [get\_trace\_match](/infra/bots/recipes/perf_skottietrace.py#130)(lottie_filename, is_android):**
410
411Returns the DM regex to match the specified lottie file name.
412
413— **def [parse\_trace](/infra/bots/recipes/perf_skottietrace.py#145)(trace_json, lottie_filename, api):**
414
415parse_trace parses the specified trace JSON.
416
417Parses the trace JSON and calculates the time of a single frame. Frame time is
418considered the same as seek time + render time.
419Note: The first seek is ignored because it is a constructor call.
420
421A dictionary is returned that has the following structure:
422{
423 'frame_max_us': 100,
424 'frame_min_us': 90,
425 'frame_avg_us': 95,
426}
427
428— **def [perf\_steps](/infra/bots/recipes/perf_skottietrace.py#35)(api):**
429
430Run DM on lottie files with tracing turned on and then parse the output.
431### *recipes* / [perf\_skottiewasm\_lottieweb](/infra/bots/recipes/perf_skottiewasm_lottieweb.py)
432
433[DEPS](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#12): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [checkout](#recipe_modules-checkout), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
434
435— **def [RunSteps](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#82)(api):**
436
437— **def [parse\_trace](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#207)(trace_json, lottie_filename, api, renderer):**
438
439parse_trace parses the specified trace JSON.
440
441Parses the trace JSON and calculates the time of a single frame.
442A dictionary is returned that has the following structure:
443{
444 'frame_max_us': 100,
445 'frame_min_us': 90,
446 'frame_avg_us': 95,
447}
448### *recipes* / [recreate\_skps](/infra/bots/recipes/recreate_skps.py)
449
450[DEPS](/infra/bots/recipes/recreate_skps.py#9): [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
451
452Recipe for the Skia RecreateSKPs Bot.
453
454— **def [RunSteps](/infra/bots/recipes/recreate_skps.py#35)(api):**
455### *recipes* / [run:examples/full](/infra/bots/recipe_modules/run/examples/full.py)
456
457[DEPS](/infra/bots/recipe_modules/run/examples/full.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
458
459— **def [RunSteps](/infra/bots/recipe_modules/run/examples/full.py#21)(api):**
460
461— **def [myfunc](/infra/bots/recipe_modules/run/examples/full.py#17)(api, i):**
462### *recipes* / [skpbench](/infra/bots/recipes/skpbench.py)
463
464[DEPS](/infra/bots/recipes/skpbench.py#12): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
465
466— **def [RunSteps](/infra/bots/recipes/skpbench.py#158)(api):**
467
468— **def [skpbench\_steps](/infra/bots/recipes/skpbench.py#41)(api):**
469
470benchmark Skia using skpbench.
471### *recipes* / [sync\_and\_compile](/infra/bots/recipes/sync_and_compile.py)
472
473[DEPS](/infra/bots/recipes/sync_and_compile.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [build](#recipe_modules-build), [checkout](#recipe_modules-checkout), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
474
475— **def [RunSteps](/infra/bots/recipes/sync_and_compile.py#25)(api):**
476### *recipes* / [test](/infra/bots/recipes/test.py)
477
478[DEPS](/infra/bots/recipes/test.py#12): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
479
480— **def [RunSteps](/infra/bots/recipes/test.py#161)(api):**
481
482— **def [test\_steps](/infra/bots/recipes/test.py#30)(api):**
483
484Run the DM test.
485### *recipes* / [test\_canvaskit](/infra/bots/recipes/test_canvaskit.py)
486
487[DEPS](/infra/bots/recipes/test_canvaskit.py#8): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
488
489— **def [RunSteps](/infra/bots/recipes/test_canvaskit.py#28)(api):**
490### *recipes* / [test\_lottie\_web](/infra/bots/recipes/test_lottie_web.py)
491
492[DEPS](/infra/bots/recipes/test_lottie_web.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
493
494— **def [RunSteps](/infra/bots/recipes/test_lottie_web.py#27)(api):**
495### *recipes* / [test\_pathkit](/infra/bots/recipes/test_pathkit.py)
496
497[DEPS](/infra/bots/recipes/test_pathkit.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
498
499— **def [RunSteps](/infra/bots/recipes/test_pathkit.py#28)(api):**
500### *recipes* / [test\_skqp\_emulator](/infra/bots/recipes/test_skqp_emulator.py)
501
502[DEPS](/infra/bots/recipes/test_skqp_emulator.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
503
504— **def [RunSteps](/infra/bots/recipes/test_skqp_emulator.py#25)(api):**
505### *recipes* / [upload\_buildstats\_results](/infra/bots/recipes/upload_buildstats_results.py)
506
507[DEPS](/infra/bots/recipes/upload_buildstats_results.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [vars](#recipe_modules-vars)
508
509— **def [RunSteps](/infra/bots/recipes/upload_buildstats_results.py#20)(api):**
510### *recipes* / [upload\_dm\_results](/infra/bots/recipes/upload_dm_results.py)
511
512[DEPS](/infra/bots/recipes/upload_dm_results.py#12): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [gsutil](#recipe_modules-gsutil), [vars](#recipe_modules-vars)
513
514— **def [RunSteps](/infra/bots/recipes/upload_dm_results.py#28)(api):**
515### *recipes* / [upload\_nano\_results](/infra/bots/recipes/upload_nano_results.py)
516
517[DEPS](/infra/bots/recipes/upload_nano_results.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [vars](#recipe_modules-vars)
518
519— **def [RunSteps](/infra/bots/recipes/upload_nano_results.py#20)(api):**
520### *recipes* / [vars:examples/full](/infra/bots/recipe_modules/vars/examples/full.py)
521
522[DEPS](/infra/bots/recipe_modules/vars/examples/full.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [vars](#recipe_modules-vars)
523
524— **def [RunSteps](/infra/bots/recipe_modules/vars/examples/full.py#15)(api):**
525
526[depot_tools/recipe_modules/bot_update]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/4ea67bbd15c5faffad4797a3dadde6d69f5f36fa/recipes/README.recipes.md#recipe_modules-bot_update
527[depot_tools/recipe_modules/gclient]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/4ea67bbd15c5faffad4797a3dadde6d69f5f36fa/recipes/README.recipes.md#recipe_modules-gclient
528[depot_tools/recipe_modules/git]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/4ea67bbd15c5faffad4797a3dadde6d69f5f36fa/recipes/README.recipes.md#recipe_modules-git
529[depot_tools/recipe_modules/tryserver]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/4ea67bbd15c5faffad4797a3dadde6d69f5f36fa/recipes/README.recipes.md#recipe_modules-tryserver
530[recipe_engine/recipe_modules/context]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-context
531[recipe_engine/recipe_modules/file]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-file
532[recipe_engine/recipe_modules/json]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-json
533[recipe_engine/recipe_modules/path]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-path
534[recipe_engine/recipe_modules/platform]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-platform
535[recipe_engine/recipe_modules/properties]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-properties
536[recipe_engine/recipe_modules/python]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-python
537[recipe_engine/recipe_modules/raw_io]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-raw_io
538[recipe_engine/recipe_modules/step]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-step
539[recipe_engine/recipe_modules/time]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/README.recipes.md#recipe_modules-time
540[recipe_engine/wkt/RecipeApi]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/91d88f5f33de9779cc396cfe0e8d17edb078a8ab/recipe_engine/recipe_api.py#875
541