aboutsummaryrefslogtreecommitdiffhomepage
path: root/infra/bots/recipe_modules
diff options
context:
space:
mode:
Diffstat (limited to 'infra/bots/recipe_modules')
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-Arm7-Release-iOS.json173
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-arm64-Debug-GN_iOS.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-mipsel-Debug-GN_Android.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Debug-CommandBuffer.json194
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Release-GN.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot.json163
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-ASAN.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-GN.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86-Debug.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-GN.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-MSAN.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-NoGPU.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-ANGLE.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Fast.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Mesa.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json224
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths.json224
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Valgrind.json157
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-Clang-arm64-Release-GN_Android.json175
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-ANGLE.json175
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-Exceptions.json175
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug.json175
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GDI.json175
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GN.json175
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86_64-Release-Vulkan.json212
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/big_issue_number.json181
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_gerrit.json201
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_rietveld.json203
-rw-r--r--infra/bots/recipe_modules/compile/example.expected/recipe_with_gerrit_patch.json201
-rw-r--r--infra/bots/recipe_modules/compile/example.py168
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android_Vulkan.json455
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-GN_Android.json455
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android.json509
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android.json509
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android.json509
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android.json509
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN.json208
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json113
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN.json208
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE.json212
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json207
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Debug.json119
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release.json205
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE.json211
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json122
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot.json213
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/Perf-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json429
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/big_issue_number.json213
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/nobuildbot.json247
-rw-r--r--infra/bots/recipe_modules/perf/example.expected/recipe_with_gerrit_patch.json229
-rw-r--r--infra/bots/recipe_modules/perf/example.py157
-rw-r--r--infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench.json290
-rw-r--r--infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Vulkan_Skpbench.json290
-rw-r--r--infra/bots/recipe_modules/skpbench/example.py56
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6-GPU-Adreno420-arm-Debug-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-GN_Android_Vulkan.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Release-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-PixelC-GPU-TegraX1-arm64-Debug-GN_Android.json606
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug.json623
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug.json525
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json424
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug.json527
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-ASAN.json414
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN.json415
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug.json525
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Shared.json527
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN.json415
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json1227
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Debug-ANGLE.json382
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan.json376
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan.json378
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot.json510
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json390
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json984
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/big_issue_number.json510
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/failed_dm.json530
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/failed_get_hashes.json608
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/missing_SKP_VERSION_device.json988
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/nobuildbot.json565
-rw-r--r--infra/bots/recipe_modules/sktest/example.expected/recipe_with_gerrit_patch.json531
-rw-r--r--infra/bots/recipe_modules/sktest/example.py225
-rw-r--r--infra/bots/recipe_modules/upload_dm_results/example.expected/failed_all.json157
-rw-r--r--infra/bots/recipe_modules/upload_dm_results/example.expected/failed_once.json124
-rw-r--r--infra/bots/recipe_modules/upload_dm_results/example.expected/normal_bot.json111
-rw-r--r--infra/bots/recipe_modules/upload_dm_results/example.expected/recipe_with_gerrit_patch.json111
-rw-r--r--infra/bots/recipe_modules/upload_dm_results/example.expected/trybot.json111
-rw-r--r--infra/bots/recipe_modules/upload_dm_results/example.py70
-rw-r--r--infra/bots/recipe_modules/upload_nano_results/example.expected/normal_bot.json31
-rw-r--r--infra/bots/recipe_modules/upload_nano_results/example.expected/recipe_with_gerrit_patch.json31
-rw-r--r--infra/bots/recipe_modules/upload_nano_results/example.expected/trybot.json31
-rw-r--r--infra/bots/recipe_modules/upload_nano_results/example.py50
102 files changed, 32630 insertions, 0 deletions
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-Arm7-Release-iOS.json b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-Arm7-Release-iOS.json
new file mode 100644
index 0000000000..9a85fed563
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-Arm7-Release-iOS.json
@@ -0,0 +1,173 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-Arm7-Release-iOS"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[CUSTOM_/_B_WORK]/skia/platform_tools/ios/bin/ios_ninja"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CC": "/usr/bin/clang",
+ "CHROME_HEADLESS": "1",
+ "CXX": "/usr/bin/clang++",
+ "GYP_DEFINES": "skia_arch_type=arm skia_clang_build=1 skia_os=ios skia_warnings_as_errors=1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-Arm7-Release-iOS"
+ },
+ "name": "build iOSShell"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-Arm7-Release-iOS/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/xcodebuild/Release-iphoneos",
+ "[CUSTOM_[SWARM_OUT_DIR]]/xcodebuild/Release-iphoneos"
+ ],
+ "name": "copy build products (2)",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-arm64-Debug-GN_iOS.json b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-arm64-Debug-GN_iOS.json
new file mode 100644
index 0000000000..cc218ce11f
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-arm64-Debug-GN_iOS.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-arm64-Debug-GN_iOS"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-arm64-Debug-GN_iOS/Debug",
+ "--args=cc=\"clang\" cxx=\"clang++\" extra_cflags=[\"-O1\"] target_os=\"ios\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-arm64-Debug-GN_iOS/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-arm64-Debug-GN_iOS/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-mipsel-Debug-GN_Android.json b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-mipsel-Debug-GN_Android.json
new file mode 100644
index 0000000000..e3874738ca
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-mipsel-Debug-GN_Android.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-mipsel-Debug-GN_Android"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-mipsel-Debug-GN_Android/Debug",
+ "--args=extra_cflags=[\"-O1\"] ndk=\"[START_DIR]/android_ndk_darwin\" target_cpu=\"mipsel\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-mipsel-Debug-GN_Android/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-mipsel-Debug-GN_Android/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Debug-CommandBuffer.json b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Debug-CommandBuffer.json
new file mode 100644
index 0000000000..661aaad554
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Debug-CommandBuffer.json
@@ -0,0 +1,194 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}, {'deps_file': '.DEPS.git', 'managed': False, 'name': 'src', 'url': 'https://chromium.googlesource.com/chromium/src.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--revision",
+ "src@origin/lkgr",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Debug-CommandBuffer"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"src\": \"origin/lkgr\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_PACKAGE_REPO[depot_tools]/gclient.py",
+ "runhooks"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "GYP_CHROMIUM_NO_ACTION": "0",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gclient runhooks"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/tools/build_command_buffer.py",
+ "--chrome-dir",
+ "[CUSTOM_/_B_WORK]",
+ "--output-dir",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Debug-CommandBuffer/Debug",
+ "--no-sync",
+ "--make-output-dir"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Debug-CommandBuffer"
+ },
+ "name": "build command_buffer"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Debug-CommandBuffer/Debug",
+ "--args=cc=\"clang\" cxx=\"clang++\" extra_cflags=[\"-O1\"]"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Debug-CommandBuffer/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Debug-CommandBuffer/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Release-GN.json b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Release-GN.json
new file mode 100644
index 0000000000..216aabf553
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Mac-Clang-x86_64-Release-GN.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Release-GN"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Release-GN/Release",
+ "--args=cc=\"clang\" cxx=\"clang++\" is_debug=false"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Release-GN/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Mac-Clang-x86_64-Release-GN/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot.json
new file mode 100644
index 0000000000..78b81c7ac1
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot.json
@@ -0,0 +1,163 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--issue",
+ "500",
+ "--patchset",
+ "1",
+ "--rietveld_server",
+ "https://codereview.chromium.org",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot/Debug",
+ "--args=extra_cflags=[\"-O1\"] ndk=\"[START_DIR]/android_ndk_linux\" target_cpu=\"arm64\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs.json
new file mode 100644
index 0000000000..553bbae0bd
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs/Debug",
+ "--args=extra_cflags=[\"-O1\"] ndk=\"[START_DIR]/android_ndk_linux\" skia_enable_android_framework_defines=true target_cpu=\"arm64\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android.json
new file mode 100644
index 0000000000..0e44619a29
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android/Release",
+ "--args=is_debug=false ndk=\"[START_DIR]/android_ndk_linux\" target_cpu=\"arm64\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan.json
new file mode 100644
index 0000000000..aba757358a
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan/Release",
+ "--args=is_debug=false ndk=\"[START_DIR]/android_ndk_linux\" ndk_api=24 skia_enable_vulkan_debug_layers=false target_cpu=\"arm64\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-ASAN.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-ASAN.json
new file mode 100644
index 0000000000..587b3e4869
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-ASAN.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-ASAN"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-ASAN/Debug",
+ "--args=cc=\"[START_DIR]/clang_linux/bin/clang\" cxx=\"[START_DIR]/clang_linux/bin/clang++\" extra_cflags=[\"-O1\"] extra_ldflags=[\"-fuse-ld=lld\"] sanitize=\"ASAN\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-ASAN/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-ASAN/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-GN.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-GN.json
new file mode 100644
index 0000000000..37b4f13d6e
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-Clang-x86_64-Debug-GN.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-GN"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-GN/Debug",
+ "--args=cc=\"[START_DIR]/clang_linux/bin/clang\" cxx=\"[START_DIR]/clang_linux/bin/clang++\" extra_cflags=[\"-O1\"] extra_ldflags=[\"-fuse-ld=lld\"]"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-GN/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-Clang-x86_64-Debug-GN/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86-Debug.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86-Debug.json
new file mode 100644
index 0000000000..f32a316e56
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86-Debug.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86-Debug"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86-Debug/Debug",
+ "--args=cc=\"gcc\" cxx=\"g++\" extra_cflags=[\"-O1\"] target_cpu=\"x86\""
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86-Debug/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86-Debug/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-GN.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-GN.json
new file mode 100644
index 0000000000..9faddf7130
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-GN.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-GN"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-GN/Debug",
+ "--args=cc=\"gcc\" cxx=\"g++\" extra_cflags=[\"-O1\"]"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-GN/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-GN/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-MSAN.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-MSAN.json
new file mode 100644
index 0000000000..0f3e6fad6f
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-MSAN.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-MSAN"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-MSAN/Debug",
+ "--args=cc=\"gcc\" cxx=\"g++\" extra_cflags=[\"-O1\"] extra_ldflags=[\"-L[START_DIR]/clang_linux/msan\"] sanitize=\"MSAN\" skia_use_fontconfig=false"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-MSAN/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-MSAN/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-NoGPU.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-NoGPU.json
new file mode 100644
index 0000000000..bb23e90a12
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-NoGPU.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-NoGPU"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-NoGPU/Debug",
+ "--args=cc=\"gcc\" cxx=\"g++\" extra_cflags=[\"-O1\"] skia_enable_gpu=false"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-NoGPU/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-NoGPU/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE.json
new file mode 100644
index 0000000000..d6f3944375
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE/Debug",
+ "--args=cc=\"gcc\" cxx=\"g++\" extra_cflags=[\"-O1\", \"-DSK_USE_DISCARDABLE_SCALEDIMAGECACHE\"]"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE/Debug"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE/Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-ANGLE.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-ANGLE.json
new file mode 100644
index 0000000000..1d7a797477
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-ANGLE.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-ANGLE"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-ANGLE/Release",
+ "--args=cc=\"gcc\" cxx=\"g++\" is_debug=false skia_use_angle=true"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-ANGLE/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-ANGLE/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Fast.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Fast.json
new file mode 100644
index 0000000000..f1607435f8
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Fast.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Fast"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Fast/Release",
+ "--args=cc=\"gcc\" cxx=\"g++\" extra_cflags=[\"-march=native\", \"-fomit-frame-pointer\", \"-O3\", \"-ffp-contract=off\"] is_debug=false"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Fast/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Fast/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Mesa.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Mesa.json
new file mode 100644
index 0000000000..53819878d8
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Mesa.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Mesa"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Mesa/Release",
+ "--args=cc=\"gcc\" cxx=\"g++\" is_debug=false skia_use_mesa=true"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Mesa/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Mesa/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json
new file mode 100644
index 0000000000..7bec373a9d
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json
@@ -0,0 +1,224 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}, {'deps_file': '.DEPS.git', 'managed': False, 'name': 'pdfium', 'url': 'https://pdfium.googlesource.com/pdfium.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "pdfium@origin/master",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"pdfium\": \"origin/master\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gclient",
+ "runhook",
+ "gn_linux64"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "GYP_DEFINES": "",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium"
+ },
+ "name": "runhook"
+ },
+ {
+ "cmd": [
+ "python",
+ "build/linux/sysroot_scripts/install-sysroot.py",
+ "--arch=amd64"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium"
+ },
+ "name": "sysroot"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "out/skia",
+ "--args=pdf_is_standalone=true clang_use_chrome_plugins=false is_component_build=false is_debug=false pdf_use_skia=true"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "CHROMIUM_BUILDTOOLS_PATH": "[CUSTOM_/_B_WORK]/pdfium/buildtools",
+ "GYP_DEFINES": "",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium"
+ },
+ "name": "gn_gen"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[CUSTOM_/_B_WORK]/pdfium/DEPS",
+ "/path/to/tmp/"
+ ],
+ "name": "read PDFium DEPS"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "'skia_revision': '9046e2e693bb92a76e972b694580e5d17ad10748'",
+ "[CUSTOM_/_B_WORK]/pdfium/DEPS"
+ ],
+ "name": "write PDFium DEPs"
+ },
+ {
+ "cmd": [
+ "gclient",
+ "sync"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium"
+ },
+ "name": "sync_pdfium"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "out/skia",
+ "-j100"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "CHROMIUM_BUILDTOOLS_PATH": "[CUSTOM_/_B_WORK]/pdfium/buildtools",
+ "GYP_DEFINES": "",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium"
+ },
+ "name": "build_pdfium"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths.json
new file mode 100644
index 0000000000..449c02cc51
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths.json
@@ -0,0 +1,224 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}, {'deps_file': '.DEPS.git', 'managed': False, 'name': 'pdfium', 'url': 'https://pdfium.googlesource.com/pdfium.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "pdfium@origin/master",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"pdfium\": \"origin/master\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gclient",
+ "runhook",
+ "gn_linux64"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "GYP_DEFINES": "",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths"
+ },
+ "name": "runhook"
+ },
+ {
+ "cmd": [
+ "python",
+ "build/linux/sysroot_scripts/install-sysroot.py",
+ "--arch=amd64"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths"
+ },
+ "name": "sysroot"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "out/skia",
+ "--args=pdf_is_standalone=true clang_use_chrome_plugins=false is_component_build=false is_debug=false pdf_use_skia_paths=true"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "CHROMIUM_BUILDTOOLS_PATH": "[CUSTOM_/_B_WORK]/pdfium/buildtools",
+ "GYP_DEFINES": "",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths"
+ },
+ "name": "gn_gen"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[CUSTOM_/_B_WORK]/pdfium/DEPS",
+ "/path/to/tmp/"
+ ],
+ "name": "read PDFium DEPS"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "'skia_revision': '9046e2e693bb92a76e972b694580e5d17ad10748'",
+ "[CUSTOM_/_B_WORK]/pdfium/DEPS"
+ ],
+ "name": "write PDFium DEPs"
+ },
+ {
+ "cmd": [
+ "gclient",
+ "sync"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths"
+ },
+ "name": "sync_pdfium"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "out/skia",
+ "-j100"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/pdfium",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "CHROMIUM_BUILDTOOLS_PATH": "[CUSTOM_/_B_WORK]/pdfium/buildtools",
+ "GYP_DEFINES": "",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths"
+ },
+ "name": "build_pdfium"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Valgrind.json b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Valgrind.json
new file mode 100644
index 0000000000..7872d204ca
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Ubuntu-GCC-x86_64-Release-Valgrind.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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_/_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_/_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Valgrind"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_/_B_WORK]/skia/bin/fetch-gn"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn",
+ "gen",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Valgrind/Release",
+ "--args=cc=\"gcc\" cxx=\"g++\" is_debug=false"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja",
+ "-C",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Valgrind/Release"
+ ],
+ "cwd": "[CUSTOM_/_B_WORK]/skia",
+ "env": {
+ "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_/_B_WORK]/skia/out/Build-Ubuntu-GCC-x86_64-Release-Valgrind/Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]/out/Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-Clang-arm64-Release-GN_Android.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-Clang-arm64-Release-GN_Android.json
new file mode 100644
index 0000000000..a3360db50b
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-Clang-arm64-Release-GN_Android.json
@@ -0,0 +1,175 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-Clang-arm64-Release-GN_Android"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-Clang-arm64-Release-GN_Android\\Release",
+ "--args=is_debug=false ndk=\"[START_DIR]\\n\" target_cpu=\"arm64\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-Clang-arm64-Release-GN_Android\\Release"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-Clang-arm64-Release-GN_Android\\Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-ANGLE.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-ANGLE.json
new file mode 100644
index 0000000000..a8d496f190
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-ANGLE.json
@@ -0,0 +1,175 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-ANGLE"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-ANGLE\\Debug",
+ "--args=skia_use_angle=true target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-ANGLE\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-ANGLE\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-Exceptions.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-Exceptions.json
new file mode 100644
index 0000000000..d86b258e66
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug-Exceptions.json
@@ -0,0 +1,175 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Exceptions"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Exceptions\\Debug",
+ "--args=extra_cflags=[\"/EHsc\"] target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Exceptions\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Exceptions\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug.json
new file mode 100644
index 0000000000..9af4febe59
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Debug.json
@@ -0,0 +1,175 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "--args=target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GDI.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GDI.json
new file mode 100644
index 0000000000..8e2519c16e
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GDI.json
@@ -0,0 +1,175 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GDI"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GDI\\Release",
+ "--args=is_debug=false skia_use_gdi=true target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GDI\\Release"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GDI\\Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GN.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GN.json
new file mode 100644
index 0000000000..89eef193e0
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86-Release-GN.json
@@ -0,0 +1,175 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GN"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GN\\Release",
+ "--args=is_debug=false target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GN\\Release"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Release-GN\\Release",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Release"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86_64-Release-Vulkan.json b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86_64-Release-Vulkan.json
new file mode 100644
index 0000000000..7d336f0d6c
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/Build-Win-MSVC-x86_64-Release-Vulkan.json
@@ -0,0 +1,212 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86_64-Release-Vulkan"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86_64-Release-Vulkan\\Release_x64",
+ "--args=is_debug=false skia_vulkan_sdk=\"[START_DIR]\\win_vulkan_sdk\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86_64-Release-Vulkan\\Release_x64"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86_64-Release-Vulkan\\Release_x64",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Release_x64"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[START_DIR]\\win_vulkan_sdk",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Release_x64"
+ ],
+ "name": "copy build products (2)",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/big_issue_number.json b/infra/bots/recipe_modules/compile/example.expected/big_issue_number.json
new file mode 100644
index 0000000000..f6b1c973c4
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/big_issue_number.json
@@ -0,0 +1,181 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--issue",
+ "2147533002",
+ "--patchset",
+ "1",
+ "--rietveld_server",
+ "https://codereview.chromium.org",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "--args=target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_gerrit.json b/infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_gerrit.json
new file mode 100644
index 0000000000..e1d93a11d0
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_gerrit.json
@@ -0,0 +1,201 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--gerrit_repo",
+ "skia",
+ "--gerrit_ref",
+ "refs/changes/89/456789/12",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "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",
+ "[START_DIR]\\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",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "--args=target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_rietveld.json b/infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_rietveld.json
new file mode 100644
index 0000000000..b4c1c074e9
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/buildbotless_trybot_rietveld.json
@@ -0,0 +1,203 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--issue",
+ "500",
+ "--patchset",
+ "1",
+ "--rietveld_server",
+ "https://codereview.chromium.org",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "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",
+ "[START_DIR]\\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",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "--args=target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.expected/recipe_with_gerrit_patch.json b/infra/bots/recipe_modules/compile/example.expected/recipe_with_gerrit_patch.json
new file mode 100644
index 0000000000..880e0028d4
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.expected/recipe_with_gerrit_patch.json
@@ -0,0 +1,201 @@
+[
+ {
+ "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_C:\\_B_WORK]",
+ "511"
+ ],
+ "name": "makedirs checkout_path",
+ "~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",
+ "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
+ "--spec",
+ "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
+ "--patch_root",
+ "skia",
+ "--revision_mapping_file",
+ "{\"skia\": \"got_revision\"}",
+ "--git-cache-dir",
+ "[CUSTOM_C:\\_B_CACHE]",
+ "--gerrit_repo",
+ "https://skia.googlesource.com/skia",
+ "--gerrit_ref",
+ "refs/changes/89/456789/12",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--revision",
+ "skia@abc123",
+ "--output_manifest"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]",
+ "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Trybot"
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }, @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
+ ]
+ },
+ {
+ "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",
+ "[START_DIR]\\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",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\bin\\fetch-gn"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "fetch-gn"
+ },
+ {
+ "cmd": [
+ "gn.bat",
+ "gen",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Trybot\\Debug",
+ "--args=target_cpu=\"x86\" windk=\"[START_DIR]\\t\\depot_tools\\win_toolchain\\vs_files\\d3cb0e37bdd120ad0ac4650b674b09e81be45616\""
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "gn gen"
+ },
+ {
+ "cmd": [
+ "ninja.exe",
+ "-C",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Trybot\\Debug"
+ ],
+ "cwd": "[CUSTOM_C:\\_B_WORK]\\skia",
+ "env": {
+ "PATH": "%(PATH)s;RECIPE_PACKAGE_REPO[depot_tools]"
+ },
+ "name": "ninja"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n",
+ "[CUSTOM_C:\\_B_WORK]\\skia\\out\\Build-Win-MSVC-x86-Debug-Trybot\\Debug",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\out\\Debug"
+ ],
+ "name": "copy build products",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import errno@@@",
+ "@@@STEP_LOG_LINE@python.inline@import glob@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import shutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@",
+ "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ raise@@@",
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import psutil\nfor p in psutil.process_iter():\n try:\n if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):\n p.kill()\n except psutil._error.AccessDenied:\n pass\n"
+ ],
+ "name": "cleanup",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@import psutil@@@",
+ "@@@STEP_LOG_LINE@python.inline@for p in psutil.process_iter():@@@",
+ "@@@STEP_LOG_LINE@python.inline@ try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p.name in ('mspdbsrv.exe', 'vctip.exe', 'cl.exe', 'link.exe'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p.kill()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ except psutil._error.AccessDenied:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ pass@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/compile/example.py b/infra/bots/recipe_modules/compile/example.py
new file mode 100644
index 0000000000..6cd948fbe2
--- /dev/null
+++ b/infra/bots/recipe_modules/compile/example.py
@@ -0,0 +1,168 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Example recipe w/ coverage.
+
+
+DEPS = [
+ 'compile',
+ 'recipe_engine/path',
+ 'recipe_engine/platform',
+ 'recipe_engine/properties',
+]
+
+
+TEST_BUILDERS = {
+ 'client.skia.compile': {
+ 'skiabot-linux-swarm-000': [
+ 'Build-Mac-Clang-Arm7-Release-iOS',
+ 'Build-Mac-Clang-arm64-Debug-GN_iOS',
+ 'Build-Mac-Clang-mipsel-Debug-GN_Android',
+ 'Build-Mac-Clang-x86_64-Debug-CommandBuffer',
+ 'Build-Mac-Clang-x86_64-Release-GN',
+ 'Build-Ubuntu-Clang-arm64-Release-GN_Android',
+ 'Build-Ubuntu-Clang-arm64-Release-GN_Android_Vulkan',
+ 'Build-Ubuntu-Clang-x86_64-Debug-ASAN',
+ 'Build-Ubuntu-Clang-x86_64-Debug-GN',
+ 'Build-Ubuntu-Clang-arm64-Debug-GN_Android-Trybot',
+ 'Build-Ubuntu-Clang-arm64-Debug-GN_Android_FrameworkDefs',
+ 'Build-Ubuntu-GCC-x86-Debug',
+ 'Build-Ubuntu-GCC-x86_64-Debug-GN',
+ 'Build-Ubuntu-GCC-x86_64-Debug-MSAN',
+ 'Build-Ubuntu-GCC-x86_64-Debug-NoGPU',
+ 'Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE',
+ 'Build-Ubuntu-GCC-x86_64-Release-ANGLE',
+ 'Build-Ubuntu-GCC-x86_64-Release-Fast',
+ 'Build-Ubuntu-GCC-x86_64-Release-Mesa',
+ 'Build-Ubuntu-GCC-x86_64-Release-PDFium',
+ 'Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths',
+ 'Build-Ubuntu-GCC-x86_64-Release-Valgrind',
+ 'Build-Win-Clang-arm64-Release-GN_Android',
+ 'Build-Win-MSVC-x86-Debug',
+ 'Build-Win-MSVC-x86-Debug-ANGLE',
+ 'Build-Win-MSVC-x86-Debug-Exceptions',
+ 'Build-Win-MSVC-x86-Release-GDI',
+ 'Build-Win-MSVC-x86-Release-GN',
+ 'Build-Win-MSVC-x86_64-Release-Vulkan',
+ ],
+ },
+}
+
+
+def RunSteps(api):
+ api.compile.run()
+
+
+def GenTests(api):
+ for mastername, slaves in TEST_BUILDERS.iteritems():
+ for slavename, builders_by_slave in slaves.iteritems():
+ for builder in builders_by_slave:
+ test = (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ )
+ )
+ if 'Win' in builder:
+ test += api.platform('win', 64)
+ elif 'Mac' in builder:
+ test += api.platform('mac', 64)
+ else:
+ test += api.platform('linux', 64)
+ if 'Trybot' in builder:
+ test += api.properties(issue=500,
+ patchset=1,
+ rietveld='https://codereview.chromium.org')
+
+ yield test
+
+ mastername = 'client.skia.compile'
+ slavename = 'skiabot-win-compile-000'
+ buildername = 'Build-Win-MSVC-x86-Debug'
+ yield (
+ api.test('big_issue_number') +
+ api.properties(buildername=buildername,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ rietveld='https://codereview.chromium.org',
+ patchset=1,
+ issue=2147533002L) +
+ api.path.exists(
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.platform('win', 64)
+ )
+
+ yield (
+ api.test('recipe_with_gerrit_patch') +
+ api.properties(
+ buildername=buildername + '-Trybot',
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername + '-Trybot',
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ ) +
+ api.platform('win', 64)
+ )
+
+ yield (
+ api.test('buildbotless_trybot_rietveld') +
+ api.properties(
+ repository='skia',
+ buildername=buildername,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ nobuildbot='True',
+ issue=500,
+ patchset=1,
+ patch_storage='rietveld',
+ rietveld='https://codereview.chromium.org') +
+ api.platform('win', 64)
+ )
+
+ yield (
+ api.test('buildbotless_trybot_gerrit') +
+ api.properties(
+ repository='skia',
+ buildername=buildername,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ nobuildbot='True',
+ patch_issue=500,
+ patch_set=1,
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=buildername,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ ) +
+ api.platform('win', 64)
+ )
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android_Vulkan.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android_Vulkan.json
new file mode 100644
index 0000000000..4c222d112c
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android_Vulkan.json
@@ -0,0 +1,455 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/nanobench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "set -x; /data/local/tmp/nanobench --undefok -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --nocpu --pre_log --images --gpuStatsDump true --useThermalManager 1,1,10,1000 --scales 1.0 1.1 --config vk --match ~blurroundrect ~patch_grid ~desk_carsvg ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/nanobench.sh"
+ ],
+ "name": "write nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/nanobench.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "nanobench.sh"
+ ],
+ "name": "nanobench",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-GN_Android.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-GN_Android.json
new file mode 100644
index 0000000000..199abf21f0
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-GN_Android.json
@@ -0,0 +1,455 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/nanobench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "set -x; /data/local/tmp/nanobench --undefok -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --nocpu --pre_log --images --gpuStatsDump true --useThermalManager 1,1,10,1000 --scales 1.0 1.1 --config 8888 gpu nonrendering hwui f16 srgb msaa4 nvpr4 nvprdit4 --match ~blurroundrect ~patch_grid ~desk_carsvg ~keymobi_shop_mobileweb_ebay_com.skp ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/nanobench.sh"
+ ],
+ "name": "write nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/nanobench.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "nanobench.sh"
+ ],
+ "name": "nanobench",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android.json
new file mode 100644
index 0000000000..f6101b463a
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android.json
@@ -0,0 +1,509 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/nanobench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "set -x; /data/local/tmp/nanobench --undefok -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --nocpu --pre_log --images --gpuStatsDump true --useThermalManager 1,1,10,1000 --scales 1.0 1.1 --config 8888 gpu nonrendering hwui f16 srgb msaa4 nvpr4 nvprdit4 esinst --match ~blurroundrect ~patch_grid ~desk_carsvg ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp --outResultsFile /sdcard/revenge_of_the_skiabot/perf/nanobench_abc123_1337000001.json --properties gitHash abc123 build_number 5 --key arch arm compiler Clang cpu_or_gpu GPU cpu_or_gpu_value Adreno420 extra_config GN_Android model Nexus6 os Android; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/nanobench.sh"
+ ],
+ "name": "write nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/nanobench.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "nanobench.sh"
+ ],
+ "name": "nanobench",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(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]]/perfdata/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android/data",
+ "511"
+ ],
+ "name": "makedirs perf_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": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/perf",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android/data"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/perf [CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android/data"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android.json
new file mode 100644
index 0000000000..e847a237d6
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android.json
@@ -0,0 +1,509 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/nanobench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "set -x; /data/local/tmp/nanobench --undefok -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --nocpu --pre_log --images --gpuStatsDump true --useThermalManager 1,1,10,1000 --scales 1.0 1.1 --config 8888 gpu nonrendering hwui f16 srgb msaa4 nvpr4 nvprdit4 --match ~blurroundrect ~patch_grid ~desk_carsvg ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp --outResultsFile /sdcard/revenge_of_the_skiabot/perf/nanobench_abc123_1337000001.json --properties gitHash abc123 build_number 5 --key arch arm compiler Clang cpu_or_gpu GPU cpu_or_gpu_value Tegra3 extra_config GN_Android model Nexus7 os Android; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/nanobench.sh"
+ ],
+ "name": "write nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/nanobench.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "nanobench.sh"
+ ],
+ "name": "nanobench",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(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]]/perfdata/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android/data",
+ "511"
+ ],
+ "name": "makedirs perf_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": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/perf",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android/data"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/perf [CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android/data"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android.json
new file mode 100644
index 0000000000..c4228de6c1
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android.json
@@ -0,0 +1,509 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/nanobench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "set -x; /data/local/tmp/nanobench --undefok -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --nocpu --pre_log --images --gpuStatsDump true --useThermalManager 1,1,10,1000 --scales 1.0 1.1 --config 8888 gpu nonrendering hwui f16 srgb --match ~blurroundrect ~patch_grid ~desk_carsvg ~desk_unicodetable ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp --outResultsFile /sdcard/revenge_of_the_skiabot/perf/nanobench_abc123_1337000001.json --properties gitHash abc123 build_number 5 --key arch x86 compiler Clang cpu_or_gpu GPU cpu_or_gpu_value PowerVR extra_config GN_Android model NexusPlayer os Android; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/nanobench.sh"
+ ],
+ "name": "write nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/nanobench.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "nanobench.sh"
+ ],
+ "name": "nanobench",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(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]]/perfdata/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android/data",
+ "511"
+ ],
+ "name": "makedirs perf_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": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/perf",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android/data"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/perf [CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android/data"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android.json
new file mode 100644
index 0000000000..35b20726c3
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android.json
@@ -0,0 +1,509 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/perf"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/perf"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/nanobench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "set -x; /data/local/tmp/nanobench --undefok -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --nocpu --pre_log --images --gpuStatsDump true --useThermalManager 1,1,10,1000 --scales 1.0 1.1 --config 8888 gpu nonrendering hwui f16 srgb msaa4 nvpr4 nvprdit4 esinst esinst4 --match ~blurroundrect ~patch_grid ~desk_carsvg ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp --outResultsFile /sdcard/revenge_of_the_skiabot/perf/nanobench_abc123_1337000001.json --properties gitHash abc123 build_number 5 --key arch arm64 compiler Clang cpu_or_gpu GPU cpu_or_gpu_value TegraX1 extra_config GN_Android model PixelC os Android; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/nanobench.sh"
+ ],
+ "name": "write nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/nanobench.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push nanobench.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "nanobench.sh"
+ ],
+ "name": "nanobench",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(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]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android/data",
+ "511"
+ ],
+ "name": "makedirs perf_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": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/perf",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android/data"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/perf [CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android/data"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN.json
new file mode 100644
index 0000000000..9492e955a7
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN.json
@@ -0,0 +1,208 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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]]/perfdata/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN/data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "name": "rmtree data",
+ "~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]]/perfdata/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN/data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--nogpu",
+ "--pre_log",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "glinst",
+ "glinst16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN/data/nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "Clang",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX",
+ "extra_config",
+ "GN",
+ "model",
+ "MacMini6.2",
+ "os",
+ "Mac"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]/perfdata/Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN/data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json
new file mode 100644
index 0000000000..16a2734c6e
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json
@@ -0,0 +1,113 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/out/Debug/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "commandbuffer",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "nanobench"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN.json
new file mode 100644
index 0000000000..3b4b94c675
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN.json
@@ -0,0 +1,208 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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]]/perfdata/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN/data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "name": "rmtree data",
+ "~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]]/perfdata/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN/data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "catchsegv",
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--nogpu",
+ "--pre_log",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "565",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN/data/nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "Clang",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "extra_config",
+ "GN",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]/perfdata/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN/data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE.json
new file mode 100644
index 0000000000..7eda498082
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE.json
@@ -0,0 +1,212 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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]]/perfdata/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE/data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts"
+ },
+ "name": "rmtree data",
+ "~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]]/perfdata/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE/data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "catchsegv",
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "angle_d3d11_es2",
+ "angle_gl_es2",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE/data/nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX550Ti",
+ "extra_config",
+ "ANGLE",
+ "model",
+ "ShuttleA",
+ "os",
+ "Ubuntu"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]/perfdata/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE/data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json
new file mode 100644
index 0000000000..ff596e3b53
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json
@@ -0,0 +1,207 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--loops",
+ "1",
+ "--samples",
+ "1",
+ "--keepAlive",
+ "true",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "nanobench"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--loops",
+ "1",
+ "--samples",
+ "1",
+ "--keepAlive",
+ "true",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--abandonGpuContext",
+ "--nocpu"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "nanobench --abandonGpuContext"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Debug.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Debug.json
new file mode 100644
index 0000000000..f3fd6492cb
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Debug.json
@@ -0,0 +1,119 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]\\out\\Debug_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nogpu",
+ "--pre_log",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "565",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release.json
new file mode 100644
index 0000000000..9a94744ff1
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release.json
@@ -0,0 +1,205 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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]]\\perfdata\\Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release\\data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]\\skia\\infra\\bots\\.recipe_deps\\build\\scripts"
+ },
+ "name": "rmtree data",
+ "~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]]\\perfdata\\Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release\\data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "[START_DIR]\\out\\Release_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nogpu",
+ "--pre_log",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "565",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\perfdata\\Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release\\data\\nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "GCE",
+ "os",
+ "Win"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]\\perfdata\\Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release\\data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE.json
new file mode 100644
index 0000000000..4db8b0ba3d
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE.json
@@ -0,0 +1,211 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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]]\\perfdata\\Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE\\data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]\\skia\\infra\\bots\\.recipe_deps\\build\\scripts"
+ },
+ "name": "rmtree data",
+ "~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]]\\perfdata\\Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE\\data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "[START_DIR]\\out\\Release_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "angle_d3d11_es2",
+ "--match",
+ "~tile_image_filter_tiled_64",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\perfdata\\Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE\\data\\nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "IntelIris540",
+ "extra_config",
+ "ANGLE",
+ "model",
+ "NUC",
+ "os",
+ "Win10"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]\\perfdata\\Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE\\data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json
new file mode 100644
index 0000000000..3e02cdd9f1
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json
@@ -0,0 +1,122 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]\\out\\Debug_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "angle_d3d11_es2",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot.json b/infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot.json
new file mode 100644
index 0000000000..c743570a0f
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot.json
@@ -0,0 +1,213 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]\\skia\\infra\\bots\\.recipe_deps\\build\\scripts"
+ },
+ "name": "rmtree data",
+ "~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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "[START_DIR]\\out\\Release_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data\\nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "issue",
+ "500",
+ "patchset",
+ "1",
+ "patch_storage",
+ "rietveld",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "HD4600",
+ "model",
+ "ShuttleB",
+ "os",
+ "Win8"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/Perf-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json b/infra/bots/recipe_modules/perf/example.expected/Perf-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json
new file mode 100644
index 0000000000..a5c89e7611
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/Perf-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json
@@ -0,0 +1,429 @@
+[
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_install"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "install iOSShell"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skia/resources",
+ "skiabot/skia_resources"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push resources to skia_resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_skp/skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_skp/skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skp",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push skp to skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skimage",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push skimage to skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_svg/svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_svg/svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/svg",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push svg to svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_run_skia",
+ "--nanobench",
+ "--undefok",
+ "-i",
+ "skiabot/skia_resources",
+ "--skps",
+ "skiabot/skia_skp/skps",
+ "--images",
+ "skiabot/skia_images/nanobench",
+ "--svgs",
+ "skiabot/skia_svg/svgs",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--skps",
+ "ignore_skps",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~blurroundrect",
+ "~patch_grid",
+ "~desk_carsvg",
+ "~keymobi",
+ "~path_hairline",
+ "~GLInstancedArraysBench",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "nanobench"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_restart"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "reboot"
+ },
+ {
+ "cmd": [
+ "sleep",
+ "20"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "wait for reboot"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/big_issue_number.json b/infra/bots/recipe_modules/perf/example.expected/big_issue_number.json
new file mode 100644
index 0000000000..2817618709
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/big_issue_number.json
@@ -0,0 +1,213 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]\\skia\\infra\\bots\\.recipe_deps\\build\\scripts"
+ },
+ "name": "rmtree data",
+ "~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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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": [
+ "[START_DIR]\\out\\Release_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data\\nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "issue",
+ "2147533002",
+ "patchset",
+ "1",
+ "patch_storage",
+ "rietveld",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "HD4600",
+ "model",
+ "ShuttleB",
+ "os",
+ "Win8"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/nobuildbot.json b/infra/bots/recipe_modules/perf/example.expected/nobuildbot.json
new file mode 100644
index 0000000000..01b485bc21
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/nobuildbot.json
@@ -0,0 +1,247 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data"
+ ],
+ "env": {
+ "PYTHONPATH": "[START_DIR]\\skia\\infra\\bots\\.recipe_deps\\build\\scripts"
+ },
+ "name": "rmtree data",
+ "~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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data",
+ "511"
+ ],
+ "name": "makedirs data",
+ "~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",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~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",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~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": [
+ "[START_DIR]\\out\\Release_x64\\nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\nanobench",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--outResultsFile",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data\\nanobench_abc123_1337000001.json",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "571",
+ "issue",
+ "456789",
+ "patchset",
+ "12",
+ "patch_storage",
+ "gerrit",
+ "no_buildbot",
+ "True",
+ "swarming_bot_id",
+ "skia-bot-123",
+ "swarming_task_id",
+ "123456",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "HD4600",
+ "model",
+ "ShuttleB",
+ "os",
+ "Win8"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "nanobench"
+ },
+ {
+ "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]]\\perfdata\\Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot\\data",
+ "511"
+ ],
+ "name": "makedirs perf_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@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.expected/recipe_with_gerrit_patch.json b/infra/bots/recipe_modules/perf/example.expected/recipe_with_gerrit_patch.json
new file mode 100644
index 0000000000..ed45dac5ab
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.expected/recipe_with_gerrit_patch.json
@@ -0,0 +1,229 @@
+[
+ {
+ "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",
+ "[START_DIR]/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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--loops",
+ "1",
+ "--samples",
+ "1",
+ "--keepAlive",
+ "true",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "nanobench"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/nanobench",
+ "--undefok",
+ "-i",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/nanobench",
+ "--nocpu",
+ "--pre_log",
+ "--images",
+ "--gpuStatsDump",
+ "true",
+ "--scales",
+ "1.0",
+ "1.1",
+ "--config",
+ "8888",
+ "gpu",
+ "nonrendering",
+ "hwui",
+ "f16",
+ "srgb",
+ "msaa16",
+ "nvpr16",
+ "nvprdit16",
+ "--loops",
+ "1",
+ "--samples",
+ "1",
+ "--keepAlive",
+ "true",
+ "--match",
+ "~inc0.gif",
+ "~inc1.gif",
+ "~incInterlaced.gif",
+ "~inc0.jpg",
+ "~incGray.jpg",
+ "~inc0.wbmp",
+ "~inc1.wbmp",
+ "~inc0.webp",
+ "~inc1.webp",
+ "~inc0.ico",
+ "~inc1.ico",
+ "~inc0.png",
+ "~inc1.png",
+ "~inc2.png",
+ "~inc12.png",
+ "~inc13.png",
+ "~inc14.png",
+ "~inc0.webp",
+ "~inc1.webp",
+ "--abandonGpuContext",
+ "--nocpu"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "nanobench --abandonGpuContext"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/perf/example.py b/infra/bots/recipe_modules/perf/example.py
new file mode 100644
index 0000000000..16cde3b5d9
--- /dev/null
+++ b/infra/bots/recipe_modules/perf/example.py
@@ -0,0 +1,157 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Example recipe w/ coverage.
+
+
+DEPS = [
+ 'perf',
+ 'recipe_engine/path',
+ 'recipe_engine/platform',
+ 'recipe_engine/properties',
+ 'recipe_engine/raw_io',
+]
+
+
+TEST_BUILDERS = {
+ 'client.skia': {
+ 'skiabot-linux-swarm-000': [
+ ('Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug' +
+ '-GN_Android_Vulkan'),
+ 'Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-GN_Android',
+ 'Perf-Android-Clang-Nexus6-GPU-Adreno420-arm-Release-GN_Android',
+ 'Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-GN_Android',
+ 'Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-GN_Android',
+ 'Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android',
+ 'Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-GN',
+ 'Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer',
+ 'Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-GN',
+ 'Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind',
+ 'Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-ANGLE',
+ 'Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Debug',
+ 'Perf-Win-MSVC-GCE-CPU-AVX2-x86_64-Release',
+ 'Perf-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Release-ANGLE',
+ 'Perf-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE',
+ 'Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot',
+ 'Perf-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug',
+ ],
+ },
+}
+
+
+def RunSteps(api):
+ api.perf.run()
+
+
+def GenTests(api):
+ for mastername, slaves in TEST_BUILDERS.iteritems():
+ for slavename, builders_by_slave in slaves.iteritems():
+ for builder in builders_by_slave:
+ test = (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ )
+ )
+ if 'Trybot' in builder:
+ test += api.properties(issue=500,
+ patchset=1,
+ rietveld='https://codereview.chromium.org')
+ if 'Win' in builder:
+ test += api.platform('win', 64)
+
+ yield test
+
+ builder = 'Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot'
+ yield (
+ api.test('big_issue_number') +
+ api.properties(buildername=builder,
+ mastername='client.skia.compile',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ rietveld='https://codereview.chromium.org',
+ patchset=1,
+ issue=2147533002L) +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.platform('win', 64)
+ )
+
+ builder = ('Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind-'
+ 'Trybot')
+ yield (
+ api.test('recipe_with_gerrit_patch') +
+ api.properties(
+ buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=5,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=builder,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )
+
+ builder = 'Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release-Trybot'
+ yield (
+ api.test('nobuildbot') +
+ api.properties(
+ buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ nobuildbot='True',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=builder,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ ) +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.platform('win', 64) +
+ api.step_data('get swarming bot id',
+ stdout=api.raw_io.output('skia-bot-123')) +
+ api.step_data('get swarming task id', stdout=api.raw_io.output('123456'))
+ )
diff --git a/infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench.json b/infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench.json
new file mode 100644
index 0000000000..6353575a6c
--- /dev/null
+++ b/infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench.json
@@ -0,0 +1,290 @@
+[
+ {
+ "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",
+ "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/skpbench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push skpbench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/skia/tools/skpbench/skpbench.py",
+ "/data/local/tmp/skpbench",
+ "/sdcard/revenge_of_the_skiabot/skps",
+ "--adb",
+ "--resultsfile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/table",
+ "--config",
+ "gpu,esinst4"
+ ],
+ "name": "skpbench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~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",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~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",
+ "-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]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench/data",
+ "511"
+ ],
+ "name": "makedirs perf_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",
+ "[START_DIR]/skia/tools/skpbench/skiaperf.py",
+ "[CUSTOM_[SWARM_OUT_DIR]]/table",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "no_buildbot",
+ "True",
+ "swarming_bot_id",
+ "skia-bot-123",
+ "swarming_task_id",
+ "123456",
+ "--outfile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench/data/skpbench_abc123_1337000001.json",
+ "--key",
+ "arch",
+ "arm64",
+ "compiler",
+ "Clang",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "TegraX1",
+ "extra_config",
+ "GN_Android_Skpbench",
+ "model",
+ "PixelC",
+ "os",
+ "Android"
+ ],
+ "name": "Parse skpbench output into Perf json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Vulkan_Skpbench.json b/infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Vulkan_Skpbench.json
new file mode 100644
index 0000000000..5a54a616b7
--- /dev/null
+++ b/infra/bots/recipe_modules/skpbench/example.expected/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Vulkan_Skpbench.json
@@ -0,0 +1,290 @@
+[
+ {
+ "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",
+ "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/skpbench",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push skpbench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "[START_DIR]/skia/tools/skpbench/skpbench.py",
+ "/data/local/tmp/skpbench",
+ "/sdcard/revenge_of_the_skiabot/skps",
+ "--adb",
+ "--resultsfile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/table",
+ "--config",
+ "vk"
+ ],
+ "name": "skpbench"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~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",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~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",
+ "-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]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Vulkan_Skpbench/data",
+ "511"
+ ],
+ "name": "makedirs perf_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",
+ "[START_DIR]/skia/tools/skpbench/skiaperf.py",
+ "[CUSTOM_[SWARM_OUT_DIR]]/table",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "build_number",
+ "5",
+ "no_buildbot",
+ "True",
+ "swarming_bot_id",
+ "skia-bot-123",
+ "swarming_task_id",
+ "123456",
+ "--outfile",
+ "[CUSTOM_[SWARM_OUT_DIR]]/perfdata/Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Vulkan_Skpbench/data/skpbench_abc123_1337000001.json",
+ "--key",
+ "arch",
+ "arm64",
+ "compiler",
+ "Clang",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "TegraX1",
+ "extra_config",
+ "GN_Android_Vulkan_Skpbench",
+ "model",
+ "PixelC",
+ "os",
+ "Android"
+ ],
+ "name": "Parse skpbench output into Perf json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/skpbench/example.py b/infra/bots/recipe_modules/skpbench/example.py
new file mode 100644
index 0000000000..4acf916524
--- /dev/null
+++ b/infra/bots/recipe_modules/skpbench/example.py
@@ -0,0 +1,56 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Example recipe w/ coverage.
+
+
+DEPS = [
+ 'recipe_engine/path',
+ 'recipe_engine/properties',
+ 'recipe_engine/raw_io',
+ 'skpbench',
+]
+
+
+TEST_BUILDERS = {
+ 'client.skia': {
+ 'skiabot-linux-swarm-000': [
+ 'Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-GN_Android_Skpbench',
+ ('Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-' +
+ 'GN_Android_Vulkan_Skpbench'),
+ ],
+ },
+}
+
+
+def RunSteps(api):
+ api.skpbench.run()
+
+
+def GenTests(api):
+ for mastername, slaves in TEST_BUILDERS.iteritems():
+ for slavename, builders_by_slave in slaves.iteritems():
+ for builder in builders_by_slave:
+ test = (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ ) +
+ api.step_data('get swarming bot id',
+ stdout=api.raw_io.output('skia-bot-123')) +
+ api.step_data('get swarming task id',
+ stdout=api.raw_io.output('123456'))
+ )
+
+ yield test
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-GN_Android.json
new file mode 100644
index 0000000000..c59ee494f9
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-AndroidOne-CPU-MT6582-arm-Release-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Release cpu_or_gpu CPU cpu_or_gpu_value MT6582 extra_config GN_Android model AndroidOne os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nogpu --config 8888 srgb gpu gpudft gpusrgb msaa4 serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa --match ~WritePixels; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-GN_Android.json
new file mode 100644
index 0000000000..ecbcaa405d
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-AndroidOne-GPU-Mali400MP2-arm-Release-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Release cpu_or_gpu GPU cpu_or_gpu_value Mali400MP2 extra_config GN_Android model AndroidOne os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb msaa4 serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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 ~WritePixels; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-GN_Android.json
new file mode 100644
index 0000000000..58c5ed4937
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-GalaxyS7-GPU-Adreno530-arm64-Debug-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm64 compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Adreno530 extra_config GN_Android model GalaxyS7 os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb msaa4 serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --threads 0 --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android.json
new file mode 100644
index 0000000000..93b342782c
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm64 compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value TegraX1 extra_config GN_Android model NVIDIA_Shield os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gl gldft glsrgb glmsaa4 glinstdit4 serialize-8888 tiles_rt-8888 pic-8888 glinst --src tests gm image colorImage svg --blacklist glsrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-GN_Android.json
new file mode 100644
index 0000000000..9973f36018
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-Nexus10-GPU-MaliT604-arm-Release-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Release cpu_or_gpu GPU cpu_or_gpu_value MaliT604 extra_config GN_Android model Nexus10 os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb msaa4 serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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 ~CopySurface ~SRGBReadWritePixels; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android.json
new file mode 100644
index 0000000000..c78cf86253
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-Nexus5-GPU-Adreno330-arm-Release-Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Release cpu_or_gpu GPU cpu_or_gpu_value Adreno330 extra_config Android model Nexus5 os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb msaa4 serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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 msaa4 gm _ encode-platform --noRAW_threading; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6-GPU-Adreno420-arm-Debug-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6-GPU-Adreno420-arm-Debug-GN_Android.json
new file mode 100644
index 0000000000..1cdac304b8
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6-GPU-Adreno420-arm-Debug-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-Nexus6-GPU-Adreno420-arm-Debug-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Adreno420 extra_config GN_Android model Nexus6 os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb msaa4 serialize-8888 tiles_rt-8888 pic-8888 esinst --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-GN_Android_Vulkan.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-GN_Android_Vulkan.json
new file mode 100644
index 0000000000..bb07359b71
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-GN_Android_Vulkan.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-Nexus6p-GPU-Adreno430-arm64-Debug-GN_Android_Vulkan build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm64 compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Adreno430 extra_config GN_Android_Vulkan model Nexus6p 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 image colorImage svg --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 ~XfermodeImageFilterCroppedInput ~GrTextureStripAtlasFlush ~CopySurface; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-GN_Android.json
new file mode 100644
index 0000000000..d2a87aa9d2
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-Nexus7-GPU-Tegra3-arm-Debug-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Tegra3 extra_config GN_Android model Nexus7 os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Release-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Release-GN_Android.json
new file mode 100644
index 0000000000..2b9b16d0da
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Release-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Release/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-CPU-SSE4-x86-Release-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch x86 compiler Clang configuration Release cpu_or_gpu CPU cpu_or_gpu_value SSE4 extra_config GN_Android model NexusPlayer os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nogpu --config 8888 srgb gpu gpusrgb --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape --match ~ResourceCache --noRAW_threading; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Release"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-PixelC-GPU-TegraX1-arm64-Debug-GN_Android.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-PixelC-GPU-TegraX1-arm64-Debug-GN_Android.json
new file mode 100644
index 0000000000..8f15d1b1ea
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Android-Clang-PixelC-GPU-TegraX1-arm64-Debug-GN_Android.json
@@ -0,0 +1,606 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "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": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-PixelC-GPU-TegraX1-arm64-Debug-GN_Android build_number 5 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm64 compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value TegraX1 extra_config GN_Android model PixelC os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb msaa4 esinstdit4 serialize-8888 tiles_rt-8888 pic-8888 esinst --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug.json
new file mode 100644
index 0000000000..0e52cc3856
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug.json
@@ -0,0 +1,623 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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": [
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "Clang",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GeForce320M",
+ "model",
+ "MacMini4.1",
+ "os",
+ "Mac",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nocpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "frame_larger_than_image.gif",
+ "_",
+ "image",
+ "gen_platf",
+ "inc0.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc1.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc2.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc3.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc4.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc5.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc6.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc7.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc8.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc9.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc10.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc11.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc12.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc13.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc14.png",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "_",
+ "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",
+ "_",
+ "image",
+ "_",
+ "abnormal.wbmp",
+ "msaa16",
+ "gm",
+ "_",
+ "blurcircles"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug.json
new file mode 100644
index 0000000000..f3af2a3e24
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug.json
@@ -0,0 +1,525 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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": [
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "Clang",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX",
+ "model",
+ "MacMini6.2",
+ "os",
+ "Mac",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "glinst",
+ "glinst16",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "frame_larger_than_image.gif",
+ "_",
+ "image",
+ "gen_platf",
+ "inc0.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc1.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc2.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc3.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc4.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc5.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc6.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc7.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc8.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc9.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc10.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc11.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc12.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc13.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc14.png",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json
new file mode 100644
index 0000000000..21e42dc0e2
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer.json
@@ -0,0 +1,424 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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": [
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "Clang",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "HD4000",
+ "extra_config",
+ "CommandBuffer",
+ "model",
+ "MacMini6.2",
+ "os",
+ "Mac",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nocpu",
+ "--config",
+ "commandbuffer",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "frame_larger_than_image.gif",
+ "_",
+ "image",
+ "gen_platf",
+ "inc0.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc1.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc2.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc3.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc4.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc5.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc6.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc7.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc8.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc9.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc10.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc11.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc12.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc13.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc14.png",
+ "_",
+ "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"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug.json
new file mode 100644
index 0000000000..0a14eb6b28
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug.json
@@ -0,0 +1,527 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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",
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--threads",
+ "4",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-ASAN.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-ASAN.json
new file mode 100644
index 0000000000..ac6c632dec
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-ASAN.json
@@ -0,0 +1,414 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-ASAN",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "extra_config",
+ "ASAN",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "ASAN_OPTIONS": "symbolize=1 detect_leaks=1",
+ "LSAN_OPTIONS": "symbolize=1 print_suppressions=1",
+ "PATH": "%(PATH)s:[START_DIR]/clang_linux/bin",
+ "UBSAN_OPTIONS": "symbolize=1 print_stacktrace=1"
+ },
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN.json
new file mode 100644
index 0000000000..7e8aa79910
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN.json
@@ -0,0 +1,415 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "extra_config",
+ "MSAN",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "--match",
+ "~Once",
+ "~Shared"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "LD_LIBRARY_PATH": "[START_DIR]/clang_linux/msan",
+ "PATH": "%(PATH)s:[START_DIR]/clang_linux/bin"
+ },
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug.json
new file mode 100644
index 0000000000..6f0279b216
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug.json
@@ -0,0 +1,525 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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",
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Shared.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Shared.json
new file mode 100644
index 0000000000..5ce3a9108f
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Shared.json
@@ -0,0 +1,527 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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",
+ "[START_DIR]/out/Release/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Shared",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "extra_config",
+ "Shared",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN.json
new file mode 100644
index 0000000000..1fc060b727
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN.json
@@ -0,0 +1,415 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/out/Release/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "extra_config",
+ "TSAN",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "--match",
+ "~ReadWriteAlpha",
+ "~RGBA4444TextureTest",
+ "~RGB565TextureTest"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "PATH": "%(PATH)s:[START_DIR]/clang_linux/bin"
+ },
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json
new file mode 100644
index 0000000000..41a5b7c034
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind.json
@@ -0,0 +1,1227 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX550Ti",
+ "extra_config",
+ "Valgrind",
+ "model",
+ "ShuttleA",
+ "os",
+ "Ubuntu",
+ "--nocpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "nvprdit16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "pdf",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "pdf",
+ "_",
+ "_",
+ "PANO_20121023_214540.jpg",
+ "pdf",
+ "skp",
+ "_",
+ "worldjournal",
+ "pdf",
+ "skp",
+ "_",
+ "desk_baidu.skp",
+ "pdf",
+ "skp",
+ "_",
+ "desk_wikipedia.skp",
+ "_",
+ "svg",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "_",
+ "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",
+ "~Threaded"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "dm"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX550Ti",
+ "extra_config",
+ "Valgrind",
+ "model",
+ "ShuttleA",
+ "os",
+ "Ubuntu",
+ "--nocpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "nvprdit16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "pdf",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "pdf",
+ "_",
+ "_",
+ "PANO_20121023_214540.jpg",
+ "pdf",
+ "skp",
+ "_",
+ "worldjournal",
+ "pdf",
+ "skp",
+ "_",
+ "desk_baidu.skp",
+ "pdf",
+ "skp",
+ "_",
+ "desk_wikipedia.skp",
+ "_",
+ "svg",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "_",
+ "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",
+ "~Threaded",
+ "--abandonGpuContext"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "dm --abandonGpuContext"
+ },
+ {
+ "cmd": [
+ "valgrind",
+ "--gen-suppressions=all",
+ "--leak-check=full",
+ "--track-origins=yes",
+ "--error-exitcode=1",
+ "--num-callers=40",
+ "--suppressions=[START_DIR]/skia/tools/valgrind.supp",
+ "[START_DIR]/out/Release/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX550Ti",
+ "extra_config",
+ "Valgrind",
+ "model",
+ "ShuttleA",
+ "os",
+ "Ubuntu",
+ "--nocpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "nvprdit16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "pdf",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "pdf",
+ "_",
+ "_",
+ "PANO_20121023_214540.jpg",
+ "pdf",
+ "skp",
+ "_",
+ "worldjournal",
+ "pdf",
+ "skp",
+ "_",
+ "desk_baidu.skp",
+ "pdf",
+ "skp",
+ "_",
+ "desk_wikipedia.skp",
+ "_",
+ "svg",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "_",
+ "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",
+ "~Threaded",
+ "--preAbandonGpuContext"
+ ],
+ "env": {
+ "BUILDTYPE": "Release",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out"
+ },
+ "name": "dm --preAbandonGpuContext"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Debug-ANGLE.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Debug-ANGLE.json
new file mode 100644
index 0000000000..4472f5443d
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Debug-ANGLE.json
@@ -0,0 +1,382 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]\\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",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "env": {
+ "BUILDTYPE": "Debug_x64",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]\\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": [
+ "[START_DIR]\\out\\Debug_x64\\dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\dm",
+ "--colorImages",
+ "[START_DIR]\\skimage\\colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Debug-ANGLE",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "IntelIris540",
+ "extra_config",
+ "ANGLE",
+ "model",
+ "NUC",
+ "os",
+ "Win10",
+ "--uninterestingHashesFile",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\dm",
+ "--nocpu",
+ "--config",
+ "angle_d3d11_es2",
+ "angle_d3d9_es2",
+ "angle_d3d11_es2_msaa4",
+ "angle_gl_es2",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "_",
+ "image",
+ "gen_platf",
+ "rle8-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rle4-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2-16.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "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",
+ "~GLPrograms",
+ "~IntTexture"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan.json
new file mode 100644
index 0000000000..b44fc614c1
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan.json
@@ -0,0 +1,376 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]\\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",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "env": {
+ "BUILDTYPE": "Debug_x64",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]\\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": [
+ "[START_DIR]\\out\\Debug_x64\\dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\dm",
+ "--colorImages",
+ "[START_DIR]\\skimage\\colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX660",
+ "extra_config",
+ "Vulkan",
+ "model",
+ "ShuttleA",
+ "os",
+ "Win10",
+ "--uninterestingHashesFile",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\dm",
+ "--nocpu",
+ "--config",
+ "vk",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "_",
+ "image",
+ "gen_platf",
+ "rle8-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rle4-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2-16.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "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"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan.json
new file mode 100644
index 0000000000..0e17c8c4d5
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan.json
@@ -0,0 +1,378 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]\\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",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "env": {
+ "BUILDTYPE": "Debug_x64",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]\\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": [
+ "[START_DIR]\\out\\Debug_x64\\dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\dm",
+ "--colorImages",
+ "[START_DIR]\\skimage\\colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX1070",
+ "extra_config",
+ "Vulkan",
+ "model",
+ "ZBOX",
+ "os",
+ "Win10",
+ "--uninterestingHashesFile",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\dm",
+ "--nocpu",
+ "--config",
+ "vk",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "_",
+ "image",
+ "gen_platf",
+ "rle8-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rle4-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2-16.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "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",
+ "~GPUMemorySize"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot.json
new file mode 100644
index 0000000000..85f4bd7727
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot.json
@@ -0,0 +1,510 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]\\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",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]\\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": [
+ "[START_DIR]\\out\\Release_x64\\dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\dm",
+ "--colorImages",
+ "[START_DIR]\\skimage\\colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot",
+ "build_number",
+ "5",
+ "issue",
+ "500",
+ "patchset",
+ "1",
+ "patch_storage",
+ "rietveld",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "ShuttleB",
+ "os",
+ "Win8",
+ "--uninterestingHashesFile",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\dm",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "_",
+ "image",
+ "gen_platf",
+ "rle8-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rle4-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2-16.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "_",
+ "gm",
+ "_",
+ "fontscalerdistortable",
+ "_",
+ "svg",
+ "_",
+ "Nebraska-StateSeal.svg",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "verylargebitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "verylarge_picture_image",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "--noRAW_threading"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json b/infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json
new file mode 100644
index 0000000000..7b5a76d0f5
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE.json
@@ -0,0 +1,390 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]\\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",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "env": {
+ "BUILDTYPE": "Debug_x64",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]\\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": [
+ "[START_DIR]\\out\\Debug_x64\\dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\dm",
+ "--colorImages",
+ "[START_DIR]\\skimage\\colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE",
+ "build_number",
+ "5",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "GTX960",
+ "extra_config",
+ "ANGLE",
+ "model",
+ "ShuttleB",
+ "os",
+ "Win8",
+ "--uninterestingHashesFile",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\dm",
+ "--nocpu",
+ "--config",
+ "angle_d3d11_es2",
+ "angle_d3d9_es2",
+ "angle_d3d11_es2_msaa4",
+ "angle_gl_es2",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "_",
+ "image",
+ "gen_platf",
+ "rle8-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rle4-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2-16.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "gm",
+ "_",
+ "fontscalerdistortable",
+ "_",
+ "svg",
+ "_",
+ "Nebraska-StateSeal.svg",
+ "_",
+ "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",
+ "~GLPrograms",
+ "--noRAW_threading"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json b/infra/bots/recipe_modules/sktest/example.expected/Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json
new file mode 100644
index 0000000000..f935ad37fc
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug.json
@@ -0,0 +1,984 @@
+[
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_install"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "install iOSShell"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skia/resources",
+ "skiabot/skia_resources"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push resources to skia_resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_skp/skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_skp/skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skp",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push skp to skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skimage",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push skimage to skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_svg/svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_svg/svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/svg",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push svg to svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SVG_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": "[START_DIR]/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": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_dm"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_dm"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_dm"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_dm"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "skiabot/skia_tmp_dir/uninteresting_hashes.txt"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_run_skia",
+ "--dm",
+ "--undefok",
+ "--resourcePath",
+ "skiabot/skia_resources",
+ "--skps",
+ "skiabot/skia_skp/skps",
+ "--images",
+ "skiabot/skia_images/dm",
+ "--colorImages",
+ "skiabot/skia_images/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug",
+ "build_number",
+ "5",
+ "--svgs",
+ "skiabot/skia_svg/svgs",
+ "--key",
+ "arch",
+ "Arm7",
+ "compiler",
+ "Clang",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "SGX554",
+ "model",
+ "iPad4",
+ "os",
+ "iOS",
+ "--uninterestingHashesFile",
+ "skiabot/skia_tmp_dir/uninteresting_hashes.txt",
+ "--writePath",
+ "skiabot/skia_dm",
+ "--nocpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "gpu",
+ "skp",
+ "_",
+ "_",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "frame_larger_than_image.gif",
+ "_",
+ "image",
+ "gen_platf",
+ "inc0.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc1.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc2.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc3.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc4.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc5.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc6.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc7.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc8.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc9.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc10.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc11.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc12.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc13.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc14.png",
+ "_",
+ "test",
+ "_",
+ "GrShape",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "_",
+ "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"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "dm"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_pull_if_needed",
+ "skiabot/skia_dm",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "pull skia_dm"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_restart"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "reboot"
+ },
+ {
+ "cmd": [
+ "sleep",
+ "20"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "wait for reboot"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/big_issue_number.json b/infra/bots/recipe_modules/sktest/example.expected/big_issue_number.json
new file mode 100644
index 0000000000..baa74eb35c
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/big_issue_number.json
@@ -0,0 +1,510 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\skimage\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]\\skia\\infra\\bots\\assets\\svg\\VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]\\tmp\\SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]\\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",
+ "[START_DIR]\\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",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "env": {
+ "BUILDTYPE": "Release_x64",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]\\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": [
+ "[START_DIR]\\out\\Release_x64\\dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]\\skia\\resources",
+ "--skps",
+ "[START_DIR]\\skp",
+ "--images",
+ "[START_DIR]\\skimage\\dm",
+ "--colorImages",
+ "[START_DIR]\\skimage\\colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia.compile",
+ "builder",
+ "Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot",
+ "build_number",
+ "5",
+ "issue",
+ "2147533002",
+ "patchset",
+ "1",
+ "patch_storage",
+ "rietveld",
+ "--svgs",
+ "[START_DIR]\\svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "MSVC",
+ "configuration",
+ "Release",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "ShuttleB",
+ "os",
+ "Win8",
+ "--uninterestingHashesFile",
+ "[START_DIR]\\tmp\\uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]\\dm",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "_",
+ "image",
+ "gen_platf",
+ "rle8-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rle4-height-negative.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "pal8os2v2-16.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "_",
+ "gm",
+ "_",
+ "fontscalerdistortable",
+ "_",
+ "svg",
+ "_",
+ "Nebraska-StateSeal.svg",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "verylargebitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "verylarge_picture_image",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "--noRAW_threading"
+ ],
+ "cwd": "[START_DIR]\\skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/failed_dm.json b/infra/bots/recipe_modules/sktest/example.expected/failed_dm.json
new file mode 100644
index 0000000000..4ac42919f1
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/failed_dm.json
@@ -0,0 +1,530 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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",
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug",
+ "build_number",
+ "6",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86_64",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--uninterestingHashesFile",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "reason": "Failed build steps: dm",
+ "recipe_result": null,
+ "status_code": 1
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/failed_get_hashes.json b/infra/bots/recipe_modules/sktest/example.expected/failed_get_hashes.json
new file mode 100644
index 0000000000..d8aa3df636
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/failed_get_hashes.json
@@ -0,0 +1,608 @@
+[
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skia/resources",
+ "/sdcard/revenge_of_the_skiabot/resources"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skp",
+ "/sdcard/revenge_of_the_skiabot/skps"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/skimage",
+ "/sdcard/revenge_of_the_skiabot/images"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "cat",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-f",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/svg",
+ "/sdcard/revenge_of_the_skiabot/svgs"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@host = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ p = os.path.relpath(d, host)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if p != '.' and p.startswith('.'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ continue@@@",
+ "@@@STEP_LOG_LINE@python.inline@ for f in fs:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print os.path.join(p,f)@@@",
+ "@@@STEP_LOG_LINE@python.inline@ subprocess.check_call(['adb', 'push',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.realpath(os.path.join(host, p, f)),@@@",
+ "@@@STEP_LOG_LINE@python.inline@ os.path.join(device, p, f)])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_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": "[START_DIR]/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": [
+ "adb",
+ "shell",
+ "rm",
+ "-rf",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "rm /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "cmd": [
+ "adb",
+ "shell",
+ "mkdir",
+ "-p",
+ "/sdcard/revenge_of_the_skiabot/dm_out"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "mkdir /sdcard/revenge_of_the_skiabot/dm_out"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "get uninteresting hashes",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@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@@@",
+ "@@@STEP_EXCEPTION@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "/sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/out/Debug/dm",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "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-Nexus7-GPU-Tegra3-arm-Debug-GN_Android build_number 6 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Tegra3 extra_config GN_Android model Nexus7 os Android --uninterestingHashesFile /sdcard/revenge_of_the_skiabot/uninteresting_hashes.txt --writePath /sdcard/revenge_of_the_skiabot/dm_out --nocpu --config 8888 srgb gpu gpudft gpusrgb serialize-8888 tiles_rt-8888 pic-8888 --src tests gm image colorImage svg --blacklist gpusrgb image _ _ 8888 image _ _ _ test _ GrShape serialize-8888 gm _ bleed_image serialize-8888 gm _ c_gms serialize-8888 gm _ colortype serialize-8888 gm _ colortype_xfermodes serialize-8888 gm _ drawfilter serialize-8888 gm _ fontmgr_bounds_0.75_0 serialize-8888 gm _ fontmgr_bounds_1_-0.25 serialize-8888 gm _ fontmgr_bounds serialize-8888 gm _ fontmgr_match serialize-8888 gm _ fontmgr_iter serialize-8888 gm _ imagemasksubset serialize-8888 gm _ bitmapfilters serialize-8888 gm _ bitmapshaders serialize-8888 gm _ bleed serialize-8888 gm _ bleed_alpha_bmp serialize-8888 gm _ bleed_alpha_bmp_shader serialize-8888 gm _ convex_poly_clip serialize-8888 gm _ extractalpha serialize-8888 gm _ filterbitmap_checkerboard_32_32_g8 serialize-8888 gm _ filterbitmap_image_mandrill_64 serialize-8888 gm _ shadows serialize-8888 gm _ simpleaaclip_aaclip serialize-8888 gm _ composeshader_bitmap serialize-8888 gm _ scaled_tilemodes_npot serialize-8888 gm _ scaled_tilemodes serialize-8888 gm _ typefacerendering_pfaMac serialize-8888 gm _ parsedpaths serialize-8888 gm _ ImageGeneratorExternal_rect serialize-8888 gm _ ImageGeneratorExternal_shader serialize-8888 gm _ bleed_alpha_image serialize-8888 gm _ bleed_alpha_image_shader serialize-8888 gm _ verylargebitmap serialize-8888 gm _ verylarge_picture_image pic-8888 gm _ drawfilter pic-8888 gm _ image-cacherator-from-picture serialize-8888 gm _ image-cacherator-from-picture pic-8888 gm _ image-cacherator-from-raster serialize-8888 gm _ image-cacherator-from-raster pic-8888 gm _ image-cacherator-from-ctable serialize-8888 gm _ image-cacherator-from-ctable pic-8888 gm _ gamut serialize-8888 gm _ gamut pic-8888 gm _ complexclip4_bw serialize-8888 gm _ complexclip4_bw pic-8888 gm _ complexclip4_aa serialize-8888 gm _ complexclip4_aa tiles_rt-8888 gm _ complexclip4_bw tiles_rt-8888 gm _ complexclip4_aa _ 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; echo $? >/data/local/tmp/rc",
+ "[START_DIR]/tmp/dm.sh"
+ ],
+ "name": "write dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "push",
+ "[START_DIR]/tmp/dm.sh",
+ "/data/local/tmp/"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "push dm.sh"
+ },
+ {
+ "cmd": [
+ "adb",
+ "logcat",
+ "-c"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "clear log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "/data/local/tmp/",
+ "dm.sh"
+ ],
+ "name": "dm",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@sh = sys.argv[2]@@@",
+ "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['adb', 'shell', 'sh', bin_dir + sh])@@@",
+ "@@@STEP_LOG_LINE@python.inline@try:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',@@@",
+ "@@@STEP_LOG_LINE@python.inline@ bin_dir + 'rc'])))@@@",
+ "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print \"Couldn't read the return code. Probably killed for OOM.\"@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "pull",
+ "/sdcard/revenge_of_the_skiabot/dm_out",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "pull /sdcard/revenge_of_the_skiabot/dm_out [CUSTOM_[SWARM_OUT_DIR]]/dm"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\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",
+ "[START_DIR]/out/Debug"
+ ],
+ "name": "dump log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
+ "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['adb', 'logcat', '-d'])@@@",
+ "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ tokens = line.split()@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
+ "@@@STEP_LOG_LINE@python.inline@ addr, path = tokens[-2:]@@@",
+ "@@@STEP_LOG_LINE@python.inline@ local = os.path.join(out, os.path.basename(path))@@@",
+ "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(local):@@@",
+ "@@@STEP_LOG_LINE@python.inline@ sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
+ "@@@STEP_LOG_LINE@python.inline@ line = line.replace(addr, addr + ' ' + sym.strip())@@@",
+ "@@@STEP_LOG_LINE@python.inline@ print line@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "adb",
+ "kill-server"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "kill adb server"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/missing_SKP_VERSION_device.json b/infra/bots/recipe_modules/sktest/example.expected/missing_SKP_VERSION_device.json
new file mode 100644
index 0000000000..59676385f2
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/missing_SKP_VERSION_device.json
@@ -0,0 +1,988 @@
+[
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_install"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "install iOSShell"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skia/resources",
+ "skiabot/skia_resources"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push resources to skia_resources"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SKP_VERSION",
+ "stdout": "/path/to/tmp/",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_EXCEPTION@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_skp/skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_skp/skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skp",
+ "skiabot/skia_skp/skps"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push skp to skps"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SKP_VERSION",
+ "skiabot/skia_tmp_dir/SKP_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SK_IMAGE_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/skimage",
+ "skiabot/skia_images"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push skimage to skia_images"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION",
+ "skiabot/skia_tmp_dir/SK_IMAGE_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_cat_file",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "read SVG_VERSION",
+ "stdout": "/path/to/tmp/"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rm skiabot/skia_tmp_dir/SVG_VERSION"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_svg/svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_svg/svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_if_needed",
+ "[START_DIR]/svg",
+ "skiabot/skia_svg/svgs"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push svg to svgs"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/SVG_VERSION",
+ "skiabot/skia_tmp_dir/SVG_VERSION"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/SVG_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": "[START_DIR]/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": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_rm",
+ "skiabot/skia_dm"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "rmdir skiabot/skia_dm"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_mkdir",
+ "skiabot/skia_dm"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "mkdir skiabot/skia_dm"
+ },
+ {
+ "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",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_push_file",
+ "[START_DIR]/tmp/uninteresting_hashes.txt",
+ "skiabot/skia_tmp_dir/uninteresting_hashes.txt"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "push [START_DIR]/tmp/uninteresting_hashes.txt"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_run_skia",
+ "--dm",
+ "--undefok",
+ "--resourcePath",
+ "skiabot/skia_resources",
+ "--skps",
+ "skiabot/skia_skp/skps",
+ "--images",
+ "skiabot/skia_images/dm",
+ "--colorImages",
+ "skiabot/skia_images/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "client.skia",
+ "builder",
+ "Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug",
+ "build_number",
+ "6",
+ "--svgs",
+ "skiabot/skia_svg/svgs",
+ "--key",
+ "arch",
+ "Arm7",
+ "compiler",
+ "Clang",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "GPU",
+ "cpu_or_gpu_value",
+ "SGX554",
+ "model",
+ "iPad4",
+ "os",
+ "iOS",
+ "--uninterestingHashesFile",
+ "skiabot/skia_tmp_dir/uninteresting_hashes.txt",
+ "--writePath",
+ "skiabot/skia_dm",
+ "--nocpu",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "gpu",
+ "skp",
+ "_",
+ "_",
+ "_",
+ "image",
+ "gen_platf",
+ "rgba32abf.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24prof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "rgb24lprof.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "8bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "4bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "32bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "24bpp-pixeldata-cropped.bmp",
+ "_",
+ "image",
+ "gen_platf",
+ "frame_larger_than_image.gif",
+ "_",
+ "image",
+ "gen_platf",
+ "inc0.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc1.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc2.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc3.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc4.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc5.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc6.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc7.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc8.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc9.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc10.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc11.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc12.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc13.png",
+ "_",
+ "image",
+ "gen_platf",
+ "inc14.png",
+ "_",
+ "test",
+ "_",
+ "GrShape",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "_",
+ "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"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "dm"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_pull_if_needed",
+ "skiabot/skia_dm",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "pull skia_dm"
+ },
+ {
+ "cmd": [
+ "[START_DIR]/skia/platform_tools/ios/bin/ios_restart"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "reboot"
+ },
+ {
+ "cmd": [
+ "sleep",
+ "20"
+ ],
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/out",
+ "XCODEBUILD": "[START_DIR]/xcodebuild"
+ },
+ "name": "wait for reboot"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/nobuildbot.json b/infra/bots/recipe_modules/sktest/example.expected/nobuildbot.json
new file mode 100644
index 0000000000..8e69ee7bc6
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/nobuildbot.json
@@ -0,0 +1,565 @@
+[
+ {
+ "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",
+ "[START_DIR]/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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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 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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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": [
+ "python",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+ ],
+ "name": "get swarming bot id",
+ "stdout": "/path/to/tmp/",
+ "~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",
+ "-u",
+ "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+ ],
+ "name": "get swarming task id",
+ "stdout": "/path/to/tmp/",
+ "~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": [
+ "catchsegv",
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "chromium.testing.master",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug-Trybot",
+ "build_number",
+ "571",
+ "issue",
+ "456789",
+ "patchset",
+ "12",
+ "patch_storage",
+ "gerrit",
+ "no_buildbot",
+ "True",
+ "swarming_bot_id",
+ "skia-bot-123",
+ "swarming_task_id",
+ "123456",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--threads",
+ "4",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.expected/recipe_with_gerrit_patch.json b/infra/bots/recipe_modules/sktest/example.expected/recipe_with_gerrit_patch.json
new file mode 100644
index 0000000000..6f6b3bd85b
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.expected/recipe_with_gerrit_patch.json
@@ -0,0 +1,531 @@
+[
+ {
+ "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",
+ "[START_DIR]/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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/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",
+ "[START_DIR]/tmp/SKP_VERSION"
+ ],
+ "name": "write SKP_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded skimage VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SK_IMAGE_VERSION"
+ ],
+ "name": "write SK_IMAGE_VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+ "/path/to/tmp/"
+ ],
+ "name": "Get downloaded SVG VERSION"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "42",
+ "[START_DIR]/tmp/SVG_VERSION"
+ ],
+ "name": "write SVG_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": "[START_DIR]/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 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",
+ "[START_DIR]/tmp/uninteresting_hashes.txt"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "env": {
+ "BUILDTYPE": "Debug",
+ "CHROME_HEADLESS": "1",
+ "SKIA_OUT": "[START_DIR]/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",
+ "[START_DIR]/out/Debug/dm",
+ "--undefok",
+ "--resourcePath",
+ "[START_DIR]/skia/resources",
+ "--skps",
+ "[START_DIR]/skp",
+ "--images",
+ "[START_DIR]/skimage/dm",
+ "--colorImages",
+ "[START_DIR]/skimage/colorspace",
+ "--nameByHash",
+ "--properties",
+ "gitHash",
+ "abc123",
+ "master",
+ "chromium.testing.master",
+ "builder",
+ "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug-Trybot",
+ "build_number",
+ "571",
+ "issue",
+ "456789",
+ "patchset",
+ "12",
+ "patch_storage",
+ "gerrit",
+ "--svgs",
+ "[START_DIR]/svg",
+ "--key",
+ "arch",
+ "x86",
+ "compiler",
+ "GCC",
+ "configuration",
+ "Debug",
+ "cpu_or_gpu",
+ "CPU",
+ "cpu_or_gpu_value",
+ "AVX2",
+ "model",
+ "GCE",
+ "os",
+ "Ubuntu",
+ "--writePath",
+ "[CUSTOM_[SWARM_OUT_DIR]]/dm",
+ "--nogpu",
+ "--threads",
+ "4",
+ "--config",
+ "8888",
+ "srgb",
+ "gpu",
+ "gpudft",
+ "gpusrgb",
+ "pdf",
+ "msaa16",
+ "565",
+ "f16",
+ "sp-8888",
+ "2ndpic-8888",
+ "lite-8888",
+ "serialize-8888",
+ "tiles_rt-8888",
+ "pic-8888",
+ "--src",
+ "tests",
+ "gm",
+ "image",
+ "colorImage",
+ "svg",
+ "--blacklist",
+ "f16",
+ "_",
+ "_",
+ "dstreadshuffle",
+ "f16",
+ "image",
+ "_",
+ "_",
+ "gpusrgb",
+ "image",
+ "_",
+ "_",
+ "8888",
+ "image",
+ "_",
+ "_",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "c_gms",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype",
+ "serialize-8888",
+ "gm",
+ "_",
+ "colortype_xfermodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_0.75_0",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds_1_-0.25",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_bounds",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_match",
+ "serialize-8888",
+ "gm",
+ "_",
+ "fontmgr_iter",
+ "serialize-8888",
+ "gm",
+ "_",
+ "imagemasksubset",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapfilters",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bitmapshaders",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_bmp_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "convex_poly_clip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "extractalpha",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_checkerboard_32_32_g8",
+ "serialize-8888",
+ "gm",
+ "_",
+ "filterbitmap_image_mandrill_64",
+ "serialize-8888",
+ "gm",
+ "_",
+ "shadows",
+ "serialize-8888",
+ "gm",
+ "_",
+ "simpleaaclip_aaclip",
+ "serialize-8888",
+ "gm",
+ "_",
+ "composeshader_bitmap",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes_npot",
+ "serialize-8888",
+ "gm",
+ "_",
+ "scaled_tilemodes",
+ "serialize-8888",
+ "gm",
+ "_",
+ "typefacerendering_pfaMac",
+ "serialize-8888",
+ "gm",
+ "_",
+ "parsedpaths",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_rect",
+ "serialize-8888",
+ "gm",
+ "_",
+ "ImageGeneratorExternal_shader",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "sp-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "pic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "lite-8888",
+ "gm",
+ "_",
+ "drawfilter",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-picture",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-raster",
+ "sp-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "pic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "serialize-8888",
+ "gm",
+ "_",
+ "image-cacherator-from-ctable",
+ "sp-8888",
+ "gm",
+ "_",
+ "gamut",
+ "pic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "lite-8888",
+ "gm",
+ "_",
+ "gamut",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "gamut",
+ "serialize-8888",
+ "gm",
+ "_",
+ "gamut",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "sp-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "pic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "lite-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "2ndpic-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "serialize-8888",
+ "gm",
+ "_",
+ "complexclip4_aa",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_bw",
+ "tiles_rt-8888",
+ "gm",
+ "_",
+ "complexclip4_aa"
+ ],
+ "cwd": "[START_DIR]/skia",
+ "name": "dm"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/sktest/example.py b/infra/bots/recipe_modules/sktest/example.py
new file mode 100644
index 0000000000..7ea7d6c25e
--- /dev/null
+++ b/infra/bots/recipe_modules/sktest/example.py
@@ -0,0 +1,225 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Example recipe w/ coverage.
+
+
+DEPS = [
+ 'recipe_engine/path',
+ 'recipe_engine/platform',
+ 'recipe_engine/properties',
+ 'recipe_engine/raw_io',
+ 'sktest',
+]
+
+
+TEST_BUILDERS = {
+ 'client.skia': {
+ 'skiabot-linux-swarm-000': [
+ 'Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-GN_Android',
+ 'Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-GN_Android',
+ 'Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-GN_Android',
+ 'Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-GN_Android',
+ 'Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-GN_Android',
+ 'Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android',
+ 'Test-Android-Clang-Nexus6-GPU-Adreno420-arm-Debug-GN_Android',
+ 'Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-GN_Android_Vulkan',
+ 'Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-GN_Android',
+ 'Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Release-GN_Android',
+ 'Test-Android-Clang-PixelC-GPU-TegraX1-arm64-Debug-GN_Android',
+ 'Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug',
+ 'Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug',
+ 'Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer',
+ 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug',
+ 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug',
+ 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-ASAN',
+ 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN',
+ 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Shared',
+ 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN',
+ 'Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind',
+ 'Test-Win10-MSVC-NUC-GPU-IntelIris540-x86_64-Debug-ANGLE',
+ 'Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan',
+ 'Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan',
+ 'Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot',
+ 'Test-Win8-MSVC-ShuttleB-GPU-GTX960-x86_64-Debug-ANGLE',
+ 'Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug',
+ ],
+ },
+}
+
+
+def RunSteps(api):
+ api.sktest.run()
+
+
+def GenTests(api):
+ for mastername, slaves in TEST_BUILDERS.iteritems():
+ for slavename, builders_by_slave in slaves.iteritems():
+ for builder in builders_by_slave:
+ test = (
+ api.test(builder) +
+ api.properties(buildername=builder,
+ mastername=mastername,
+ slavename=slavename,
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ )
+ )
+ if 'Trybot' in builder:
+ test += api.properties(issue=500,
+ patchset=1,
+ rietveld='https://codereview.chromium.org')
+ if 'Win' in builder:
+ test += api.platform('win', 64)
+
+
+ yield test
+
+ builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug'
+ yield (
+ api.test('failed_dm') +
+ api.properties(buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=6,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.step_data('dm', retcode=1)
+ )
+
+ builder = 'Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-GN_Android'
+ yield (
+ api.test('failed_get_hashes') +
+ api.properties(buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=6,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.step_data('get uninteresting hashes', retcode=1)
+ )
+
+ builder = 'Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug'
+ yield (
+ api.test('missing_SKP_VERSION_device') +
+ api.properties(buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=6,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]') +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.step_data('read SKP_VERSION', retcode=1)
+ )
+
+ builder = 'Test-Win8-MSVC-ShuttleB-CPU-AVX2-x86_64-Release-Trybot'
+ yield (
+ api.test('big_issue_number') +
+ api.properties(buildername=builder,
+ mastername='client.skia.compile',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=5,
+ revision='abc123',
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ rietveld='https://codereview.chromium.org',
+ patchset=1,
+ issue=2147533002L) +
+ api.path.exists(
+ api.path['start_dir'].join('skia'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skimage', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'skp', 'VERSION'),
+ api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
+ 'svg', 'VERSION'),
+ api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
+ ) +
+ api.platform('win', 64)
+ )
+
+ builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug-Trybot'
+ yield (
+ api.test('recipe_with_gerrit_patch') +
+ api.properties(
+ buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=5,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=builder,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )
+
+ yield (
+ api.test('nobuildbot') +
+ api.properties(
+ buildername=builder,
+ mastername='client.skia',
+ slavename='skiabot-linux-swarm-000',
+ buildnumber=5,
+ path_config='kitchen',
+ swarm_out_dir='[SWARM_OUT_DIR]',
+ revision='abc123',
+ nobuildbot='True',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=builder,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ ) +
+ api.step_data('get swarming bot id',
+ stdout=api.raw_io.output('skia-bot-123')) +
+ api.step_data('get swarming task id', stdout=api.raw_io.output('123456'))
+ )
diff --git a/infra/bots/recipe_modules/upload_dm_results/example.expected/failed_all.json b/infra/bots/recipe_modules/upload_dm_results/example.expected/failed_all.json
new file mode 100644
index 0000000000..7ec0362e4d
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_dm_results/example.expected/failed_all.json
@@ -0,0 +1,157 @@
+[
+ {
+ "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",
+ "[START_DIR]/tmp_upload",
+ "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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/dm.json",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy dm.json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/verbose.log",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy verbose.log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/dm.json"
+ ],
+ "name": "rm old dm.json",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/verbose.log"
+ ],
+ "name": "rm old verbose.log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "[START_DIR]/dm/*"
+ ],
+ "name": "find images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images (attempt 2)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images (attempt 3)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images (attempt 4)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images (attempt 5)",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "name": "$result",
+ "reason": "Step('upload images (attempt 5)') failed with return_code 1",
+ "recipe_result": null,
+ "status_code": 1
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_dm_results/example.expected/failed_once.json b/infra/bots/recipe_modules/upload_dm_results/example.expected/failed_once.json
new file mode 100644
index 0000000000..b6ed1fe3a9
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_dm_results/example.expected/failed_once.json
@@ -0,0 +1,124 @@
+[
+ {
+ "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",
+ "[START_DIR]/tmp_upload",
+ "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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/dm.json",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy dm.json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/verbose.log",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy verbose.log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/dm.json"
+ ],
+ "name": "rm old dm.json",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/verbose.log"
+ ],
+ "name": "rm old verbose.log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "[START_DIR]/dm/*"
+ ],
+ "name": "find images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images",
+ "~followup_annotations": [
+ "step returned non-zero exit code: 1",
+ "@@@STEP_FAILURE@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images (attempt 2)"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-z",
+ "json,log",
+ "[START_DIR]/tmp_upload/*",
+ "gs://skia-infra-gm/dm-json-v1/2012/05/14/12/abc123/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug/1337000001"
+ ],
+ "name": "upload JSON and logs"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_dm_results/example.expected/normal_bot.json b/infra/bots/recipe_modules/upload_dm_results/example.expected/normal_bot.json
new file mode 100644
index 0000000000..9ea0d30397
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_dm_results/example.expected/normal_bot.json
@@ -0,0 +1,111 @@
+[
+ {
+ "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",
+ "[START_DIR]/tmp_upload",
+ "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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/dm.json",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy dm.json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/verbose.log",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy verbose.log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/dm.json"
+ ],
+ "name": "rm old dm.json",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/verbose.log"
+ ],
+ "name": "rm old verbose.log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "[START_DIR]/dm/*"
+ ],
+ "name": "find images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-z",
+ "json,log",
+ "[START_DIR]/tmp_upload/*",
+ "gs://skia-infra-gm/dm-json-v1/2012/05/14/12/abc123/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug/1337000001"
+ ],
+ "name": "upload JSON and logs"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_dm_results/example.expected/recipe_with_gerrit_patch.json b/infra/bots/recipe_modules/upload_dm_results/example.expected/recipe_with_gerrit_patch.json
new file mode 100644
index 0000000000..03bb50541a
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_dm_results/example.expected/recipe_with_gerrit_patch.json
@@ -0,0 +1,111 @@
+[
+ {
+ "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",
+ "[START_DIR]/tmp_upload",
+ "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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/dm.json",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy dm.json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/verbose.log",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy verbose.log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/dm.json"
+ ],
+ "name": "rm old dm.json",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/verbose.log"
+ ],
+ "name": "rm old verbose.log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "[START_DIR]/dm/*"
+ ],
+ "name": "find images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-z",
+ "json,log",
+ "[START_DIR]/tmp_upload/*",
+ "gs://skia-infra-gm/trybot/dm-json-v1/2012/05/14/12/abc123/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/1337000001/456789/12"
+ ],
+ "name": "upload JSON and logs"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_dm_results/example.expected/trybot.json b/infra/bots/recipe_modules/upload_dm_results/example.expected/trybot.json
new file mode 100644
index 0000000000..3ebc3fa0af
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_dm_results/example.expected/trybot.json
@@ -0,0 +1,111 @@
+[
+ {
+ "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",
+ "[START_DIR]/tmp_upload",
+ "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 shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/dm.json",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy dm.json"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+ "[START_DIR]/dm/verbose.log",
+ "[START_DIR]/tmp_upload"
+ ],
+ "name": "copy verbose.log"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/dm.json"
+ ],
+ "name": "rm old dm.json",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport os\nimport sys\nos.remove(sys.argv[1])\n",
+ "[START_DIR]/dm/verbose.log"
+ ],
+ "name": "rm old verbose.log",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@python.inline@@@@",
+ "@@@STEP_LOG_LINE@python.inline@import os@@@",
+ "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+ "@@@STEP_LOG_LINE@python.inline@os.remove(sys.argv[1])@@@",
+ "@@@STEP_LOG_END@python.inline@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "[START_DIR]/dm/*"
+ ],
+ "name": "find images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "[START_DIR]/dm/*",
+ "gs://skia-infra-gm/dm-images-v1"
+ ],
+ "name": "upload images"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-z",
+ "json,log",
+ "[START_DIR]/tmp_upload/*",
+ "gs://skia-infra-gm/trybot/dm-json-v1/2012/05/14/12/abc123/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/1337000001/12345/1002"
+ ],
+ "name": "upload JSON and logs"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_dm_results/example.py b/infra/bots/recipe_modules/upload_dm_results/example.py
new file mode 100644
index 0000000000..54448458ab
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_dm_results/example.py
@@ -0,0 +1,70 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Example recipe w/ coverage.
+
+
+DEPS = [
+ 'upload_dm_results',
+ 'recipe_engine/properties',
+]
+
+
+def RunSteps(api):
+ api.upload_dm_results.run()
+
+
+def GenTests(api):
+ builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug'
+ yield (
+ api.test('normal_bot') +
+ api.properties(buildername=builder,
+ revision='abc123',
+ path_config='kitchen')
+ )
+
+ yield (
+ api.test('failed_once') +
+ api.properties(buildername=builder,
+ revision='abc123',
+ path_config='kitchen') +
+ api.step_data('upload images', retcode=1)
+ )
+
+ yield (
+ api.test('failed_all') +
+ api.properties(buildername=builder,
+ revision='abc123',
+ path_config='kitchen') +
+ api.step_data('upload images', retcode=1) +
+ api.step_data('upload images (attempt 2)', retcode=1) +
+ api.step_data('upload images (attempt 3)', retcode=1) +
+ api.step_data('upload images (attempt 4)', retcode=1) +
+ api.step_data('upload images (attempt 5)', retcode=1)
+ )
+
+ builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot'
+ yield (
+ api.test('trybot') +
+ api.properties(buildername=builder,
+ revision='abc123',
+ path_config='kitchen',
+ issue='12345',
+ patchset='1002')
+ )
+
+ yield (
+ api.test('recipe_with_gerrit_patch') +
+ api.properties(
+ buildername=builder,
+ revision='abc123',
+ path_config='kitchen',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=builder,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )
diff --git a/infra/bots/recipe_modules/upload_nano_results/example.expected/normal_bot.json b/infra/bots/recipe_modules/upload_nano_results/example.expected/normal_bot.json
new file mode 100644
index 0000000000..e004853974
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_nano_results/example.expected/normal_bot.json
@@ -0,0 +1,31 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "*.json"
+ ],
+ "cwd": "[START_DIR]/perfdata/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug/data",
+ "name": "find results"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-a",
+ "public-read",
+ "-z",
+ "json",
+ "[START_DIR]/perfdata/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug/data/nanobench_abc123.json",
+ "gs://skia-perf/nano-json-v1/2012/05/14/12/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug/nanobench_abc123.json"
+ ],
+ "name": "upload"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_nano_results/example.expected/recipe_with_gerrit_patch.json b/infra/bots/recipe_modules/upload_nano_results/example.expected/recipe_with_gerrit_patch.json
new file mode 100644
index 0000000000..f55491cf7a
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_nano_results/example.expected/recipe_with_gerrit_patch.json
@@ -0,0 +1,31 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "*.json"
+ ],
+ "cwd": "[START_DIR]/perfdata/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/data",
+ "name": "find results"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-a",
+ "public-read",
+ "-z",
+ "json",
+ "[START_DIR]/perfdata/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/data/nanobench_abc123.json",
+ "gs://skia-perf/trybot/nano-json-v1/2012/05/14/12/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/456789/12/nanobench_abc123.json"
+ ],
+ "name": "upload"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_nano_results/example.expected/trybot.json b/infra/bots/recipe_modules/upload_nano_results/example.expected/trybot.json
new file mode 100644
index 0000000000..dd71c716cb
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_nano_results/example.expected/trybot.json
@@ -0,0 +1,31 @@
+[
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "\nimport glob\nimport sys\nwith open(sys.argv[1], 'w') as f:\n f.write('\\n'.join(glob.glob(sys.argv[2])))\n",
+ "/path/to/tmp/",
+ "*.json"
+ ],
+ "cwd": "[START_DIR]/perfdata/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/data",
+ "name": "find results"
+ },
+ {
+ "cmd": [
+ "gsutil",
+ "cp",
+ "-a",
+ "public-read",
+ "-z",
+ "json",
+ "[START_DIR]/perfdata/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/data/nanobench_abc123.json",
+ "gs://skia-perf/trybot/nano-json-v1/2012/05/14/12/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot/12345/1002/nanobench_abc123.json"
+ ],
+ "name": "upload"
+ },
+ {
+ "name": "$result",
+ "recipe_result": null,
+ "status_code": 0
+ }
+] \ No newline at end of file
diff --git a/infra/bots/recipe_modules/upload_nano_results/example.py b/infra/bots/recipe_modules/upload_nano_results/example.py
new file mode 100644
index 0000000000..f97cac86f2
--- /dev/null
+++ b/infra/bots/recipe_modules/upload_nano_results/example.py
@@ -0,0 +1,50 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Example recipe w/ coverage.
+
+
+DEPS = [
+ 'recipe_engine/properties',
+ 'upload_nano_results',
+]
+
+
+def RunSteps(api):
+ api.upload_nano_results.run()
+
+
+def GenTests(api):
+ builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug'
+ yield (
+ api.test('normal_bot') +
+ api.properties(buildername=builder,
+ revision='abc123',
+ path_config='kitchen')
+ )
+
+ builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Trybot'
+ yield (
+ api.test('trybot') +
+ api.properties(buildername=builder,
+ revision='abc123',
+ path_config='kitchen',
+ issue='12345',
+ patchset='1002')
+ )
+
+ yield (
+ api.test('recipe_with_gerrit_patch') +
+ api.properties(
+ buildername=builder,
+ revision='abc123',
+ path_config='kitchen',
+ patch_storage='gerrit') +
+ api.properties.tryserver(
+ buildername=builder,
+ gerrit_project='skia',
+ gerrit_url='https://skia-review.googlesource.com/',
+ )
+ )