72eb1772cabb2ad9652802caae5cbaaca08ae398
[platform/upstream/libSkiaSharp.git] /
1 [
2   {
3     "cmd": [
4       "adb",
5       "reboot"
6     ],
7     "cwd": "[START_DIR]/skia",
8     "infra_step": true,
9     "name": "rebooting device"
10   },
11   {
12     "cmd": [
13       "python",
14       "-u",
15       "\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"
16     ],
17     "infra_step": true,
18     "name": "wait for device",
19     "~followup_annotations": [
20       "@@@STEP_LOG_LINE@python.inline@@@@",
21       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
22       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
23       "@@@STEP_LOG_LINE@python.inline@import time@@@",
24       "@@@STEP_LOG_LINE@python.inline@@@@",
25       "@@@STEP_LOG_LINE@python.inline@kicks = 0@@@",
26       "@@@STEP_LOG_LINE@python.inline@while True:@@@",
27       "@@@STEP_LOG_LINE@python.inline@@@@",
28       "@@@STEP_LOG_LINE@python.inline@  times = 0@@@",
29       "@@@STEP_LOG_LINE@python.inline@  while times < 30:@@@",
30       "@@@STEP_LOG_LINE@python.inline@    print 'Waiting for the device to be connected and ready.'@@@",
31       "@@@STEP_LOG_LINE@python.inline@    try:@@@",
32       "@@@STEP_LOG_LINE@python.inline@      times += 1@@@",
33       "@@@STEP_LOG_LINE@python.inline@      output = subprocess.check_output(['adb', 'shell',@@@",
34       "@@@STEP_LOG_LINE@python.inline@                                        'getprop', 'sys.boot_completed'])@@@",
35       "@@@STEP_LOG_LINE@python.inline@      if '1' in output:@@@",
36       "@@@STEP_LOG_LINE@python.inline@        print 'Connected'@@@",
37       "@@@STEP_LOG_LINE@python.inline@        sys.exit(0)@@@",
38       "@@@STEP_LOG_LINE@python.inline@    except subprocess.CalledProcessError:@@@",
39       "@@@STEP_LOG_LINE@python.inline@      # no device connected/authorized yet@@@",
40       "@@@STEP_LOG_LINE@python.inline@      pass@@@",
41       "@@@STEP_LOG_LINE@python.inline@    time.sleep(5)@@@",
42       "@@@STEP_LOG_LINE@python.inline@  if kicks >= 3:@@@",
43       "@@@STEP_LOG_LINE@python.inline@    break@@@",
44       "@@@STEP_LOG_LINE@python.inline@  print 'Giving the device a \"kick\" by trying to reboot it.'@@@",
45       "@@@STEP_LOG_LINE@python.inline@  kicks += 1@@@",
46       "@@@STEP_LOG_LINE@python.inline@  print subprocess.check_output(['adb', 'reboot'])@@@",
47       "@@@STEP_LOG_LINE@python.inline@@@@",
48       "@@@STEP_LOG_LINE@python.inline@print 'Timed out waiting for device'@@@",
49       "@@@STEP_LOG_LINE@python.inline@sys.exit(1)@@@",
50       "@@@STEP_LOG_END@python.inline@@@"
51     ]
52   },
53   {
54     "cmd": [
55       "adb",
56       "shell",
57       "mkdir",
58       "-p",
59       "/sdcard/revenge_of_the_skiabot/resources"
60     ],
61     "cwd": "[START_DIR]/skia",
62     "infra_step": true,
63     "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
64   },
65   {
66     "cmd": [
67       "python",
68       "-u",
69       "\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",
70       "[START_DIR]/skia/resources",
71       "/sdcard/revenge_of_the_skiabot/resources"
72     ],
73     "infra_step": true,
74     "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
75     "~followup_annotations": [
76       "@@@STEP_LOG_LINE@python.inline@@@@",
77       "@@@STEP_LOG_LINE@python.inline@import os@@@",
78       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
79       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
80       "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
81       "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
82       "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
83       "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
84       "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
85       "@@@STEP_LOG_LINE@python.inline@    continue@@@",
86       "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
87       "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
88       "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
89       "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
90       "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
91       "@@@STEP_LOG_END@python.inline@@@"
92     ]
93   },
94   {
95     "cmd": [
96       "python",
97       "-u",
98       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
99       "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
100       "/path/to/tmp/"
101     ],
102     "infra_step": true,
103     "name": "Get downloaded SKP VERSION"
104   },
105   {
106     "cmd": [
107       "python",
108       "-u",
109       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
110       "42",
111       "[START_DIR]/tmp/SKP_VERSION"
112     ],
113     "infra_step": true,
114     "name": "write SKP_VERSION"
115   },
116   {
117     "cmd": [
118       "adb",
119       "shell",
120       "cat",
121       "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
122     ],
123     "cwd": "[START_DIR]/skia",
124     "infra_step": true,
125     "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
126     "stdout": "/path/to/tmp/"
127   },
128   {
129     "cmd": [
130       "adb",
131       "shell",
132       "rm",
133       "-f",
134       "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
135     ],
136     "cwd": "[START_DIR]/skia",
137     "infra_step": true,
138     "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
139   },
140   {
141     "cmd": [
142       "adb",
143       "shell",
144       "rm",
145       "-rf",
146       "/sdcard/revenge_of_the_skiabot/skps"
147     ],
148     "cwd": "[START_DIR]/skia",
149     "infra_step": true,
150     "name": "rm /sdcard/revenge_of_the_skiabot/skps"
151   },
152   {
153     "cmd": [
154       "adb",
155       "shell",
156       "mkdir",
157       "-p",
158       "/sdcard/revenge_of_the_skiabot/skps"
159     ],
160     "cwd": "[START_DIR]/skia",
161     "infra_step": true,
162     "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
163   },
164   {
165     "cmd": [
166       "python",
167       "-u",
168       "\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",
169       "[START_DIR]/skp",
170       "/sdcard/revenge_of_the_skiabot/skps"
171     ],
172     "infra_step": true,
173     "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
174     "~followup_annotations": [
175       "@@@STEP_LOG_LINE@python.inline@@@@",
176       "@@@STEP_LOG_LINE@python.inline@import os@@@",
177       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
178       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
179       "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
180       "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
181       "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
182       "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
183       "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
184       "@@@STEP_LOG_LINE@python.inline@    continue@@@",
185       "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
186       "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
187       "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
188       "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
189       "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
190       "@@@STEP_LOG_END@python.inline@@@"
191     ]
192   },
193   {
194     "cmd": [
195       "adb",
196       "push",
197       "[START_DIR]/tmp/SKP_VERSION",
198       "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
199     ],
200     "cwd": "[START_DIR]/skia",
201     "infra_step": true,
202     "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
203   },
204   {
205     "cmd": [
206       "python",
207       "-u",
208       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
209       "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
210       "/path/to/tmp/"
211     ],
212     "infra_step": true,
213     "name": "Get downloaded skimage VERSION"
214   },
215   {
216     "cmd": [
217       "python",
218       "-u",
219       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
220       "42",
221       "[START_DIR]/tmp/SK_IMAGE_VERSION"
222     ],
223     "infra_step": true,
224     "name": "write SK_IMAGE_VERSION"
225   },
226   {
227     "cmd": [
228       "adb",
229       "shell",
230       "cat",
231       "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
232     ],
233     "cwd": "[START_DIR]/skia",
234     "infra_step": true,
235     "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
236     "stdout": "/path/to/tmp/"
237   },
238   {
239     "cmd": [
240       "adb",
241       "shell",
242       "rm",
243       "-f",
244       "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
245     ],
246     "cwd": "[START_DIR]/skia",
247     "infra_step": true,
248     "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
249   },
250   {
251     "cmd": [
252       "adb",
253       "shell",
254       "rm",
255       "-rf",
256       "/sdcard/revenge_of_the_skiabot/images"
257     ],
258     "cwd": "[START_DIR]/skia",
259     "infra_step": true,
260     "name": "rm /sdcard/revenge_of_the_skiabot/images"
261   },
262   {
263     "cmd": [
264       "adb",
265       "shell",
266       "mkdir",
267       "-p",
268       "/sdcard/revenge_of_the_skiabot/images"
269     ],
270     "cwd": "[START_DIR]/skia",
271     "infra_step": true,
272     "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
273   },
274   {
275     "cmd": [
276       "python",
277       "-u",
278       "\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",
279       "[START_DIR]/skimage",
280       "/sdcard/revenge_of_the_skiabot/images"
281     ],
282     "infra_step": true,
283     "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
284     "~followup_annotations": [
285       "@@@STEP_LOG_LINE@python.inline@@@@",
286       "@@@STEP_LOG_LINE@python.inline@import os@@@",
287       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
288       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
289       "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
290       "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
291       "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
292       "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
293       "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
294       "@@@STEP_LOG_LINE@python.inline@    continue@@@",
295       "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
296       "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
297       "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
298       "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
299       "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
300       "@@@STEP_LOG_END@python.inline@@@"
301     ]
302   },
303   {
304     "cmd": [
305       "adb",
306       "push",
307       "[START_DIR]/tmp/SK_IMAGE_VERSION",
308       "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
309     ],
310     "cwd": "[START_DIR]/skia",
311     "infra_step": true,
312     "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
313   },
314   {
315     "cmd": [
316       "python",
317       "-u",
318       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
319       "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
320       "/path/to/tmp/"
321     ],
322     "infra_step": true,
323     "name": "Get downloaded SVG VERSION"
324   },
325   {
326     "cmd": [
327       "python",
328       "-u",
329       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
330       "42",
331       "[START_DIR]/tmp/SVG_VERSION"
332     ],
333     "infra_step": true,
334     "name": "write SVG_VERSION"
335   },
336   {
337     "cmd": [
338       "adb",
339       "shell",
340       "cat",
341       "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
342     ],
343     "cwd": "[START_DIR]/skia",
344     "infra_step": true,
345     "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
346     "stdout": "/path/to/tmp/"
347   },
348   {
349     "cmd": [
350       "adb",
351       "shell",
352       "rm",
353       "-f",
354       "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
355     ],
356     "cwd": "[START_DIR]/skia",
357     "infra_step": true,
358     "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
359   },
360   {
361     "cmd": [
362       "adb",
363       "shell",
364       "rm",
365       "-rf",
366       "/sdcard/revenge_of_the_skiabot/svgs"
367     ],
368     "cwd": "[START_DIR]/skia",
369     "infra_step": true,
370     "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
371   },
372   {
373     "cmd": [
374       "adb",
375       "shell",
376       "mkdir",
377       "-p",
378       "/sdcard/revenge_of_the_skiabot/svgs"
379     ],
380     "cwd": "[START_DIR]/skia",
381     "infra_step": true,
382     "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
383   },
384   {
385     "cmd": [
386       "python",
387       "-u",
388       "\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",
389       "[START_DIR]/svg",
390       "/sdcard/revenge_of_the_skiabot/svgs"
391     ],
392     "infra_step": true,
393     "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
394     "~followup_annotations": [
395       "@@@STEP_LOG_LINE@python.inline@@@@",
396       "@@@STEP_LOG_LINE@python.inline@import os@@@",
397       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
398       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
399       "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
400       "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
401       "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
402       "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
403       "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
404       "@@@STEP_LOG_LINE@python.inline@    continue@@@",
405       "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
406       "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
407       "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['adb', 'push',@@@",
408       "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
409       "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
410       "@@@STEP_LOG_END@python.inline@@@"
411     ]
412   },
413   {
414     "cmd": [
415       "adb",
416       "push",
417       "[START_DIR]/tmp/SVG_VERSION",
418       "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
419     ],
420     "cwd": "[START_DIR]/skia",
421     "infra_step": true,
422     "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
423   },
424   {
425     "cmd": [
426       "python",
427       "-u",
428       "RECIPE_MODULE[build::file]/resources/fileutil.py",
429       "rmtree",
430       "[CUSTOM_[SWARM_OUT_DIR]]/dm"
431     ],
432     "env": {
433       "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
434     },
435     "infra_step": true,
436     "name": "rmtree dm"
437   },
438   {
439     "cmd": [
440       "python",
441       "-u",
442       "\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",
443       "[CUSTOM_[SWARM_OUT_DIR]]/dm",
444       "511"
445     ],
446     "infra_step": true,
447     "name": "makedirs dm",
448     "~followup_annotations": [
449       "@@@STEP_LOG_LINE@python.inline@@@@",
450       "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
451       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
452       "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
453       "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
454       "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
455       "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
456       "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
457       "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
458       "@@@STEP_LOG_END@python.inline@@@"
459     ]
460   },
461   {
462     "cmd": [
463       "adb",
464       "shell",
465       "rm",
466       "-rf",
467       "/sdcard/revenge_of_the_skiabot/dm_out"
468     ],
469     "cwd": "[START_DIR]/skia",
470     "infra_step": true,
471     "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
472   },
473   {
474     "cmd": [
475       "adb",
476       "shell",
477       "mkdir",
478       "-p",
479       "/sdcard/revenge_of_the_skiabot/dm_out"
480     ],
481     "cwd": "[START_DIR]/skia",
482     "infra_step": true,
483     "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
484   },
485   {
486     "cmd": [
487       "python",
488       "-u",
489       "\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",
490       "[START_DIR]/tmp",
491       "511"
492     ],
493     "infra_step": true,
494     "name": "makedirs tmp_dir",
495     "~followup_annotations": [
496       "@@@STEP_LOG_LINE@python.inline@@@@",
497       "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
498       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
499       "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
500       "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
501       "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
502       "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
503       "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
504       "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
505       "@@@STEP_LOG_END@python.inline@@@"
506     ]
507   },
508   {
509     "cmd": [
510       "python",
511       "-u",
512       "\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",
513       "[START_DIR]/tmp/uninteresting_hashes.txt"
514     ],
515     "infra_step": true,
516     "name": "get uninteresting hashes",
517     "~followup_annotations": [
518       "@@@STEP_LOG_LINE@python.inline@@@@",
519       "@@@STEP_LOG_LINE@python.inline@import contextlib@@@",
520       "@@@STEP_LOG_LINE@python.inline@import math@@@",
521       "@@@STEP_LOG_LINE@python.inline@import socket@@@",
522       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
523       "@@@STEP_LOG_LINE@python.inline@import time@@@",
524       "@@@STEP_LOG_LINE@python.inline@import urllib2@@@",
525       "@@@STEP_LOG_LINE@python.inline@@@@",
526       "@@@STEP_LOG_LINE@python.inline@HASHES_URL = 'https://gold.skia.org/_/hashes'@@@",
527       "@@@STEP_LOG_LINE@python.inline@RETRIES = 5@@@",
528       "@@@STEP_LOG_LINE@python.inline@TIMEOUT = 60@@@",
529       "@@@STEP_LOG_LINE@python.inline@WAIT_BASE = 15@@@",
530       "@@@STEP_LOG_LINE@python.inline@@@@",
531       "@@@STEP_LOG_LINE@python.inline@socket.setdefaulttimeout(TIMEOUT)@@@",
532       "@@@STEP_LOG_LINE@python.inline@for retry in range(RETRIES):@@@",
533       "@@@STEP_LOG_LINE@python.inline@  try:@@@",
534       "@@@STEP_LOG_LINE@python.inline@    with contextlib.closing(@@@",
535       "@@@STEP_LOG_LINE@python.inline@        urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:@@@",
536       "@@@STEP_LOG_LINE@python.inline@      hashes = w.read()@@@",
537       "@@@STEP_LOG_LINE@python.inline@      with open(sys.argv[1], 'w') as f:@@@",
538       "@@@STEP_LOG_LINE@python.inline@        f.write(hashes)@@@",
539       "@@@STEP_LOG_LINE@python.inline@        break@@@",
540       "@@@STEP_LOG_LINE@python.inline@  except Exception as e:@@@",
541       "@@@STEP_LOG_LINE@python.inline@    print 'Failed to get uninteresting hashes from %s:' % HASHES_URL@@@",
542       "@@@STEP_LOG_LINE@python.inline@    print e@@@",
543       "@@@STEP_LOG_LINE@python.inline@    if retry == RETRIES:@@@",
544       "@@@STEP_LOG_LINE@python.inline@      raise@@@",
545       "@@@STEP_LOG_LINE@python.inline@    waittime = WAIT_BASE * math.pow(2, retry)@@@",
546       "@@@STEP_LOG_LINE@python.inline@    print 'Retry in %d seconds.' % waittime@@@",
547       "@@@STEP_LOG_LINE@python.inline@    time.sleep(waittime)@@@",
548       "@@@STEP_LOG_END@python.inline@@@"
549     ]
550   },
551   {
552     "cmd": [
553       "adb",
554       "push",
555       "[START_DIR]/tmp/uninteresting_hashes.txt",
556       "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
557     ],
558     "cwd": "[START_DIR]/skia",
559     "infra_step": true,
560     "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
561   },
562   {
563     "cmd": [
564       "adb",
565       "push",
566       "[START_DIR]/out/Release/dm",
567       "/data/local/tmp/"
568     ],
569     "cwd": "[START_DIR]/skia",
570     "infra_step": true,
571     "name": "push dm"
572   },
573   {
574     "cmd": [
575       "python",
576       "-u",
577       "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
578       "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",
579       "[START_DIR]/tmp/dm.sh"
580     ],
581     "infra_step": true,
582     "name": "write dm.sh"
583   },
584   {
585     "cmd": [
586       "adb",
587       "push",
588       "[START_DIR]/tmp/dm.sh",
589       "/data/local/tmp/"
590     ],
591     "cwd": "[START_DIR]/skia",
592     "infra_step": true,
593     "name": "push dm.sh"
594   },
595   {
596     "cmd": [
597       "adb",
598       "logcat",
599       "-c"
600     ],
601     "cwd": "[START_DIR]/skia",
602     "infra_step": true,
603     "name": "clear log"
604   },
605   {
606     "cmd": [
607       "python",
608       "-u",
609       "\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",
610       "/data/local/tmp/",
611       "dm.sh"
612     ],
613     "name": "dm",
614     "~followup_annotations": [
615       "@@@STEP_LOG_LINE@python.inline@@@@",
616       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
617       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
618       "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
619       "@@@STEP_LOG_LINE@python.inline@sh      = sys.argv[2]@@@",
620       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
621       "@@@STEP_LOG_LINE@python.inline@try:@@@",
622       "@@@STEP_LOG_LINE@python.inline@  sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
623       "@@@STEP_LOG_LINE@python.inline@                                        bin_dir + 'rc'])))@@@",
624       "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
625       "@@@STEP_LOG_LINE@python.inline@  print \"Couldn't read the return code.  Probably killed for OOM.\"@@@",
626       "@@@STEP_LOG_LINE@python.inline@  sys.exit(1)@@@",
627       "@@@STEP_LOG_END@python.inline@@@"
628     ]
629   },
630   {
631     "cmd": [
632       "adb",
633       "pull",
634       "/sdcard/revenge_of_the_skiabot/dm_out",
635       "[CUSTOM_[SWARM_OUT_DIR]]/dm"
636     ],
637     "cwd": "[START_DIR]/skia",
638     "infra_step": true,
639     "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
640   },
641   {
642     "cmd": [
643       "python",
644       "-u",
645       "\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",
646       "[START_DIR]/out/Release"
647     ],
648     "infra_step": true,
649     "name": "dump log",
650     "~followup_annotations": [
651       "@@@STEP_LOG_LINE@python.inline@@@@",
652       "@@@STEP_LOG_LINE@python.inline@import os@@@",
653       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
654       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
655       "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
656       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
657       "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
658       "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
659       "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
660       "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
661       "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
662       "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
663       "@@@STEP_LOG_LINE@python.inline@      sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
664       "@@@STEP_LOG_LINE@python.inline@      line = line.replace(addr, addr + ' ' + sym.strip())@@@",
665       "@@@STEP_LOG_LINE@python.inline@  print line@@@",
666       "@@@STEP_LOG_END@python.inline@@@"
667     ]
668   },
669   {
670     "cmd": [
671       "adb",
672       "kill-server"
673     ],
674     "cwd": "[START_DIR]/skia",
675     "infra_step": true,
676     "name": "kill adb server"
677   },
678   {
679     "name": "$result",
680     "recipe_result": null,
681     "status_code": 0
682   }
683 ]