Bug 1384396 - Detect Watchman Mercurial integration in configure; r=nalexander
authorGregory Szorc <gps@mozilla.com>
Thu, 27 Jul 2017 14:12:35 -0700
changeset 371571 6504499c1689d9199c355e07164b849f9144ca2f
parent 371570 3db186a5de7dbcf9d762b1dbcc54e9a5f8d7e057
child 371572 13358d0eb5a1e9651d7549d9d00e34b233c47ba2
push id93118
push usercbook@mozilla.com
push dateFri, 28 Jul 2017 13:26:42 +0000
treeherdermozilla-inbound@6e3ba727a94a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersnalexander
bugs1384396
milestone56.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1384396 - Detect Watchman Mercurial integration in configure; r=nalexander Configure now detects VCS info. Configure now detects Watchman. We can combine the two so configure can detect if Mercurial is configured with Watchman enabled. This commit does two things: 1) collects the Mercurial config so it is available to downstream checks 2) examines the config for presence and state of the fsmonitor extension We don't yet do anything with the fsmonitor state. But it should be useful soon. Also, the return value is kinda wonky. This will almost certainly be improved as soon as there is an actual consumer. MozReview-Commit-ID: HyHZ2X8VI0h
build/moz.configure/init.configure
moz.configure
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -348,16 +348,49 @@ def hg_version(hg):
     if not match:
         raise FatalCheckError('unable to determine Mercurial version: %s' % out)
 
     # The version string may be "unknown" for Mercurial run out of its own
     # source checkout or for bad builds. But LooseVersion handles it.
 
     return Version(match.group(1))
 
+# Resolve Mercurial config items so other checks have easy access.
+# Do NOT set this in the config because it may contain sensitive data
+# like API keys.
+@depends_all(check_build_environment, hg, hg_version)
+@imports('os')
+def hg_config(build_env, hg, version):
+    env = dict(os.environ)
+    env['HGPLAIN'] = '1'
+
+    # Warnings may get sent to stderr. But check_cmd_output() ignores
+    # stderr if exit code is 0. And the command should always succeed if
+    # `hg version` worked.
+    out = check_cmd_output(hg, 'config', env=env, cwd=build_env.topsrcdir)
+
+    # out is bytes. However, unicode literals are in effect, so implicit
+    # type coercion can occur. The underlying Mercurial config file may be
+    # in a user-defined encoding. However, HGPLAIN both overrides the decoding
+    # inside Mercurial *and* ensures output is utf-8. Because moz.configure
+    # is using unicode literals, our returned config object uses unicode
+    # keys and values to limit potential for coercion.
+
+    # Mercurial should emit utf-8. But be paranoid and ignore invalid utf-8
+    # byte sequences.
+    out = out.decode('utf-8', 'replace')
+
+    config = {}
+
+    for line in out.strip().splitlines():
+        key, value = [s.strip() for s in line.split('=', 1)]
+        config[key] = value
+
+    return config
+
 @depends_if(git)
 @checking('for Git version')
 @imports('re')
 def git_version(git):
     out = check_cmd_output(git, '--version').rstrip()
 
     match = re.search('git version (.*)$', out)
 
--- a/moz.configure
+++ b/moz.configure
@@ -373,16 +373,39 @@ watchman = check_prog('WATCHMAN', ('watc
 @depends_if(watchman)
 @checking('for watchman version')
 @imports('json')
 def watchman_version(watchman):
     out = check_cmd_output(watchman, 'version')
     res = json.loads(out)
     return Version(res['version'])
 
+@depends_all(hg_version, hg_config, watchman)
+@checking('for watchman Mercurial integration')
+@imports('os')
+def watchman_hg(hg_version, hg_config, watchman):
+    if hg_version < Version('3.8'):
+        return 'no (Mercurial 3.8+ required)'
+
+    ext_enabled = False
+    mode_disabled = False
+
+    for k in ('extensions.fsmonitor', 'extensions.hgext.fsmonitor'):
+        if k in hg_config and hg_config[k] != '!':
+            ext_enabled = True
+
+    mode_disabled = hg_config.get('fsmonitor.mode') == 'off'
+
+    if not ext_enabled:
+        return 'no (fsmonitor extension not enabled)'
+    if mode_disabled:
+        return 'no (fsmonitor.mode=off disables fsmonitor)'
+
+    return True
+
 # Miscellaneous programs
 # ==============================================================
 check_prog('DOXYGEN', ('doxygen',), allow_missing=True)
 check_prog('XARGS', ('xargs',))
 
 @depends(target)
 def extra_programs(target):
     if target.kernel == 'Darwin':