sapling/tests/fsmonitor-run-tests.py
Jun Wu 584656dff3 codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).

Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.

Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.

An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.

As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.

Reviewed By: wez, phillco, simpkins, pkaush, singhsrb

Differential Revision: D8173629

fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-25 22:17:29 -07:00

148 lines
4.4 KiB
Python
Executable File

#!/usr/bin/env python
# fsmonitor-run-tests.py - Run Mercurial tests with fsmonitor enabled
#
# Copyright 2017 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
#
# This is a wrapper around run-tests.py that spins up an isolated instance of
# Watchman and runs the Mercurial tests against it. This ensures that the global
# version of Watchman isn't affected by anything this test does.
from __future__ import absolute_import, print_function
import argparse
import contextlib
import json
import os
import shutil
import subprocess
import sys
import tempfile
import uuid
osenvironb = getattr(os, "environb", os.environ)
if sys.version_info > (3, 5, 0):
PYTHON3 = True
xrange = range # we use xrange in one place, and we'd rather not use range
def _bytespath(p):
return p.encode("utf-8")
elif sys.version_info >= (3, 0, 0):
print(
"%s is only supported on Python 3.5+ and 2.7, not %s"
% (sys.argv[0], ".".join(str(v) for v in sys.version_info[:3]))
)
sys.exit(70) # EX_SOFTWARE from `man 3 sysexit`
else:
PYTHON3 = False
# In python 2.x, path operations are generally done using
# bytestrings by default, so we don't have to do any extra
# fiddling there. We define the wrapper functions anyway just to
# help keep code consistent between platforms.
def _bytespath(p):
return p
def getparser():
"""Obtain the argument parser used by the CLI."""
parser = argparse.ArgumentParser(
description="Run tests with fsmonitor enabled.",
epilog="Unrecognized options are passed to run-tests.py.",
)
# - keep these sorted
# - none of these options should conflict with any in run-tests.py
parser.add_argument(
"--keep-fsmonitor-tmpdir",
action="store_true",
help="keep temporary directory with fsmonitor state",
)
parser.add_argument(
"--watchman",
help="location of watchman binary (default: watchman in PATH)",
default="watchman",
)
return parser
@contextlib.contextmanager
def watchman(args):
basedir = tempfile.mkdtemp(prefix="hg-fsmonitor")
try:
# Much of this configuration is borrowed from Watchman's test harness.
cfgfile = os.path.join(basedir, "config.json")
# TODO: allow setting a config
with open(cfgfile, "w") as f:
f.write(json.dumps({}))
logfile = os.path.join(basedir, "log")
clilogfile = os.path.join(basedir, "cli-log")
if os.name == "nt":
sockfile = "\\\\.\\pipe\\watchman-test-%s" % uuid.uuid4().hex
else:
sockfile = os.path.join(basedir, "sock")
pidfile = os.path.join(basedir, "pid")
statefile = os.path.join(basedir, "state")
argv = [
args.watchman,
"--sockname",
sockfile,
"--logfile",
logfile,
"--pidfile",
pidfile,
"--statefile",
statefile,
"--foreground",
"--log-level=2", # debug logging for watchman
]
envb = osenvironb.copy()
envb[b"WATCHMAN_CONFIG_FILE"] = _bytespath(cfgfile)
with open(clilogfile, "wb") as f:
proc = subprocess.Popen(argv, env=envb, stdin=None, stdout=f, stderr=f)
try:
yield sockfile
finally:
proc.terminate()
proc.kill()
finally:
if args.keep_fsmonitor_tmpdir:
print("fsmonitor dir available at %s" % basedir)
else:
shutil.rmtree(basedir, ignore_errors=True)
def run():
parser = getparser()
args, runtestsargv = parser.parse_known_args()
with watchman(args) as sockfile:
osenvironb[b"WATCHMAN_SOCK"] = _bytespath(sockfile)
# Indicate to hghave that we're running with fsmonitor enabled.
osenvironb[b"HGFSMONITOR_TESTS"] = b"1"
runtestdir = os.path.dirname(__file__)
runtests = os.path.join(runtestdir, "run-tests.py")
blacklist = os.path.join(runtestdir, "blacklists", "fsmonitor")
runtestsargv.insert(0, runtests)
runtestsargv.extend(
["--extra-config", "extensions.fsmonitor=", "--blacklist", blacklist]
)
return subprocess.call(runtestsargv)
if __name__ == "__main__":
sys.exit(run())