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: