| Index: infra/bots/recipes/swarm_test.expected/legacy_skimage_version.json
 | 
| diff --git a/infra/bots/recipes/swarm_test.expected/legacy_skimage_version.json b/infra/bots/recipes/swarm_test.expected/legacy_skimage_version.json
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..4e3706af49ee7eed0168038aa34d462d839381a8
 | 
| --- /dev/null
 | 
| +++ b/infra/bots/recipes/swarm_test.expected/legacy_skimage_version.json
 | 
| @@ -0,0 +1,250 @@
 | 
| +[
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "[SLAVE_BUILD]/skia/tools/buildbot_spec.py",
 | 
| +      "/path/to/tmp/json",
 | 
| +      "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug"
 | 
| +    ],
 | 
| +    "cwd": "[SLAVE_BUILD]/skia",
 | 
| +    "name": "exec buildbot_spec.py",
 | 
| +    "~followup_annotations": [
 | 
| +      "@@@STEP_LOG_LINE@json.output@{@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"build_targets\": [@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"dm\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"nanobench\"@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  ], @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"builder_cfg\": {@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"arch\": \"x86_64\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"compiler\": \"GCC\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"configuration\": \"Debug\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"cpu_or_gpu\": \"CPU\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"cpu_or_gpu_value\": \"AVX2\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"is_trybot\": false, @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"model\": \"GCE\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"os\": \"Ubuntu\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"role\": \"Test\"@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  }, @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"configuration\": \"Debug\", @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"dm_flags\": [@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"--dummy-flags\"@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  ], @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"do_perf_steps\": true, @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"do_test_steps\": true, @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"env\": {@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"GYP_DEFINES\": \"skia_arch_type=x86_64 skia_gpu=0 skia_warnings_as_errors=0\"@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  }, @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"nanobench_flags\": [@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@    \"--dummy-flags\"@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  ], @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"upload_dm_results\": true, @@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@  \"upload_perf_results\": false@@@",
 | 
| +      "@@@STEP_LOG_LINE@json.output@}@@@",
 | 
| +      "@@@STEP_LOG_END@json.output@@@"
 | 
| +    ]
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
 | 
| +      "[SLAVE_BUILD]/skia/infra/bots/assets/skp/VERSION",
 | 
| +      "/path/to/tmp/"
 | 
| +    ],
 | 
| +    "name": "Get downloaded SKP VERSION"
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
 | 
| +      "42",
 | 
| +      "[SLAVE_BUILD]/tmp/SKP_VERSION"
 | 
| +    ],
 | 
| +    "name": "write SKP_VERSION"
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
 | 
| +      "[SLAVE_BUILD]/tmp/SK_IMAGE_VERSION",
 | 
| +      "/path/to/tmp/"
 | 
| +    ],
 | 
| +    "name": "Get downloaded SK_IMAGE_VERSION"
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\nimport os, sys\nfrom common import chromium_utils # Error? See https://crbug.com/584783.\n\n\nif os.path.exists(sys.argv[1]):\n  chromium_utils.RemoveDirectory(sys.argv[1])\n",
 | 
| +      "[CUSTOM_[SWARM_OUT_DIR]]/dm"
 | 
| +    ],
 | 
| +    "env": {
 | 
| +      "PYTHONPATH": "[SLAVE_BUILD]/skia/infra/bots/.recipe_deps/build/scripts"
 | 
| +    },
 | 
| +    "name": "rmtree dm",
 | 
| +    "~followup_annotations": [
 | 
| +      "@@@STEP_LOG_LINE@python.inline@@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@import os, sys@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@from common import chromium_utils # Error? See https://crbug.com/584783.@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@if os.path.exists(sys.argv[1]):@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@  chromium_utils.RemoveDirectory(sys.argv[1])@@@",
 | 
| +      "@@@STEP_LOG_END@python.inline@@@"
 | 
| +    ]
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\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",
 | 
| +      "[CUSTOM_[SWARM_OUT_DIR]]/dm",
 | 
| +      "511"
 | 
| +    ],
 | 
| +    "name": "makedirs dm",
 | 
| +    "~followup_annotations": [
 | 
| +      "@@@STEP_LOG_LINE@python.inline@@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
 | 
| +      "@@@STEP_LOG_END@python.inline@@@"
 | 
| +    ]
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\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",
 | 
| +      "[SLAVE_BUILD]/tmp",
 | 
| +      "511"
 | 
| +    ],
 | 
| +    "name": "makedirs tmp_dir",
 | 
| +    "~followup_annotations": [
 | 
| +      "@@@STEP_LOG_LINE@python.inline@@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
 | 
| +      "@@@STEP_LOG_END@python.inline@@@"
 | 
| +    ]
 | 
| +  },
 | 
| +  {
 | 
| +    "cmd": [
 | 
| +      "python",
 | 
| +      "-u",
 | 
| +      "\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",
 | 
| +      "[SLAVE_BUILD]/tmp/uninteresting_hashes.txt"
 | 
| +    ],
 | 
| +    "cwd": "[SLAVE_BUILD]/skia",
 | 
| +    "env": {
 | 
| +      "BUILDTYPE": "Debug",
 | 
| +      "CHROME_HEADLESS": "1",
 | 
| +      "GYP_DEFINES": "skia_arch_type=x86_64 skia_gpu=0 skia_warnings_as_errors=0",
 | 
| +      "SKIA_OUT": "[SLAVE_BUILD]/out"
 | 
| +    },
 | 
| +    "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@import urllib2@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@HASHES_URL = 'https://gold.skia.org/_/hashes'@@@",
 | 
| +      "@@@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@        urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@      hashes = w.read()@@@",
 | 
| +      "@@@STEP_LOG_LINE@python.inline@      with open(sys.argv[1], '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": [
 | 
| +      "catchsegv",
 | 
| +      "[SLAVE_BUILD]/out/Debug/dm",
 | 
| +      "--undefok",
 | 
| +      "--resourcePath",
 | 
| +      "[SLAVE_BUILD]/skia/resources",
 | 
| +      "--skps",
 | 
| +      "[SLAVE_BUILD]/skp",
 | 
| +      "--images",
 | 
| +      "[SLAVE_BUILD]/images/dm",
 | 
| +      "--colorImages",
 | 
| +      "[SLAVE_BUILD]/images/colorspace",
 | 
| +      "--nameByHash",
 | 
| +      "--properties",
 | 
| +      "gitHash",
 | 
| +      "abc123",
 | 
| +      "master",
 | 
| +      "client.skia",
 | 
| +      "builder",
 | 
| +      "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug",
 | 
| +      "build_number",
 | 
| +      "6",
 | 
| +      "--key",
 | 
| +      "arch",
 | 
| +      "x86_64",
 | 
| +      "compiler",
 | 
| +      "GCC",
 | 
| +      "configuration",
 | 
| +      "Debug",
 | 
| +      "cpu_or_gpu",
 | 
| +      "CPU",
 | 
| +      "cpu_or_gpu_value",
 | 
| +      "AVX2",
 | 
| +      "model",
 | 
| +      "GCE",
 | 
| +      "os",
 | 
| +      "Ubuntu",
 | 
| +      "--uninterestingHashesFile",
 | 
| +      "[SLAVE_BUILD]/tmp/uninteresting_hashes.txt",
 | 
| +      "--writePath",
 | 
| +      "[CUSTOM_[SWARM_OUT_DIR]]/dm",
 | 
| +      "--nogpu",
 | 
| +      "--dummy-flags"
 | 
| +    ],
 | 
| +    "env": {
 | 
| +      "BUILDTYPE": "Debug",
 | 
| +      "CHROME_HEADLESS": "1",
 | 
| +      "GYP_DEFINES": "skia_arch_type=x86_64 skia_gpu=0 skia_warnings_as_errors=0",
 | 
| +      "SKIA_OUT": "[SLAVE_BUILD]/out"
 | 
| +    },
 | 
| +    "name": "dm"
 | 
| +  },
 | 
| +  {
 | 
| +    "name": "$result",
 | 
| +    "recipe_result": null,
 | 
| +    "status_code": 0
 | 
| +  }
 | 
| +]
 | 
| 
 |