1[
2  {
3    "cmd": [
4      "adb",
5      "reboot"
6    ],
7    "cwd": "[START_DIR]/skia",
8    "env": {
9      "BUILDTYPE": "Release",
10      "CHROME_HEADLESS": "1",
11      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
12      "SKIA_OUT": "[START_DIR]/out"
13    },
14    "infra_step": true,
15    "name": "rebooting device"
16  },
17  {
18    "cmd": [
19      "python",
20      "-u",
21      "\nimport subprocess\nimport sys\nimport time\n\nkicks = 0\nwhile True:\n\n  times = 0\n  while times < 30:\n    print 'Waiting for the device to be connected and ready.'\n    try:\n      times += 1\n      output = subprocess.check_output(['adb', 'shell',\n                                        'getprop', 'sys.boot_completed'])\n      if '1' in output:\n        print 'Connected'\n        sys.exit(0)\n    except subprocess.CalledProcessError:\n      # no device connected/authorized yet\n      pass\n    time.sleep(5)\n  if kicks >= 3:\n    break\n  print 'Giving the device a \"kick\" by trying to reboot it.'\n  kicks += 1\n  print subprocess.check_output(['adb', 'reboot'])\n\nprint 'Timed out waiting for device'\nsys.exit(1)\n"
22    ],
23    "env": {
24      "BUILDTYPE": "Release",
25      "CHROME_HEADLESS": "1",
26      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
27      "SKIA_OUT": "[START_DIR]/out"
28    },
29    "infra_step": true,
30    "name": "wait for device",
31    "~followup_annotations": [
32      "@@@STEP_LOG_LINE@python.inline@@@@",
33      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
34      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
35      "@@@STEP_LOG_LINE@python.inline@import time@@@",
36      "@@@STEP_LOG_LINE@python.inline@@@@",
37      "@@@STEP_LOG_LINE@python.inline@kicks = 0@@@",
38      "@@@STEP_LOG_LINE@python.inline@while True:@@@",
39      "@@@STEP_LOG_LINE@python.inline@@@@",
40      "@@@STEP_LOG_LINE@python.inline@  times = 0@@@",
41      "@@@STEP_LOG_LINE@python.inline@  while times < 30:@@@",
42      "@@@STEP_LOG_LINE@python.inline@    print 'Waiting for the device to be connected and ready.'@@@",
43      "@@@STEP_LOG_LINE@python.inline@    try:@@@",
44      "@@@STEP_LOG_LINE@python.inline@      times += 1@@@",
45      "@@@STEP_LOG_LINE@python.inline@      output = subprocess.check_output(['adb', 'shell',@@@",
46      "@@@STEP_LOG_LINE@python.inline@                                        'getprop', 'sys.boot_completed'])@@@",
47      "@@@STEP_LOG_LINE@python.inline@      if '1' in output:@@@",
48      "@@@STEP_LOG_LINE@python.inline@        print 'Connected'@@@",
49      "@@@STEP_LOG_LINE@python.inline@        sys.exit(0)@@@",
50      "@@@STEP_LOG_LINE@python.inline@    except subprocess.CalledProcessError:@@@",
51      "@@@STEP_LOG_LINE@python.inline@      # no device connected/authorized yet@@@",
52      "@@@STEP_LOG_LINE@python.inline@      pass@@@",
53      "@@@STEP_LOG_LINE@python.inline@    time.sleep(5)@@@",
54      "@@@STEP_LOG_LINE@python.inline@  if kicks >= 3:@@@",
55      "@@@STEP_LOG_LINE@python.inline@    break@@@",
56      "@@@STEP_LOG_LINE@python.inline@  print 'Giving the device a \"kick\" by trying to reboot it.'@@@",
57      "@@@STEP_LOG_LINE@python.inline@  kicks += 1@@@",
58      "@@@STEP_LOG_LINE@python.inline@  print subprocess.check_output(['adb', 'reboot'])@@@",
59      "@@@STEP_LOG_LINE@python.inline@@@@",
60      "@@@STEP_LOG_LINE@python.inline@print 'Timed out waiting for device'@@@",
61      "@@@STEP_LOG_LINE@python.inline@sys.exit(1)@@@",
62      "@@@STEP_LOG_END@python.inline@@@"
63    ]
64  },
65  {
66    "cmd": [
67      "adb",
68      "shell",
69      "mkdir",
70      "-p",
71      "/sdcard/revenge_of_the_skiabot/resources"
72    ],
73    "cwd": "[START_DIR]/skia",
74    "env": {
75      "BUILDTYPE": "Release",
76      "CHROME_HEADLESS": "1",
77      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
78      "SKIA_OUT": "[START_DIR]/out"
79    },
80    "infra_step": true,
81    "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
82  },
83  {
84    "cmd": [
85      "python",
86      "-u",
87      "\nimport os\nimport subprocess\nimport sys\nhost   = sys.argv[1]\ndevice = sys.argv[2]\nfor d, _, fs in os.walk(host):\n  p = os.path.relpath(d, host)\n  if p != '.' and p.startswith('.'):\n    continue\n  for f in fs:\n    print os.path.join(p,f)\n    subprocess.check_call(['adb', 'push',\n                           os.path.realpath(os.path.join(host, p, f)),\n                           os.path.join(device, p, f)])\n",
88      "[START_DIR]/skia/resources",
89      "/sdcard/revenge_of_the_skiabot/resources"
90    ],
91    "env": {
92      "BUILDTYPE": "Release",
93      "CHROME_HEADLESS": "1",
94      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
95      "SKIA_OUT": "[START_DIR]/out"
96    },
97    "infra_step": true,
98    "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
99    "~followup_annotations": [
100      "@@@STEP_LOG_LINE@python.inline@@@@",
101      "@@@STEP_LOG_LINE@python.inline@import os@@@",
102      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
103      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
104      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
105      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
106      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
107      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
108      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
109      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
110      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
111      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
112      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
113      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
114      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
115      "@@@STEP_LOG_END@python.inline@@@"
116    ]
117  },
118  {
119    "cmd": [
120      "python",
121      "-u",
122      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
123      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
124      "/path/to/tmp/"
125    ],
126    "infra_step": true,
127    "name": "Get downloaded SKP VERSION"
128  },
129  {
130    "cmd": [
131      "python",
132      "-u",
133      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
134      "42",
135      "[START_DIR]/tmp/SKP_VERSION"
136    ],
137    "infra_step": true,
138    "name": "write SKP_VERSION"
139  },
140  {
141    "cmd": [
142      "adb",
143      "shell",
144      "cat",
145      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
146    ],
147    "cwd": "[START_DIR]/skia",
148    "env": {
149      "BUILDTYPE": "Release",
150      "CHROME_HEADLESS": "1",
151      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
152      "SKIA_OUT": "[START_DIR]/out"
153    },
154    "infra_step": true,
155    "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
156    "stdout": "/path/to/tmp/"
157  },
158  {
159    "cmd": [
160      "adb",
161      "shell",
162      "rm",
163      "-f",
164      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
165    ],
166    "cwd": "[START_DIR]/skia",
167    "env": {
168      "BUILDTYPE": "Release",
169      "CHROME_HEADLESS": "1",
170      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
171      "SKIA_OUT": "[START_DIR]/out"
172    },
173    "infra_step": true,
174    "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
175  },
176  {
177    "cmd": [
178      "adb",
179      "shell",
180      "rm",
181      "-rf",
182      "/sdcard/revenge_of_the_skiabot/skps"
183    ],
184    "cwd": "[START_DIR]/skia",
185    "env": {
186      "BUILDTYPE": "Release",
187      "CHROME_HEADLESS": "1",
188      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
189      "SKIA_OUT": "[START_DIR]/out"
190    },
191    "infra_step": true,
192    "name": "rm /sdcard/revenge_of_the_skiabot/skps"
193  },
194  {
195    "cmd": [
196      "adb",
197      "shell",
198      "mkdir",
199      "-p",
200      "/sdcard/revenge_of_the_skiabot/skps"
201    ],
202    "cwd": "[START_DIR]/skia",
203    "env": {
204      "BUILDTYPE": "Release",
205      "CHROME_HEADLESS": "1",
206      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
207      "SKIA_OUT": "[START_DIR]/out"
208    },
209    "infra_step": true,
210    "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
211  },
212  {
213    "cmd": [
214      "python",
215      "-u",
216      "\nimport os\nimport subprocess\nimport sys\nhost   = sys.argv[1]\ndevice = sys.argv[2]\nfor d, _, fs in os.walk(host):\n  p = os.path.relpath(d, host)\n  if p != '.' and p.startswith('.'):\n    continue\n  for f in fs:\n    print os.path.join(p,f)\n    subprocess.check_call(['adb', 'push',\n                           os.path.realpath(os.path.join(host, p, f)),\n                           os.path.join(device, p, f)])\n",
217      "[START_DIR]/skp",
218      "/sdcard/revenge_of_the_skiabot/skps"
219    ],
220    "env": {
221      "BUILDTYPE": "Release",
222      "CHROME_HEADLESS": "1",
223      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
224      "SKIA_OUT": "[START_DIR]/out"
225    },
226    "infra_step": true,
227    "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
228    "~followup_annotations": [
229      "@@@STEP_LOG_LINE@python.inline@@@@",
230      "@@@STEP_LOG_LINE@python.inline@import os@@@",
231      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
232      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
233      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
234      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
235      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
236      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
237      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
238      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
239      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
240      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
241      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
242      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
243      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
244      "@@@STEP_LOG_END@python.inline@@@"
245    ]
246  },
247  {
248    "cmd": [
249      "adb",
250      "push",
251      "[START_DIR]/tmp/SKP_VERSION",
252      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
253    ],
254    "cwd": "[START_DIR]/skia",
255    "env": {
256      "BUILDTYPE": "Release",
257      "CHROME_HEADLESS": "1",
258      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
259      "SKIA_OUT": "[START_DIR]/out"
260    },
261    "infra_step": true,
262    "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
263  },
264  {
265    "cmd": [
266      "python",
267      "-u",
268      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
269      "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
270      "/path/to/tmp/"
271    ],
272    "infra_step": true,
273    "name": "Get downloaded skimage VERSION"
274  },
275  {
276    "cmd": [
277      "python",
278      "-u",
279      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
280      "42",
281      "[START_DIR]/tmp/SK_IMAGE_VERSION"
282    ],
283    "infra_step": true,
284    "name": "write SK_IMAGE_VERSION"
285  },
286  {
287    "cmd": [
288      "adb",
289      "shell",
290      "cat",
291      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
292    ],
293    "cwd": "[START_DIR]/skia",
294    "env": {
295      "BUILDTYPE": "Release",
296      "CHROME_HEADLESS": "1",
297      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
298      "SKIA_OUT": "[START_DIR]/out"
299    },
300    "infra_step": true,
301    "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
302    "stdout": "/path/to/tmp/"
303  },
304  {
305    "cmd": [
306      "adb",
307      "shell",
308      "rm",
309      "-f",
310      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
311    ],
312    "cwd": "[START_DIR]/skia",
313    "env": {
314      "BUILDTYPE": "Release",
315      "CHROME_HEADLESS": "1",
316      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
317      "SKIA_OUT": "[START_DIR]/out"
318    },
319    "infra_step": true,
320    "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
321  },
322  {
323    "cmd": [
324      "adb",
325      "shell",
326      "rm",
327      "-rf",
328      "/sdcard/revenge_of_the_skiabot/images"
329    ],
330    "cwd": "[START_DIR]/skia",
331    "env": {
332      "BUILDTYPE": "Release",
333      "CHROME_HEADLESS": "1",
334      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
335      "SKIA_OUT": "[START_DIR]/out"
336    },
337    "infra_step": true,
338    "name": "rm /sdcard/revenge_of_the_skiabot/images"
339  },
340  {
341    "cmd": [
342      "adb",
343      "shell",
344      "mkdir",
345      "-p",
346      "/sdcard/revenge_of_the_skiabot/images"
347    ],
348    "cwd": "[START_DIR]/skia",
349    "env": {
350      "BUILDTYPE": "Release",
351      "CHROME_HEADLESS": "1",
352      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
353      "SKIA_OUT": "[START_DIR]/out"
354    },
355    "infra_step": true,
356    "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
357  },
358  {
359    "cmd": [
360      "python",
361      "-u",
362      "\nimport os\nimport subprocess\nimport sys\nhost   = sys.argv[1]\ndevice = sys.argv[2]\nfor d, _, fs in os.walk(host):\n  p = os.path.relpath(d, host)\n  if p != '.' and p.startswith('.'):\n    continue\n  for f in fs:\n    print os.path.join(p,f)\n    subprocess.check_call(['adb', 'push',\n                           os.path.realpath(os.path.join(host, p, f)),\n                           os.path.join(device, p, f)])\n",
363      "[START_DIR]/skimage",
364      "/sdcard/revenge_of_the_skiabot/images"
365    ],
366    "env": {
367      "BUILDTYPE": "Release",
368      "CHROME_HEADLESS": "1",
369      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
370      "SKIA_OUT": "[START_DIR]/out"
371    },
372    "infra_step": true,
373    "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
374    "~followup_annotations": [
375      "@@@STEP_LOG_LINE@python.inline@@@@",
376      "@@@STEP_LOG_LINE@python.inline@import os@@@",
377      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
378      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
379      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
380      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
381      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
382      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
383      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
384      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
385      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
386      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
387      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
388      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
389      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
390      "@@@STEP_LOG_END@python.inline@@@"
391    ]
392  },
393  {
394    "cmd": [
395      "adb",
396      "push",
397      "[START_DIR]/tmp/SK_IMAGE_VERSION",
398      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
399    ],
400    "cwd": "[START_DIR]/skia",
401    "env": {
402      "BUILDTYPE": "Release",
403      "CHROME_HEADLESS": "1",
404      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
405      "SKIA_OUT": "[START_DIR]/out"
406    },
407    "infra_step": true,
408    "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
409  },
410  {
411    "cmd": [
412      "python",
413      "-u",
414      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
415      "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
416      "/path/to/tmp/"
417    ],
418    "infra_step": true,
419    "name": "Get downloaded SVG VERSION"
420  },
421  {
422    "cmd": [
423      "python",
424      "-u",
425      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
426      "42",
427      "[START_DIR]/tmp/SVG_VERSION"
428    ],
429    "infra_step": true,
430    "name": "write SVG_VERSION"
431  },
432  {
433    "cmd": [
434      "adb",
435      "shell",
436      "cat",
437      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
438    ],
439    "cwd": "[START_DIR]/skia",
440    "env": {
441      "BUILDTYPE": "Release",
442      "CHROME_HEADLESS": "1",
443      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
444      "SKIA_OUT": "[START_DIR]/out"
445    },
446    "infra_step": true,
447    "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
448    "stdout": "/path/to/tmp/"
449  },
450  {
451    "cmd": [
452      "adb",
453      "shell",
454      "rm",
455      "-f",
456      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
457    ],
458    "cwd": "[START_DIR]/skia",
459    "env": {
460      "BUILDTYPE": "Release",
461      "CHROME_HEADLESS": "1",
462      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
463      "SKIA_OUT": "[START_DIR]/out"
464    },
465    "infra_step": true,
466    "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
467  },
468  {
469    "cmd": [
470      "adb",
471      "shell",
472      "rm",
473      "-rf",
474      "/sdcard/revenge_of_the_skiabot/svgs"
475    ],
476    "cwd": "[START_DIR]/skia",
477    "env": {
478      "BUILDTYPE": "Release",
479      "CHROME_HEADLESS": "1",
480      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
481      "SKIA_OUT": "[START_DIR]/out"
482    },
483    "infra_step": true,
484    "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
485  },
486  {
487    "cmd": [
488      "adb",
489      "shell",
490      "mkdir",
491      "-p",
492      "/sdcard/revenge_of_the_skiabot/svgs"
493    ],
494    "cwd": "[START_DIR]/skia",
495    "env": {
496      "BUILDTYPE": "Release",
497      "CHROME_HEADLESS": "1",
498      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
499      "SKIA_OUT": "[START_DIR]/out"
500    },
501    "infra_step": true,
502    "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
503  },
504  {
505    "cmd": [
506      "python",
507      "-u",
508      "\nimport os\nimport subprocess\nimport sys\nhost   = sys.argv[1]\ndevice = sys.argv[2]\nfor d, _, fs in os.walk(host):\n  p = os.path.relpath(d, host)\n  if p != '.' and p.startswith('.'):\n    continue\n  for f in fs:\n    print os.path.join(p,f)\n    subprocess.check_call(['adb', 'push',\n                           os.path.realpath(os.path.join(host, p, f)),\n                           os.path.join(device, p, f)])\n",
509      "[START_DIR]/svg",
510      "/sdcard/revenge_of_the_skiabot/svgs"
511    ],
512    "env": {
513      "BUILDTYPE": "Release",
514      "CHROME_HEADLESS": "1",
515      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
516      "SKIA_OUT": "[START_DIR]/out"
517    },
518    "infra_step": true,
519    "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
520    "~followup_annotations": [
521      "@@@STEP_LOG_LINE@python.inline@@@@",
522      "@@@STEP_LOG_LINE@python.inline@import os@@@",
523      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
524      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
525      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
526      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
527      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
528      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
529      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
530      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
531      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
532      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
533      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
534      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
535      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
536      "@@@STEP_LOG_END@python.inline@@@"
537    ]
538  },
539  {
540    "cmd": [
541      "adb",
542      "push",
543      "[START_DIR]/tmp/SVG_VERSION",
544      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
545    ],
546    "cwd": "[START_DIR]/skia",
547    "env": {
548      "BUILDTYPE": "Release",
549      "CHROME_HEADLESS": "1",
550      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
551      "SKIA_OUT": "[START_DIR]/out"
552    },
553    "infra_step": true,
554    "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
555  },
556  {
557    "cmd": [
558      "python",
559      "-u",
560      "RECIPE_MODULE[build::file]/resources/fileutil.py",
561      "rmtree",
562      "[CUSTOM_[SWARM_OUT_DIR]]/dm"
563    ],
564    "env": {
565      "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
566    },
567    "infra_step": true,
568    "name": "rmtree dm"
569  },
570  {
571    "cmd": [
572      "python",
573      "-u",
574      "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n  if os.path.exists(path):\n    print \"%s exists but is not a dir\" % path\n    sys.exit(1)\n  os.makedirs(path, mode)\n",
575      "[CUSTOM_[SWARM_OUT_DIR]]/dm",
576      "511"
577    ],
578    "infra_step": true,
579    "name": "makedirs dm",
580    "~followup_annotations": [
581      "@@@STEP_LOG_LINE@python.inline@@@@",
582      "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
583      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
584      "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
585      "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
586      "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
587      "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
588      "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
589      "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
590      "@@@STEP_LOG_END@python.inline@@@"
591    ]
592  },
593  {
594    "cmd": [
595      "adb",
596      "shell",
597      "rm",
598      "-rf",
599      "/sdcard/revenge_of_the_skiabot/dm_out"
600    ],
601    "cwd": "[START_DIR]/skia",
602    "env": {
603      "BUILDTYPE": "Release",
604      "CHROME_HEADLESS": "1",
605      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
606      "SKIA_OUT": "[START_DIR]/out"
607    },
608    "infra_step": true,
609    "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
610  },
611  {
612    "cmd": [
613      "adb",
614      "shell",
615      "mkdir",
616      "-p",
617      "/sdcard/revenge_of_the_skiabot/dm_out"
618    ],
619    "cwd": "[START_DIR]/skia",
620    "env": {
621      "BUILDTYPE": "Release",
622      "CHROME_HEADLESS": "1",
623      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
624      "SKIA_OUT": "[START_DIR]/out"
625    },
626    "infra_step": true,
627    "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
628  },
629  {
630    "cmd": [
631      "python",
632      "-u",
633      "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n  if os.path.exists(path):\n    print \"%s exists but is not a dir\" % path\n    sys.exit(1)\n  os.makedirs(path, mode)\n",
634      "[START_DIR]/tmp",
635      "511"
636    ],
637    "infra_step": true,
638    "name": "makedirs tmp_dir",
639    "~followup_annotations": [
640      "@@@STEP_LOG_LINE@python.inline@@@@",
641      "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
642      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
643      "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
644      "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
645      "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
646      "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
647      "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
648      "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
649      "@@@STEP_LOG_END@python.inline@@@"
650    ]
651  },
652  {
653    "cmd": [
654      "python",
655      "-u",
656      "\nimport contextlib\nimport math\nimport socket\nimport sys\nimport time\nimport urllib2\n\nHASHES_URL = 'https://gold.skia.org/_/hashes'\nRETRIES = 5\nTIMEOUT = 60\nWAIT_BASE = 15\n\nsocket.setdefaulttimeout(TIMEOUT)\nfor retry in range(RETRIES):\n  try:\n    with contextlib.closing(\n        urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:\n      hashes = w.read()\n      with open(sys.argv[1], 'w') as f:\n        f.write(hashes)\n        break\n  except Exception as e:\n    print 'Failed to get uninteresting hashes from %s:' % HASHES_URL\n    print e\n    if retry == RETRIES:\n      raise\n    waittime = WAIT_BASE * math.pow(2, retry)\n    print 'Retry in %d seconds.' % waittime\n    time.sleep(waittime)\n",
657      "[START_DIR]/tmp/uninteresting_hashes.txt"
658    ],
659    "env": {
660      "BUILDTYPE": "Release",
661      "CHROME_HEADLESS": "1",
662      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
663      "SKIA_OUT": "[START_DIR]/out"
664    },
665    "infra_step": true,
666    "name": "get uninteresting hashes",
667    "~followup_annotations": [
668      "@@@STEP_LOG_LINE@python.inline@@@@",
669      "@@@STEP_LOG_LINE@python.inline@import contextlib@@@",
670      "@@@STEP_LOG_LINE@python.inline@import math@@@",
671      "@@@STEP_LOG_LINE@python.inline@import socket@@@",
672      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
673      "@@@STEP_LOG_LINE@python.inline@import time@@@",
674      "@@@STEP_LOG_LINE@python.inline@import urllib2@@@",
675      "@@@STEP_LOG_LINE@python.inline@@@@",
676      "@@@STEP_LOG_LINE@python.inline@HASHES_URL = 'https://gold.skia.org/_/hashes'@@@",
677      "@@@STEP_LOG_LINE@python.inline@RETRIES = 5@@@",
678      "@@@STEP_LOG_LINE@python.inline@TIMEOUT = 60@@@",
679      "@@@STEP_LOG_LINE@python.inline@WAIT_BASE = 15@@@",
680      "@@@STEP_LOG_LINE@python.inline@@@@",
681      "@@@STEP_LOG_LINE@python.inline@socket.setdefaulttimeout(TIMEOUT)@@@",
682      "@@@STEP_LOG_LINE@python.inline@for retry in range(RETRIES):@@@",
683      "@@@STEP_LOG_LINE@python.inline@  try:@@@",
684      "@@@STEP_LOG_LINE@python.inline@    with contextlib.closing(@@@",
685      "@@@STEP_LOG_LINE@python.inline@        urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:@@@",
686      "@@@STEP_LOG_LINE@python.inline@      hashes = w.read()@@@",
687      "@@@STEP_LOG_LINE@python.inline@      with open(sys.argv[1], 'w') as f:@@@",
688      "@@@STEP_LOG_LINE@python.inline@        f.write(hashes)@@@",
689      "@@@STEP_LOG_LINE@python.inline@        break@@@",
690      "@@@STEP_LOG_LINE@python.inline@  except Exception as e:@@@",
691      "@@@STEP_LOG_LINE@python.inline@    print 'Failed to get uninteresting hashes from %s:' % HASHES_URL@@@",
692      "@@@STEP_LOG_LINE@python.inline@    print e@@@",
693      "@@@STEP_LOG_LINE@python.inline@    if retry == RETRIES:@@@",
694      "@@@STEP_LOG_LINE@python.inline@      raise@@@",
695      "@@@STEP_LOG_LINE@python.inline@    waittime = WAIT_BASE * math.pow(2, retry)@@@",
696      "@@@STEP_LOG_LINE@python.inline@    print 'Retry in %d seconds.' % waittime@@@",
697      "@@@STEP_LOG_LINE@python.inline@    time.sleep(waittime)@@@",
698      "@@@STEP_LOG_END@python.inline@@@"
699    ]
700  },
701  {
702    "cmd": [
703      "adb",
704      "push",
705      "[START_DIR]/tmp/uninteresting_hashes.txt",
706      "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
707    ],
708    "cwd": "[START_DIR]/skia",
709    "env": {
710      "BUILDTYPE": "Release",
711      "CHROME_HEADLESS": "1",
712      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
713      "SKIA_OUT": "[START_DIR]/out"
714    },
715    "infra_step": true,
716    "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
717  },
718  {
719    "cmd": [
720      "adb",
721      "push",
722      "[START_DIR]/out/Release/dm",
723      "/data/local/tmp/"
724    ],
725    "cwd": "[START_DIR]/skia",
726    "env": {
727      "BUILDTYPE": "Release",
728      "CHROME_HEADLESS": "1",
729      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
730      "SKIA_OUT": "[START_DIR]/out"
731    },
732    "infra_step": true,
733    "name": "push dm"
734  },
735  {
736    "cmd": [
737      "python",
738      "-u",
739      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
740      "set -x; /data/local/tmp/dm --undefok --resourcePath /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/dm --colorImages /sdcard/revenge_of_the_skiabot/images/colorspace --nameByHash --properties gitHash abc123 master client.skia builder Test-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android_Vulkan build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch x86 compiler Clang configuration Release cpu_or_gpu GPU cpu_or_gpu_value PowerVR extra_config GN_Android_Vulkan model NexusPlayer os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config vk --src tests gm colorImage --blacklist _ test _ GrShape _ image _ interlaced1.png _ image _ interlaced2.png _ image _ interlaced3.png _ image _ .arw _ image _ .cr2 _ image _ .dng _ image _ .nef _ image _ .nrw _ image _ .orf _ image _ .raf _ image _ .rw2 _ image _ .pef _ image _ .srw _ image _ .ARW _ image _ .CR2 _ image _ .DNG _ image _ .NEF _ image _ .NRW _ image _ .ORF _ image _ .RAF _ image _ .RW2 _ image _ .PEF _ image _ .SRW --match ~ResourceCache ~hardstop_gradient ~gradients_dup_color_stops ~gradients_no_texture$ ~tilemodes ~shadertext$ ~bitmapfilters ~GrContextFactory_abandon --noRAW_threading; echo $? >/data/local/tmp/rc",
741      "[START_DIR]/tmp/dm.sh"
742    ],
743    "env": {
744      "BUILDTYPE": "Release",
745      "CHROME_HEADLESS": "1",
746      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
747      "SKIA_OUT": "[START_DIR]/out"
748    },
749    "infra_step": true,
750    "name": "write dm.sh"
751  },
752  {
753    "cmd": [
754      "adb",
755      "push",
756      "[START_DIR]/tmp/dm.sh",
757      "/data/local/tmp/"
758    ],
759    "cwd": "[START_DIR]/skia",
760    "env": {
761      "BUILDTYPE": "Release",
762      "CHROME_HEADLESS": "1",
763      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
764      "SKIA_OUT": "[START_DIR]/out"
765    },
766    "infra_step": true,
767    "name": "push dm.sh"
768  },
769  {
770    "cmd": [
771      "adb",
772      "logcat",
773      "-c"
774    ],
775    "cwd": "[START_DIR]/skia",
776    "env": {
777      "BUILDTYPE": "Release",
778      "CHROME_HEADLESS": "1",
779      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
780      "SKIA_OUT": "[START_DIR]/out"
781    },
782    "infra_step": true,
783    "name": "clear log"
784  },
785  {
786    "cmd": [
787      "python",
788      "-u",
789      "\nimport subprocess\nimport sys\nbin_dir = sys.argv[1]\nsh      = sys.argv[2]\nsubprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])\ntry:\n  sys.exit(int(subprocess.check_output(['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",
790      "/data/local/tmp/",
791      "dm.sh"
792    ],
793    "env": {
794      "BUILDTYPE": "Release",
795      "CHROME_HEADLESS": "1",
796      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
797      "SKIA_OUT": "[START_DIR]/out"
798    },
799    "name": "dm",
800    "~followup_annotations": [
801      "@@@STEP_LOG_LINE@python.inline@@@@",
802      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
803      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
804      "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
805      "@@@STEP_LOG_LINE@python.inline@sh      = sys.argv[2]@@@",
806      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
807      "@@@STEP_LOG_LINE@python.inline@try:@@@",
808      "@@@STEP_LOG_LINE@python.inline@  sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
809      "@@@STEP_LOG_LINE@python.inline@                                        bin_dir + 'rc'])))@@@",
810      "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
811      "@@@STEP_LOG_LINE@python.inline@  print \"Couldn't read the return code.  Probably killed for OOM.\"@@@",
812      "@@@STEP_LOG_LINE@python.inline@  sys.exit(1)@@@",
813      "@@@STEP_LOG_END@python.inline@@@"
814    ]
815  },
816  {
817    "cmd": [
818      "adb",
819      "pull",
820      "/sdcard/revenge_of_the_skiabot/dm_out",
821      "[CUSTOM_[SWARM_OUT_DIR]]/dm"
822    ],
823    "cwd": "[START_DIR]/skia",
824    "env": {
825      "BUILDTYPE": "Release",
826      "CHROME_HEADLESS": "1",
827      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
828      "SKIA_OUT": "[START_DIR]/out"
829    },
830    "infra_step": true,
831    "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
832  },
833  {
834    "cmd": [
835      "python",
836      "-u",
837      "\nimport os\nimport subprocess\nimport sys\nout = sys.argv[1]\nlog = subprocess.check_output(['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      sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])\n      line = line.replace(addr, addr + ' ' + sym.strip())\n  print line\n",
838      "[START_DIR]/out/Release"
839    ],
840    "env": {
841      "BUILDTYPE": "Release",
842      "CHROME_HEADLESS": "1",
843      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
844      "SKIA_OUT": "[START_DIR]/out"
845    },
846    "infra_step": true,
847    "name": "dump log",
848    "~followup_annotations": [
849      "@@@STEP_LOG_LINE@python.inline@@@@",
850      "@@@STEP_LOG_LINE@python.inline@import os@@@",
851      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
852      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
853      "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
854      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
855      "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
856      "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
857      "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
858      "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
859      "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
860      "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
861      "@@@STEP_LOG_LINE@python.inline@      sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
862      "@@@STEP_LOG_LINE@python.inline@      line = line.replace(addr, addr + ' ' + sym.strip())@@@",
863      "@@@STEP_LOG_LINE@python.inline@  print line@@@",
864      "@@@STEP_LOG_END@python.inline@@@"
865    ]
866  },
867  {
868    "cmd": [
869      "adb",
870      "kill-server"
871    ],
872    "cwd": "[START_DIR]/skia",
873    "env": {
874      "BUILDTYPE": "Release",
875      "CHROME_HEADLESS": "1",
876      "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
877      "SKIA_OUT": "[START_DIR]/out"
878    },
879    "infra_step": true,
880    "name": "kill adb server"
881  },
882  {
883    "name": "$result",
884    "recipe_result": null,
885    "status_code": 0
886  }
887]