[
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "ensure-directory",
      "--mode",
      "0777",
      "[START_DIR]/tmp"
    ],
    "infra_step": true,
    "name": "makedirs tmp_dir"
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "copy",
      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
      "/path/to/tmp/"
    ],
    "infra_step": true,
    "name": "Get skp VERSION",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@VERSION@42@@@",
      "@@@STEP_LOG_END@VERSION@@@"
    ]
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "copy",
      "42",
      "[START_DIR]/tmp/SKP_VERSION"
    ],
    "infra_step": true,
    "name": "write SKP_VERSION",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@SKP_VERSION@42@@@",
      "@@@STEP_LOG_END@SKP_VERSION@@@"
    ]
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "copy",
      "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
      "/path/to/tmp/"
    ],
    "infra_step": true,
    "name": "Get skimage VERSION",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@VERSION@42@@@",
      "@@@STEP_LOG_END@VERSION@@@"
    ]
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "copy",
      "42",
      "[START_DIR]/tmp/SK_IMAGE_VERSION"
    ],
    "infra_step": true,
    "name": "write SK_IMAGE_VERSION",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@SK_IMAGE_VERSION@42@@@",
      "@@@STEP_LOG_END@SK_IMAGE_VERSION@@@"
    ]
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "copy",
      "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
      "/path/to/tmp/"
    ],
    "infra_step": true,
    "name": "Get svg VERSION",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@VERSION@42@@@",
      "@@@STEP_LOG_END@VERSION@@@"
    ]
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "copy",
      "42",
      "[START_DIR]/tmp/SVG_VERSION"
    ],
    "infra_step": true,
    "name": "write SVG_VERSION",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@SVG_VERSION@42@@@",
      "@@@STEP_LOG_END@SVG_VERSION@@@"
    ]
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "rmtree",
      "[START_DIR]/test"
    ],
    "infra_step": true,
    "name": "rmtree test"
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "ensure-directory",
      "--mode",
      "0777",
      "[START_DIR]/test"
    ],
    "infra_step": true,
    "name": "makedirs test"
  },
  {
    "cmd": [
      "python",
      "\nimport contextlib\nimport math\nimport socket\nimport sys\nimport time\n\nfrom urllib.request import urlopen\n\nHASHES_URL = sys.argv[1]\nRETRIES = 5\nTIMEOUT = 60\nWAIT_BASE = 15\n\nsocket.setdefaulttimeout(TIMEOUT)\nfor retry in range(RETRIES):\n  try:\n    with contextlib.closing(\n        urlopen(HASHES_URL, timeout=TIMEOUT)) as w:\n      hashes = w.read().decode('utf-8')\n      with open(sys.argv[2], '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",
      "https://example.com/hashes.txt",
      "[START_DIR]/tmp/uninteresting_hashes.txt"
    ],
    "env": {
      "CHROME_HEADLESS": "1",
      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
    },
    "infra_step": true,
    "name": "get uninteresting hashes",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@python.inline@@@@",
      "@@@STEP_LOG_LINE@python.inline@import contextlib@@@",
      "@@@STEP_LOG_LINE@python.inline@import math@@@",
      "@@@STEP_LOG_LINE@python.inline@import socket@@@",
      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
      "@@@STEP_LOG_LINE@python.inline@import time@@@",
      "@@@STEP_LOG_LINE@python.inline@@@@",
      "@@@STEP_LOG_LINE@python.inline@from urllib.request import urlopen@@@",
      "@@@STEP_LOG_LINE@python.inline@@@@",
      "@@@STEP_LOG_LINE@python.inline@HASHES_URL = sys.argv[1]@@@",
      "@@@STEP_LOG_LINE@python.inline@RETRIES = 5@@@",
      "@@@STEP_LOG_LINE@python.inline@TIMEOUT = 60@@@",
      "@@@STEP_LOG_LINE@python.inline@WAIT_BASE = 15@@@",
      "@@@STEP_LOG_LINE@python.inline@@@@",
      "@@@STEP_LOG_LINE@python.inline@socket.setdefaulttimeout(TIMEOUT)@@@",
      "@@@STEP_LOG_LINE@python.inline@for retry in range(RETRIES):@@@",
      "@@@STEP_LOG_LINE@python.inline@  try:@@@",
      "@@@STEP_LOG_LINE@python.inline@    with contextlib.closing(@@@",
      "@@@STEP_LOG_LINE@python.inline@        urlopen(HASHES_URL, timeout=TIMEOUT)) as w:@@@",
      "@@@STEP_LOG_LINE@python.inline@      hashes = w.read().decode('utf-8')@@@",
      "@@@STEP_LOG_LINE@python.inline@      with open(sys.argv[2], 'w') as f:@@@",
      "@@@STEP_LOG_LINE@python.inline@        f.write(hashes)@@@",
      "@@@STEP_LOG_LINE@python.inline@        break@@@",
      "@@@STEP_LOG_LINE@python.inline@  except Exception as e:@@@",
      "@@@STEP_LOG_LINE@python.inline@    print('Failed to get uninteresting hashes from %s:' % HASHES_URL)@@@",
      "@@@STEP_LOG_LINE@python.inline@    print(e)@@@",
      "@@@STEP_LOG_LINE@python.inline@    if retry == RETRIES:@@@",
      "@@@STEP_LOG_LINE@python.inline@      raise@@@",
      "@@@STEP_LOG_LINE@python.inline@    waittime = WAIT_BASE * math.pow(2, retry)@@@",
      "@@@STEP_LOG_LINE@python.inline@    print('Retry in %d seconds.' % waittime)@@@",
      "@@@STEP_LOG_LINE@python.inline@    time.sleep(waittime)@@@",
      "@@@STEP_LOG_END@python.inline@@@"
    ]
  },
  {
    "cmd": [
      "python",
      "import os\nprint(os.environ.get('SWARMING_BOT_ID', ''))\n"
    ],
    "name": "get swarming bot id",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@python.inline@import os@@@",
      "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_BOT_ID', ''))@@@",
      "@@@STEP_LOG_END@python.inline@@@"
    ]
  },
  {
    "cmd": [
      "python",
      "import os\nprint(os.environ.get('SWARMING_TASK_ID', ''))\n"
    ],
    "name": "get swarming task id",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@python.inline@import os@@@",
      "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_TASK_ID', ''))@@@",
      "@@@STEP_LOG_END@python.inline@@@"
    ]
  },
  {
    "cmd": [
      "python",
      "RECIPE_MODULE[skia::flavor]/resources/symbolize_stack_trace.py",
      "[START_DIR]",
      "[START_DIR]/build/dm",
      "--example",
      "--flags",
      "--properties",
      "bot",
      "skia-bot-123",
      "key1",
      "value1",
      "task",
      "123456",
      "--resourcePath",
      "[START_DIR]/skia/resources",
      "--skps",
      "[START_DIR]/skp",
      "--images",
      "[START_DIR]/skimage/dm",
      "--colorImages",
      "[START_DIR]/skimage/colorspace",
      "--svgs",
      "[START_DIR]/svg/svg",
      "--fontTestDataPath",
      "[START_DIR]/googlefonts_testdata/data",
      "--uninterestingHashesFile",
      "[START_DIR]/tmp/uninteresting_hashes.txt",
      "--writePath",
      "[START_DIR]/[SWARM_OUT_DIR]"
    ],
    "cwd": "[START_DIR]/skia",
    "env": {
      "CHROME_HEADLESS": "1",
      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
    },
    "name": "symbolized dm"
  },
  {
    "cmd": [
      "vpython3",
      "-u",
      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
      "--json-output",
      "/path/to/tmp/json",
      "glob",
      "[START_DIR]/[SWARM_OUT_DIR]",
      "*.png"
    ],
    "infra_step": true,
    "name": "find .png images",
    "~followup_annotations": [
      "@@@STEP_LOG_LINE@glob@[START_DIR]/[SWARM_OUT_DIR]/someimage.png@@@",
      "@@@STEP_LOG_END@glob@@@"
    ]
  },
  {
    "cmd": [
      "gsutil",
      "-m",
      "cp",
      "[START_DIR]/[SWARM_OUT_DIR]/*.png",
      "gs://skia-infra-gm/dm-images-v1"
    ],
    "name": "upload .png images"
  },
  {
    "cmd": [
      "gsutil",
      "cp",
      "-Z",
      "[START_DIR]/[SWARM_OUT_DIR]/dm.json",
      "gs://skia-infra-gm/trybot/dm-json-v1/2012/05/14/12/1234_7/Test-Debian10-Clang-GCE-CPU-AVX2-x86_64-Debug-All-Fontations/1337000001/dm.json"
    ],
    "name": "upload dm.json"
  },
  {
    "name": "$result"
  }
]