| # This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this, |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| from __future__ import unicode_literals |
| |
| import os |
| import re |
| import subprocess |
| import which |
| |
| from distutils.version import LooseVersion |
| |
| def get_hg_path(): |
| """Obtain the path of the Mercurial client.""" |
| |
| # We use subprocess in places, which expects a Win32 executable or |
| # batch script. On some versions of MozillaBuild, we have "hg.exe", |
| # "hg.bat," and "hg" (a Python script). "which" will happily return the |
| # Python script, which will cause subprocess to choke. Explicitly favor |
| # the Windows version over the plain script. |
| try: |
| return which.which('hg.exe') |
| except which.WhichError: |
| try: |
| return which.which('hg') |
| except which.WhichError as e: |
| print(e) |
| |
| raise Exception('Unable to obtain Mercurial path. Try running ' + |
| '|mach bootstrap| to ensure your environment is up to ' + |
| 'date.') |
| |
| def get_hg_version(hg): |
| """Obtain the version of the Mercurial client.""" |
| |
| env = os.environ.copy() |
| env[b'HGPLAIN'] = b'1' |
| |
| info = subprocess.check_output([hg, '--version'], env=env) |
| match = re.search('version ([^\+\)]+)', info) |
| if not match: |
| raise Exception('Unable to identify Mercurial version.') |
| |
| return LooseVersion(match.group(1)) |