Bug 1055918 - mozharness mach twig fixes for 1084165, 1084170, 1087100, 1087101, 1087104, r=mgerva
authorJordan Lund <jlund@mozilla.com>
Wed, 29 Oct 2014 11:50:36 -0700 (2014-10-29)
changeset 3328 42d035f84c6316348966a04c2c4ec5bd902d9233
parent 3325 e8616b7fdc4373187291e766a5930eb760c03af7
child 3329 4994ebe1f513c49d1d3464c8736419c64f6895b6
push id2558
push userjlund@mozilla.com
push dateWed, 29 Oct 2014 18:50:42 +0000 (2014-10-29)
reviewersmgerva
bugs1055918, 1084165, 1084170, 1087100, 1087101, 1087104
Bug 1055918 - mozharness mach twig fixes for 1084165, 1084170, 1087100, 1087101, 1087104, r=mgerva
configs/builds/branch_specifics.py
configs/builds/releng_base_linux_32_builds.py
configs/builds/releng_base_linux_64_builds.py
configs/builds/releng_base_mac_64_builds.py
configs/builds/releng_base_windows_32_builds.py
configs/builds/releng_sub_linux_configs/32_debug.py
configs/builds/releng_sub_linux_configs/64_asan.py
configs/builds/releng_sub_linux_configs/64_asan_and_debug.py
configs/builds/releng_sub_linux_configs/64_code_coverage.py
configs/builds/releng_sub_linux_configs/64_debug.py
configs/builds/releng_sub_linux_configs/64_debug_and_non_unified.py
configs/builds/releng_sub_linux_configs/64_mulet.py
configs/builds/releng_sub_linux_configs/64_non_unified.py
configs/builds/releng_sub_linux_configs/64_stat_and_debug.py
configs/builds/releng_sub_mac_configs/64_debug.py
configs/builds/releng_sub_mac_configs/64_debug_and_non_unified.py
configs/builds/releng_sub_mac_configs/64_non_unified.py
configs/builds/releng_sub_windows_configs/32_debug.py
configs/builds/releng_sub_windows_configs/32_debug_and_non_unified.py
configs/builds/releng_sub_windows_configs/32_non_unified.py
mozharness/mozilla/building/buildbase.py
scripts/fx_desktop_build.py
--- a/configs/builds/branch_specifics.py
+++ b/configs/builds/branch_specifics.py
@@ -26,18 +26,18 @@
 #             },
 #         }
 #     },
 # }
 
 config = {
     ### release branches
     "mozilla-central": {
+        "repo_path": 'mozilla-central',
         "update_channel": "nightly",
-        "repo_path": 'mozilla-central',
         "graph_server_branch_name": "Firefox",
         'use_branch_in_symbols_extra_buildid': False,
     },
     'mozilla-release': {
         'repo_path': 'releases/mozilla-release',
         # TODO I think we can remove update_channel since we don't run
         # nightlies for mozilla-release
         'update_channel': 'release',
@@ -67,40 +67,32 @@ config = {
     'mozilla-b2g28_v1_3t': {
         'repo_path': 'releases/mozilla-b2g28_v1_3t',
         'use_branch_in_symbols_extra_buildid': False,
     },
     'mozilla-b2g30_v1_4': {
         'repo_path': 'releases/mozilla-b2g30_v1_4',
         'use_branch_in_symbols_extra_buildid': False,
         'update_channel': 'nightly-b2g30',
-        'branch_supports_partials': False,
         'graph_server_branch_name': 'Mozilla-B2g30-v1.4',
     },
     'mozilla-b2g32_v2_0': {
         'repo_path': 'releases/mozilla-b2g32_v2_0',
         'use_branch_in_symbols_extra_buildid': False,
         'update_channel': 'nightly-b2g32',
-        'branch_supports_partials': False,
         'graph_server_branch_name': 'Mozilla-B2g32-v2.0',
     },
     'try': {
         'repo_path': 'try',
         'clone_by_revision': True,
         'clone_with_purge': True,
         'tinderbox_build_dir': '%(who)s-%(got_revision)s',
         'to_tinderbox_dated': False,
         'include_post_upload_builddir': True,
         'release_to_try_builds': True,
-        'upload_env': {
-            # stage_server is dictated from build_pool_specifics.py
-            'UPLOAD_USER': "trybld",
-            'UPLOAD_TO_TEMP': '1',
-            'UPLOAD_SSH_KEY': '~/.ssh/%s' % ("trybld_dsa",),
-        },
         'use_branch_in_symbols_extra_buildid': False,
         'stage_username': 'trybld',
         'stage_ssh_key': 'trybld_dsa',
     },
 
     ### project branches
     'b2g-inbound': {
         'repo_path': 'integration/b2g-inbound',
--- a/configs/builds/releng_base_linux_32_builds.py
+++ b/configs/builds/releng_base_linux_32_builds.py
@@ -1,10 +1,9 @@
 import os
-import sys
 
 STAGE_USERNAME = 'ffxbld'
 STAGE_SSH_KEY = 'ffxbld_rsa'
 
 config = {
     #########################################################################
     ######## LINUX GENERIC CONFIG KEYS/VAlUES
     # if you are updating this with custom 32 bit keys/values please add them
@@ -12,17 +11,16 @@ config = {
     # code block and also make sure this is synced with
     # releng_base_linux_64_builds.py
 
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     "buildbot_json_path": "buildprops.json",
     'exes': {
         'hgtool.py': os.path.join(
             os.getcwd(), 'build', 'tools', 'buildfarm', 'utils', 'hgtool.py'
         ),
@@ -39,24 +37,24 @@ config = {
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/home/cltbld/.boto', '/builds/.boto'),
         ('/builds/gapi.data', '/builds/gapi.data'),
         ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'enable_ccache': True,
+    'enable_check_test': True,
     'vcs_share_base': '/builds/hg-shared',
     'objdir': 'obj-firefox',
     'tooltool_script': ["/builds/tooltool.py"],
     'tooltool_bootstrap': "setup.sh",
     'enable_count_ctors': True,
     'enable_talos_sendchange': True,
     'enable_unittest_sendchange': True,
-    'platform_supports_partials': True,
     #########################################################################
 
 
     #########################################################################
     ###### 32 bit specific ######
     'base_name': 'Linux_%(branch)s',
     'platform': 'linux',
     'stage_platform': 'linux',
@@ -83,21 +81,21 @@ config = {
         'LC_ALL': 'C',
         # 32 bit specific
         'PATH': '/tools/buildbot/bin:/usr/local/bin:/usr/lib/ccache:\
 /bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/tools/git/bin:\
 /tools/python27/bin:/tools/python27-mercurial/bin:/home/cltbld/bin',
         'LD_LIBRARY_PATH': "/tools/gcc-4.3.3/installed/lib",
     },
     'upload_env': {
-        # UPLOAD_HOST is set to stage_server
         # stage_server is dictated from build_pool_specifics.py
-        'UPLOAD_USER': STAGE_USERNAME,
+        'UPLOAD_HOST': '%(stage_server)s',
+        'UPLOAD_USER': '%(stage_username)s',
+        'UPLOAD_SSH_KEY': '/home/mock_mozilla/.ssh/%(stage_ssh_key)s',
         'UPLOAD_TO_TEMP': '1',
-        'UPLOAD_SSH_KEY': '~/.ssh/%s' % (STAGE_SSH_KEY,),
     },
     "check_test_env": {
         'MINIDUMP_STACKWALK': '%(abs_tools_dir)s/breakpad/linux/minidump_stackwalk',
         'MINIDUMP_SAVE_PATH': '%(base_work_dir)s/minidumps',
     },
     'purge_minsize': 12,
     'mock_packages': [
         'autoconf213', 'python', 'mozilla-python27', 'zip', 'mozilla-python27-mercurial',
@@ -144,11 +142,10 @@ config = {
         'freetype-2.3.11-6.el6_1.8.i686',
         'freetype-devel-2.3.11-6.el6_1.8.i686',
         'freetype-2.3.11-6.el6_1.8.x86_64',
         ######## 32 bit specific ###########
     ],
     'src_mozconfig': 'browser/config/mozconfigs/linux32/nightly',
     'tooltool_manifest_src': "browser/config/tooltool-manifests/linux32/\
 releng.manifest",
-    'platform_ftp_name': 'linux-i686.complete.mar',
     #########################################################################
 }
--- a/configs/builds/releng_base_linux_64_builds.py
+++ b/configs/builds/releng_base_linux_64_builds.py
@@ -1,10 +1,9 @@
 import os
-import sys
 
 STAGE_USERNAME = 'ffxbld'
 STAGE_SSH_KEY = 'ffxbld_rsa'
 
 config = {
     #########################################################################
     ######## LINUX GENERIC CONFIG KEYS/VAlUES
     # if you are updating this with custom 64 bit keys/values please add them
@@ -12,17 +11,16 @@ config = {
     # code block and also make sure this is synced with
     # releng_base_linux_64_builds.py
 
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     "buildbot_json_path": "buildprops.json",
     'exes': {
         'hgtool.py': os.path.join(
             os.getcwd(), 'build', 'tools', 'buildfarm', 'utils', 'hgtool.py'
         ),
@@ -39,24 +37,24 @@ config = {
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/home/cltbld/.boto', '/builds/.boto'),
         ('/builds/gapi.data', '/builds/gapi.data'),
         ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'enable_ccache': True,
+    'enable_check_test': True,
     'vcs_share_base': '/builds/hg-shared',
     'objdir': 'obj-firefox',
     'tooltool_script': ["/builds/tooltool.py"],
     'tooltool_bootstrap': "setup.sh",
     'enable_count_ctors': True,
     'enable_talos_sendchange': True,
     'enable_unittest_sendchange': True,
-    'platform_supports_partials': True,
     #########################################################################
 
 
     #########################################################################
     ###### 64 bit specific ######
     'base_name': 'Linux_x86-64_%(branch)s',
     'platform': 'linux64',
     'stage_platform': 'linux64',
@@ -85,21 +83,21 @@ config = {
         ## 64 bit specific
         'PATH': '/tools/buildbot/bin:/usr/local/bin:/usr/lib64/ccache:/bin:\
 /usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/tools/git/bin:/tools/python27/bin:\
 /tools/python27-mercurial/bin:/home/cltbld/bin',
         'LD_LIBRARY_PATH': "/tools/gcc-4.3.3/installed/lib64",
         ##
     },
     'upload_env': {
-        # UPLOAD_HOST is set to stage_server
         # stage_server is dictated from build_pool_specifics.py
-        'UPLOAD_USER': STAGE_USERNAME,
+        'UPLOAD_HOST': '%(stage_server)s',
+        'UPLOAD_USER': '%(stage_username)s',
+        'UPLOAD_SSH_KEY': '/home/mock_mozilla/.ssh/%(stage_ssh_key)s',
         'UPLOAD_TO_TEMP': '1',
-        'UPLOAD_SSH_KEY': '~/.ssh/%s' % (STAGE_SSH_KEY,),
     },
     "check_test_env": {
         'MINIDUMP_STACKWALK': '%(abs_tools_dir)s/breakpad/linux64/minidump_stackwalk',
         'MINIDUMP_SAVE_PATH': '%(base_work_dir)s/minidumps',
     },
     'purge_minsize': 14,
     'mock_packages': [
         'autoconf213', 'python', 'mozilla-python27', 'zip', 'mozilla-python27-mercurial',
@@ -125,11 +123,10 @@ config = {
         ###
         'pulseaudio-libs-devel', 'gstreamer-devel',
         'gstreamer-plugins-base-devel', 'freetype-2.3.11-6.el6_1.8.x86_64',
         'freetype-devel-2.3.11-6.el6_1.8.x86_64'
     ],
     'src_mozconfig': 'browser/config/mozconfigs/linux64/nightly',
     'tooltool_manifest_src': "browser/config/tooltool-manifests/linux64/\
 releng.manifest",
-    'platform_ftp_name': 'linux-x86_64.complete.mar',
     #########################################################################
 }
--- a/configs/builds/releng_base_mac_64_builds.py
+++ b/configs/builds/releng_base_mac_64_builds.py
@@ -8,17 +8,16 @@ config = {
     #########################################################################
     ######## MACOSX GENERIC CONFIG KEYS/VAlUES
 
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock',
         'build',
-        'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     "buildbot_json_path": "buildprops.json",
     'exes': {
         'python2.7': sys.executable,
         'hgtool.py': os.path.join(
             os.getcwd(), 'build', 'tools', 'buildfarm', 'utils', 'hgtool.py'
@@ -26,24 +25,24 @@ config = {
         "buildbot": "/tools/buildbot/bin/buildbot",
     },
     'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
     # decides whether we want to use moz_sign_cmd in env
     'enable_signing': True,
     'purge_skip': ['info', 'rel-*:45d', 'tb-rel-*:45d'],
     'purge_basedirs':  [],
     'enable_ccache': True,
+    'enable_check_test': True,
     'vcs_share_base': '/builds/hg-shared',
     'objdir': 'obj-firefox/i386',
     'tooltool_script': ["/builds/tooltool.py"],
     'tooltool_bootstrap': "setup.sh",
     'enable_count_ctors': False,
     'enable_talos_sendchange': True,
     'enable_unittest_sendchange': True,
-    'platform_supports_partials': True,
     #########################################################################
 
 
     #########################################################################
     ###### 64 bit specific ######
     'base_name': 'OS X 10.7 %(branch)s',
     'platform': 'macosx64',
     'stage_platform': 'macosx64',
@@ -71,24 +70,23 @@ config = {
         'CCACHE_UMASK': '002',
         'LC_ALL': 'C',
         ## 64 bit specific
         'PATH': '/tools/python/bin:/tools/buildbot/bin:/opt/local/bin:/usr/bin:'
                 '/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin',
         ##
     },
     'upload_env': {
-        # UPLOAD_HOST is set to stage_server
         # stage_server is dictated from build_pool_specifics.py
-        'UPLOAD_USER': STAGE_USERNAME,
+        'UPLOAD_HOST': '%(stage_server)s',
+        'UPLOAD_USER': '%(stage_username)s',
+        'UPLOAD_SSH_KEY': '/Users/cltbld/.ssh/%(stage_ssh_key)s',
         'UPLOAD_TO_TEMP': '1',
-        'UPLOAD_SSH_KEY': '~/.ssh/%s' % (STAGE_SSH_KEY,),
     },
     "check_test_env": {
         'MINIDUMP_STACKWALK': '%(abs_tools_dir)s/breakpad/osx64/minidump_stackwalk',
         'MINIDUMP_SAVE_PATH': '%(base_work_dir)s/minidumps',
     },
     'purge_minsize': 12,
     'src_mozconfig': 'browser/config/mozconfigs/macosx-universal/nightly',
     'tooltool_manifest_src': 'browser/config/tooltool-manifests/macosx64/releng.manifest',
-    'platform_ftp_name': 'mac.complete.mar',
     #########################################################################
 }
--- a/configs/builds/releng_base_windows_32_builds.py
+++ b/configs/builds/releng_base_windows_32_builds.py
@@ -12,17 +12,16 @@ config = {
     # code block and also make sure this is synced with
     # releng_base_windows_64_builds.py
 
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock', windows do not use mock
         'build',
-        'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     "buildbot_json_path": "buildprops.json",
     'exes': {
         'python2.7': sys.executable,
         'hgtool.py': [
             sys.executable,
@@ -42,25 +41,25 @@ config = {
         ]
     },
     'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
     # decides whether we want to use moz_sign_cmd in env
     'enable_signing': True,
     'purge_skip': ['info', 'rel-*:45d', 'tb-rel-*:45d'],
     'purge_basedirs':  [],
     'enable_ccache': False,
+    'enable_check_test': True,
     'vcs_share_base': 'C:/builds/hg-shared',
     'objdir': 'obj-firefox',
     'tooltool_script': [sys.executable,
                         'C:/mozilla-build/tooltool.py'],
     'tooltool_bootstrap': "setup.sh",
     'enable_count_ctors': False,
     'enable_talos_sendchange': True,
     'enable_unittest_sendchange': True,
-    'platform_supports_partials': True,
     #########################################################################
 
 
      #########################################################################
      ###### 32 bit specific ######
     'base_name': 'WINNT_5.2_%(branch)s',
     'platform': 'win32',
     'stage_platform': 'win32',
@@ -81,24 +80,24 @@ config = {
         'SYMBOL_SERVER_HOST': '%(symbol_server_host)s',
         'SYMBOL_SERVER_SSH_KEY': '/c/Users/cltbld/.ssh/ffxbld_rsa',
         'SYMBOL_SERVER_USER': 'ffxbld',
         'SYMBOL_SERVER_PATH': '/mnt/netapp/breakpad/symbols_ffx/',
         'POST_SYMBOL_UPLOAD_CMD': '/usr/local/bin/post-symbol-upload.py',
         'TINDERBOX_OUTPUT': '1',
     },
     'upload_env': {
-        # UPLOAD_HOST is set to stage_server
         # stage_server is dictated from build_pool_specifics.py
-        'UPLOAD_USER': STAGE_USERNAME,
+        'UPLOAD_HOST': '%(stage_server)s',
+        'UPLOAD_USER': '%(stage_username)s',
+        'UPLOAD_SSH_KEY': '/c/Users/cltbld/.ssh/%(stage_ssh_key)s',
         'UPLOAD_TO_TEMP': '1',
-        'UPLOAD_SSH_KEY': '~/.ssh/%s' % (STAGE_SSH_KEY,),
     },
     "check_test_env": {
         'MINIDUMP_STACKWALK': '%(abs_tools_dir)s/breakpad/win32/minidump_stackwalk.exe',
         'MINIDUMP_SAVE_PATH': '%(base_work_dir)s/minidumps',
     },
+    'enable_pymake': True,
     'purge_minsize': 12,
     'src_mozconfig': 'browser/config/mozconfigs/win32/nightly',
     'tooltool_manifest_src': "browser/config/tooltool-manifests/win32/releng.manifest",
-    'platform_ftp_name': 'win32.complete.mar',
     #########################################################################
 }
--- a/configs/builds/releng_sub_linux_configs/32_debug.py
+++ b/configs/builds/releng_sub_linux_configs/32_debug.py
@@ -3,17 +3,16 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'debug_build': True,
     'stage_platform': 'linux-debug',
     'purge_minsize': 15,
     'enable_signing': False,
     'enable_talos_sendchange': False,
--- a/configs/builds/releng_sub_linux_configs/64_asan.py
+++ b/configs/builds/releng_sub_linux_configs/64_asan.py
@@ -3,28 +3,26 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         # 'update',
     ],
     'stage_platform': 'linux64-asan',
     'purge_minsize': 12,
     'tooltool_manifest_src': "browser/config/tooltool-manifests/linux64/\
 asan.manifest",
     'platform_supports_post_upload_to_latest': False,
     'enable_signing': False,
     'enable_talos_sendchange': False,
-    'platform_supports_partials': False,
     #### 64 bit build specific #####
     'env': {
         'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
         'MOZ_AUTOMATION': '1',
         'DISPLAY': ':2',
         'HG_SHARE_BASE_DIR': '/builds/hg-shared',
         'MOZ_OBJDIR': 'obj-firefox',
         'TINDERBOX_OUTPUT': '1',
--- a/configs/builds/releng_sub_linux_configs/64_asan_and_debug.py
+++ b/configs/builds/releng_sub_linux_configs/64_asan_and_debug.py
@@ -3,29 +3,27 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         # 'update',
     ],
     'stage_platform': 'linux64-asan-debug',
     'debug_build': True,
     'purge_minsize': 12,
     'tooltool_manifest_src': "browser/config/tooltool-manifests/linux64/\
 asan.manifest",
     'platform_supports_post_upload_to_latest': False,
     'enable_signing': False,
     'enable_talos_sendchange': False,
-    'platform_supports_partials': False,
     #### 64 bit build specific #####
     'env': {
         'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
         'MOZ_AUTOMATION': '1',
         'DISPLAY': ':2',
         'HG_SHARE_BASE_DIR': '/builds/hg-shared',
         'MOZ_OBJDIR': 'obj-firefox',
         'TINDERBOX_OUTPUT': '1',
--- a/configs/builds/releng_sub_linux_configs/64_code_coverage.py
+++ b/configs/builds/releng_sub_linux_configs/64_code_coverage.py
@@ -3,17 +3,16 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'linux64-cc',
     'platform_supports_post_upload_to_latest': False,
     'enable_signing': False,
     'enable_talos_sendchange': False,
     'enable_count_ctors': False,
--- a/configs/builds/releng_sub_linux_configs/64_debug.py
+++ b/configs/builds/releng_sub_linux_configs/64_debug.py
@@ -3,17 +3,16 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'linux64-debug',
     'debug_build': True,
     'enable_signing': False,
     'enable_talos_sendchange': False,
     #### 64 bit build specific #####
--- a/configs/builds/releng_sub_linux_configs/64_debug_and_non_unified.py
+++ b/configs/builds/releng_sub_linux_configs/64_debug_and_non_unified.py
@@ -3,25 +3,25 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        # 'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'debug_build': True,
     'stage_platform': 'linux64-debug-nonunified',
     'enable_signing': False,
     'enable_talos_sendchange': False,
     'enable_unittest_sendchange': False,
+    'enable_check_test': False,
     #### 64 bit build specific #####
     'env': {
         'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
         'MOZ_AUTOMATION': '1',
         'DISPLAY': ':2',
         'HG_SHARE_BASE_DIR': '/builds/hg-shared',
         'MOZ_OBJDIR': MOZ_OBJDIR,
         'MOZ_CRASHREPORTER_NO_REPORT': '1',
--- a/configs/builds/releng_sub_linux_configs/64_mulet.py
+++ b/configs/builds/releng_sub_linux_configs/64_mulet.py
@@ -3,17 +3,16 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'linux64-mulet',
     'tooltool_manifest_src': "browser/config/tooltool-manifests/linux64/\
 asan.manifest",
     'platform_supports_post_upload_to_latest': False,
     'enable_signing': False,
--- a/configs/builds/releng_sub_linux_configs/64_non_unified.py
+++ b/configs/builds/releng_sub_linux_configs/64_non_unified.py
@@ -1,17 +1,17 @@
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        # 'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'linux64-nonunified',
     'enable_talos_sendchange': False,
     'enable_unittest_sendchange': False,
+    'enable_check_test': False,
     #### 64 bit build specific #####
     'src_mozconfig': 'browser/config/mozconfigs/linux64/nightly-nonunified',
     #######################
 }
--- a/configs/builds/releng_sub_linux_configs/64_stat_and_debug.py
+++ b/configs/builds/releng_sub_linux_configs/64_stat_and_debug.py
@@ -3,27 +3,28 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         'setup-mock',
         'build',
-        # 'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'debug_build': True,
     'stage_platform': 'linux64-st-an-debug',
     'purge_minsize': 12,
     'tooltool_manifest_src': "browser/config/tooltool-manifests/linux64/\
 clang.manifest",
     'platform_supports_post_upload_to_latest': False,
     'enable_signing': False,
+    'enable_talos_sendchange': False,
+    'enable_unittest_sendchange': False,
     #### 64 bit build specific #####
     'env': {
         'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
         'MOZ_AUTOMATION': '1',
         'DISPLAY': ':2',
         'HG_SHARE_BASE_DIR': '/builds/hg-shared',
         'MOZ_OBJDIR': MOZ_OBJDIR,
         'TINDERBOX_OUTPUT': '1',
--- a/configs/builds/releng_sub_mac_configs/64_debug.py
+++ b/configs/builds/releng_sub_mac_configs/64_debug.py
@@ -3,17 +3,16 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock',
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'macosx64-debug',
     'debug_build': True,
     'objdir': 'obj-firefox',
     'enable_talos_sendchange': False,
     #### 64 bit build specific #####
--- a/configs/builds/releng_sub_mac_configs/64_debug_and_non_unified.py
+++ b/configs/builds/releng_sub_mac_configs/64_debug_and_non_unified.py
@@ -3,24 +3,24 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock',
         'build',
-        # 'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'debug_build': True,
     'stage_platform': 'macosx64-debug-nonunified',
     'enable_talos_sendchange': False,
     'enable_unittest_sendchange': False,
+    'enable_check_test': False,
     'objdir': 'obj-firefox',
     #### 64 bit build specific #####
     'env': {
         'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
         'MOZ_AUTOMATION': '1',
         'HG_SHARE_BASE_DIR': '/builds/hg-shared',
         'MOZ_OBJDIR': 'obj-firefox',
         'TINDERBOX_OUTPUT': '1',
--- a/configs/builds/releng_sub_mac_configs/64_non_unified.py
+++ b/configs/builds/releng_sub_mac_configs/64_non_unified.py
@@ -1,17 +1,17 @@
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock',
         'build',
-        # 'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'macosx64-nonunified',
     'enable_talos_sendchange': False,
     'enable_unittest_sendchange': False,
+    'enable_check_test': False,
     #### 64 bit build specific #####
     'src_mozconfig': 'browser/config/mozconfigs/macosx-universal/nightly-nonunified',
     #######################
 }
--- a/configs/builds/releng_sub_windows_configs/32_debug.py
+++ b/configs/builds/releng_sub_windows_configs/32_debug.py
@@ -3,17 +3,16 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock', windows do not use mock
         'build',
-        'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'win32-debug',
     'debug_build': True,
     'enable_talos_sendchange': False,
     #### 32 bit build specific #####
     'env': {
--- a/configs/builds/releng_sub_windows_configs/32_debug_and_non_unified.py
+++ b/configs/builds/releng_sub_windows_configs/32_debug_and_non_unified.py
@@ -3,24 +3,24 @@ import os
 MOZ_OBJDIR = 'obj-firefox'
 
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock', windows do not use mock
         'build',
-        # 'sendchanges',
         # 'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'win32-debug-nonunified',
     'debug_build': True,
     'enable_talos_sendchange': False,
     'enable_unittest_sendchange': False,
+    'enable_check_test': False,
     #### 32 bit build specific #####
     'env': {
         'BINSCOPE': 'C:/Program Files (x86)/Microsoft/SDL BinScope/BinScope.exe',
         'HG_SHARE_BASE_DIR': 'C:/builds/hg-shared',
         'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
         'MOZ_AUTOMATION': '1',
         'MOZ_CRASHREPORTER_NO_REPORT': '1',
         'MOZ_OBJDIR': 'obj-firefox',
--- a/configs/builds/releng_sub_windows_configs/32_non_unified.py
+++ b/configs/builds/releng_sub_windows_configs/32_non_unified.py
@@ -1,17 +1,17 @@
 config = {
     'default_actions': [
         'clobber',
         'clone-tools',
         # 'setup-mock', windows do not use mock
         'build',
-        # 'sendchanges',
         'generate-build-stats',
         'update',  # decided by query_is_nightly()
     ],
     'stage_platform': 'win32-nonunified',
     'enable_talos_sendchange': False,
     'enable_unittest_sendchange': False,
+    'enable_check_test': False,
     #### 64 bit build specific #####
     'src_mozconfig': 'browser/config/mozconfigs/win32/nightly-nonunified',
     #######################
 }
--- a/mozharness/mozilla/building/buildbase.py
+++ b/mozharness/mozilla/building/buildbase.py
@@ -26,21 +26,23 @@ import sys
 from datetime import datetime
 import re
 from mozharness.base.config import BaseConfig, parse_config_file
 from mozharness.base.log import ERROR, OutputParser, FATAL, WARNING
 from mozharness.base.script import PostScriptRun
 from mozharness.base.vcs.vcsbase import MercurialScript
 from mozharness.mozilla.buildbot import BuildbotMixin, TBPL_STATUS_DICT, \
     TBPL_EXCEPTION, TBPL_RETRY, EXIT_STATUS_DICT, TBPL_WARNING, TBPL_SUCCESS, \
-    TBPL_WORST_LEVEL_TUPLE
+    TBPL_WORST_LEVEL_TUPLE, TBPL_FAILURE
 from mozharness.mozilla.purge import PurgeMixin
 from mozharness.mozilla.mock import MockMixin
 from mozharness.mozilla.signing import SigningMixin
 from mozharness.mozilla.mock import ERROR_MSGS as MOCK_ERROR_MSGS
+from mozharness.mozilla.testing.errors import TinderBoxPrintRe
+from mozharness.mozilla.testing.unittest import tbox_print_summary
 from mozharness.mozilla.updates.balrog import BalrogMixin
 
 AUTOMATION_EXIT_CODES = EXIT_STATUS_DICT.values()
 AUTOMATION_EXIT_CODES.sort()
 
 MISSING_CFG_KEY_MSG = "The key '%s' could not be determined \
 Please add this to your config."
 
@@ -122,16 +124,55 @@ class MakeUploadOutputParser(OutputParse
                 self.tbpl_status = self.worst_level(
                     error_check['level'], self.tbpl_status,
                     levels=TBPL_WORST_LEVEL_TUPLE
                 )
                 break
         else:
             self.info(line)
 
+class CheckTestCompleteParser(OutputParser):
+    tbpl_error_list = TBPL_UPLOAD_ERRORS
+
+    def __init__(self, **kwargs):
+        self.matches = {}
+        super(CheckTestCompleteParser, self).__init__(**kwargs)
+        self.pass_count = 0
+        self.fail_count = 0
+        self.leaked = False
+        self.harness_err_re = TinderBoxPrintRe['harness_error']['full_regex']
+
+    def parse_single_line(self, line):
+        # Counts and flags.
+        # Regular expression for crash and leak detections.
+        if "TEST-PASS" in line:
+            self.pass_count += 1
+            return self.info(line)
+        if "TEST-UNEXPECTED-" in line:
+            # Set the error flags.
+            # Or set the failure count.
+            m = self.harness_err_re.match(line)
+            if m:
+                r = m.group(1)
+                if r == "missing output line for total leaks!":
+                    self.leaked = None
+                else:
+                    self.leaked = True
+            else:
+                self.fail_count += 1
+            return self.warning(line)
+        self.info(line)  # else
+
+    def evaluate_parser(self):
+        # Return the summary.
+        summary = tbox_print_summary(self.pass_count,
+                                     self.fail_count,
+                                     self.leaked)
+        self.info("TinderboxPrint: check<br/>%s\n" % summary)
+
 
 class BuildingConfig(BaseConfig):
     # TODO add nosetests for this class
     def get_cfgs_from_files(self, all_config_files, parser):
         """ create a config based upon config files passed
 
         This is class specific. It recognizes certain config files
         by knowing how to combine them in an organized hierarchy
@@ -701,45 +742,73 @@ or run without that action (ie: --no-{ac
         if self.query_is_nightly():
             env["IS_NIGHTLY"] = "yes"
             # in branch_specifics.py we might set update_channel explicitly
             if c.get('update_channel'):
                 env["MOZ_UPDATE_CHANNEL"] = c['update_channel']
             else:  # let's just give the generic channel based on branch
                 env["MOZ_UPDATE_CHANNEL"] = "nightly-%s" % (self.branch,)
 
-        if self.config.get('pgo_build'):
+        if self.config.get('pgo_build') or self._compile_against_pgo():
             env['MOZ_PGO'] = '1'
 
         if c.get('enable_signing'):
             moz_sign_cmd = subprocess.list2cmdline(
                 self.query_moz_sign_cmd(formats=None)
             )
             # windows fix. This is passed to mach build env and we call that
             # with python, not with bash so we need to fix the slashes here
             env['MOZ_SIGN_CMD'] = moz_sign_cmd.replace('\\', '\\\\\\\\')
 
         # we can't make env an attribute of self because env can change on
         # every call for reasons like MOZ_SIGN_CMD
         return env
 
-    def query_build_upload_env(self):
+    def query_mach_build_env(self):
         c = self.config
-        upload_env = {}
+        mach_env = {}
         if c.get('upload_env'):
-            upload_env.update(c['upload_env'])
-        if not upload_env.get("UPLOAD_HOST") and c.get('stage_server'):
-            upload_env['UPLOAD_HOST'] = c['stage_server']
+            mach_env.update(c['upload_env'])
+            mach_env['UPLOAD_HOST'] = mach_env['UPLOAD_HOST'] % {
+                'stage_server': c['stage_server']
+            }
+            mach_env['UPLOAD_USER'] = mach_env['UPLOAD_USER'] % {
+                'stage_username': c['stage_username']
+            }
+            mach_env['UPLOAD_SSH_KEY'] = mach_env['UPLOAD_SSH_KEY'] % {
+                'stage_ssh_key': c['stage_ssh_key']
+            }
+
+        if self.query_is_nightly():
+            mach_env['LATEST_MAR_DIR'] = c['latest_mar_dir'] % {
+                'branch': self.branch
+            }
 
         # _query_post_upload_cmd returns a list (a cmd list), for env sake here
         # let's make it a string
         pst_up_cmd = ' '.join([str(i) for i in self._query_post_upload_cmd()])
-        upload_env['POST_UPLOAD_CMD'] = pst_up_cmd
+        mach_env['POST_UPLOAD_CMD'] = pst_up_cmd
+
+        return mach_env
+
+    def _compile_against_pgo(self):
+        """determines whether a build should be run with pgo even if it is
+        not a classified as a 'pgo build'.
 
-        return upload_env
+        requirements:
+        1) must be a platform that can run against pgo
+        2) either:
+            a) must be a nightly build
+            b) must be on a branch that runs pgo if it can everytime
+        """
+        c = self.config
+        if self.stage_platform in c['pgo_platforms']:
+            if c.get('branch_uses_per_checkin_strategy') or self.query_is_nightly():
+                return True
+        return False
 
     def query_check_test_env(self):
         c = self.config
         dirs = self.query_abs_dirs()
         check_test_env = {}
         if c.get('check_test_env'):
             for env_var, env_value in c['check_test_env'].iteritems():
                 check_test_env[env_var] = env_value % dirs
@@ -804,46 +873,46 @@ or run without that action (ie: --no-{ac
             tinderbox_build_dir = c['tinderbox_build_dir'] % {
                 'who': who,
                 'got_revision': revision
             }
         else:
             # the default
             tinderbox_build_dir = "%s-%s" % (self.branch, platform)
 
-        if who:
+        if who and self.branch == 'try':
             post_upload_cmd.extend(["--who", who])
         if c.get('include_post_upload_builddir'):
             post_upload_cmd.extend(
                 ["--builddir", "%s-%s" % (self.branch, platform)]
             )
         post_upload_cmd.extend(["--tinderbox-builds-dir", tinderbox_build_dir])
         post_upload_cmd.extend(["-p", c['stage_product']])
         post_upload_cmd.extend(['-i', buildid])
         if revision:
             post_upload_cmd.extend(['--revision', revision])
         if c.get('to_tinderbox_dated'):
             post_upload_cmd.append('--release-to-tinderbox-dated-builds')
+            post_upload_cmd.append('--release-to-latest-tinderbox-builds')
         if c.get('release_to_try_builds'):
             post_upload_cmd.append('--release-to-try-builds')
         if self.query_is_nightly():
             post_upload_cmd.extend(['-b', self.branch])
             post_upload_cmd.append('--release-to-dated')
             if c['platform_supports_post_upload_to_latest']:
                 post_upload_cmd.append('--release-to-latest')
         return post_upload_cmd
 
     def _ccache_z(self):
         """clear ccache stats."""
         dirs = self.query_abs_dirs()
         env = self.query_build_env()
-        if os.path.exists(dirs['abs_src_dir']):
-            self.run_command(command=['ccache', '-z'],
-                             cwd=dirs['abs_src_dir'],
-                             env=env)
+        self.run_command(command=['ccache', '-z'],
+                         cwd=dirs['base_work_dir'],
+                         env=env)
 
     def _ccache_s(self):
         """print ccache stats. only done for unix like platforms"""
         dirs = self.query_abs_dirs()
         env = self.query_build_env()
         cmd = ['ccache', '-s']
         self.run_command(cmd, cwd=dirs['abs_src_dir'], env=env)
 
@@ -1084,17 +1153,17 @@ or run without that action (ie: --no-{ac
         if c.get('graph_server_branch_name'):
             return c['graph_server_branch_name']
         else:
             # capitalize every word in between '-'
             branch_list = self.branch.split('-')
             branch_list = [elem.capitalize() for elem in branch_list]
             return '-'.join(branch_list)
 
-    def _query_props_set_by_mach(self, console_output, error_level):
+    def _query_props_set_by_mach(self, console_output=True, error_level=FATAL):
         mach_properties_path = os.path.join(
             self.query_abs_dirs()['abs_obj_dir'], 'mach_build_properties.json'
         )
         self.info("setting properties set by mach build. Looking in path: %s"
                   % mach_properties_path)
         if os.path.exists(mach_properties_path):
             with self.opened(mach_properties_path, error_level=error_level) as (fh, err):
                 build_props = json.load(fh)
@@ -1247,124 +1316,16 @@ or run without that action (ie: --no-{ac
         if not previous_buildid:
             self.fatal("Could not determine previous_buildid. This property"
                        "requires the upload action creating a partial mar.")
         self.set_buildbot_property("previous_buildid",
                                    previous_buildid,
                                    write_to_file=True)
         return previous_buildid
 
-    def _create_partial_mar(self):
-        # TODO use mar.py MIXINs and make this simpler
-        self._assert_cfg_valid_for_action(
-            ['update_env', 'platform_ftp_name', 'stage_server',
-             'stage_username', 'stage_ssh_key', 'latest_mar_dir'],
-            'upload'
-        )
-        self.info('Creating a partial mar:')
-        c = self.config
-        dirs = self.query_abs_dirs()
-        generic_env = self.query_build_env()
-        update_env = dict(chain(generic_env.items(), c['update_env'].items()))
-        abs_unwrap_update_path = os.path.join(dirs['abs_src_dir'],
-                                              'tools',
-                                              'update-packaging',
-                                              'unwrap_full_update.pl')
-        dist_update_dir = os.path.join(dirs['abs_obj_dir'],
-                                       'dist',
-                                       'update')
-        self.info('removing old unpacked dirs...')
-        for f in ['current', 'current.work', 'previous']:
-            self.rmtree(os.path.join(dirs['abs_obj_dir'], f),
-                        error_level=FATAL)
-        self.info('making unpacked dirs...')
-        for f in ['current', 'previous']:
-            self.mkdir_p(os.path.join(dirs['abs_obj_dir'], f),
-                         error_level=FATAL)
-        self.info('unpacking current mar...')
-        mar_file = self.query_buildbot_property('completeMarFilename')
-        cmd = '%s %s %s' % (self.query_exe('perl'),
-                            abs_unwrap_update_path,
-                            os.path.join(dist_update_dir, mar_file))
-        self.run_command_m(command=cmd,
-                           cwd=os.path.join(dirs['abs_obj_dir'], 'current'),
-                           env=update_env,
-                           halt_on_failure=True,
-                           fatal_exit_code=3)
-        # The mar file name will be the same from one day to the next,
-        # *except* when we do a version bump for a release. To cope with
-        # this, we get the name of the previous complete mar directly
-        # from staging. Version bumps can also often involve multiple mars
-        # living in the latest dir, so we grab the latest one.
-        self.info('getting previous mar filename...')
-        latest_mar_dir = c['latest_mar_dir'] % {'branch': self.branch}
-        cmd = 'ssh -l %s -i ~/.ssh/%s %s ls -1t %s | grep %s$ | head -n 1' % (
-            c['stage_username'], c['stage_ssh_key'], c['stage_server'],
-            latest_mar_dir, c['platform_ftp_name']
-        )
-        previous_mar_name = self.get_output_from_command(cmd)
-        if re.search(r'\.mar$', previous_mar_name or ""):
-            previous_mar_url = "http://%s%s/%s" % (c['stage_server'],
-                                                   latest_mar_dir,
-                                                   previous_mar_name)
-            self.info('downloading previous mar...')
-            previous_mar_file = self.download_file(previous_mar_url,
-                                                   file_name='previous.mar',
-                                                   parent_dir=dist_update_dir)
-            if not previous_mar_file:
-                # download_file will send error logs if this does not download
-                return
-        else:
-            self.warning('could not determine the previous complete mar file')
-            return
-        self.info('unpacking previous mar...')
-        cmd = '%s %s %s' % (self.query_exe('perl'),
-                            abs_unwrap_update_path,
-                            os.path.join(dist_update_dir, 'previous.mar'))
-        self.run_command_m(command=cmd,
-                           cwd=os.path.join(dirs['abs_obj_dir'], 'previous'),
-                           env=update_env)
-        # Extract the build ID from the unpacked previous complete mar.
-        previous_buildid = self._query_previous_buildid()
-        self.info('removing pgc files from previous and current dirs')
-        for mar_dir in ['current', 'previous']:
-            target_path = os.path.join(dirs['abs_obj_dir'], mar_dir)
-            if os.path.exists(target_path):
-                for root, target_dirs, file_names in os.walk(target_path):
-                    for file_name in file_names:
-                        if file_name.endswith('.pgc'):
-                            self.info('removing file: %s' % (file_name,))
-                            os.remove(file_name)
-        self.info("removing existing partial mar...")
-        mar_file_results = glob.glob(
-            os.path.join(dist_update_dir, '*.partial.*.mar')
-        )
-        if not mar_file_results:
-            self.warning("Could not determine an existing partial mar from "
-                         "%s pattern in %s dir" % ('*.partial.*.mar',
-                                                   dist_update_dir))
-        for mar_file in mar_file_results:
-            self.rmtree(mar_file)
-
-        self.info('generating partial patch from two complete mars...')
-        update_env.update({
-            'STAGE_DIR': '../../dist/update',
-            'SRC_BUILD': '../../previous',
-            'SRC_BUILD_ID': previous_buildid,
-            'DST_BUILD': '../../current',
-            'DST_BUILD_ID': self.query_buildid()
-        })
-        cmd = '%s -C tools/update-packaging partial-patch' % (
-            self.query_exe('make', return_type='string')
-        )
-        self.run_command_m(command=cmd,
-                           cwd=dirs['abs_obj_dir'],
-                           env=update_env)
-        self.rmtree(os.path.join(dist_update_dir, 'previous.mar'))
-
     def clone_tools(self):
         """clones the tools repo."""
         self._assert_cfg_valid_for_action(['tools_repo'], 'clone_tools')
         c = self.config
         dirs = self.query_abs_dirs()
         repo = {
             'repo': c['tools_repo'],
             'vcs': 'hg',
@@ -1402,74 +1363,102 @@ or run without that action (ie: --no-{ac
         )
         if os.path.exists(mach_props):
             self.info("Removing previous mach property file: %s" % mach_props)
             self.rmtree(mach_props)
 
     def build(self):
         """builds application."""
         env = self.query_build_env()
-        env.update(self.query_build_upload_env())
-        env.update(self.query_check_test_env())
+        env.update(self.query_mach_build_env())
         symbols_extra_buildid = self._query_moz_symbols_buildid()
         if symbols_extra_buildid:
             env['MOZ_SYMBOLS_EXTRA_BUILDID'] = symbols_extra_buildid
 
         # XXX Bug 1037883 - mozconfigs can not find buildprops.json when builds
         # are through mozharness. This is not pretty but it is a stopgap
         # until an alternative solution is made or all builds that touch
         # mozconfig.cache are converted to mozharness.
         dirs = self.query_abs_dirs()
         self.copyfile(os.path.join(dirs['base_work_dir'], 'buildprops.json'),
                       os.path.join(dirs['abs_work_dir'], 'buildprops.json'))
 
         python = self.query_exe('python2.7')
         return_code = self.run_command_m(
-            command=[python, 'mach', 'build'],
+            command=[python, 'mach', '--log-no-times', 'build', '-v'],
             cwd=self.query_abs_dirs()['abs_src_dir'],
             env=env
         )
         if return_code:
-            log_level = WARNING
-            if return_code != 1:
-                # if not 1 (warning/orange), set the build to 2 (failure/red)
-                return_code = 2
-                log_level = FATAL
-            # set the return code to red, failure
             self.return_code = self.worst_level(
-                return_code,  self.return_code, AUTOMATION_EXIT_CODES[::-1]
+                EXIT_STATUS_DICT[TBPL_FAILURE],  self.return_code,
+                AUTOMATION_EXIT_CODES[::-1]
             )
-            self.log("'mach build' did not run successfully. Please check log "
-                     "for errors/warnings.", log_level)
+            self.fatal("'mach build' did not run successfully. Please check "
+                       "log for errors.")
 
     def postflight_build(self, console_output=True):
         """grabs properties from post build and calls ccache -s"""
+        c = self.config
         self.generate_build_props(console_output=console_output,
                                   halt_on_failure=True)
+
+        if c.get('enable_talos_sendchange'):
+            self._do_sendchange('talos')
+
+        if c.get('enable_unittest_sendchange'):
+            self._do_sendchange('unittest')
+
+        if self.config.get('enable_check_test'):
+            self._check_test()
+
         if self.config.get('enable_ccache'):
             self._ccache_s()
 
+    def _check_test(self):
+        c = self.config
+        dirs = self.query_abs_dirs()
+
+        env = self.query_build_env()
+        env.update(self.query_check_test_env())
+
+        if c.get('enable_pymake'):  # e.g. windows
+            pymake_path = os.path.join(dirs['abs_src_dir'], 'build',
+                                       'pymake', 'make.py')
+            cmd = ['python', pymake_path]
+        else:
+            cmd = ['make']
+        cmd.extend(['-k', 'check'])
+
+        parser = CheckTestCompleteParser(config=c,
+                                         log_obj=self.log_obj)
+        self.run_command_m(command=cmd,
+                           cwd=dirs['abs_obj_dir'],
+                           env=env,
+                           output_parser=parser)
+        parser.evaluate_parser()
+
     def generate_build_stats(self):
         """grab build stats following a compile.
 
         This action handles all statitics from a build: 'count_ctors' and
         'vsize' and then posts to graph server the results.
         We only post to graph server for non nightly build
         """
         c = self.config
 
         # grab any props available from this or previous unclobbered runs
         self.generate_build_props(console_output=False,
                                   halt_on_failure=False)
 
         # enable_max_vsize will be True for builds like pgo win32 builds
         # but not for nightlies (nightlies are pgo builds too so the
         # check is needed).
-        enable_max_vsize = (c.get('enable_max_vsize') and c.get('pgo_build')
-                            and not self.query_is_nightly())
+        enable_max_vsize = c.get('enable_max_vsize') and c.get('pgo_build')
+
         if enable_max_vsize or c.get('enable_count_ctors'):
             if c.get('enable_count_ctors'):
                 self.info("counting ctors...")
                 self._count_ctors()
                 num_ctors = self.buildbot_properties.get('num_ctors', 'unknown')
                 self.info("TinderboxPrint: num_ctors: %s" % (num_ctors,))
             if enable_max_vsize:
                 self.info("getting vsize...")
@@ -1478,18 +1467,17 @@ or run without that action (ie: --no-{ac
                 self._graph_server_post()
             else:
                 self.info("We are not posting to graph server as this is a "
                           "nightly build.")
         else:
             self.info("Nothing to do for this action since ctors and vsize "
                       "counts are disabled for this build.")
 
-    def sendchanges(self):
-        # TODO rip out this logic and put it in build configs
+    def _do_sendchange(self, test_type):
         c = self.config
 
         # grab any props available from this or previous unclobbered runs
         self.generate_build_props(console_output=False,
                                   halt_on_failure=False)
 
         installer_url = self.query_buildbot_property('packageUrl')
         if not installer_url:
@@ -1497,91 +1485,75 @@ or run without that action (ie: --no-{ac
             self.error("could not determine packageUrl property to use "
                        "against sendchange. Was it set after 'mach build'?")
             self.return_code = self.worst_level(
                 1,  self.return_code, AUTOMATION_EXIT_CODES[::-1]
             )
             self.return_code = 1
             return
         tests_url = self.query_buildbot_property('testsUrl')
+        pgo_build = c.get('pgo_build', False) or self._compile_against_pgo()
+
+        # these cmds are sent to mach through env vars. We won't know the
+        # packageUrl or testsUrl until mach runs upload target so we let mach
+        #  fill in the rest of the cmd
         sendchange_props = {
             'buildid': self.query_buildid(),
             'builduid': self.query_builduid(),
             'nightly_build': self.query_is_nightly(),
-            'pgo_build': c.get('pgo_build', False),
+            'pgo_build': pgo_build,
         }
-        # TODO insert check for uploadMulti factory 2526
-        # if not self.uploadMulti when we introduce a platform/build that uses
-        # uploadMulti
-
-        if c.get('enable_talos_sendchange'):
-            if c.get('pgo_build'):
+        if test_type == 'talos':
+            if pgo_build:
                 build_type = 'pgo-'
             else:  # we don't do talos sendchange for debug so no need to check
                 build_type = ''  # leave 'opt' out of branch for talos
             talos_branch = "%s-%s-%s%s" % (self.branch,
                                            self.stage_platform,
                                            build_type,
                                            'talos')
             self.sendchange(downloadables=[installer_url],
                             branch=talos_branch,
                             username='sendchange',
                             sendchange_props=sendchange_props)
-
-        if c.get('enable_unittest_sendchange'):
+        elif test_type == 'unittest':
             # do unittest sendchange
-
-            # we need a way to make opt builds use pgo branch sendchanges.
-            # if the branch supports per_checkin and this platform is in
-            # pgo platforms (see branch_specifics.py), use pgo instead of opt.
-            override_opt_branch = (self.stage_platform in c['pgo_platforms'] and
-                                   c.get('branch_uses_per_checkin_strategy'))
             if c.get('debug_build'):
                 build_type = ''  # for debug builds we append nothing
-            elif c.get('pgo_build') or override_opt_branch:
+            elif pgo_build:
                 build_type = '-pgo'
             else:  # generic opt build
                 build_type = '-opt'
 
             if c.get('unittest_platform'):
                 platform = c['unittest_platform']
             else:
                 platform = self.stage_platform
 
             platform_and_build_type = "%s%s" % (platform, build_type)
             unittest_branch = "%s-%s-%s" % (self.branch,
                                             platform_and_build_type,
                                             'unittest')
             self.sendchange(downloadables=[installer_url, tests_url],
                             branch=unittest_branch,
                             sendchange_props=sendchange_props)
+        else:
+            self.fatal('type: "%s" is unknown for sendchange type. valid '
+                       'strings are "unittest" or "talos"' % test_type)
 
     def update(self):
         """ submit balrog update steps. """
         c = self.config
         if not self.query_is_nightly():
             self.info("Not a nightly build, skipping balrog submission.")
             return
 
         # grab any props available from this or previous unclobbered runs
         self.generate_build_props(console_output=False,
                                   halt_on_failure=False)
-
-        # platform_supports_partials: is False for things like asan
-        # branch_supports_partials: is False for things like some b2g branches
-        if (c.get('platform_supports_partials') and
-                c.get('branch_supports_partials')):
-            self._create_partial_mar()
-            dist_update_dir = os.path.join(self.query_abs_dirs()['abs_obj_dir'],
-                                           'dist',
-                                           'update')
-            self._set_file_properties(file_name='*.partial.*.mar',
-                                      find_dir=dist_update_dir,
-                                      prop_type='partialMar')
-
         if not self.config.get("balrog_api_root"):
             self.fatal("balrog_api_root not set; skipping balrog submission.")
             return
 
         if c['balrog_api_root']:
             self.submit_balrog_updates()
 
     def _post_fatal(self, message=None, exit_code=None):
--- a/scripts/fx_desktop_build.py
+++ b/scripts/fx_desktop_build.py
@@ -27,17 +27,16 @@ class FxDesktopBuild(BuildScript, object
     def __init__(self):
         buildscript_kwargs = {
             'config_options': BUILD_BASE_CONFIG_OPTIONS,
             'all_actions': [
                 'clobber',
                 'clone-tools',
                 'setup-mock',
                 'build',
-                'sendchanges',
                 'generate-build-stats',
                 'update',
             ],
             'require_config_file': True,
             # Default configuration
             'config': {
                 'is_automation': True,
                 "pgo_build": False,
@@ -60,22 +59,17 @@ class FxDesktopBuild(BuildScript, object
                     "%(objdir)s/dist/fennec*",
                     "%(objdir)s/dist/seamonkey*",
                     "%(objdir)s/dist/thunderbird*",
                     "%(objdir)s/dist/install/sea/*.exe"
                 ],
                 'stage_product': 'firefox',
                 'platform_supports_post_upload_to_latest': True,
                 'use_branch_in_symbols_extra_buildid': True,
-                'update_env': {
-                    'MAR': '../dist/host/bin/mar',
-                    'MBSDIFF': '../dist/host/bin/mbsdiff'
-                },
                 'latest_mar_dir': '/pub/mozilla.org/firefox/nightly/latest-%(branch)s',
-                'branch_supports_partials': True,  # check branch_specifics.py
 
                 # try will overwrite these
                 'clone_with_purge': False,
                 'clone_by_revision': False,
                 'tinderbox_build_dir': None,
                 'to_tinderbox_dated': True,
                 'release_to_try_builds': False,
                 'include_post_upload_builddir': False,