• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[
2  {
3    "cmd": [
4      "python",
5      "-u",
6      "import os\nprint(os.environ.get('SWARMING_BOT_ID', ''))\n"
7    ],
8    "name": "get swarming bot id",
9    "~followup_annotations": [
10      "@@@STEP_LOG_LINE@python.inline@import os@@@",
11      "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_BOT_ID', ''))@@@",
12      "@@@STEP_LOG_END@python.inline@@@"
13    ]
14  },
15  {
16    "cmd": [
17      "/opt/infra-android/tools/adb",
18      "push",
19      "file.txt",
20      "file.txt"
21    ],
22    "cwd": "[START_DIR]/skia",
23    "env": {
24      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
25      "CHROME_HEADLESS": "1",
26      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
27    },
28    "infra_step": true,
29    "name": "push file.txt file.txt"
30  },
31  {
32    "cmd": [
33      "/opt/infra-android/tools/adb",
34      "shell",
35      "cat",
36      "file.txt"
37    ],
38    "cwd": "[START_DIR]/skia",
39    "env": {
40      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
41      "CHROME_HEADLESS": "1",
42      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
43    },
44    "infra_step": true,
45    "name": "read file.txt"
46  },
47  {
48    "cmd": [
49      "python",
50      "-u",
51      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
52      "/opt/infra-android/tools/adb",
53      "file.txt"
54    ],
55    "env": {
56      "CHROME_HEADLESS": "1",
57      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
58    },
59    "infra_step": true,
60    "name": "rm file.txt",
61    "~followup_annotations": [
62      "@@@STEP_LOG_LINE@python.inline@@@@",
63      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
64      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
65      "@@@STEP_LOG_LINE@python.inline@@@@",
66      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
67      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
68      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
69      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
70      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
71      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
72      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
73      "@@@STEP_LOG_LINE@python.inline@@@@",
74      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
75      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
76      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
77      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
78      "@@@STEP_LOG_LINE@python.inline@try:@@@",
79      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
80      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
81      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
82      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
83      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
84      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
85      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
86      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
87      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
88      "@@@STEP_LOG_END@python.inline@@@"
89    ]
90  },
91  {
92    "cmd": [
93      "vpython",
94      "-u",
95      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
96      "--json-output",
97      "/path/to/tmp/json",
98      "rmtree",
99      "results_dir"
100    ],
101    "infra_step": true,
102    "name": "rmtree results_dir"
103  },
104  {
105    "cmd": [
106      "vpython",
107      "-u",
108      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
109      "--json-output",
110      "/path/to/tmp/json",
111      "ensure-directory",
112      "--mode",
113      "0777",
114      "results_dir"
115    ],
116    "infra_step": true,
117    "name": "makedirs results_dir"
118  },
119  {
120    "cmd": [
121      "python",
122      "-u",
123      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
124      "/opt/infra-android/tools/adb",
125      "device_results_dir"
126    ],
127    "env": {
128      "CHROME_HEADLESS": "1",
129      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
130    },
131    "infra_step": true,
132    "name": "rm device_results_dir",
133    "~followup_annotations": [
134      "@@@STEP_LOG_LINE@python.inline@@@@",
135      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
136      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
137      "@@@STEP_LOG_LINE@python.inline@@@@",
138      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
139      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
140      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
141      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
142      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
143      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
144      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
145      "@@@STEP_LOG_LINE@python.inline@@@@",
146      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
147      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
148      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
149      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
150      "@@@STEP_LOG_LINE@python.inline@try:@@@",
151      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
152      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
153      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
154      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
155      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
156      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
157      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
158      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
159      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
160      "@@@STEP_LOG_END@python.inline@@@"
161    ]
162  },
163  {
164    "cmd": [
165      "/opt/infra-android/tools/adb",
166      "shell",
167      "mkdir",
168      "-p",
169      "device_results_dir"
170    ],
171    "cwd": "[START_DIR]/skia",
172    "env": {
173      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
174      "CHROME_HEADLESS": "1",
175      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
176    },
177    "infra_step": true,
178    "name": "mkdir device_results_dir"
179  },
180  {
181    "cmd": [
182      "/opt/infra-android/tools/adb",
183      "shell",
184      "mkdir",
185      "-p",
186      "/sdcard/revenge_of_the_skiabot/resources"
187    ],
188    "cwd": "[START_DIR]/skia",
189    "env": {
190      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
191      "CHROME_HEADLESS": "1",
192      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
193    },
194    "infra_step": true,
195    "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
196  },
197  {
198    "cmd": [
199      "python",
200      "-u",
201      "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ncpu = int(sys.argv[2])\ngov = sys.argv[3]\n\nlog = subprocess.check_output([ADB, 'root'])\n# check for message like 'adbd cannot run as root in production builds'\nprint(log)\nif 'cannot' in log:\n  raise Exception('adb root failed')\n\nsubprocess.check_output([ADB, 'shell', 'echo \"%s\" > '\n    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (gov, cpu)])\nactual_gov = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % cpu]).strip()\nif actual_gov != gov:\n  raise Exception('(actual, expected) (%s, %s)'\n                  % (actual_gov, gov))\n",
202      "/opt/infra-android/tools/adb",
203      "0",
204      "hotplug"
205    ],
206    "env": {
207      "CHROME_HEADLESS": "1",
208      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
209    },
210    "infra_step": true,
211    "name": "Set CPU 0's governor to hotplug",
212    "timeout": 30,
213    "~followup_annotations": [
214      "@@@STEP_LOG_LINE@python.inline@@@@",
215      "@@@STEP_LOG_LINE@python.inline@import os@@@",
216      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
217      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
218      "@@@STEP_LOG_LINE@python.inline@import time@@@",
219      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
220      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
221      "@@@STEP_LOG_LINE@python.inline@gov = sys.argv[3]@@@",
222      "@@@STEP_LOG_LINE@python.inline@@@@",
223      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
224      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
225      "@@@STEP_LOG_LINE@python.inline@print(log)@@@",
226      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
227      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
228      "@@@STEP_LOG_LINE@python.inline@@@@",
229      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo \"%s\" > '@@@",
230      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (gov, cpu)])@@@",
231      "@@@STEP_LOG_LINE@python.inline@actual_gov = subprocess.check_output([ADB, 'shell', 'cat '@@@",
232      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % cpu]).strip()@@@",
233      "@@@STEP_LOG_LINE@python.inline@if actual_gov != gov:@@@",
234      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %s)'@@@",
235      "@@@STEP_LOG_LINE@python.inline@                  % (actual_gov, gov))@@@",
236      "@@@STEP_LOG_END@python.inline@@@"
237    ]
238  },
239  {
240    "cmd": [
241      "/opt/infra-android/tools/adb",
242      "push",
243      "[START_DIR]/build/dm",
244      "/data/local/tmp/"
245    ],
246    "cwd": "[START_DIR]/skia",
247    "env": {
248      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
249      "CHROME_HEADLESS": "1",
250      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
251    },
252    "infra_step": true,
253    "name": "push dm"
254  },
255  {
256    "cmd": [
257      "vpython",
258      "-u",
259      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
260      "--json-output",
261      "/path/to/tmp/json",
262      "glob",
263      "[START_DIR]/skia/resources",
264      "*"
265    ],
266    "infra_step": true,
267    "name": "ls [START_DIR]/skia/resources/*",
268    "~followup_annotations": [
269      "@@@STEP_LOG_LINE@glob@[START_DIR]/skia/resources/bar.jpg@@@",
270      "@@@STEP_LOG_LINE@glob@[START_DIR]/skia/resources/foo.png@@@",
271      "@@@STEP_LOG_END@glob@@@"
272    ]
273  },
274  {
275    "cmd": [
276      "/opt/infra-android/tools/adb",
277      "push",
278      "[START_DIR]/skia/resources/bar.jpg",
279      "[START_DIR]/skia/resources/foo.png",
280      "/sdcard/revenge_of_the_skiabot/resources"
281    ],
282    "cwd": "[START_DIR]/skia",
283    "env": {
284      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
285      "CHROME_HEADLESS": "1",
286      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
287    },
288    "infra_step": true,
289    "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources"
290  },
291  {
292    "cmd": [
293      "vpython",
294      "-u",
295      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
296      "--json-output",
297      "/path/to/tmp/json",
298      "copy",
299      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
300      "/path/to/tmp/"
301    ],
302    "infra_step": true,
303    "name": "Get skp VERSION",
304    "~followup_annotations": [
305      "@@@STEP_LOG_LINE@VERSION@42@@@",
306      "@@@STEP_LOG_END@VERSION@@@"
307    ]
308  },
309  {
310    "cmd": [
311      "vpython",
312      "-u",
313      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
314      "--json-output",
315      "/path/to/tmp/json",
316      "copy",
317      "42",
318      "[START_DIR]/tmp/SKP_VERSION"
319    ],
320    "infra_step": true,
321    "name": "write SKP_VERSION",
322    "~followup_annotations": [
323      "@@@STEP_LOG_LINE@SKP_VERSION@42@@@",
324      "@@@STEP_LOG_END@SKP_VERSION@@@"
325    ]
326  },
327  {
328    "cmd": [
329      "/opt/infra-android/tools/adb",
330      "shell",
331      "cat",
332      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
333    ],
334    "cwd": "[START_DIR]/skia",
335    "env": {
336      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
337      "CHROME_HEADLESS": "1",
338      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
339    },
340    "infra_step": true,
341    "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION"
342  },
343  {
344    "cmd": [
345      "python",
346      "-u",
347      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
348      "/opt/infra-android/tools/adb",
349      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
350    ],
351    "env": {
352      "CHROME_HEADLESS": "1",
353      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
354    },
355    "infra_step": true,
356    "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION",
357    "~followup_annotations": [
358      "@@@STEP_LOG_LINE@python.inline@@@@",
359      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
360      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
361      "@@@STEP_LOG_LINE@python.inline@@@@",
362      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
363      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
364      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
365      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
366      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
367      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
368      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
369      "@@@STEP_LOG_LINE@python.inline@@@@",
370      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
371      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
372      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
373      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
374      "@@@STEP_LOG_LINE@python.inline@try:@@@",
375      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
376      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
377      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
378      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
379      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
380      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
381      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
382      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
383      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
384      "@@@STEP_LOG_END@python.inline@@@"
385    ]
386  },
387  {
388    "cmd": [
389      "python",
390      "-u",
391      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
392      "/opt/infra-android/tools/adb",
393      "/sdcard/revenge_of_the_skiabot/skps"
394    ],
395    "env": {
396      "CHROME_HEADLESS": "1",
397      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
398    },
399    "infra_step": true,
400    "name": "rm /sdcard/revenge_of_the_skiabot/skps",
401    "~followup_annotations": [
402      "@@@STEP_LOG_LINE@python.inline@@@@",
403      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
404      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
405      "@@@STEP_LOG_LINE@python.inline@@@@",
406      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
407      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
408      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
409      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
410      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
411      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
412      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
413      "@@@STEP_LOG_LINE@python.inline@@@@",
414      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
415      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
416      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
417      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
418      "@@@STEP_LOG_LINE@python.inline@try:@@@",
419      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
420      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
421      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
422      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
423      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
424      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
425      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
426      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
427      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
428      "@@@STEP_LOG_END@python.inline@@@"
429    ]
430  },
431  {
432    "cmd": [
433      "/opt/infra-android/tools/adb",
434      "shell",
435      "mkdir",
436      "-p",
437      "/sdcard/revenge_of_the_skiabot/skps"
438    ],
439    "cwd": "[START_DIR]/skia",
440    "env": {
441      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
442      "CHROME_HEADLESS": "1",
443      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
444    },
445    "infra_step": true,
446    "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
447  },
448  {
449    "cmd": [
450      "vpython",
451      "-u",
452      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
453      "--json-output",
454      "/path/to/tmp/json",
455      "glob",
456      "[START_DIR]/skp",
457      "*"
458    ],
459    "infra_step": true,
460    "name": "ls [START_DIR]/skp/*",
461    "~followup_annotations": [
462      "@@@STEP_LOG_LINE@glob@[START_DIR]/skp/bar.jpg@@@",
463      "@@@STEP_LOG_LINE@glob@[START_DIR]/skp/foo.png@@@",
464      "@@@STEP_LOG_END@glob@@@"
465    ]
466  },
467  {
468    "cmd": [
469      "/opt/infra-android/tools/adb",
470      "push",
471      "[START_DIR]/skp/bar.jpg",
472      "[START_DIR]/skp/foo.png",
473      "/sdcard/revenge_of_the_skiabot/skps"
474    ],
475    "cwd": "[START_DIR]/skia",
476    "env": {
477      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
478      "CHROME_HEADLESS": "1",
479      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
480    },
481    "infra_step": true,
482    "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps"
483  },
484  {
485    "cmd": [
486      "/opt/infra-android/tools/adb",
487      "push",
488      "[START_DIR]/tmp/SKP_VERSION",
489      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
490    ],
491    "cwd": "[START_DIR]/skia",
492    "env": {
493      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
494      "CHROME_HEADLESS": "1",
495      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
496    },
497    "infra_step": true,
498    "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
499  },
500  {
501    "cmd": [
502      "vpython",
503      "-u",
504      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
505      "--json-output",
506      "/path/to/tmp/json",
507      "copy",
508      "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
509      "/path/to/tmp/"
510    ],
511    "infra_step": true,
512    "name": "Get skimage VERSION",
513    "~followup_annotations": [
514      "@@@STEP_LOG_LINE@VERSION@42@@@",
515      "@@@STEP_LOG_END@VERSION@@@"
516    ]
517  },
518  {
519    "cmd": [
520      "vpython",
521      "-u",
522      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
523      "--json-output",
524      "/path/to/tmp/json",
525      "copy",
526      "42",
527      "[START_DIR]/tmp/SK_IMAGE_VERSION"
528    ],
529    "infra_step": true,
530    "name": "write SK_IMAGE_VERSION",
531    "~followup_annotations": [
532      "@@@STEP_LOG_LINE@SK_IMAGE_VERSION@42@@@",
533      "@@@STEP_LOG_END@SK_IMAGE_VERSION@@@"
534    ]
535  },
536  {
537    "cmd": [
538      "/opt/infra-android/tools/adb",
539      "shell",
540      "cat",
541      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
542    ],
543    "cwd": "[START_DIR]/skia",
544    "env": {
545      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
546      "CHROME_HEADLESS": "1",
547      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
548    },
549    "infra_step": true,
550    "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
551  },
552  {
553    "cmd": [
554      "python",
555      "-u",
556      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
557      "/opt/infra-android/tools/adb",
558      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
559    ],
560    "env": {
561      "CHROME_HEADLESS": "1",
562      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
563    },
564    "infra_step": true,
565    "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
566    "~followup_annotations": [
567      "@@@STEP_LOG_LINE@python.inline@@@@",
568      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
569      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
570      "@@@STEP_LOG_LINE@python.inline@@@@",
571      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
572      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
573      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
574      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
575      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
576      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
577      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
578      "@@@STEP_LOG_LINE@python.inline@@@@",
579      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
580      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
581      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
582      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
583      "@@@STEP_LOG_LINE@python.inline@try:@@@",
584      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
585      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
586      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
587      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
588      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
589      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
590      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
591      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
592      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
593      "@@@STEP_LOG_END@python.inline@@@"
594    ]
595  },
596  {
597    "cmd": [
598      "python",
599      "-u",
600      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
601      "/opt/infra-android/tools/adb",
602      "/sdcard/revenge_of_the_skiabot/images"
603    ],
604    "env": {
605      "CHROME_HEADLESS": "1",
606      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
607    },
608    "infra_step": true,
609    "name": "rm /sdcard/revenge_of_the_skiabot/images",
610    "~followup_annotations": [
611      "@@@STEP_LOG_LINE@python.inline@@@@",
612      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
613      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
614      "@@@STEP_LOG_LINE@python.inline@@@@",
615      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
616      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
617      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
618      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
619      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
620      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
621      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
622      "@@@STEP_LOG_LINE@python.inline@@@@",
623      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
624      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
625      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
626      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
627      "@@@STEP_LOG_LINE@python.inline@try:@@@",
628      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
629      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
630      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
631      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
632      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
633      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
634      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
635      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
636      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
637      "@@@STEP_LOG_END@python.inline@@@"
638    ]
639  },
640  {
641    "cmd": [
642      "/opt/infra-android/tools/adb",
643      "shell",
644      "mkdir",
645      "-p",
646      "/sdcard/revenge_of_the_skiabot/images"
647    ],
648    "cwd": "[START_DIR]/skia",
649    "env": {
650      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
651      "CHROME_HEADLESS": "1",
652      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
653    },
654    "infra_step": true,
655    "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
656  },
657  {
658    "cmd": [
659      "vpython",
660      "-u",
661      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
662      "--json-output",
663      "/path/to/tmp/json",
664      "glob",
665      "[START_DIR]/skimage",
666      "*"
667    ],
668    "infra_step": true,
669    "name": "ls [START_DIR]/skimage/*",
670    "~followup_annotations": [
671      "@@@STEP_LOG_LINE@glob@[START_DIR]/skimage/bar.jpg@@@",
672      "@@@STEP_LOG_LINE@glob@[START_DIR]/skimage/foo.png@@@",
673      "@@@STEP_LOG_END@glob@@@"
674    ]
675  },
676  {
677    "cmd": [
678      "/opt/infra-android/tools/adb",
679      "push",
680      "[START_DIR]/skimage/bar.jpg",
681      "[START_DIR]/skimage/foo.png",
682      "/sdcard/revenge_of_the_skiabot/images"
683    ],
684    "cwd": "[START_DIR]/skia",
685    "env": {
686      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
687      "CHROME_HEADLESS": "1",
688      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
689    },
690    "infra_step": true,
691    "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images"
692  },
693  {
694    "cmd": [
695      "/opt/infra-android/tools/adb",
696      "push",
697      "[START_DIR]/tmp/SK_IMAGE_VERSION",
698      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
699    ],
700    "cwd": "[START_DIR]/skia",
701    "env": {
702      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
703      "CHROME_HEADLESS": "1",
704      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
705    },
706    "infra_step": true,
707    "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
708  },
709  {
710    "cmd": [
711      "vpython",
712      "-u",
713      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
714      "--json-output",
715      "/path/to/tmp/json",
716      "copy",
717      "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
718      "/path/to/tmp/"
719    ],
720    "infra_step": true,
721    "name": "Get svg VERSION",
722    "~followup_annotations": [
723      "@@@STEP_LOG_LINE@VERSION@42@@@",
724      "@@@STEP_LOG_END@VERSION@@@"
725    ]
726  },
727  {
728    "cmd": [
729      "vpython",
730      "-u",
731      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
732      "--json-output",
733      "/path/to/tmp/json",
734      "copy",
735      "42",
736      "[START_DIR]/tmp/SVG_VERSION"
737    ],
738    "infra_step": true,
739    "name": "write SVG_VERSION",
740    "~followup_annotations": [
741      "@@@STEP_LOG_LINE@SVG_VERSION@42@@@",
742      "@@@STEP_LOG_END@SVG_VERSION@@@"
743    ]
744  },
745  {
746    "cmd": [
747      "/opt/infra-android/tools/adb",
748      "shell",
749      "cat",
750      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
751    ],
752    "cwd": "[START_DIR]/skia",
753    "env": {
754      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
755      "CHROME_HEADLESS": "1",
756      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
757    },
758    "infra_step": true,
759    "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION"
760  },
761  {
762    "cmd": [
763      "python",
764      "-u",
765      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
766      "/opt/infra-android/tools/adb",
767      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
768    ],
769    "env": {
770      "CHROME_HEADLESS": "1",
771      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
772    },
773    "infra_step": true,
774    "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION",
775    "~followup_annotations": [
776      "@@@STEP_LOG_LINE@python.inline@@@@",
777      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
778      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
779      "@@@STEP_LOG_LINE@python.inline@@@@",
780      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
781      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
782      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
783      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
784      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
785      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
786      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
787      "@@@STEP_LOG_LINE@python.inline@@@@",
788      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
789      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
790      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
791      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
792      "@@@STEP_LOG_LINE@python.inline@try:@@@",
793      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
794      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
795      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
796      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
797      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
798      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
799      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
800      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
801      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
802      "@@@STEP_LOG_END@python.inline@@@"
803    ]
804  },
805  {
806    "cmd": [
807      "python",
808      "-u",
809      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
810      "/opt/infra-android/tools/adb",
811      "/sdcard/revenge_of_the_skiabot/svgs"
812    ],
813    "env": {
814      "CHROME_HEADLESS": "1",
815      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
816    },
817    "infra_step": true,
818    "name": "rm /sdcard/revenge_of_the_skiabot/svgs",
819    "~followup_annotations": [
820      "@@@STEP_LOG_LINE@python.inline@@@@",
821      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
822      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
823      "@@@STEP_LOG_LINE@python.inline@@@@",
824      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
825      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
826      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
827      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
828      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
829      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
830      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
831      "@@@STEP_LOG_LINE@python.inline@@@@",
832      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
833      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
834      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
835      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
836      "@@@STEP_LOG_LINE@python.inline@try:@@@",
837      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
838      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
839      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
840      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
841      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
842      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
843      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
844      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
845      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
846      "@@@STEP_LOG_END@python.inline@@@"
847    ]
848  },
849  {
850    "cmd": [
851      "/opt/infra-android/tools/adb",
852      "shell",
853      "mkdir",
854      "-p",
855      "/sdcard/revenge_of_the_skiabot/svgs"
856    ],
857    "cwd": "[START_DIR]/skia",
858    "env": {
859      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
860      "CHROME_HEADLESS": "1",
861      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
862    },
863    "infra_step": true,
864    "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
865  },
866  {
867    "cmd": [
868      "vpython",
869      "-u",
870      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
871      "--json-output",
872      "/path/to/tmp/json",
873      "glob",
874      "[START_DIR]/svg",
875      "*"
876    ],
877    "infra_step": true,
878    "name": "ls [START_DIR]/svg/*",
879    "~followup_annotations": [
880      "@@@STEP_LOG_LINE@glob@[START_DIR]/svg/bar.jpg@@@",
881      "@@@STEP_LOG_LINE@glob@[START_DIR]/svg/foo.png@@@",
882      "@@@STEP_LOG_END@glob@@@"
883    ]
884  },
885  {
886    "cmd": [
887      "/opt/infra-android/tools/adb",
888      "push",
889      "[START_DIR]/svg/bar.jpg",
890      "[START_DIR]/svg/foo.png",
891      "/sdcard/revenge_of_the_skiabot/svgs"
892    ],
893    "cwd": "[START_DIR]/skia",
894    "env": {
895      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
896      "CHROME_HEADLESS": "1",
897      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
898    },
899    "infra_step": true,
900    "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs"
901  },
902  {
903    "cmd": [
904      "/opt/infra-android/tools/adb",
905      "push",
906      "[START_DIR]/tmp/SVG_VERSION",
907      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
908    ],
909    "cwd": "[START_DIR]/skia",
910    "env": {
911      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
912      "CHROME_HEADLESS": "1",
913      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
914    },
915    "infra_step": true,
916    "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
917  },
918  {
919    "cmd": [
920      "vpython",
921      "-u",
922      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
923      "--json-output",
924      "/path/to/tmp/json",
925      "copy",
926      "set -x; LD_LIBRARY_PATH=/data/local/tmp/ /data/local/tmp/dm --some-flag; echo $? >/data/local/tmp/rc",
927      "[START_DIR]/tmp/dm.sh"
928    ],
929    "infra_step": true,
930    "name": "write dm.sh",
931    "~followup_annotations": [
932      "@@@STEP_LOG_LINE@dm.sh@set -x; LD_LIBRARY_PATH=/data/local/tmp/ /data/local/tmp/dm --some-flag; echo $? >/data/local/tmp/rc@@@",
933      "@@@STEP_LOG_END@dm.sh@@@"
934    ]
935  },
936  {
937    "cmd": [
938      "/opt/infra-android/tools/adb",
939      "push",
940      "[START_DIR]/tmp/dm.sh",
941      "/data/local/tmp/"
942    ],
943    "cwd": "[START_DIR]/skia",
944    "env": {
945      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
946      "CHROME_HEADLESS": "1",
947      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
948    },
949    "infra_step": true,
950    "name": "push dm.sh"
951  },
952  {
953    "cmd": [
954      "/opt/infra-android/tools/adb",
955      "logcat",
956      "-c"
957    ],
958    "cwd": "[START_DIR]/skia",
959    "env": {
960      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
961      "CHROME_HEADLESS": "1",
962      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
963    },
964    "infra_step": true,
965    "name": "clear log"
966  },
967  {
968    "cmd": [
969      "python",
970      "-u",
971      "\nimport subprocess\nimport sys\nbin_dir = sys.argv[1]\nsh      = sys.argv[2]\nsubprocess.check_call(['/opt/infra-android/tools/adb', 'shell', 'sh', bin_dir + sh])\ntry:\n  sys.exit(int(subprocess.check_output(['/opt/infra-android/tools/adb', 'shell', 'cat',\n                                        bin_dir + 'rc'])))\nexcept ValueError:\n  print(\"Couldn't read the return code.  Probably killed for OOM.\")\n  sys.exit(1)\n",
972      "/data/local/tmp/",
973      "dm.sh"
974    ],
975    "name": "dm",
976    "~followup_annotations": [
977      "@@@STEP_LOG_LINE@python.inline@@@@",
978      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
979      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
980      "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
981      "@@@STEP_LOG_LINE@python.inline@sh      = sys.argv[2]@@@",
982      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['/opt/infra-android/tools/adb', 'shell', 'sh', bin_dir + sh])@@@",
983      "@@@STEP_LOG_LINE@python.inline@try:@@@",
984      "@@@STEP_LOG_LINE@python.inline@  sys.exit(int(subprocess.check_output(['/opt/infra-android/tools/adb', 'shell', 'cat',@@@",
985      "@@@STEP_LOG_LINE@python.inline@                                        bin_dir + 'rc'])))@@@",
986      "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
987      "@@@STEP_LOG_LINE@python.inline@  print(\"Couldn't read the return code.  Probably killed for OOM.\")@@@",
988      "@@@STEP_LOG_LINE@python.inline@  sys.exit(1)@@@",
989      "@@@STEP_LOG_END@python.inline@@@"
990    ]
991  },
992  {
993    "cmd": [],
994    "name": "adb pull"
995  },
996  {
997    "cmd": [
998      "/opt/infra-android/tools/adb",
999      "pull",
1000      "/sdcard/revenge_of_the_skiabot/dm_out",
1001      "[CLEANUP]/adb_pull_tmp_1"
1002    ],
1003    "cwd": "[START_DIR]/skia",
1004    "env": {
1005      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1006      "CHROME_HEADLESS": "1",
1007      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1008    },
1009    "infra_step": true,
1010    "name": "adb pull.pull /sdcard/revenge_of_the_skiabot/dm_out",
1011    "~followup_annotations": [
1012      "@@@STEP_NEST_LEVEL@1@@@"
1013    ]
1014  },
1015  {
1016    "cmd": [
1017      "vpython",
1018      "-u",
1019      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1020      "--json-output",
1021      "/path/to/tmp/json",
1022      "glob",
1023      "[CLEANUP]/adb_pull_tmp_1",
1024      "dm_out/*"
1025    ],
1026    "infra_step": true,
1027    "name": "adb pull.list pulled files",
1028    "~followup_annotations": [
1029      "@@@STEP_NEST_LEVEL@1@@@",
1030      "@@@STEP_LOG_LINE@glob@[CLEANUP]/adb_pull_tmp_1/1.png@@@",
1031      "@@@STEP_LOG_LINE@glob@[CLEANUP]/adb_pull_tmp_1/2.png@@@",
1032      "@@@STEP_LOG_END@glob@@@"
1033    ]
1034  },
1035  {
1036    "cmd": [
1037      "vpython",
1038      "-u",
1039      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1040      "--json-output",
1041      "/path/to/tmp/json",
1042      "copy",
1043      "[CLEANUP]/adb_pull_tmp_1/1.png",
1044      "[START_DIR]/[SWARM_OUT_DIR]"
1045    ],
1046    "infra_step": true,
1047    "name": "adb pull.copy 1.png",
1048    "~followup_annotations": [
1049      "@@@STEP_NEST_LEVEL@1@@@"
1050    ]
1051  },
1052  {
1053    "cmd": [
1054      "vpython",
1055      "-u",
1056      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1057      "--json-output",
1058      "/path/to/tmp/json",
1059      "copy",
1060      "[CLEANUP]/adb_pull_tmp_1/2.png",
1061      "[START_DIR]/[SWARM_OUT_DIR]"
1062    ],
1063    "infra_step": true,
1064    "name": "adb pull.copy 2.png",
1065    "~followup_annotations": [
1066      "@@@STEP_NEST_LEVEL@1@@@"
1067    ]
1068  },
1069  {
1070    "cmd": [
1071      "python",
1072      "-u",
1073      "\nimport os\nimport subprocess\nimport sys\nout = sys.argv[1]\nlog = subprocess.check_output(['/opt/infra-android/tools/adb', 'logcat', '-d'])\nfor line in log.split('\\n'):\n  tokens = line.split()\n  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':\n    addr, path = tokens[-2:]\n    local = os.path.join(out, os.path.basename(path))\n    if os.path.exists(local):\n      try:\n        sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])\n        line = line.replace(addr, addr + ' ' + sym.strip())\n      except subprocess.CalledProcessError:\n        pass\n  print(line)\n",
1074      "[START_DIR]/build"
1075    ],
1076    "env": {
1077      "CHROME_HEADLESS": "1",
1078      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1079    },
1080    "infra_step": true,
1081    "name": "dump log",
1082    "timeout": 300,
1083    "~followup_annotations": [
1084      "@@@STEP_LOG_LINE@python.inline@@@@",
1085      "@@@STEP_LOG_LINE@python.inline@import os@@@",
1086      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
1087      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
1088      "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
1089      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['/opt/infra-android/tools/adb', 'logcat', '-d'])@@@",
1090      "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
1091      "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
1092      "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
1093      "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
1094      "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
1095      "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
1096      "@@@STEP_LOG_LINE@python.inline@      try:@@@",
1097      "@@@STEP_LOG_LINE@python.inline@        sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
1098      "@@@STEP_LOG_LINE@python.inline@        line = line.replace(addr, addr + ' ' + sym.strip())@@@",
1099      "@@@STEP_LOG_LINE@python.inline@      except subprocess.CalledProcessError:@@@",
1100      "@@@STEP_LOG_LINE@python.inline@        pass@@@",
1101      "@@@STEP_LOG_LINE@python.inline@  print(line)@@@",
1102      "@@@STEP_LOG_END@python.inline@@@"
1103    ]
1104  },
1105  {
1106    "cmd": [
1107      "/opt/infra-android/tools/adb",
1108      "kill-server"
1109    ],
1110    "cwd": "[START_DIR]/skia",
1111    "env": {
1112      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1113      "CHROME_HEADLESS": "1",
1114      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1115    },
1116    "infra_step": true,
1117    "name": "kill adb server"
1118  },
1119  {
1120    "name": "$result"
1121  }
1122]