From 805d36e4df797f2405604feca10df9148f74244d Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Wed, 10 Apr 2019 20:42:04 +0100 Subject: [PATCH] [V2-UI] Move logging to Rust (#6817) ### Problem Currently, Rust calls Python through FFI to handle logging. As we move to the V2 UI, we would like to make the reverse happen, where the V2 engine logs to the UI. ### Solution The Rust code owns logging (which the Python code can forward to) instead of the other way around. Note that this PR changes some logging formats (adding timestamps, adding PIDs, and possibly a few other minor changes). --- src/python/pants/base/exception_sink.py | 13 +- src/python/pants/base/exiter.py | 7 + src/python/pants/bin/local_pants_runner.py | 4 +- src/python/pants/bin/pants_runner.py | 10 + src/python/pants/bin/remote_pants_runner.py | 14 - src/python/pants/engine/native.py | 26 +- src/python/pants/init/BUILD | 1 + src/python/pants/init/logging.py | 108 +++-- src/python/pants/pantsd/pants_daemon.py | 27 +- src/rust/engine/Cargo.lock | 375 ++++++++++-------- src/rust/engine/Cargo.toml | 3 + src/rust/engine/logging/Cargo.toml | 14 + src/rust/engine/logging/src/lib.rs | 91 +++++ src/rust/engine/logging/src/logger.rs | 169 ++++++++ src/rust/engine/src/externs.rs | 114 ------ src/rust/engine/src/lib.rs | 61 ++- src/rust/engine/ui/src/display.rs | 1 - .../tasks/lifecycle_stub_task.py | 2 +- .../engine/legacy/test_graph_integration.py | 14 +- tests/python/pants_test/init/test_logging.py | 87 ++-- tests/python/pants_test/logging/BUILD | 1 + .../logging/test_native_engine_logging.py | 35 +- .../pants_test/pants_run_integration_test.py | 19 + tests/python/pants_test/pantsd/stderr | 0 .../pantsd/test_pantsd_integration.py | 12 +- tests/python/pants_test/test_base.py | 5 + 26 files changed, 789 insertions(+), 424 deletions(-) create mode 100644 src/rust/engine/logging/Cargo.toml create mode 100644 src/rust/engine/logging/src/lib.rs create mode 100644 src/rust/engine/logging/src/logger.rs create mode 100644 tests/python/pants_test/pantsd/stderr diff --git a/src/python/pants/base/exception_sink.py b/src/python/pants/base/exception_sink.py index 7297ba5ea15..46146c4aa02 100644 --- a/src/python/pants/base/exception_sink.py +++ b/src/python/pants/base/exception_sink.py @@ -122,7 +122,7 @@ def reset_log_location(cls, new_log_location): `cls._shared_error_fileobj`. OS state: - May create a new directory. - - Overwrites signal handlers for many fatal and non-fatal signals. + - Overwrites signal handlers for many fatal and non-fatal signals (but not SIGUSR2). :raises: :class:`ExceptionSink.ExceptionSinkError` if the directory does not exist or is not writable. @@ -167,7 +167,11 @@ def reset_exiter(cls, exiter): sys.excepthook = cls._log_unhandled_exception_and_exit @classmethod - def reset_interactive_output_stream(cls, interactive_output_stream): + def reset_interactive_output_stream( + cls, + interactive_output_stream, + override_faulthandler_destination=True + ): """ Class state: - Overwrites `cls._interactive_output_stream`. @@ -180,8 +184,9 @@ def reset_interactive_output_stream(cls, interactive_output_stream): try: # NB: mutate process-global state! # This permits a non-fatal `kill -31 ` for stacktrace retrieval. - faulthandler.register(signal.SIGUSR2, interactive_output_stream, - all_threads=True, chain=False) + if override_faulthandler_destination: + faulthandler.register(signal.SIGUSR2, interactive_output_stream, + all_threads=True, chain=False) # NB: mutate the class variables! cls._interactive_output_stream = interactive_output_stream except ValueError: diff --git a/src/python/pants/base/exiter.py b/src/python/pants/base/exiter.py index 8fb601cb57a..2b41f4a061a 100644 --- a/src/python/pants/base/exiter.py +++ b/src/python/pants/base/exiter.py @@ -6,6 +6,7 @@ import logging import sys +import traceback from builtins import object from future.utils import PY3 @@ -70,6 +71,12 @@ def exit(self, result=PANTS_SUCCEEDED_EXIT_CODE, msg=None, out=None): except Exception as e: # If the file is already closed, or any other error occurs, just log it and continue to # exit. + if msg: + logger.warning("Encountered error when trying to log this message: {}".format(msg)) + # In pantsd, this won't go anywhere, because there's really nowhere for us to log if we + # can't log :( + # Not in pantsd, this will end up in sys.stderr. + traceback.print_stack() logger.exception(e) self._exit(result) diff --git a/src/python/pants/bin/local_pants_runner.py b/src/python/pants/bin/local_pants_runner.py index 93ea626e5a6..7a947aba1a6 100644 --- a/src/python/pants/bin/local_pants_runner.py +++ b/src/python/pants/bin/local_pants_runner.py @@ -140,8 +140,8 @@ def create(cls, exiter, args, env, target_roots=None, daemon_graph_session=None, options, build_config, options_bootstrapper = cls.parse_options( args, env, - True, - options_bootstrapper + setup_logging=True, + options_bootstrapper=options_bootstrapper, ) global_options = options.for_global_scope() diff --git a/src/python/pants/bin/pants_runner.py b/src/python/pants/bin/pants_runner.py index 23c3331c7c1..38633274d57 100644 --- a/src/python/pants/bin/pants_runner.py +++ b/src/python/pants/bin/pants_runner.py @@ -11,6 +11,7 @@ from pants.base.exception_sink import ExceptionSink from pants.bin.remote_pants_runner import RemotePantsRunner +from pants.init.logging import init_rust_logger, setup_logging_to_stderr from pants.option.options_bootstrapper import OptionsBootstrapper @@ -31,6 +32,11 @@ def __init__(self, exiter, args=None, env=None, start_time=None): self._env = env or os.environ self._start_time = start_time + def _enable_rust_logging(self, global_bootstrap_options): + levelname = global_bootstrap_options.level.upper() + init_rust_logger(levelname) + setup_logging_to_stderr(logging.getLogger(None), levelname) + def run(self): # Register our exiter at the beginning of the run() method so that any code in this process from # this point onwards will use that exiter in the case of a fatal error. @@ -40,6 +46,10 @@ def run(self): bootstrap_options = options_bootstrapper.bootstrap_options global_bootstrap_options = bootstrap_options.for_global_scope() + # We enable Rust logging here, + # and everything before it will be routed through regular Python logging. + self._enable_rust_logging(global_bootstrap_options) + ExceptionSink.reset_should_print_backtrace_to_terminal(global_bootstrap_options.print_exception_stacktrace) ExceptionSink.reset_log_location(global_bootstrap_options.pants_workdir) diff --git a/src/python/pants/bin/remote_pants_runner.py b/src/python/pants/bin/remote_pants_runner.py index e34a397a3d0..fec8e9dd308 100644 --- a/src/python/pants/bin/remote_pants_runner.py +++ b/src/python/pants/bin/remote_pants_runner.py @@ -95,19 +95,6 @@ def _trapped_signals(self, client): with ExceptionSink.trapped_signals(signal_handler): yield - def _setup_logging(self): - """Sets up basic stdio logging for the thin client.""" - log_level = logging.getLevelName(self._bootstrap_options.for_global_scope().level.upper()) - - formatter = logging.Formatter('%(levelname)s] %(message)s') - handler = logging.StreamHandler(sys.stderr) - handler.setLevel(log_level) - handler.setFormatter(formatter) - - root = logging.getLogger() - root.setLevel(log_level) - root.addHandler(handler) - @staticmethod def _backoff(attempt): """Minimal backoff strategy for daemon restarts.""" @@ -200,6 +187,5 @@ def _maybe_launch_pantsd(self): return PantsDaemon.Factory.maybe_launch(options_bootstrapper=self._options_bootstrapper) def run(self, args=None): - self._setup_logging() pantsd_handle = self._maybe_launch_pantsd() self._run_pants_with_retry(pantsd_handle) diff --git a/src/python/pants/engine/native.py b/src/python/pants/engine/native.py index 14ae63b34ff..1272cd85b8a 100644 --- a/src/python/pants/engine/native.py +++ b/src/python/pants/engine/native.py @@ -271,12 +271,6 @@ def call(cls, c, func, args): return PyResult(is_throw, c.to_value(val)) - @_extern_decl('void', ['ExternContext*', 'uint8_t', 'uint8_t*', 'uint64_t']) - def extern_log(self, context_handle, level, msg_ptr, msg_len): - """Given a log level and utf8 message string, log it.""" - msg = bytes(self._ffi.buffer(msg_ptr, msg_len)).decode('utf-8') - logger.log(level, msg) - @_extern_decl('TypeId', ['ExternContext*', 'Handle*']) def extern_get_type_for(self, context_handle, val): """Return a representation of the object's type.""" @@ -628,7 +622,6 @@ def context(self): def init_externs(): context = ExternContext(self.ffi, self.lib) self.lib.externs_set(context._handle, - self.ffi_lib.extern_log, logger.getEffectiveLevel(), self.ffi_lib.extern_call, self.ffi_lib.extern_generator_send, @@ -679,6 +672,25 @@ def decompress_tarball(self, tarfile_path, dest_dir): result = self.lib.decompress_tarball(tarfile_path, dest_dir) return self.context.raise_or_return(result) + def init_rust_logging(self, level): + return self.lib.init_logging(level) + + def setup_pantsd_logger(self, log_file_path, level): + log_file_path = log_file_path.encode("utf-8") + result = self.lib.setup_pantsd_logger(log_file_path, level) + return self.context.raise_or_return(result) + + def setup_stderr_logger(self, level): + return self.lib.setup_stderr_logger(level) + + def write_log(self, msg, level, target): + msg = msg.encode("utf-8") + target = target.encode("utf-8") + return self.lib.write_log(msg, level, target) + + def flush_log(self): + return self.lib.flush_log() + def match_path_globs(self, path_globs, paths): path_globs = self.context.to_value(path_globs) paths_buf = self.context.utf8_buf_buf(tuple(paths)) diff --git a/src/python/pants/init/BUILD b/src/python/pants/init/BUILD index 2111b1a2096..8cd87561da0 100644 --- a/src/python/pants/init/BUILD +++ b/src/python/pants/init/BUILD @@ -11,6 +11,7 @@ python_library( '3rdparty/python/twitter/commons:twitter.common.collections', 'src/python/pants/backend/python/subsystems', 'src/python/pants/base:build_environment', + 'src/python/pants/base:exception_sink', 'src/python/pants/base:exceptions', 'src/python/pants/base:target_roots', 'src/python/pants/binaries', diff --git a/src/python/pants/init/logging.py b/src/python/pants/init/logging.py index 42b3b0caf71..fd64e779759 100644 --- a/src/python/pants/init/logging.py +++ b/src/python/pants/init/logging.py @@ -7,12 +7,13 @@ import logging import os import sys -import time from collections import namedtuple -from logging import FileHandler, Formatter, StreamHandler +from logging import StreamHandler from future.moves.http import client +from pants.base.exception_sink import ExceptionSink +from pants.engine.native import Native from pants.util.dirutil import safe_mkdir @@ -42,13 +43,71 @@ def _maybe_configure_extended_logging(logger): _configure_requests_debug_logging() +def init_rust_logger(level): + native = Native() + levelno = get_numeric_level(level) + native.init_rust_logging(levelno) + + +def setup_logging_to_stderr(python_logger, level): + """ + We setup logging as loose as possible from the Python side, + and let Rust do the filtering. + """ + native = Native() + levelno = get_numeric_level(level) + handler = create_native_stderr_log_handler(levelno, native, stream=sys.stderr) + python_logger.addHandler(handler) + # Let the rust side filter levels; try to have the python side send everything to the rust logger. + python_logger.setLevel("TRACE") + + def setup_logging_from_options(bootstrap_options): # N.B. quiet help says 'Squelches all console output apart from errors'. level = 'ERROR' if bootstrap_options.quiet else bootstrap_options.level.upper() - return setup_logging(level, console_stream=sys.stderr, log_dir=bootstrap_options.logdir) + native = Native() + return setup_logging(level, console_stream=sys.stderr, log_dir=bootstrap_options.logdir, native=native) + + +class NativeHandler(StreamHandler): + + def __init__(self, level, native=None, stream=None, native_filename=None): + super(NativeHandler, self).__init__(stream) + self.native = native + self.native_filename = native_filename + self.setLevel(level) + + def emit(self, record): + self.native.write_log(self.format(record), record.levelno, "{}:pid={}".format(record.name, os.getpid())) + + def flush(self): + self.native.flush_log() -def setup_logging(level, console_stream=None, log_dir=None, scope=None, log_name=None): +def create_native_pantsd_file_log_handler(level, native, native_filename): + fd = native.setup_pantsd_logger(native_filename, get_numeric_level(level)) + ExceptionSink.reset_interactive_output_stream(os.fdopen(os.dup(fd), 'a')) + return NativeHandler(level, native, native_filename=native_filename) + + +def create_native_stderr_log_handler(level, native, stream=None): + try: + native.setup_stderr_logger(get_numeric_level(level)) + except Exception as e: + print("Error setting up pantsd logger: {}".format(e), file=sys.stderr) + raise e + + return NativeHandler(level, native, stream) + + +# TODO This function relies on logging._checkLevel, which is private. +# There is currently no good way to convert string levels to numeric values, +# but if there is ever one, it may be worth changing this. +def get_numeric_level(level): + return logging._checkLevel(level) + + +def setup_logging(level, console_stream=None, log_dir=None, scope=None, log_name=None, native=None): """Configures logging for a given scope, by default the global scope. :param str level: The logging level to enable, must be one of the level names listed here: @@ -63,6 +122,7 @@ def setup_logging(level, console_stream=None, log_dir=None, scope=None, log_name The '.' separator providing the scope hierarchy. By default the root logger is configured. :param str log_name: The base name of the log file (defaults to 'pants.log'). + :param Native native: An instance of the Native FFI lib, to register rust logging. :returns: The full path to the main log file if file logging is configured or else `None`. :rtype: str """ @@ -88,43 +148,19 @@ def trace(self, message, *args, **kwargs): for handler in logger.handlers: logger.removeHandler(handler) + if console_stream: - console_handler = StreamHandler(stream=console_stream) - console_handler.setFormatter(Formatter(fmt='%(levelname)s] %(message)s')) - console_handler.setLevel(level) - logger.addHandler(console_handler) + native_handler = create_native_stderr_log_handler(level, native, stream=console_stream) + logger.addHandler(native_handler) if log_dir: safe_mkdir(log_dir) log_filename = os.path.join(log_dir, log_name or 'pants.log') - file_handler = FileHandler(log_filename) - - class GlogFormatter(Formatter): - LEVEL_MAP = { - logging.FATAL: 'F', - logging.ERROR: 'E', - logging.WARN: 'W', - logging.INFO: 'I', - logging.DEBUG: 'D', - TRACE: 'T' - } - - def format(self, record): - datetime = time.strftime('%m%d %H:%M:%S', time.localtime(record.created)) - micros = int((record.created - int(record.created)) * 1e6) - return '{levelchar}{datetime}.{micros:06d} {process} {filename}:{lineno}] {msg}'.format( - levelchar=self.LEVEL_MAP[record.levelno], - datetime=datetime, - micros=micros, - process=record.process, - filename=record.filename, - lineno=record.lineno, - msg=record.getMessage() - ) - - file_handler.setFormatter(GlogFormatter()) - file_handler.setLevel(level) - logger.addHandler(file_handler) + + native_handler = create_native_pantsd_file_log_handler(level, native, log_filename) + file_handler = native_handler + logger.addHandler(native_handler) + logger.setLevel(level) diff --git a/src/python/pants/pantsd/pants_daemon.py b/src/python/pants/pantsd/pants_daemon.py index 0814deb3549..dac10e4d3d5 100644 --- a/src/python/pants/pantsd/pants_daemon.py +++ b/src/python/pants/pantsd/pants_daemon.py @@ -20,7 +20,7 @@ from pants.bin.daemon_pants_runner import DaemonPantsRunner from pants.engine.native import Native from pants.init.engine_initializer import EngineInitializer -from pants.init.logging import setup_logging +from pants.init.logging import init_rust_logger, setup_logging from pants.init.options_initializer import BuildConfigInitializer from pants.option.arg_splitter import GLOBAL_SCOPE from pants.option.options_bootstrapper import OptionsBootstrapper @@ -306,7 +306,8 @@ def _pantsd_logging(self): # for further forks. with stdio_as(stdin_fd=-1, stdout_fd=-1, stderr_fd=-1): # Reinitialize logging for the daemon context. - result = setup_logging(self._log_level, log_dir=self._log_dir, log_name=self.LOG_NAME) + init_rust_logger(self._log_level) + result = setup_logging(self._log_level, log_dir=self._log_dir, log_name=self.LOG_NAME, native=self._native) # Do a python-level redirect of stdout/stderr, which will not disturb `0,1,2`. # TODO: Consider giving these pipes/actual fds, in order to make them "deep" replacements @@ -315,7 +316,7 @@ def _pantsd_logging(self): sys.stderr = _LoggerStream(logging.getLogger(), logging.WARN, result.log_handler) self._logger.debug('logging initialized') - yield result.log_handler.stream + yield (result.log_handler.stream, result.log_handler.native_filename) def _setup_services(self, pants_services): for service in pants_services.services: @@ -369,13 +370,23 @@ def run_sync(self): """Synchronously run pantsd.""" # Switch log output to the daemon's log stream from here forward. self._close_stdio() - with self._pantsd_logging() as log_stream: + with self._pantsd_logging() as (log_stream, log_filename): + # Register an exiter using os._exit to ensure we only close stdio streams once. ExceptionSink.reset_exiter(Exiter(exiter=os._exit)) - # We don't have any stdio streams to log to anymore, but we can get tracebacks of the pantsd - # process by tailing the pantsd log and sending it SIGUSR2. - ExceptionSink.reset_interactive_output_stream(log_stream) + # We don't have any stdio streams to log to anymore, so we log to a file. + # We don't override the faulthandler destination because the stream we get will proxy things + # via the rust logging code, and faulthandler needs to be writing directly to a real file + # descriptor. When pantsd logging was originally initialised, we already set up faulthandler + # to log to the correct file descriptor, so don't override it. + # + # We can get tracebacks of the pantsd process by tailing the pantsd log and sending it + # SIGUSR2. + ExceptionSink.reset_interactive_output_stream( + log_stream, + override_faulthandler_destination=False, + ) # Reset the log location and the backtrace preference from the global bootstrap options. global_bootstrap_options = self._bootstrap_options.for_global_scope() @@ -383,8 +394,6 @@ def run_sync(self): global_bootstrap_options.print_exception_stacktrace) ExceptionSink.reset_log_location(global_bootstrap_options.pants_workdir) - self._logger.info('pantsd starting, log level is {}'.format(self._log_level)) - self._native.set_panic_handler() # Set the process name in ps output to 'pantsd' vs './pants compile src/etc:: -ldebug'. diff --git a/src/rust/engine/Cargo.lock b/src/rust/engine/Cargo.lock index b5846dbfcdb..a826e3c365d 100644 --- a/src/rust/engine/Cargo.lock +++ b/src/rust/engine/Cargo.lock @@ -54,7 +54,7 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -71,8 +71,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -82,8 +82,8 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -99,7 +99,7 @@ name = "bazel_protos" version = "0.0.1" dependencies = [ "build_utils 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "grpcio 0.3.0 (git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d0702e7386a6fedcd9734c0)", "grpcio-compiler 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -160,7 +160,7 @@ name = "brfs" version = "0.0.1" dependencies = [ "bazel_protos 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -170,7 +170,7 @@ dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.1.1 (git+https://github.com/pantsbuild/futures-timer?rev=0b747e565309a58537807ab43c674d8951f9e5a0)", "hashing 0.0.1", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -201,7 +201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bytes" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -218,21 +218,31 @@ dependencies = [ "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chrono" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "clap" version = "2.32.0" @@ -260,12 +270,12 @@ name = "cmake" version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "codegen" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -286,10 +296,10 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -316,7 +326,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -336,7 +346,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -361,7 +371,7 @@ name = "dirs" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -381,7 +391,7 @@ name = "encoding_rs" version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -390,9 +400,9 @@ version = "0.0.1" dependencies = [ "boxfuture 0.0.1", "build_utils 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cbindgen 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fs 0.0.1", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -403,16 +413,17 @@ dependencies = [ "itertools 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "logging 0.0.1", "num_enum 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "process_execution 0.0.1", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", "resettable 0.0.1", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tar_api 0.0.1", "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "ui 0.0.1", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -435,7 +446,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -445,7 +456,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -464,7 +475,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -478,8 +489,8 @@ name = "filetime" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -490,11 +501,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "flate2" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -510,7 +521,7 @@ version = "0.0.1" dependencies = [ "bazel_protos 0.0.1", "boxfuture 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -543,7 +554,7 @@ name = "fs_util" version = "0.0.1" dependencies = [ "boxfuture 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "fs 0.0.1", @@ -582,7 +593,7 @@ name = "fuse" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -662,7 +673,7 @@ source = "git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d07 dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "grpcio-sys 0.2.3 (git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d0702e7386a6fedcd9734c0)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -681,19 +692,19 @@ name = "grpcio-sys" version = "0.2.3" source = "git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d0702e7386a6fedcd9734c0#4dfafe9355dc996d7d0702e7386a6fedcd9734c0" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "h2" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -734,7 +745,7 @@ name = "http" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -757,10 +768,10 @@ name = "hyper" version = "0.12.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -769,7 +780,7 @@ dependencies = [ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -781,18 +792,16 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ct-logs 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -834,7 +843,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -872,18 +881,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.49" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libflate" -version = "0.1.20" +version = "0.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "lmdb" @@ -891,7 +890,7 @@ version = "0.8.0" source = "git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8#06bdfbfc6348f6804127176e561843f214fc17f8" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "lmdb-sys 0.8.0 (git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8)", ] @@ -900,8 +899,8 @@ name = "lmdb-sys" version = "0.8.0" source = "git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8#06bdfbfc6348f6804127176e561843f214fc17f8" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -936,7 +935,19 @@ name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "logging" +version = "0.0.1" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num_enum 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ui 0.0.1", ] [[package]] @@ -959,7 +970,7 @@ name = "mime" version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -978,8 +989,8 @@ name = "miniz-sys" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -995,9 +1006,9 @@ name = "miniz_oxide_c_api" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1011,7 +1022,7 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1036,7 +1047,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1073,7 +1084,7 @@ name = "mock" version = "0.0.1" dependencies = [ "bazel_protos 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "grpcio 0.3.0 (git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d0702e7386a6fedcd9734c0)", "hashing 0.0.1", @@ -1092,8 +1103,8 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1102,12 +1113,25 @@ name = "nodrop" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-integer" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1117,7 +1141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1166,7 +1190,7 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1178,7 +1202,7 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1262,7 +1286,7 @@ dependencies = [ "async_semaphore 0.0.1", "bazel_protos 0.0.1", "boxfuture 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fs 0.0.1", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1301,7 +1325,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1309,7 +1333,7 @@ name = "prost-build" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1339,7 +1363,7 @@ name = "prost-types" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "prost-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1349,7 +1373,7 @@ name = "protobuf" version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1362,7 +1386,7 @@ dependencies = [ [[package]] name = "protoc" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1378,7 +1402,7 @@ dependencies = [ "mktemp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf-codegen 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protoc 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protoc 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1407,7 +1431,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1417,7 +1441,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1430,7 +1454,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1441,13 +1465,13 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1496,19 +1520,19 @@ name = "rand_jitter" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_os" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1559,7 +1583,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1593,17 +1617,17 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libflate 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-rustls 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1611,10 +1635,10 @@ dependencies = [ "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1634,9 +1658,9 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1792,7 +1816,17 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arc-swap 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "simplelog" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1815,8 +1849,8 @@ name = "socket2" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1863,7 +1897,7 @@ dependencies = [ [[package]] name = "syn" -version = "0.15.27" +version = "0.15.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1878,17 +1912,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tar" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1897,8 +1931,8 @@ dependencies = [ name = "tar_api" version = "0.0.1" dependencies = [ - "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tar 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "testutil 0.0.1", ] @@ -1917,14 +1951,23 @@ name = "tempfile" version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "term" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "termcolor" version = "1.0.4" @@ -1938,7 +1981,7 @@ name = "termion" version = "1.5.1" source = "git+https://github.com/redox-os/termion.git?rev=ce6b43d071cd6edfc4b366bb945b45e06c239e2c#ce6b43d071cd6edfc4b366bb945b45e06c239e2c" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1949,7 +1992,7 @@ name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1959,7 +2002,7 @@ name = "testutil" version = "0.0.1" dependencies = [ "bazel_protos 0.0.1", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashing 0.0.1", "protobuf 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1992,17 +2035,17 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2012,10 +2055,11 @@ dependencies = [ "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2025,7 +2069,7 @@ name = "tokio-codec" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2072,7 +2116,7 @@ name = "tokio-io" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2083,7 +2127,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2107,12 +2151,12 @@ dependencies = [ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-rustls" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2127,7 +2171,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "signal-hook 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2139,7 +2183,7 @@ dependencies = [ [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2151,7 +2195,7 @@ name = "tokio-tcp" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2186,12 +2230,20 @@ dependencies = [ "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-udp" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2205,10 +2257,10 @@ name = "tokio-uds" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2248,9 +2300,9 @@ name = "tower-grpc" version = "0.1.0" source = "git+https://github.com/pantsbuild/tower-grpc.git?rev=ef19f2e1715f415ecb699e8f17f5845ad2b45daf#ef19f2e1715f415ecb699e8f17f5845ad2b45daf" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2266,7 +2318,7 @@ name = "tower-grpc-build" version = "0.1.0" source = "git+https://github.com/pantsbuild/tower-grpc.git?rev=ef19f2e1715f415ecb699e8f17f5845ad2b45daf#ef19f2e1715f415ecb699e8f17f5845ad2b45daf" dependencies = [ - "codegen 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "codegen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2276,9 +2328,9 @@ name = "tower-h2" version = "0.1.0" source = "git+https://github.com/pantsbuild/tower-h2?rev=44b0efb4983b769283efd5b2a3bc3decbf7c33de#44b0efb4983b769283efd5b2a3bc3decbf7c33de" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-connect 0.1.0 (git+https://github.com/pantsbuild/tokio-connect?rev=f7ad1ca437973d6e24037ac6f7d5ef1013833c0b)", @@ -2350,7 +2402,7 @@ dependencies = [ [[package]] name = "unicase" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2478,7 +2530,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2541,7 +2593,7 @@ name = "xattr" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] @@ -2563,17 +2615,18 @@ dependencies = [ "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" -"checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" +"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum cbindgen 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "89ae8c2f780373f1842acb548fa53c7fd3acd6ca27d47966c69351719b239eae" -"checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" -"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d" +"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "6ec65ee4f9c9d16f335091d23693457ed4928657ba4982289d7fafee03bc614a" -"checksum codegen 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3f4228e2f06a368bf4f1dc433c3f0671c4d5af99717f23a30eadb0067662057" +"checksum codegen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bf02acd61125952ee148207cd411f9b73c9e218eab4b901375a82e1a443b6238" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" -"checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" "checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" @@ -2593,7 +2646,7 @@ dependencies = [ "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a2df5c1a8c4be27e7707789dc42ae65976e60b394afd293d1419ab915833e646" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" -"checksum flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2291c165c8e703ee54ef3055ad6188e3d51108e2ded18e9f2476e774fc5ad3d4" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" @@ -2609,14 +2662,14 @@ dependencies = [ "checksum grpcio 0.3.0 (git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d0702e7386a6fedcd9734c0)" = "" "checksum grpcio-compiler 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a63ccc27b0099347d2bea2c3d0f1c79c018a13cfd08b814a1992e341b645d5e1" "checksum grpcio-sys 0.2.3 (git+https://github.com/pantsbuild/grpc-rs.git?rev=4dfafe9355dc996d7d0702e7386a6fedcd9734c0)" = "" -"checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" +"checksum h2 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "910a5e7be6283a9c91b3982fa5188368c8719cce2a3cf3b86048673bf9d9c36b" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fe67e3678f2827030e89cc4b9e7ecd16d52f132c0b940ab5005f88e821500f6a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5b6658b016965ae301fa995306db965c93677880ea70765a84235a96eae896" -"checksum hyper-rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff2c61fbda2bc72e793e329190a3e8f0ae74cb896905c8b301304c4c93f2755" +"checksum hyper-rustls 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "15b66d1bd4864ef036adf2363409caa3acd63ebb4725957b66e621c8a36631a3" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum ignore 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ad03ca67dc12474ecd91fdb94d758cbd20cb4e7a78ebe831df26a9b7511e1162" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" @@ -2626,8 +2679,7 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)" = "413f3dfc802c5dc91dc570b05125b6cda9855edfaa9825c9849807876376e70e" -"checksum libflate 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "54d1ddf9c52870243c5689d7638d888331c1116aa5b398f3ba1acfa7d8758ca1" +"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" "checksum lmdb 0.8.0 (git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8)" = "" "checksum lmdb-sys 0.8.0 (git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8)" = "" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" @@ -2650,6 +2702,8 @@ dependencies = [ "checksum multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb04b9f127583ed176e163fb9ec6f3e793b87e21deedd5734a69386a18a0151" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" +"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum num_enum 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7147f4bb0e36282bf8e78c85721eb30c1c449afedceef660e7b996fc9c34fa" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" @@ -2675,7 +2729,7 @@ dependencies = [ "checksum prost-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5644c57d56bc085f9570e113495c1f08d7185beca700dcc296cb4672f380a679" "checksum protobuf 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc4570f22641ed8c65326d54832ce1536e9ddf0ccb7a8c836cbe780d7e23537" "checksum protobuf-codegen 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c12a571137dc99703cb46fa21f185834fc5578a65836573fcff127f7b53f41e1" -"checksum protoc 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6762f5a05f41eb6252606fc6553262a025e72c51a0227717990998fd9c2ac81" +"checksum protoc 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8b83cbfb699626e2670de2aab558c34a51bd9bd25a2d3e79b4b09d05b660e8" "checksum protoc-grpcio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b0292d93a536174ff6bafe8b5e8534aeeb2b039146bae59770c07f4d2c2458c9" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" @@ -2690,7 +2744,7 @@ dependencies = [ "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" "checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" -"checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" @@ -2700,7 +2754,7 @@ dependencies = [ "checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" "checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum reqwest 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "f205a95638627fc0d21c53901671b06f439dc2830311ff11ecdff34ae2d839a8" +"checksum reqwest 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)" = "962fa64e670e70b9d3a81c3688832eb59293ef490e0af5ad169763f62016ac5e" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" @@ -2720,6 +2774,7 @@ dependencies = [ "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" "checksum signal-hook 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "97a47ae722318beceb0294e6f3d601205a1e6abaa4437d9d33e3a212233e3021" +"checksum simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e95345f185d5adeb8ec93459d2dc99654e294cc6ccf5b75414d8ea262de9a13" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" @@ -2730,11 +2785,12 @@ dependencies = [ "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" -"checksum syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)" = "525bd55255f03c816e5d7f615587bd13030c7103354fadb104993dcee6a788ec" +"checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "a303ba60a099fcd2aaa646b14d2724591a96a75283e4b7ed3d1a1658909d9ae2" +"checksum tar 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)" = "c2167ff53da2a661702b3299f71a91b61b1dffef36b4b2884b1f9c67254c0133" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" +"checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.1 (git+https://github.com/redox-os/termion.git?rev=ce6b43d071cd6edfc4b366bb945b45e06c239e2c)" = "" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" @@ -2742,7 +2798,7 @@ dependencies = [ "checksum thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcbb6aa301e5d3b0b5ef639c9a9c7e2f1c944f177b460c04dc24c69b1fa2bd99" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "1021bb1f4150435ab8f222eb7ed37c60b2d57037def63ba43085a79f387512d7" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" "checksum tokio-connect 0.1.0 (git+https://github.com/pantsbuild/tokio-connect?rev=f7ad1ca437973d6e24037ac6f7d5ef1013833c0b)" = "" "checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" @@ -2751,12 +2807,13 @@ dependencies = [ "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-process 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "88e1281e412013f1ff5787def044a9577a0bed059f451e835f1643201f8b777d" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7223fa02f4b2d9f3736f13cc3dea3723aaec57ca4b3dded922126ebbb2cb8ce9" +"checksum tokio-rustls 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "369282441514a4e8bc4d935714e4ee3f9735796f0882e1240f60db5bd94cb826" "checksum tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fda385df506bf7546e70872767f71e81640f1f251bdf2fd8eb81a0eaec5fe022" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" "checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" "checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" @@ -2772,7 +2829,7 @@ dependencies = [ "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" +"checksum unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41d17211f887da8e4a70a45b9536f26fc5de166b81e2d5d80de4a17fd22553bd" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index a31f00059fa..b527002bccf 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -35,6 +35,7 @@ members = [ "fs/fs_util", "graph", "hashing", + "logging", "process_execution", "process_executor", "resettable", @@ -62,6 +63,7 @@ default-members = [ "fs/fs_util", "graph", "hashing", + "logging", "process_execution", "process_executor", "resettable", @@ -87,6 +89,7 @@ indexmap = "1.0.2" itertools = "0.7.2" lazy_static = "1" log = "0.4" +logging = { path = "logging" } num_enum = "0.1.1" parking_lot = "0.6" process_execution = { path = "process_execution" } diff --git a/src/rust/engine/logging/Cargo.toml b/src/rust/engine/logging/Cargo.toml new file mode 100644 index 00000000000..575f378f367 --- /dev/null +++ b/src/rust/engine/logging/Cargo.toml @@ -0,0 +1,14 @@ +[package] +version = "0.0.1" +edition = "2018" +name = "logging" +authors = [ "Pants Build " ] +publish = false + +[dependencies] +lazy_static = "1" +log = "0.4" +num_enum = "0.1.1" +parking_lot = "0.6" +simplelog = "0.5.3" +ui = { path = "../ui" } diff --git a/src/rust/engine/logging/src/lib.rs b/src/rust/engine/logging/src/lib.rs new file mode 100644 index 00000000000..75f40b14708 --- /dev/null +++ b/src/rust/engine/logging/src/lib.rs @@ -0,0 +1,91 @@ +// Copyright 2018 Pants project contributors (see CONTRIBUTORS.md). +// Licensed under the Apache License, Version 2.0 (see LICENSE). + +#![deny(warnings)] +// Enable all clippy lints except for many of the pedantic ones. It's a shame this needs to be copied and pasted across crates, but there doesn't appear to be a way to include inner attributes from a common source. +#![deny( + clippy::all, + clippy::default_trait_access, + clippy::expl_impl_clone_on_copy, + clippy::if_not_else, + clippy::needless_continue, + clippy::single_match_else, + clippy::unseparated_literal_suffix, + clippy::used_underscore_binding +)] +// It is often more clear to show that nothing is being moved. +#![allow(clippy::match_ref_pats)] +// Subjective style. +#![allow( + clippy::len_without_is_empty, + clippy::redundant_field_names, + clippy::too_many_arguments +)] +// Default isn't as big a deal as people seem to think it is. +#![allow(clippy::new_without_default, clippy::new_ret_no_self)] +// Arc can be more clear than needing to grok Orderings: +#![allow(clippy::mutex_atomic)] +pub mod logger; + +pub type Logger = logger::Logger; + +use num_enum::CustomTryInto; + +// This is a hard-coding of constants in the standard logging python package. +// TODO: Switch from CustomTryInto to TryFromPrimitive when try_from is stable. +#[derive(Debug, Eq, PartialEq, CustomTryInto, Clone, Copy)] +#[repr(u64)] +enum PythonLogLevel { + NotSet = 0, + // Trace doesn't exist in a Python world, so set it to "a bit lower than Debug". + Trace = 5, + Debug = 10, + Info = 20, + Warn = 30, + Error = 40, + Critical = 50, +} + +impl From for PythonLogLevel { + fn from(level: log::Level) -> Self { + match level { + log::Level::Error => PythonLogLevel::Error, + log::Level::Warn => PythonLogLevel::Warn, + log::Level::Info => PythonLogLevel::Info, + log::Level::Debug => PythonLogLevel::Debug, + log::Level::Trace => PythonLogLevel::Trace, + } + } +} + +impl From for log::LevelFilter { + fn from(level: PythonLogLevel) -> Self { + match level { + PythonLogLevel::NotSet => log::LevelFilter::Off, + PythonLogLevel::Trace => log::LevelFilter::Trace, + PythonLogLevel::Debug => log::LevelFilter::Debug, + PythonLogLevel::Info => log::LevelFilter::Info, + PythonLogLevel::Warn => log::LevelFilter::Warn, + PythonLogLevel::Error => log::LevelFilter::Error, + // Rust doesn't have a Critical, so treat them like Errors. + PythonLogLevel::Critical => log::LevelFilter::Error, + } + } +} + +impl From for log::Level { + fn from(level: PythonLogLevel) -> Self { + match level { + PythonLogLevel::NotSet => { + panic!("PythonLogLevel::NotSet doesn't have a translation to Level") + } + PythonLogLevel::Trace => log::Level::Trace, + PythonLogLevel::Debug => log::Level::Debug, + PythonLogLevel::Info => log::Level::Info, + PythonLogLevel::Warn => log::Level::Warn, + PythonLogLevel::Error => log::Level::Error, + // Rust doesn't have a Critical, so treat them like Errors. + PythonLogLevel::Critical => log::Level::Error, + } + } +} diff --git a/src/rust/engine/logging/src/logger.rs b/src/rust/engine/logging/src/logger.rs new file mode 100644 index 00000000000..fdb596c4534 --- /dev/null +++ b/src/rust/engine/logging/src/logger.rs @@ -0,0 +1,169 @@ +// Copyright 2018 Pants project contributors (see CONTRIBUTORS.md). +// Licensed under the Apache License, Version 2.0 (see LICENSE). + +use crate::TryIntoPythonLogLevel; +use lazy_static::lazy_static; +use log::{log, set_logger, set_max_level, LevelFilter, Log, Metadata, Record}; +use parking_lot::Mutex; +use simplelog::Config; +use simplelog::WriteLogger; +use std::fs::File; +use std::fs::OpenOptions; +use std::io::{stderr, Stderr, Write}; +use std::path::PathBuf; + +lazy_static! { + pub static ref LOGGER: Logger = Logger::new(); +} + +pub struct Logger { + pantsd_log: Mutex>, + stderr_log: Mutex>, +} + +impl Logger { + pub fn new() -> Logger { + Logger { + pantsd_log: Mutex::new(MaybeWriteLogger::empty()), + stderr_log: Mutex::new(MaybeWriteLogger::empty()), + } + } + + pub fn init(max_level: u64) { + let max_python_level = (max_level).try_into_PythonLogLevel(); + match max_python_level { + Ok(python_level) => { + let level: log::LevelFilter = python_level.into(); + set_max_level(level); + set_logger(&*LOGGER).expect("Error setting up global logger."); + } + Err(err) => panic!("Unrecognised log level from python: {}: {}", max_level, err), + }; + } + + fn maybe_increase_global_verbosity(&self, new_level: log::LevelFilter) { + if log::max_level() < new_level { + set_max_level(new_level); + } + } + + pub fn set_stderr_logger(&self, python_level: u64) -> Result<(), String> { + python_level.try_into_PythonLogLevel().map(|level| { + self.maybe_increase_global_verbosity(level.into()); + *self.stderr_log.lock() = MaybeWriteLogger::new(stderr(), level.into()) + }) + } + + /// + /// Set up a file logger which logs at python_level to log_file_path. + /// Returns the file descriptor of the log file. + /// + #[cfg(unix)] + pub fn set_pantsd_logger( + &self, + log_file_path: PathBuf, + python_level: u64, + ) -> Result { + use std::os::unix::io::AsRawFd; + python_level.try_into_PythonLogLevel().and_then(|level| { + { + // Maybe close open file by dropping the existing logger + *self.pantsd_log.lock() = MaybeWriteLogger::empty(); + } + OpenOptions::new() + .create(true) + .append(true) + .open(log_file_path) + .map(|file| { + let fd = file.as_raw_fd(); + self.maybe_increase_global_verbosity(level.into()); + *self.pantsd_log.lock() = MaybeWriteLogger::new(file, level.into()); + fd + }) + .map_err(|err| format!("Error opening pantsd logfile: {}", err)) + }) + } + + pub fn log_from_python( + &self, + message: &str, + python_level: u64, + target: &str, + ) -> Result<(), String> { + python_level.try_into_PythonLogLevel().map(|level| { + log!(target: target, level.into(), "{}", message); + }) + } +} + +impl Log for Logger { + fn enabled(&self, _metadata: &Metadata) -> bool { + // Individual log levels are handled by each sub-logger, + // And a global filter is applied to set_max_level. + // No need to filter here. + true + } + + fn log(&self, record: &Record) { + self.stderr_log.lock().log(record); + self.pantsd_log.lock().log(record); + } + + fn flush(&self) { + self.stderr_log.lock().flush(); + self.pantsd_log.lock().flush(); + } +} + +struct MaybeWriteLogger { + level: LevelFilter, + inner: Option>>, +} + +impl MaybeWriteLogger { + pub fn empty() -> MaybeWriteLogger { + MaybeWriteLogger { + level: LevelFilter::Off, + inner: None, + } + } + + pub fn new(writable: W, level: LevelFilter) -> MaybeWriteLogger { + // We initialize the inner WriteLogger with no filters so that we don't + // have to create a new one every time we change the level of the outer + // MaybeWriteLogger. + MaybeWriteLogger { + level, + inner: Some(WriteLogger::new( + LevelFilter::max(), + Config::default(), + writable, + )), + } + } + + pub fn level(&self) -> LevelFilter { + self.level + } +} + +impl Log for MaybeWriteLogger { + fn enabled(&self, metadata: &Metadata) -> bool { + metadata.level() <= self.level() + } + + fn log(&self, record: &Record) { + if !self.enabled(record.metadata()) { + return; + } + if let Some(ref logger) = self.inner { + logger.log(record); + } + } + + fn flush(&self) { + if let Some(ref logger) = self.inner { + logger.flush(); + } + } +} diff --git a/src/rust/engine/src/externs.rs b/src/rust/engine/src/externs.rs index 0563390b9eb..ee5c1a1b5e1 100644 --- a/src/rust/engine/src/externs.rs +++ b/src/rust/engine/src/externs.rs @@ -13,8 +13,6 @@ use crate::core::{Failure, Function, Key, TypeId, Value}; use crate::handles::{DroppingHandle, Handle}; use crate::interning::Interns; use lazy_static::lazy_static; -use log; -use num_enum::CustomTryInto; use parking_lot::RwLock; pub fn eval(python: &str) -> Result { @@ -277,28 +275,13 @@ lazy_static! { static ref INTERNS: RwLock = RwLock::new(Interns::new()); } -// This is mut so that the max level can be set via set_externs. -// It should only be set exactly once, and nothing should ever read it (it is only defined to -// prevent the FfiLogger from being dropped). -// In order to avoid a performance hit, there is no lock guarding it (because if it had a lock, it -// would need to be acquired for every single logging statement). -// Please don't mutate it. -// Please. -static mut LOGGER: FfiLogger = FfiLogger { - level_filter: log::LevelFilter::Off, -}; - /// /// Set the static Externs for this process. All other methods of this module will fail /// until this has been called. /// pub fn set_externs(externs: Externs) { - let log_level = externs.log_level; let mut externs_ref = EXTERNS.write(); *externs_ref = Some(externs); - unsafe { - LOGGER.init(log_level); - } } fn with_externs(f: F) -> T @@ -329,7 +312,6 @@ pub type ExternContext = raw::c_void; pub struct Externs { pub context: *const ExternContext, pub log_level: u8, - pub log: LogExtern, pub call: CallExtern, pub generator_send: GeneratorSendExtern, pub eval: EvalExtern, @@ -357,8 +339,6 @@ pub struct Externs { unsafe impl Sync for Externs {} unsafe impl Send for Externs {} -pub type LogExtern = extern "C" fn(*const ExternContext, u8, str_ptr: *const u8, str_len: u64); - pub type GetTypeForExtern = extern "C" fn(*const ExternContext, *const Handle) -> TypeId; pub type IdentifyExtern = extern "C" fn(*const ExternContext, *const Handle) -> Ident; @@ -703,97 +683,3 @@ where mem::forget(cs); output } - -// This is a hard-coding of constants in the standard logging python package. -// TODO: Switch from CustomTryInto to TryFromPrimitive when try_from is stable. -#[derive(Debug, Eq, PartialEq, CustomTryInto)] -#[repr(u8)] -enum PythonLogLevel { - NotSet = 0, - // Trace doesn't exist in a Python world, so set it to "a bit lower than Debug". - Trace = 5, - Debug = 10, - Info = 20, - Warn = 30, - Error = 40, - Critical = 50, -} - -impl From for PythonLogLevel { - fn from(level: log::Level) -> Self { - match level { - log::Level::Error => PythonLogLevel::Error, - log::Level::Warn => PythonLogLevel::Warn, - log::Level::Info => PythonLogLevel::Info, - log::Level::Debug => PythonLogLevel::Debug, - log::Level::Trace => PythonLogLevel::Trace, - } - } -} - -impl From for log::LevelFilter { - fn from(level: PythonLogLevel) -> Self { - match level { - PythonLogLevel::NotSet => log::LevelFilter::Off, - PythonLogLevel::Trace => log::LevelFilter::Trace, - PythonLogLevel::Debug => log::LevelFilter::Debug, - PythonLogLevel::Info => log::LevelFilter::Info, - PythonLogLevel::Warn => log::LevelFilter::Warn, - PythonLogLevel::Error => log::LevelFilter::Error, - // Rust doesn't have a Critical, so treat them like Errors. - PythonLogLevel::Critical => log::LevelFilter::Error, - } - } -} - -/// -/// FfiLogger is an implementation of log::Log which asks the Python logging system to log via cffi. -/// -struct FfiLogger { - level_filter: log::LevelFilter, -} - -impl FfiLogger { - // init must only be called once in the lifetime of the program. No other loggers may be init'd. - // If either of the above are violated, expect a panic. - pub fn init(&'static mut self, max_level: u8) { - let max_python_level = max_level.try_into_PythonLogLevel(); - self.level_filter = { - match max_python_level { - Ok(python_level) => { - let level: log::LevelFilter = python_level.into(); - level - } - Err(err) => panic!("Unrecognised log level from python: {}: {}", max_level, err), - } - }; - - log::set_max_level(self.level_filter); - log::set_logger(self) - .expect("Failed to set logger (maybe you tried to call init multiple times?)"); - } -} - -impl log::Log for FfiLogger { - fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { - metadata.level() <= self.level_filter - } - - fn log(&self, record: &log::Record<'_>) { - if !self.enabled(record.metadata()) { - return; - } - let level: PythonLogLevel = record.level().into(); - let message = format!("{}", record.args()); - with_externs(|e| { - (e.log)( - e.context, - level as u8, - message.as_ptr(), - message.len() as u64, - ) - }) - } - - fn flush(&self) {} -} diff --git a/src/rust/engine/src/lib.rs b/src/rust/engine/src/lib.rs index 06182dd9f51..f127310a21f 100644 --- a/src/rust/engine/src/lib.rs +++ b/src/rust/engine/src/lib.rs @@ -43,6 +43,16 @@ mod selectors; mod tasks; mod types; +use fs; +use futures; + +use hashing; + +use log; + +use tar_api; + +use std::borrow::Borrow; use std::ffi::CStr; use std::fs::File; use std::io; @@ -57,8 +67,8 @@ use crate::core::{Function, Key, Params, TypeId, Value}; use crate::externs::{ Buffer, BufferBuffer, CallExtern, CloneValExtern, CreateExceptionExtern, DropHandlesExtern, EqualsExtern, EvalExtern, ExternContext, Externs, GeneratorSendExtern, GetTypeForExtern, - HandleBuffer, IdentifyExtern, LogExtern, ProjectIgnoringTypeExtern, ProjectMultiExtern, PyResult, - RawBuffer, StoreBoolExtern, StoreBytesExtern, StoreF64Extern, StoreI64Extern, StoreTupleExtern, + HandleBuffer, IdentifyExtern, ProjectIgnoringTypeExtern, ProjectMultiExtern, PyResult, RawBuffer, + StoreBoolExtern, StoreBytesExtern, StoreF64Extern, StoreI64Extern, StoreTupleExtern, StoreUtf8Extern, TypeIdBuffer, TypeToStrExtern, ValToStrExtern, }; use crate::handles::Handle; @@ -68,7 +78,9 @@ use crate::tasks::Tasks; use crate::types::Types; use futures::Future; use hashing::Digest; -use log::error; +use log::{error, Log}; +use logging::logger::LOGGER; +use logging::Logger; // TODO: Consider renaming and making generic for collections of PyResults. #[repr(C)] @@ -96,7 +108,6 @@ impl RawNodes { #[no_mangle] pub extern "C" fn externs_set( context: *const ExternContext, - log: LogExtern, log_level: u8, call: CallExtern, generator_send: GeneratorSendExtern, @@ -122,7 +133,6 @@ pub extern "C" fn externs_set( ) { externs::set_externs(Externs { context, - log, log_level, call, generator_send, @@ -800,6 +810,47 @@ pub extern "C" fn materialize_directories( .into() } +// This is called before externs are set up, so we cannot return a PyResult +#[no_mangle] +pub extern "C" fn init_logging(level: u64) { + Logger::init(level); + log::debug!("Rust logger initialized with level {}", level); +} + +#[no_mangle] +pub extern "C" fn setup_pantsd_logger(log_file_ptr: *const raw::c_char, level: u64) -> PyResult { + let path_str = unsafe { CStr::from_ptr(log_file_ptr).to_string_lossy().into_owned() }; + let path = PathBuf::from(path_str); + LOGGER + .set_pantsd_logger(path, level) + .map(i64::from) + .map(externs::store_i64) + .into() +} + +// Might be called before externs are set, therefore can't return a PyResult +#[no_mangle] +pub extern "C" fn setup_stderr_logger(level: u64) { + LOGGER + .set_stderr_logger(level) + .expect("Error setting up STDERR logger"); +} + +// Might be called before externs are set, therefore can't return a PyResult +#[no_mangle] +pub extern "C" fn write_log(msg: *const raw::c_char, level: u64, target: *const raw::c_char) { + let message_str = unsafe { CStr::from_ptr(msg).to_string_lossy() }; + let target_str = unsafe { CStr::from_ptr(target).to_string_lossy() }; + LOGGER + .log_from_python(message_str.borrow(), level, target_str.borrow()) + .expect("Error logging message"); +} + +#[no_mangle] +pub extern "C" fn flush_log() { + LOGGER.flush(); +} + fn graph_full(scheduler: &Scheduler, subject_types: Vec) -> RuleGraph { let graph_maker = GraphMaker::new(&scheduler.core.tasks, subject_types); graph_maker.full_graph() diff --git a/src/rust/engine/ui/src/display.rs b/src/rust/engine/ui/src/display.rs index 4d726804a5e..0f8c3cd995a 100644 --- a/src/rust/engine/ui/src/display.rs +++ b/src/rust/engine/ui/src/display.rs @@ -125,7 +125,6 @@ impl EngineDisplay { } fn start_raw_mode(&mut self) -> Result<()> { - eprintln!("BL: Start raw mode"); match self.terminal { Console::Terminal(ref mut t) => t.activate_raw_mode(), _ => Ok(()), diff --git a/testprojects/pants-plugins/src/python/test_pants_plugin/tasks/lifecycle_stub_task.py b/testprojects/pants-plugins/src/python/test_pants_plugin/tasks/lifecycle_stub_task.py index 396a61be309..2e0de82b309 100644 --- a/testprojects/pants-plugins/src/python/test_pants_plugin/tasks/lifecycle_stub_task.py +++ b/testprojects/pants-plugins/src/python/test_pants_plugin/tasks/lifecycle_stub_task.py @@ -47,6 +47,6 @@ def execute(self): output_file = self._lifecycle_stubs.new_interactive_stream_output_file if output_file: file_stream = open(output_file, 'wb') - ExceptionSink.reset_interactive_output_stream(file_stream) + ExceptionSink.reset_interactive_output_stream(file_stream, output_file) raise Exception('erroneous!') diff --git a/tests/python/pants_test/engine/legacy/test_graph_integration.py b/tests/python/pants_test/engine/legacy/test_graph_integration.py index a7dfcd20bb1..780a88aa321 100644 --- a/tests/python/pants_test/engine/legacy/test_graph_integration.py +++ b/tests/python/pants_test/engine/legacy/test_graph_integration.py @@ -29,7 +29,7 @@ class GraphIntegrationTest(PantsRunIntegrationTest): ]), } - _WARN_FMT = """WARN] Globs did not match. Excludes were: {excludes}. Unmatched globs were: {unmatched}.\n\n""" + _WARN_FMT = """[WARN] Globs did not match. Excludes were: {excludes}. Unmatched globs were: {unmatched}.\n\n""" _BUNDLE_ERR_MSGS = [ ['*.aaaa'], @@ -52,12 +52,12 @@ def _list_target_check_warnings_sources(self, target_name): self.assert_success(pants_run) warning_msg = ( - "WARN] Globs did not match. Excludes were: " + - '[]' + - ". Unmatched globs were: " + - "[{}]".format(', '.join('"{}"'.format(os.path.join(self._SOURCES_TARGET_BASE, g)) for g in expected_globs)) + - ".\n\n") - self.assertEqual(warning_msg, pants_run.stderr_data) + self._WARN_FMT.format( + excludes = "[]", + unmatched = "[{}]".format(', '.join('"{}"'.format(os.path.join(self._SOURCES_TARGET_BASE, g)) for g in expected_globs)) + ) + ) + self.assertTrue(warning_msg in pants_run.stderr_data) _ERR_TARGETS = { 'testprojects/src/python/sources:some-missing-some-not': [ diff --git a/tests/python/pants_test/init/test_logging.py b/tests/python/pants_test/init/test_logging.py index 7c4c7b4568f..d1002dc88e1 100644 --- a/tests/python/pants_test/init/test_logging.py +++ b/tests/python/pants_test/init/test_logging.py @@ -5,67 +5,48 @@ from __future__ import absolute_import, division, print_function, unicode_literals import logging -import unittest -import uuid -from builtins import open, str -from contextlib import closing, contextmanager -from io import StringIO +from builtins import open +from contextlib import contextmanager -from pants.init.logging import setup_logging +from pants.init.logging import get_numeric_level, setup_logging from pants.util.contextutil import temporary_dir -from pants_test.testutils.py2_compat import assertRegex +from pants_test.test_base import TestBase -class SetupTest(unittest.TestCase): - @contextmanager - def log_dir(self, file_logging): - if file_logging: - with temporary_dir() as log_dir: - yield log_dir - else: - yield None - - @contextmanager - def logger(self, level, file_logging=False): - logger = logging.getLogger(str(uuid.uuid4())) - with closing(StringIO()) as stream: - with self.log_dir(file_logging) as log_dir: - log_file = setup_logging(level, console_stream=stream, log_dir=log_dir, scope=logger.name) - yield logger, stream, log_file.log_filename - - def assertWarnInfoOutput(self, lines): - """Check to see that only warn and info output appears in the stream. +class LoggingTest(TestBase): - The first line may start with WARN] or WARNING] depending on whether 'WARN' - has been registered as a global log level. See options_bootstrapper.py. - """ - self.assertEqual(2, len(lines)) - assertRegex(self, lines[0], '^WARN\w*] warn') - self.assertEqual('INFO] info', lines[1]) + def post_scheduler_init(self): + self.native = self.scheduler._scheduler._native + # Initialize it with the least verbose level. + # Individual loggers will increase verbosity as needed. + self.native.init_rust_logging(get_numeric_level("ERROR")) - def test_standard_logging(self): - with self.logger('INFO') as (logger, stream, _): - logger.warn('warn') - logger.info('info') - logger.debug('debug') - - stream.flush() - stream.seek(0) - self.assertWarnInfoOutput(stream.read().splitlines()) + @contextmanager + def logger(self, level): + native = self.scheduler._scheduler._native + logger = logging.getLogger('my_file_logger') + with temporary_dir() as log_dir: + logging_setup_result = setup_logging(level, log_dir=log_dir, scope=logger.name, native=native) + yield logger, logging_setup_result + + def test_utf8_logging(self): + with self.logger('INFO') as (file_logger, logging_setup_result): + cat = "🐈" + file_logger.info(cat) + logging_setup_result.log_handler.flush() + with open(logging_setup_result.log_filename, "r") as fp: + contents = fp.read() + self.assertIn(cat, contents) def test_file_logging(self): - with self.logger('INFO', file_logging=True) as (logger, stream, log_file): - logger.warn('warn') - logger.info('info') - logger.debug('debug') - - stream.flush() - stream.seek(0) - self.assertWarnInfoOutput(stream.read().splitlines()) + with self.logger('INFO') as (file_logger, logging_setup_result): + file_logger.warn('this is a warning') + file_logger.info('this is some info') + file_logger.debug('this is some debug info') + logging_setup_result.log_handler.flush() - with open(log_file, 'r') as fp: + with open(logging_setup_result.log_filename, 'r') as fp: loglines = fp.read().splitlines() self.assertEqual(2, len(loglines)) - glog_format = r'\d{4} \d{2}:\d{2}:\d{2}.\d{6} \d+ \w+\.py:\d+] ' - assertRegex(self, loglines[0], r'^W{}warn$'.format(glog_format)) - assertRegex(self, loglines[1], r'^I{}info$'.format(glog_format)) + self.assertIn("[WARN] this is a warning", loglines[0]) + self.assertIn("[INFO] this is some info", loglines[1]) diff --git a/tests/python/pants_test/logging/BUILD b/tests/python/pants_test/logging/BUILD index 8909b31d948..ab4519a7062 100644 --- a/tests/python/pants_test/logging/BUILD +++ b/tests/python/pants_test/logging/BUILD @@ -16,6 +16,7 @@ python_tests( ], dependencies=[ 'tests/python/pants_test:int-test', + 'tests/python/pants_test/pantsd:pantsd_integration_test_base', 'tests/python/pants_test/testutils:py2_compat', ], tags = {'integration'}, diff --git a/tests/python/pants_test/logging/test_native_engine_logging.py b/tests/python/pants_test/logging/test_native_engine_logging.py index bc41b130357..b6cd7b67db5 100644 --- a/tests/python/pants_test/logging/test_native_engine_logging.py +++ b/tests/python/pants_test/logging/test_native_engine_logging.py @@ -4,19 +4,42 @@ from __future__ import absolute_import, division, print_function, unicode_literals -from pants_test.pants_run_integration_test import PantsRunIntegrationTest +from pants_test.pants_run_integration_test import PantsRunIntegrationTest, read_pantsd_log +from pants_test.pantsd.pantsd_integration_test_base import PantsDaemonIntegrationTestBase from pants_test.testutils.py2_compat import assertNotRegex, assertRegex class NativeEngineLoggingTest(PantsRunIntegrationTest): def test_native_logging(self): - + expected_msg = "\[DEBUG\] engine::scheduler: Launching \d+ root" pants_run = self.run_pants([ - "-linfo", "list", "3rdparty::" + "-linfo", "list", "src/scala::" ]) - assertNotRegex(self, pants_run.stderr_data, "DEBUG] Launching \\d+ root") + assertNotRegex(self, pants_run.stderr_data, expected_msg) pants_run = self.run_pants([ - "-ldebug", "list", "3rdparty::" + "-ldebug", "list", "src/scala::" ]) - assertRegex(self, pants_run.stderr_data, "DEBUG] Launching \\d+ root") + assertRegex(self, pants_run.stderr_data, expected_msg) + + +class PantsdNativeLoggingTest(PantsDaemonIntegrationTestBase): + def test_pantsd_file_logging(self): + with self.pantsd_successful_run_context('debug') as (pantsd_run, checker, workdir, _): + daemon_run = pantsd_run(["list", "3rdparty::"]) + checker.assert_started() + + self.assert_run_contains_log( + "connecting to pantsd on port", + "DEBUG", + "pants.bin.remote_pants_runner", + daemon_run, + ) + + pantsd_log = '\n'.join(read_pantsd_log(workdir)) + self.assert_contains_log( + "logging initialized", + "DEBUG", + "pants.pantsd.pants_daemon", + pantsd_log, + ) diff --git a/tests/python/pants_test/pants_run_integration_test.py b/tests/python/pants_test/pants_run_integration_test.py index b7be5e878c1..c20ef393e58 100644 --- a/tests/python/pants_test/pants_run_integration_test.py +++ b/tests/python/pants_test/pants_run_integration_test.py @@ -6,6 +6,7 @@ import glob import os +import re import shutil import unittest from builtins import open @@ -477,6 +478,24 @@ def indent(content): assertion(value, pants_run.returncode, error_msg) + def assert_run_contains_log(self, msg, level, module, pants_run): + """Asserts that the passed run's stderr contained the log message.""" + self.assert_contains_log(msg, level, module, pants_run.stderr_data, pants_run.pid) + + def assert_contains_log(self, msg, level, module, log, pid=None): + """ + Asserts that the passed log contains the message logged by the module at the level. + + If pid is specified, performs an exact match including the pid of the pants process. + Otherwise performs a regex match asserting that some pid is present. + """ + prefix = "[{}] {}:pid=".format(level, module) + suffix = ": {}".format(msg) + if pid is None: + self.assertRegexpMatches(log, re.escape(prefix) + "\\d+" + re.escape(suffix)) + else: + self.assertIn("{}{}{}".format(prefix, pid, suffix), log) + def normalize(self, s): """Removes escape sequences (e.g. colored output) and all whitespace from string s.""" return ''.join(strip_color(s).split()) diff --git a/tests/python/pants_test/pantsd/stderr b/tests/python/pants_test/pantsd/stderr new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/python/pants_test/pantsd/test_pantsd_integration.py b/tests/python/pants_test/pantsd/test_pantsd_integration.py index f21d92cdd3b..d285c693aeb 100644 --- a/tests/python/pants_test/pantsd/test_pantsd_integration.py +++ b/tests/python/pants_test/pantsd/test_pantsd_integration.py @@ -94,7 +94,7 @@ def test_pantsd_broken_pipe(self): def test_pantsd_stacktrace_dump(self): with self.pantsd_successful_run_context() as (pantsd_run, checker, workdir, _): - pantsd_run(['help']) + pantsd_run(['-ldebug', 'help']) checker.assert_started() os.kill(checker.pid, signal.SIGUSR2) @@ -495,7 +495,7 @@ def test_pantsd_sigterm(self): self._assert_pantsd_keyboardinterrupt_signal( signal.SIGTERM, regexps=[ - '^INFO] Sending SIGTERM to pantsd-runner with pid [0-9]+, waiting up to 5\\.0 seconds before sending SIGKILL\\.\\.\\.', + '\\[INFO\\] Sending SIGTERM to pantsd-runner with pid [0-9]+, waiting up to 5\\.0 seconds before sending SIGKILL\\.\\.\\.', re.escape("\nSignal {signum} (SIGTERM) was raised. Exiting with failure.\n" .format(signum=signal.SIGTERM)), """ @@ -508,7 +508,7 @@ def test_pantsd_sigquit(self): self._assert_pantsd_keyboardinterrupt_signal( signal.SIGQUIT, regexps=[ - '^INFO] Sending SIGQUIT to pantsd-runner with pid [0-9]+, waiting up to 5\\.0 seconds before sending SIGKILL\\.\\.\\.', + '\\[INFO\\] Sending SIGQUIT to pantsd-runner with pid [0-9]+, waiting up to 5\\.0 seconds before sending SIGKILL\\.\\.\\.', re.escape("\nSignal {signum} (SIGQUIT) was raised. Exiting with failure.\n" .format(signum=signal.SIGQUIT)), """ @@ -520,7 +520,7 @@ def test_pantsd_sigint(self): self._assert_pantsd_keyboardinterrupt_signal( signal.SIGINT, regexps=["""\ -^INFO] Sending SIGINT to pantsd-runner with pid [0-9]+, waiting up to 5\\.0 seconds before sending SIGKILL\\.\\.\\. +\\[INFO\\] Sending SIGINT to pantsd-runner with pid [0-9]+, waiting up to 5\\.0 seconds before sending SIGKILL\\.\\.\\. Interrupted by user. Interrupted by user: Interrupted by user over pailgun client! @@ -533,9 +533,9 @@ def test_signal_pailgun_stream_timeout(self): self._assert_pantsd_keyboardinterrupt_signal( signal.SIGINT, regexps=["""\ -^INFO] Sending SIGINT to pantsd-runner with pid [0-9]+, waiting up to 0\\.01 seconds before sending SIGKILL\\.\\.\\. +\\[INFO\\] Sending SIGINT to pantsd-runner with pid [0-9]+, waiting up to 0\\.01 seconds before sending SIGKILL\\.\\.\\. Interrupted by user\\. -WARN\\] timed out when attempting to gracefully shut down the remote client executing \ +[^ ]* \\[WARN\\] timed out when attempting to gracefully shut down the remote client executing \ "'pantsd-runner.*'"\\. sending SIGKILL to the remote client at pid: [0-9]+\\. message: iterating \ over bytes from nailgun timed out with timeout interval 0\\.01 starting at {today}T[^\n]+, \ overtime seconds: [^\n]+ diff --git a/tests/python/pants_test/test_base.py b/tests/python/pants_test/test_base.py index 1fb5c0c77ba..d1844893f36 100644 --- a/tests/python/pants_test/test_base.py +++ b/tests/python/pants_test/test_base.py @@ -410,8 +410,13 @@ def _init_engine(cls): def scheduler(self): if self._scheduler is None: self._init_engine() + self.post_scheduler_init() return self._scheduler + def post_scheduler_init(self): + """Run after initializing the Scheduler, it will have the same lifetime""" + pass + @property def address_mapper(self): if self._address_mapper is None: