From f07a3dfaacb57b5b0a89493831812ec17b6dd03b Mon Sep 17 00:00:00 2001 From: Stu Hood Date: Sat, 23 Nov 2019 09:11:36 -0800 Subject: [PATCH 01/15] Use the notify crate to implement an `InvalidationWatcher` for Graph operations. --- src/rust/engine/Cargo.toml | 2 + src/rust/engine/src/context.rs | 17 +++-- src/rust/engine/src/lib.rs | 1 + src/rust/engine/src/nodes.rs | 4 ++ src/rust/engine/src/watch.rs | 116 +++++++++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 src/rust/engine/src/watch.rs diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index bbd58081409..8ba08a8bccc 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -84,6 +84,7 @@ default-members = [ boxfuture = { path = "boxfuture" } bytes = "0.4.5" concrete_time = { path = "concrete_time" } +crossbeam-channel = "0.3" fnv = "1.0.5" fs = { path = "fs" } futures01 = { package = "futures", version = "0.1" } @@ -95,6 +96,7 @@ lazy_static = "1" log = "0.4" logging = { path = "logging" } num_enum = "0.4" +notify = { git = "https://github.com/notify-rs/notify", rev = "fba00891d9105e2f581c69fbe415a58cb7966fdd" } parking_lot = "0.6" process_execution = { path = "process_execution" } rand = "0.6" diff --git a/src/rust/engine/src/context.rs b/src/rust/engine/src/context.rs index b31c5a004cd..5158da993b9 100644 --- a/src/rust/engine/src/context.rs +++ b/src/rust/engine/src/context.rs @@ -15,6 +15,7 @@ use crate::nodes::{NodeKey, WrappedNode}; use crate::scheduler::Session; use crate::tasks::{Rule, Tasks}; use crate::types::Types; +use crate::watch::InvalidationWatcher; use boxfuture::{BoxFuture, Boxable}; use core::clone::Clone; use fs::{safe_create_dir_all_ioerror, PosixFS}; @@ -41,7 +42,7 @@ const GIGABYTES: usize = 1024 * 1024 * 1024; /// https://github.com/tokio-rs/tokio/issues/369 is resolved. /// pub struct Core { - pub graph: Graph, + pub graph: Arc>, pub tasks: Tasks, pub rule_graph: RuleGraph, pub types: Types, @@ -50,6 +51,7 @@ pub struct Core { pub command_runner: Box, pub http_client: reqwest::r#async::Client, pub vfs: PosixFS, + pub watcher: InvalidationWatcher, pub build_root: PathBuf, } @@ -218,24 +220,27 @@ impl Core { process_execution_metadata, )); } + let graph = Arc::new(Graph::new()); + let watcher = InvalidationWatcher::new(Arc::downgrade(&graph))?; let http_client = reqwest::r#async::Client::new(); let rule_graph = RuleGraph::new(tasks.as_map(), root_subject_types); Ok(Core { - graph: Graph::new(), - tasks: tasks, - rule_graph: rule_graph, - types: types, + graph, + tasks, + rule_graph, + types, executor: executor.clone(), store, command_runner, http_client, + watcher, // TODO: Errors in initialization should definitely be exposed as python // exceptions, rather than as panics. vfs: PosixFS::new(&build_root, &ignore_patterns, executor) .map_err(|e| format!("Could not initialize VFS: {:?}", e))?, - build_root: build_root, + build_root, }) } diff --git a/src/rust/engine/src/lib.rs b/src/rust/engine/src/lib.rs index 90cb5465c49..42ae5929f44 100644 --- a/src/rust/engine/src/lib.rs +++ b/src/rust/engine/src/lib.rs @@ -40,6 +40,7 @@ mod scheduler; mod selectors; mod tasks; mod types; +mod watch; pub use crate::context::Core; pub use crate::core::{Function, Key, Params, TypeId, Value}; diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index f3ab209b6e1..3f720e67c85 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -1033,6 +1033,10 @@ impl Node for NodeKey { type Error = Failure; fn run(self, context: Context) -> NodeFuture { + if let Some(path) = self.fs_subject() { + let abs_path = context.core.build_root.join(path); + try_future!(context.core.watcher.watch(abs_path).map_err(|e| throw(&e))); + } let (maybe_started_workunit, maybe_span_id) = if context.session.should_handle_workunits() { let user_facing_name = self.user_facing_name(); let span_id = generate_random_64bit_string(); diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs new file mode 100644 index 00000000000..6c5810c7136 --- /dev/null +++ b/src/rust/engine/src/watch.rs @@ -0,0 +1,116 @@ +// Copyright 2019 Pants project contributors (see CONTRIBUTORS.md). +// Licensed under the Apache License, Version 2.0 (see LICENSE). + +use std::collections::HashSet; +use std::path::Path; +use std::sync::Weak; +use std::thread; +use std::time::Duration; + +use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; +use log::{error, warn}; +use notify::{Event, RecommendedWatcher, RecursiveMode, Watcher}; +use parking_lot::Mutex; + +use graph::Graph; +use logging; + +use crate::nodes::NodeKey; + +/// +/// An InvalidationWatcher maintains a Thread that receives events from a notify Watcher. +/// +/// If the spawned Thread exits for any reason, InvalidationWatcher::running() will return False, +/// and the caller should create a new InvalidationWatcher (or shut down, in some cases). Generally +/// this will mean polling. +/// +/// TODO: Need the above polling, and need to make the watch method async. +/// +pub struct InvalidationWatcher { + watcher: Mutex, + liveness: Receiver<()>, +} + +impl InvalidationWatcher { + pub fn new(graph: Weak>) -> Result { + let logging_destination = logging::get_destination(); + let (watch_sender, watch_receiver) = crossbeam_channel::unbounded(); + let watcher = Mutex::new( + Watcher::new(watch_sender, Duration::from_millis(50)) + .map_err(|e| format!("Failed to begin watching the filesystem: {}", e))?, + ); + + let (thread_liveness_sender, thread_liveness_receiver) = crossbeam_channel::unbounded(); + thread::spawn(move || { + logging::set_destination(logging_destination); + loop { + let event_res = watch_receiver.recv_timeout(Duration::from_millis(100)); + let graph = if let Some(g) = graph.upgrade() { + g + } else { + // The Graph has been dropped: we're done. + break; + }; + match event_res { + Ok(Ok(ev)) => invalidate(&graph, ev), + Ok(Err(err)) => { + if let notify::ErrorKind::PathNotFound = err.kind { + warn!("Path(s) did not exist: {:?}", err.paths); + continue; + } else { + error!("File watcher failing with: {}", err); + break; + } + } + Err(RecvTimeoutError::Timeout) => continue, + Err(RecvTimeoutError::Disconnected) => { + // The Watcher is gone: we're done. + break; + } + }; + } + warn!("Watch thread exiting."); + // Signal that we're exiting (which we would also do by just dropping the channel). + let _ = thread_liveness_sender.send(()); + }); + + Ok(InvalidationWatcher { + watcher, + liveness: thread_liveness_receiver, + }) + } + + /// + /// Watch the given path non-recursively. + /// + pub fn watch + std::fmt::Debug>(&self, path: P) -> Result<(), String> { + // warn!("watching {:?}", path); + let mut watcher = self.watcher.lock(); + watcher + .watch(&path, RecursiveMode::NonRecursive) + .map_err(|e| format!("Failed to begin watching `{:?}`: {}", path, e)) + } + + /// + /// Returns true if this InvalidationWatcher is still valid: if it is not valid, it will have + /// already logged some sort of error, and will never restart on its own. + /// + pub fn running(&self) -> bool { + match self.liveness.try_recv() { + Ok(()) | Err(TryRecvError::Disconnected) => false, + Err(TryRecvError::Empty) => true, + } + } +} + +fn invalidate(graph: &Graph, ev: Event) { + let paths: HashSet<_> = ev.paths.into_iter().collect(); + warn!("notify invalidating {:?}", paths); + graph.invalidate_from_roots(move |node| { + if let Some(fs_subject) = node.fs_subject() { + paths.contains(fs_subject) + } else { + false + } + }); +} From 8bd16920ea14a2552a4ae4998633727972f129e9 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Fri, 13 Mar 2020 17:55:04 -0700 Subject: [PATCH 02/15] Make watch async, and watcher log to pantsd.log. Relativize paths returned from notify to the build_root. Refactor invalidate method to be an associated method on the InvalidationWatcher. --- src/rust/engine/src/context.rs | 2 +- src/rust/engine/src/nodes.rs | 5 +- src/rust/engine/src/scheduler.rs | 18 +---- src/rust/engine/src/watch.rs | 124 ++++++++++++++++++++++++------- 4 files changed, 106 insertions(+), 43 deletions(-) diff --git a/src/rust/engine/src/context.rs b/src/rust/engine/src/context.rs index 5158da993b9..2a2b84de3ce 100644 --- a/src/rust/engine/src/context.rs +++ b/src/rust/engine/src/context.rs @@ -221,7 +221,7 @@ impl Core { )); } let graph = Arc::new(Graph::new()); - let watcher = InvalidationWatcher::new(Arc::downgrade(&graph))?; + let watcher = InvalidationWatcher::new(Arc::downgrade(&graph), build_root.clone())?; let http_client = reqwest::r#async::Client::new(); let rule_graph = RuleGraph::new(tasks.as_map(), root_subject_types); diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index 3f720e67c85..3fd5b5b4c68 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -1035,7 +1035,10 @@ impl Node for NodeKey { fn run(self, context: Context) -> NodeFuture { if let Some(path) = self.fs_subject() { let abs_path = context.core.build_root.join(path); - try_future!(context.core.watcher.watch(abs_path).map_err(|e| throw(&e))); + context + .core + .executor + .spawn_and_ignore(context.core.watcher.watch(abs_path)); } let (maybe_started_workunit, maybe_span_id) = if context.session.should_handle_workunits() { let user_facing_name = self.user_facing_name(); diff --git a/src/rust/engine/src/scheduler.rs b/src/rust/engine/src/scheduler.rs index 248ac1a3662..5408b617984 100644 --- a/src/rust/engine/src/scheduler.rs +++ b/src/rust/engine/src/scheduler.rs @@ -13,6 +13,7 @@ use futures01::future::{self, Future}; use crate::context::{Context, Core}; use crate::core::{Failure, Params, TypeId, Value}; use crate::nodes::{NodeKey, Select, Tracer, Visualizer}; +use crate::watch::InvalidationWatcher; use graph::{Graph, InvalidationResult}; use hashing; use indexmap::IndexMap; @@ -227,22 +228,7 @@ impl Scheduler { /// Invalidate the invalidation roots represented by the given Paths. /// pub fn invalidate(&self, paths: &HashSet) -> usize { - let InvalidationResult { cleared, dirtied } = - self.core.graph.invalidate_from_roots(move |node| { - if let Some(fs_subject) = node.fs_subject() { - paths.contains(fs_subject) - } else { - false - } - }); - // TODO: The rust log level is not currently set correctly in a pantsd context. To ensure that - // we see this even at `info` level, we set it to warn. #6004 should address this by making - // rust logging re-configuration an explicit step in `src/python/pants/init/logging.py`. - warn!( - "invalidation: cleared {} and dirtied {} nodes for: {:?}", - cleared, dirtied, paths - ); - cleared + dirtied + InvalidationWatcher::invalidate(&self.core.graph, paths, "watchman") } /// diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 6c5810c7136..4ec9989454b 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -2,17 +2,20 @@ // Licensed under the Apache License, Version 2.0 (see LICENSE). use std::collections::HashSet; -use std::path::Path; -use std::sync::Weak; +use std::path::PathBuf; +use std::sync::{Arc, Weak}; use std::thread; use std::time::Duration; +use boxfuture::{BoxFuture, Boxable}; use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; +use futures01 as futures; +use futures01::future::Future; use log::{error, warn}; -use notify::{Event, RecommendedWatcher, RecursiveMode, Watcher}; +use notify::{RecommendedWatcher, RecursiveMode, Result as NotifyResult, Watcher}; use parking_lot::Mutex; -use graph::Graph; +use graph::{Graph, InvalidationResult}; use logging; use crate::nodes::NodeKey; @@ -27,22 +30,24 @@ use crate::nodes::NodeKey; /// TODO: Need the above polling, and need to make the watch method async. /// pub struct InvalidationWatcher { - watcher: Mutex, + watcher: Arc>, liveness: Receiver<()>, } impl InvalidationWatcher { - pub fn new(graph: Weak>) -> Result { - let logging_destination = logging::get_destination(); + pub fn new( + graph: Weak>, + build_root: PathBuf, + ) -> Result { let (watch_sender, watch_receiver) = crossbeam_channel::unbounded(); - let watcher = Mutex::new( + let watcher = Arc::new(Mutex::new( Watcher::new(watch_sender, Duration::from_millis(50)) .map_err(|e| format!("Failed to begin watching the filesystem: {}", e))?, - ); + )); let (thread_liveness_sender, thread_liveness_receiver) = crossbeam_channel::unbounded(); thread::spawn(move || { - logging::set_destination(logging_destination); + logging::set_destination(logging::Destination::Pantsd); loop { let event_res = watch_receiver.recv_timeout(Duration::from_millis(100)); let graph = if let Some(g) = graph.upgrade() { @@ -52,7 +57,22 @@ impl InvalidationWatcher { break; }; match event_res { - Ok(Ok(ev)) => invalidate(&graph, ev), + Ok(Ok(ev)) => { + let paths: HashSet<_> = ev + .paths + .into_iter() + .map(|path| { + // relativize paths to build root. + if path.starts_with(&build_root) { + path.strip_prefix(&build_root).unwrap().into() + } else { + path + } + }) + .collect(); + warn!("notify invalidating {:?} because of {:?}", paths, ev.kind); + InvalidationWatcher::invalidate(&graph, &paths, "notify"); + } Ok(Err(err)) => { if let notify::ErrorKind::PathNotFound = err.kind { warn!("Path(s) did not exist: {:?}", err.paths); @@ -83,12 +103,10 @@ impl InvalidationWatcher { /// /// Watch the given path non-recursively. /// - pub fn watch + std::fmt::Debug>(&self, path: P) -> Result<(), String> { - // warn!("watching {:?}", path); - let mut watcher = self.watcher.lock(); - watcher - .watch(&path, RecursiveMode::NonRecursive) - .map_err(|e| format!("Failed to begin watching `{:?}`: {}", path, e)) + pub fn watch(&self, path: PathBuf) -> BoxFuture<(), ()> { + WatchFuture::new(self.watcher.clone(), path.clone()) + .map_err(move |e| warn!("Failed to watch path {:?}, with error {:?}", path, e)) + .to_boxed() } /// @@ -101,16 +119,72 @@ impl InvalidationWatcher { Err(TryRecvError::Empty) => true, } } + + pub fn invalidate(graph: &Graph, paths: &HashSet, caller: &str) -> usize { + let InvalidationResult { cleared, dirtied } = graph.invalidate_from_roots(move |node| { + if let Some(fs_subject) = node.fs_subject() { + paths.contains(fs_subject) + } else { + false + } + }); + // TODO: The rust log level is not currently set correctly in a pantsd context. To ensure that + // we see this even at `info` level, we set it to warn. #6004 should address this by making + // rust logging re-configuration an explicit step in `src/python/pants/init/logging.py`. + warn!( + "{} invalidation: cleared {} and dirtied {} nodes for: {:?}", + caller, cleared, dirtied, paths + ); + cleared + dirtied + } +} + +struct WatchFuture { + watcher: Arc>, + path: PathBuf, + watch_result: Arc>>>, + thread_started: bool, } -fn invalidate(graph: &Graph, ev: Event) { - let paths: HashSet<_> = ev.paths.into_iter().collect(); - warn!("notify invalidating {:?}", paths); - graph.invalidate_from_roots(move |node| { - if let Some(fs_subject) = node.fs_subject() { - paths.contains(fs_subject) +impl WatchFuture { + fn new(watcher: Arc>, path: PathBuf) -> WatchFuture { + WatchFuture { + watcher, + path, + watch_result: Arc::new(Mutex::new(None)), + thread_started: false, + } + } +} + +impl Future for WatchFuture { + type Item = (); + type Error = String; + + fn poll(&mut self) -> futures::Poll { + if !self.thread_started { + thread::spawn({ + let current_task = futures::task::current(); + let watcher = self.watcher.clone(); + let watch_result2 = self.watch_result.clone(); + let path = self.path.clone(); + move || { + let mut watch_result2 = watch_result2.lock(); + let mut watcher = watcher.lock(); + *watch_result2 = Some(watcher.watch(path, RecursiveMode::NonRecursive)); + current_task.notify(); + } + }); + self.thread_started = true; + Ok(futures::Async::NotReady) + } else if let Some(watch_result) = self.watch_result.try_lock() { + match *watch_result { + Some(Ok(_)) => Ok(futures::Async::Ready(())), + Some(Err(ref watch_error)) => Err(format!("{:?}", watch_error)), + None => unreachable!(), // We check if the watch result is None before reaching this block. + } } else { - false + Ok(futures::Async::NotReady) } - }); + } } From a7fb332162dfa5f1b9eb07b77cc140278e5d86ca Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Thu, 19 Mar 2020 11:50:48 -0700 Subject: [PATCH 03/15] Respond to feedback. * Use spawn on io pool instead of custom future impl * Write python fs tests * Relativize paths to invalidate to build root * invalidate nodes with parent paths. * Comments --- src/python/pants/engine/scheduler.py | 3 - src/rust/engine/Cargo.toml | 4 + src/rust/engine/src/nodes.rs | 63 ++++++++----- src/rust/engine/src/watch.rs | 94 ++++++------------- tests/python/pants_test/engine/test_fs.py | 109 ++++++++++++++++++++-- 5 files changed, 173 insertions(+), 100 deletions(-) diff --git a/src/python/pants/engine/scheduler.py b/src/python/pants/engine/scheduler.py index 424725e3d19..6c3af88b611 100644 --- a/src/python/pants/engine/scheduler.py +++ b/src/python/pants/engine/scheduler.py @@ -235,10 +235,7 @@ def rule_subgraph_visualization(self, root_subject_type, product_type): yield line.rstrip() def invalidate_files(self, direct_filenames): - # NB: Watchman no longer triggers events when children are created/deleted under a directory, - # so we always need to invalidate the direct parent as well. filenames = set(direct_filenames) - filenames.update(os.path.dirname(f) for f in direct_filenames) filenames_buf = self._native.context.utf8_buf_buf(filenames) return self._native.lib.graph_invalidate(self._scheduler, filenames_buf) diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index 8ba08a8bccc..ffe94f7ad49 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -96,6 +96,10 @@ lazy_static = "1" log = "0.4" logging = { path = "logging" } num_enum = "0.4" +# notify is currently an experimental API, we are pinning to https://docs.rs/notify/5.0.0-pre.1/notify/ +# because the latest prerelease at time of writing has removed the debounced watcher which we would like to use. +# The author suggests they will add the debounced watcher back into the stable 5.0.0 release. When that happens +# we can move to it. notify = { git = "https://github.com/notify-rs/notify", rev = "fba00891d9105e2f581c69fbe415a58cb7966fdd" } parking_lot = "0.6" process_execution = { path = "process_execution" } diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index 3fd5b5b4c68..52539e2bb09 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -1033,13 +1033,6 @@ impl Node for NodeKey { type Error = Failure; fn run(self, context: Context) -> NodeFuture { - if let Some(path) = self.fs_subject() { - let abs_path = context.core.build_root.join(path); - context - .core - .executor - .spawn_and_ignore(context.core.watcher.watch(abs_path)); - } let (maybe_started_workunit, maybe_span_id) = if context.session.should_handle_workunits() { let user_facing_name = self.user_facing_name(); let span_id = generate_random_64bit_string(); @@ -1061,26 +1054,46 @@ impl Node for NodeKey { }; let context2 = context.clone(); - future::lazy(|| { - if let Some(span_id) = maybe_span_id { - set_parent_id(span_id); - } - match self { - NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::MultiPlatformExecuteProcess(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Scandir(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Select(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Task(n) => n.run(context).map(NodeResult::from).to_boxed(), + future::lazy({ + let context = context.clone(); + let self2 = self.clone(); + move || { + if let Some(path) = self2.fs_subject() { + let abs_path = context.core.build_root.join(path); + context + .core + .executor + .spawn_on_io_pool(context.core.watcher.watch(abs_path)) + .to_boxed() + } else { + future::ok(()).to_boxed() + } } }) - .inspect(move |_: &NodeResult| { - if let Some(started_workunit) = maybe_started_workunit { - let workunit: WorkUnit = started_workunit.finish(); - context2.session.workunit_store().add_workunit(workunit) - } + .then(|_| { + future::lazy(|| { + if let Some(span_id) = maybe_span_id { + set_parent_id(span_id); + } + match self { + NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::MultiPlatformExecuteProcess(n) => { + n.run(context).map(NodeResult::from).to_boxed() + } + NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Scandir(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Select(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Task(n) => n.run(context).map(NodeResult::from).to_boxed(), + } + }) + .inspect(move |_: &NodeResult| { + if let Some(started_workunit) = maybe_started_workunit { + let workunit: WorkUnit = started_workunit.finish(); + context2.session.workunit_store().add_workunit(workunit) + } + }) }) .to_boxed() } diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 4ec9989454b..e88f05475da 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -11,8 +11,8 @@ use boxfuture::{BoxFuture, Boxable}; use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; use futures01 as futures; use futures01::future::Future; -use log::{error, warn}; -use notify::{RecommendedWatcher, RecursiveMode, Result as NotifyResult, Watcher}; +use log::{debug, error, info, warn}; +use notify::{RecommendedWatcher, RecursiveMode, Watcher}; use parking_lot::Mutex; use graph::{Graph, InvalidationResult}; @@ -27,7 +27,7 @@ use crate::nodes::NodeKey; /// and the caller should create a new InvalidationWatcher (or shut down, in some cases). Generally /// this will mean polling. /// -/// TODO: Need the above polling, and need to make the watch method async. +/// TODO: Need the above polling /// pub struct InvalidationWatcher { watcher: Arc>, @@ -63,14 +63,23 @@ impl InvalidationWatcher { .into_iter() .map(|path| { // relativize paths to build root. - if path.starts_with(&build_root) { - path.strip_prefix(&build_root).unwrap().into() - } else { - path + let mut paths_to_invalidate: Vec = vec![]; + let path_relative_to_build_root = { + if path.starts_with(&build_root) { + path.strip_prefix(&build_root).unwrap().into() + } else { + path + } + }; + paths_to_invalidate.push(path_relative_to_build_root.clone()); + if let Some(parent_dir) = path_relative_to_build_root.parent() { + paths_to_invalidate.push(parent_dir.to_path_buf()); } + paths_to_invalidate }) + .flatten() .collect(); - warn!("notify invalidating {:?} because of {:?}", paths, ev.kind); + info!("notify invalidating {:?} because of {:?}", paths, ev.kind); InvalidationWatcher::invalidate(&graph, &paths, "notify"); } Ok(Err(err)) => { @@ -89,7 +98,7 @@ impl InvalidationWatcher { } }; } - warn!("Watch thread exiting."); + debug!("Watch thread exiting."); // Signal that we're exiting (which we would also do by just dropping the channel). let _ = thread_liveness_sender.send(()); }); @@ -104,8 +113,16 @@ impl InvalidationWatcher { /// Watch the given path non-recursively. /// pub fn watch(&self, path: PathBuf) -> BoxFuture<(), ()> { - WatchFuture::new(self.watcher.clone(), path.clone()) - .map_err(move |e| warn!("Failed to watch path {:?}, with error {:?}", path, e)) + let watcher = self.watcher.clone(); + let path2 = path.clone(); + futures::lazy(move || watcher.lock().watch(path, RecursiveMode::NonRecursive)) + .then(move |r| match r { + Ok(_) => futures::future::ok(()).to_boxed(), + Err(e) => { + warn!("Failed to watch path {:?}, with error {:?}", path2, e); + futures::future::err(()).to_boxed() + } + }) .to_boxed() } @@ -128,63 +145,10 @@ impl InvalidationWatcher { false } }); - // TODO: The rust log level is not currently set correctly in a pantsd context. To ensure that - // we see this even at `info` level, we set it to warn. #6004 should address this by making - // rust logging re-configuration an explicit step in `src/python/pants/init/logging.py`. - warn!( + info!( "{} invalidation: cleared {} and dirtied {} nodes for: {:?}", caller, cleared, dirtied, paths ); cleared + dirtied } } - -struct WatchFuture { - watcher: Arc>, - path: PathBuf, - watch_result: Arc>>>, - thread_started: bool, -} - -impl WatchFuture { - fn new(watcher: Arc>, path: PathBuf) -> WatchFuture { - WatchFuture { - watcher, - path, - watch_result: Arc::new(Mutex::new(None)), - thread_started: false, - } - } -} - -impl Future for WatchFuture { - type Item = (); - type Error = String; - - fn poll(&mut self) -> futures::Poll { - if !self.thread_started { - thread::spawn({ - let current_task = futures::task::current(); - let watcher = self.watcher.clone(); - let watch_result2 = self.watch_result.clone(); - let path = self.path.clone(); - move || { - let mut watch_result2 = watch_result2.lock(); - let mut watcher = watcher.lock(); - *watch_result2 = Some(watcher.watch(path, RecursiveMode::NonRecursive)); - current_task.notify(); - } - }); - self.thread_started = true; - Ok(futures::Async::NotReady) - } else if let Some(watch_result) = self.watch_result.try_lock() { - match *watch_result { - Some(Ok(_)) => Ok(futures::Async::Ready(())), - Some(Err(ref watch_error)) => Err(format!("{:?}", watch_error)), - None => unreachable!(), // We check if the watch result is None before reaching this block. - } - } else { - Ok(futures::Async::NotReady) - } - } -} diff --git a/tests/python/pants_test/engine/test_fs.py b/tests/python/pants_test/engine/test_fs.py index af185438cd0..36cdb9a544f 100644 --- a/tests/python/pants_test/engine/test_fs.py +++ b/tests/python/pants_test/engine/test_fs.py @@ -4,7 +4,9 @@ import hashlib import logging import os +import shutil import tarfile +import time import unittest from abc import ABCMeta from contextlib import contextmanager @@ -55,6 +57,17 @@ def path_globs(globs) -> PathGlobs: return globs return PathGlobs(globs) + def read_file_content(self, scheduler, filespecs_or_globs): + """Helper method for reading the content of some files from an existing scheduler + session.""" + snapshot = self.execute_expecting_one_result( + scheduler, Snapshot, self.path_globs(filespecs_or_globs) + ).value + result = self.execute_expecting_one_result( + scheduler, FilesContent, snapshot.directory_digest + ).value + return {f.path: f.content for f in result.dependencies} + def assert_walk_dirs(self, filespecs_or_globs, paths, **kwargs): self.assert_walk_snapshot("dirs", filespecs_or_globs, paths, **kwargs) @@ -74,13 +87,7 @@ def assert_walk_snapshot( def assert_content(self, filespecs_or_globs, expected_content): with self.mk_project_tree() as project_tree: scheduler = self.mk_scheduler(rules=create_fs_rules(), project_tree=project_tree) - snapshot = self.execute_expecting_one_result( - scheduler, Snapshot, self.path_globs(filespecs_or_globs) - ).value - result = self.execute_expecting_one_result( - scheduler, FilesContent, snapshot.directory_digest - ).value - actual_content = {f.path: f.content for f in result.dependencies} + actual_content = self.read_file_content(scheduler, filespecs_or_globs) self.assertEqual(expected_content, actual_content) def assert_digest(self, filespecs_or_globs, expected_files): @@ -708,6 +715,94 @@ def test_nonexistent_filename_globs(self) -> None: subset_digest = self.request_single_product(Digest, subset_input) assert subset_snapshot.directory_digest == subset_digest + def test_file_content_invalidated(self) -> None: + """Test that we can update files and have the native engine invalidate previous operations + on those files.""" + + with self.mk_project_tree() as project_tree: + scheduler = self.mk_scheduler(rules=create_fs_rules(), project_tree=project_tree) + fname = "4.txt" + new_data = "rouf" + # read the original file so we have a cached value. + self.read_file_content(scheduler, [fname]) + path_to_fname = os.path.join(project_tree.build_root, fname) + with open(path_to_fname, "w") as f: + f.write(new_data) + for i in range(4): + time.sleep(0.1 * i) + new_content = self.read_file_content(scheduler, [fname]) + if new_content[fname].decode("utf-8") == new_data: + # successfully read new data + break + else: + raise AssertionError( + f"New content {new_data} was not found in the FilesContent of the modified file {path_to_fname}, instead we found {new_content[fname]}" + ) + + def test_file_content_invalidated_after_parent_deletion(self) -> None: + """Test that FileContent is invalidated after deleting parent directory.""" + + with self.mk_project_tree() as project_tree: + scheduler = self.mk_scheduler(rules=create_fs_rules(), project_tree=project_tree) + fname = "a/b/1.txt" + # read the original file so we have nodes to invalidate. + original_content = self.read_file_content(scheduler, [fname]) + self.assertIn(fname, original_content) + path_to_parent_dir = os.path.join(project_tree.build_root, "a/b/") + shutil.rmtree(path_to_parent_dir) + for i in range(4): + time.sleep(0.1 * i) + new_content = self.read_file_content(scheduler, [fname]) + if new_content.get(fname) is None: + break + else: + raise AssertionError( + f"Deleting parent dir and could still read file from original snapshot." + ) + + def assert_mutated_directory_digest(self, mutation_function): + with self.mk_project_tree() as project_tree: + scheduler = self.mk_scheduler(rules=create_fs_rules(), project_tree=project_tree) + dir_path = "a/" + dir_glob = dir_path + "*" + initial_snapshot = self.execute_expecting_one_result( + scheduler, Snapshot, self.path_globs([dir_glob]) + ).value + assert not initial_snapshot.is_empty + assertion_error = mutation_function(project_tree, dir_path) + for i in range(4): + time.sleep(0.1 * i) + new_snapshot = self.execute_expecting_one_result( + scheduler, Snapshot, self.path_globs([dir_glob]) + ).value + assert not new_snapshot.is_empty + if initial_snapshot.directory_digest != new_snapshot.directory_digest: + # successfully invalidated snapshot and got a new digest + break + else: + raise assertion_error + + def test_directory_digest_invalidated_by_child_removal(self): + def mutation_function(project_tree, dir_path): + removed_path = os.path.join(project_tree.build_root, dir_path, "3.txt") + os.remove(removed_path) + return AssertionError( + f"Did not find a new directory snapshot after adding file {removed_path}." + ) + + self.assert_mutated_directory_digest(mutation_function) + + def test_directory_digest_invalidated_by_child_change(self): + def mutation_function(project_tree, dir_path): + new_file_path = os.path.join(project_tree.build_root, dir_path, "new_file.txt") + with open(new_file_path, "w") as f: + f.write("new file") + return AssertionError( + f"Did not find a new directory snapshot after adding file {new_file_path}." + ) + + self.assert_mutated_directory_digest(mutation_function) + class StubHandler(BaseHTTPRequestHandler): response_text = b"www.pantsbuild.org" From 3bad8b25be721514490b5d33ab6f805a2ee262b6 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Thu, 19 Mar 2020 19:21:27 -0700 Subject: [PATCH 04/15] Add rust test. Make some things public so we can use them in tests. Use canonical path to build root for relativizing changed paths. --- src/rust/engine/Cargo.lock | 807 ++++++++++++---------- src/rust/engine/Cargo.toml | 6 + src/rust/engine/graph/src/entry.rs | 14 +- src/rust/engine/graph/src/lib.rs | 45 +- src/rust/engine/src/lib.rs | 3 + src/rust/engine/src/watch.rs | 9 +- src/rust/engine/src/watch_tests.rs | 53 ++ tests/python/pants_test/engine/test_fs.py | 3 +- 8 files changed, 561 insertions(+), 379 deletions(-) create mode 100644 src/rust/engine/src/watch_tests.rs diff --git a/src/rust/engine/Cargo.lock b/src/rust/engine/Cargo.lock index 1a0af1ef4af..1efaade1e8b 100644 --- a/src/rust/engine/Cargo.lock +++ b/src/rust/engine/Cargo.lock @@ -7,10 +7,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -22,13 +22,13 @@ dependencies = [ ] [[package]] -name = "anyhow" -version = "1.0.26" +name = "anymap" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "arc-swap" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -48,7 +48,7 @@ dependencies = [ "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -56,8 +56,8 @@ name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -73,22 +73,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.44" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -133,7 +133,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -190,7 +190,7 @@ dependencies = [ "fuse 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hashing 0.0.1", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", @@ -206,10 +206,10 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -251,14 +251,6 @@ name = "bytesize" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "c2-chacha" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "cargo" version = "0.34.0" @@ -272,12 +264,12 @@ dependencies = [ "crates-io 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "crypto-hash 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "curl 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", - "curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", + "curl 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "curl-sys 0.4.30+curl-7.69.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "fwdansi 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -285,12 +277,12 @@ dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "home 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ignore 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ignore 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "im-rc 12.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -300,7 +292,7 @@ dependencies = [ "rustfix 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_ignored 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "shell-escape 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -323,8 +315,8 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -341,9 +333,18 @@ name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chashmap" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "chrono" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -402,7 +403,7 @@ name = "commoncrypto-sys" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -410,8 +411,8 @@ name = "concrete_time" version = "0.0.1" dependencies = [ "protobuf 2.0.6 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -434,11 +435,11 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -459,7 +460,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -472,10 +473,10 @@ name = "crates-io" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curl 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "curl 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -490,32 +491,43 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.4.0" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-channel" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-deque" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-epoch" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -532,7 +544,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -546,10 +558,10 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -575,11 +587,11 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.25" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "curl-sys 0.4.30+curl-7.69.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -589,12 +601,12 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.25" +version = "0.4.30+curl-7.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "libnghttp2-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "libnghttp2-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -604,7 +616,7 @@ dependencies = [ [[package]] name = "derivative" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", @@ -617,9 +629,9 @@ name = "derivative" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -643,7 +655,7 @@ name = "dirs" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -663,7 +675,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -693,6 +705,8 @@ dependencies = [ "boxfuture 0.0.1", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "concrete_time 0.0.1", + "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", @@ -703,6 +717,7 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "logging 0.0.1", + "notify 5.0.0-pre.1 (git+https://github.com/notify-rs/notify?rev=fba00891d9105e2f581c69fbe415a58cb7966fdd)", "num_enum 0.4.3 (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", @@ -714,7 +729,9 @@ dependencies = [ "store 0.1.0", "task_executor 0.0.1", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "testutil 0.0.1", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.22 (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)", "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -749,7 +766,7 @@ dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -761,7 +778,7 @@ dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -771,7 +788,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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -781,34 +798,34 @@ 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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" -version = "0.12.1" +version = "0.12.2" 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)", + "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -823,7 +840,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -835,12 +852,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "flate2" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -871,7 +888,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "ignore 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ignore 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -886,7 +903,7 @@ name = "fs2" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -904,8 +921,8 @@ dependencies = [ "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "store 0.1.0", "task_executor 0.0.1", @@ -913,6 +930,23 @@ dependencies = [ "workunit_store 0.0.1", ] +[[package]] +name = "fsevent" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fsevent-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -937,7 +971,7 @@ name = "fuse" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", "thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1006,10 +1040,10 @@ name = "futures-macro" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1034,10 +1068,10 @@ dependencies = [ "futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1046,7 +1080,7 @@ name = "fwdansi" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1069,7 +1103,7 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1079,7 +1113,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1092,7 +1126,7 @@ name = "git2-curl" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curl 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", + "curl 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", "git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1105,14 +1139,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "globset" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", - "bstr 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1137,7 +1171,7 @@ source = "git+https://github.com/pantsbuild/grpc-rs.git?rev=b582ef3dc4e8c7289093 dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "grpcio-sys 0.2.3 (git+https://github.com/pantsbuild/grpc-rs.git?rev=b582ef3dc4e8c7289093c8febff8dadf0997b532)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", ] @@ -1158,7 +1192,7 @@ source = "git+https://github.com/pantsbuild/grpc-rs.git?rev=b582ef3dc4e8c7289093 dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1185,9 +1219,9 @@ version = "0.0.1" dependencies = [ "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_test 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_test 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1201,10 +1235,10 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1322,15 +1356,16 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "globset 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1355,12 +1390,30 @@ dependencies = [ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "inotify" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "inotify-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1389,15 +1442,15 @@ name = "jobserver" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "js-sys" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1421,7 +1474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.66" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1430,9 +1483,9 @@ version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "libssh2-sys 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "curl-sys 0.4.30+curl-7.69.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "libssh2-sys 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1440,20 +1493,20 @@ dependencies = [ [[package]] name = "libnghttp2-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libssh2-sys" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1466,7 +1519,7 @@ version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1477,7 +1530,7 @@ version = "0.8.0" source = "git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8#06bdfbfc6348f6804127176e561843f214fc17f8" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "lmdb-sys 0.8.0 (git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8)", ] @@ -1487,7 +1540,7 @@ version = "0.8.0" source = "git+https://github.com/pantsbuild/lmdb-rs.git?rev=06bdfbfc6348f6804127176e561843f214fc17f8#06bdfbfc6348f6804127176e561843f214fc17f8" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1515,7 +1568,7 @@ name = "lock_api" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1524,7 +1577,7 @@ name = "lock_api" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1548,7 +1601,7 @@ name = "logging" version = "0.0.1" dependencies = [ "cargo 0.34.0 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1576,15 +1629,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memoffset" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1594,7 +1647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mime_guess" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1619,7 +1672,7 @@ dependencies = [ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (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)", @@ -1627,6 +1680,17 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio-named-pipes" version = "0.1.6" @@ -1644,7 +1708,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1714,17 +1778,29 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "nom" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" +name = "notify" +version = "5.0.0-pre.1" +source = "git+https://github.com/notify-rs/notify?rev=fba00891d9105e2f581c69fbe415a58cb7966fdd#fba00891d9105e2f581c69fbe415a58cb7966fdd" dependencies = [ - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "anymap 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "chashmap 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "inotify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1803,8 +1879,8 @@ name = "num_cpus" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1822,9 +1898,9 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1842,8 +1918,8 @@ name = "opener" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1856,7 +1932,7 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1872,7 +1948,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1884,12 +1960,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "owning_ref" -version = "0.4.0" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "owning_ref" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot" version = "0.6.4" @@ -1909,12 +2002,23 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1928,7 +2032,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1984,17 +2088,17 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-nested" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2007,7 +2111,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2024,7 +2128,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "concrete_time 0.0.1", "copy_dir 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derivative 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "fs 0.0.1", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2033,15 +2137,15 @@ dependencies = [ "hashing 0.0.1", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "mock 0.0.1", "nails 0.3.0 (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 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sharded_lmdb 0.0.1", "spectral 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2104,7 +2208,7 @@ name = "prost-derive" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2139,7 +2243,7 @@ dependencies = [ [[package]] name = "protoc" -version = "2.10.1" +version = "2.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2150,12 +2254,12 @@ name = "protoc-grpcio" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "grpcio-compiler 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "mktemp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", "protobuf-codegen 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protoc 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protoc 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2163,10 +2267,10 @@ name = "publicsuffix" version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2185,10 +2289,10 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2196,7 +2300,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2206,7 +2310,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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2219,7 +2323,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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2230,7 +2334,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2248,8 +2352,8 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2265,10 +2369,10 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2322,7 +2426,7 @@ name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2334,7 +2438,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.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2390,18 +2494,18 @@ dependencies = [ [[package]] name = "regex" -version = "1.3.4" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.14" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2422,16 +2526,16 @@ dependencies = [ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2454,10 +2558,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2473,7 +2577,7 @@ dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2504,9 +2608,9 @@ name = "rustfix" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2524,7 +2628,7 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2551,7 +2655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "scopeguard" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2569,7 +2673,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2579,20 +2683,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2600,7 +2704,7 @@ name = "serde_ignored" version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2609,16 +2713,16 @@ version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_test" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2628,7 +2732,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2680,8 +2784,8 @@ name = "signal-hook-registry" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2689,7 +2793,7 @@ name = "simplelog" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2726,16 +2830,11 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "sourcefile" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "spectral" version = "0.6.0" @@ -2776,8 +2875,8 @@ dependencies = [ "mock 0.0.1", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.6 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "serverset 0.0.1", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sharded_lmdb 0.0.1", @@ -2846,11 +2945,11 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2859,9 +2958,9 @@ name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2871,7 +2970,7 @@ version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2880,7 +2979,7 @@ dependencies = [ name = "tar_api" version = "0.0.1" dependencies = [ - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "testutil 0.0.1", @@ -2912,7 +3011,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2941,7 +3040,7 @@ name = "termion" version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (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.56 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2985,7 +3084,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3015,13 +3114,13 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3067,7 +3166,7 @@ name = "tokio-executor" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3093,12 +3192,12 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3109,7 +3208,7 @@ dependencies = [ "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3124,7 +3223,7 @@ name = "tokio-reactor" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3156,7 +3255,7 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (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-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3193,9 +3292,9 @@ name = "tokio-threadpool" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3209,7 +3308,7 @@ name = "tokio-timer" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3237,7 +3336,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3251,7 +3350,7 @@ name = "toml" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3259,7 +3358,7 @@ name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3385,7 +3484,7 @@ name = "uname" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3462,7 +3561,7 @@ name = "url_serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3493,11 +3592,6 @@ name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.9.1" @@ -3539,78 +3633,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "wasm-bindgen-webidl" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "web-sys" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3630,21 +3706,13 @@ dependencies = [ "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "weedle" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "which" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3716,22 +3784,22 @@ name = "xattr" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "743ad5a418686aad3b87fd14c43badd828cf26e214a00f92a384291cf22e1811" +"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" -"checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" +"checksum anymap 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344" +"checksum arc-swap 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d663a8e9a99154b5fb793032533f6328da35e23aac63d5c152279aa8ba356825" "checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e4036b9bf40f3cf16aba72a3d65e8a520fc4bafcdc7079aea8f848c58c5b5536" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" +"checksum backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "ad235dabf00f36301792cfe82499880ba54c6486be094d1047b02bacb67c14e8" +"checksum backtrace-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ca797db0057bae1a7aa2eef3283a874695455cecf08a43bfb8507ee0ebc1ed69" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" "checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" @@ -3739,19 +3807,19 @@ dependencies = [ "checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -"checksum bstr 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "502ae1441a0a5adb8fbd38a5955a6416b9493e92b465de5e4a9bde6a539c2c48" +"checksum bstr 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "2889e6d50f394968c8bf4240dc3f2a7eb4680844d27308f798229ac9d4725f41" "checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" "checksum bytesize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "716960a18f978640f25101b5cbf1c6f6b0d3192fab36a2d98ca96f0ecbe41010" -"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum cargo 0.34.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f7e90b5f23ae79af3ec0e4dc670349167fd47d6c1134f139cf0627817a4792bf" "checksum cbindgen 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1f861ef68cabbb271d373a7795014052bff37edce22c620d95e395e8719d7dc5" "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" +"checksum chashmap 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff41a3c2c1e39921b9003de14bf0439c7b63a9039637c291e1a64925d8ddfa45" +"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62" @@ -3766,18 +3834,19 @@ dependencies = [ "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" "checksum crates-io 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "091018c3f5e8109d82d94b648555f0d4a308d15626da2fb22c76f32117e24569" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" -"checksum crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c" -"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" -"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" +"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" +"checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" +"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" "checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" +"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum crypto-hash 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8a77162240fd97248d19a564a565eb563a3f592b386e4136fb300909e67dddca" "checksum ct-logs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" -"checksum curl 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06aa71e9208a54def20792d877bc663d6aae0732b9852e612c4a933177c31283" -"checksum curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)" = "0c38ca47d60b86d0cc9d42caa90a0885669c2abc9791f871c81f58cdf39e979b" -"checksum derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "942ca430eef7a3806595a6737bc388bf51adb888d3fc0dd1b50f1c170167ee3a" +"checksum curl 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)" = "eda1c0c03cacf3365d84818a40293f0e3f3953db8759c9c565a3b434edf0b52e" +"checksum curl-sys 0.4.30+curl-7.69.1 (registry+https://github.com/rust-lang/crates.io-index)" = "923b38e423a8f47a4058e96f2a1fa2865a6231097ee860debd678d244277d50c" +"checksum derivative 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3c6d883546668a3e2011b6a716a7330b82eabb0151b138217f632c8243e17135" "checksum derivative 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1b94d2eb97732ec84b4e25eaf37db890e317b80e921f168c82cb5282473f8151" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" "checksum dir-diff 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2860407d7d7e2e004bb2128510ad9e8d669e76fa005ccf567977b5d71b8b4a0b" @@ -3791,17 +3860,19 @@ dependencies = [ "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" "checksum errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e" "checksum errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" -"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" +"checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" +"checksum failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b" +"checksum failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1ff6d4dab0aa0c8e6346d46052e93b13a16cf847b54ed357087c35011048cc7d" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" -"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" +"checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +"checksum fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" +"checksum fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" "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" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" @@ -3824,13 +3895,13 @@ dependencies = [ "checksum git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7339329bfa14a00223244311560d11f8f489b453fb90092af97f267a6090ab0" "checksum git2-curl 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d58551e903ed7e2d6fe3a2f3c7efa3a784ec29b19d0fbb035aaf0497c183fbdd" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" -"checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" +"checksum globset 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad1da430bd7281dde2576f44c84cc3f0f7b475e7202cd503042dff01a8c8120" "checksum grpcio 0.3.0 (git+https://github.com/pantsbuild/grpc-rs.git?rev=b582ef3dc4e8c7289093c8febff8dadf0997b532)" = "" "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=b582ef3dc4e8c7289093c8febff8dadf0997b532)" = "" "checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" +"checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum home 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "29302b90cfa76231a757a887d1e3153331a63c7f80b6c75f86366334cbe70708" "checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" @@ -3841,22 +3912,24 @@ dependencies = [ "checksum hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "719d85c7df4a7f309a77d145340a063ea929dcb2e025bae46a80345cffec2952" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" -"checksum ignore 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "522daefc3b69036f80c7d2990b28ff9e0471c683bad05ca258e0a01dd22c5a1e" +"checksum ignore 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "7c81b30e645a7b49ad57340fd900717e6b3404bfe8322035ef189d434c412aa1" "checksum im-rc 12.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e882e6e7cd335baacae574b56aa3ce74844ec82fc6777def7c0ac368837dc3d5" "checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" +"checksum inotify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24e40d6fd5d64e2082e0c796495c8ef5ad667a96d03e5aaa0becfd9d47bcbfb8" +"checksum inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" "checksum itertools 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0d47946d458e94a1b7bcabbf6521ea7c037062c81f534615abcad76e84d4970d" "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" "checksum jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" -"checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" +"checksum js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1cb931d43e71f560c81badb0191596562bafad2be06a3f9025b845c847c60df5" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" +"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0" "checksum libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)" = "48441cb35dc255da8ae72825689a95368bf510659ae1ad55dc4aa88cb1789bf1" -"checksum libnghttp2-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02254d44f4435dd79e695f2c2b83cd06a47919adea30216ceaf0c57ca0a72463" -"checksum libssh2-sys 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "36aa6e813339d3a063292b77091dfbbb6152ff9006a459895fa5bebed7d34f10" +"checksum libnghttp2-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b359f5ec8106bc297694c9a562ace312be2cfd17a5fc68dc12249845aa144b11" +"checksum libssh2-sys 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "7bb70f29dc7c31d32c97577f13f41221af981b31248083e347b7f2c39225a6bc" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" "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)" = "" @@ -3867,12 +3940,13 @@ dependencies = [ "checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53445de381a1f436797497c61d851644d0e8e88e6140f22872ad33a704933978" -"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" +"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" +"checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" +"checksum mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" "checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" @@ -3881,7 +3955,7 @@ dependencies = [ "checksum multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb04b9f127583ed176e163fb9ec6f3e793b87e21deedd5734a69386a18a0151" "checksum nails 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4a2c608b13791e902e685701016a522b958ac1e1cb9197c6c002c44914947d52" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +"checksum notify 5.0.0-pre.1 (git+https://github.com/notify-rs/notify?rev=fba00891d9105e2f581c69fbe415a58cb7966fdd)" = "" "checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" "checksum num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1" "checksum num-complex 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "b288631d7878aaf59442cffd36910ea604ecd7745c36054328595114001c9656" @@ -3899,9 +3973,12 @@ dependencies = [ "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" "checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" "checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" -"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" +"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" +"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" @@ -3912,29 +3989,29 @@ dependencies = [ "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" -"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" +"checksum proc-macro-hack 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)" = "f918f2b601f93baa836c1c2945faef682ba5b6d4828ecb45eeb7cc3c71b811b4" +"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" +"checksum proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" "checksum prost 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b9f36c478cd43382388dfc3a3679af175c03d19ed8039e79a3e4447e944cd3f3" "checksum prost-build 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6325275b85605f58f576456a47af44417edf5956a6f670bb59fbe12aff69597" "checksum prost-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9787d1977ea72e8066d58e46ae66100324a2815e677897fe78dfe54958f48252" "checksum prost-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5644c57d56bc085f9570e113495c1f08d7185beca700dcc296cb4672f380a679" "checksum protobuf 2.0.6 (git+https://github.com/pantsbuild/rust-protobuf?rev=171611c33ec92f07e1b7107327f6d0139a7afebf)" = "" "checksum protobuf-codegen 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c12a571137dc99703cb46fa21f185834fc5578a65836573fcff127f7b53f41e1" -"checksum protoc 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd83d2547a9e2c8bc6016607281b3ec7ef4871c55be6930915481d80350ab88" +"checksum protoc 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8f89b56360a99c36ff8dcf7cc969b291fbae680b027e768bfd27110606f45271" "checksum protoc-grpcio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b0292d93a536174ff6bafe8b5e8534aeeb2b039146bae59770c07f4d2c2458c9" "checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" +"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" @@ -3949,8 +4026,8 @@ dependencies = [ "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" -"checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" -"checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" +"checksum regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8900ebc1363efa7ea1c399ccc32daed870b4002651e0bed86e72d501ebbe0048" +"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" "checksum ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)" = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" @@ -3961,19 +4038,19 @@ dependencies = [ "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustfix 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7150ac777a2931a53489f5a41eb0937b84e3092a20cd0e73ad436b65b507f607" "checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" -"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" +"checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" "checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" "checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +"checksum serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "e707fbbf255b8fc8c3b99abb91e7257a622caeb20a9818cbadbeeede4e0932ff" +"checksum serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "ac5d00fc561ba2724df6758a17de23df5914f20e41cb00f94d5b7ae42fffaff8" "checksum serde_ignored 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "190e9765dcedb56be63b6e0993a006c7e3b071a016a304736e4a315dc01fb142" "checksum serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" -"checksum serde_test 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "33f96dff8c3744387b53404ea33e834073b0791dcc1ea9c85b805745f9324704" +"checksum serde_test 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "4a6563891298bffe3306cbd5f058845f406f3ceb505c8cb2e4e103d12807d7ee" "checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" "checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" "checksum shell-escape 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "170a13e64f2a51b77a45702ba77287f5c6829375b04a69cf2222acd17d0cfab9" @@ -3984,7 +4061,6 @@ dependencies = [ "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" -"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spectral 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3c15181f4b14e52eeaac3efaeec4d2764716ce9c86da0c934c3e318649c5ba" "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" @@ -3994,7 +4070,7 @@ dependencies = [ "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" +"checksum syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)" = "b3196bfbffbba3e57481b6ea32249fbaf590396a52505a2615adbb79d9d826d3" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" @@ -4007,7 +4083,7 @@ dependencies = [ "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" +"checksum tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616" "checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" "checksum tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" "checksum tokio-connect 0.1.0 (git+https://github.com/pantsbuild/tokio-connect?rev=f7ad1ca437973d6e24037ac6f7d5ef1013833c0b)" = "" @@ -4015,7 +4091,7 @@ dependencies = [ "checksum tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" "checksum tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" "checksum tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" -"checksum tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" +"checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" "checksum tokio-process 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "382d90f43fa31caebe5d3bc6cfd854963394fff3b8cb59d5146607aaae7e7e43" "checksum tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" "checksum tokio-rustls 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d7cf08f990090abd6c6a73cab46fed62f85e8aef8b99e4b918a9f4a637f0676" @@ -4055,22 +4131,19 @@ dependencies = [ "checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" "checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" "checksum walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780" "checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" -"checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" -"checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" -"checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" -"checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" -"checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" -"checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" +"checksum wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3557c397ab5a8e347d434782bcd31fc1483d927a6826804cec05cc792ee2519d" +"checksum wasm-bindgen-backend 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "e0da9c9a19850d3af6df1cb9574970b566d617ecfaf36eb0b706b6f3ef9bd2f8" +"checksum wasm-bindgen-macro 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "0f6fde1d36e75a714b5fe0cffbb78978f222ea6baebb726af13c78869fdb4205" +"checksum wasm-bindgen-macro-support 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "25bda4168030a6412ea8a047e27238cadf56f0e53516e1e83fec0a8b7c786f6d" +"checksum wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "fc9f36ad51f25b0219a3d4d13b90eb44cd075dff8b6280cca015775d7acaddd8" +"checksum web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "721c6263e2c66fd44501cc5efbfa2b7dfa775d13e4ea38c46299646ed1f9c70a" "checksum webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" "checksum webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" -"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index ffe94f7ad49..b465386c211 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -117,6 +117,12 @@ uuid = { version = "0.7", features = ["v4"] } task_executor = { path = "task_executor" } workunit_store = { path = "workunit_store" } +[dev-dependencies] +testutil = { path = "./testutil" } +fs = { path = "./fs" } +tokio = "0.1" +env_logger = "0.5.4" + [patch.crates-io] # TODO: Remove patch when we can upgrade to an official released version of protobuf with a fix. # See: https://github.com/pantsbuild/pants/issues/7760 for context. diff --git a/src/rust/engine/graph/src/entry.rs b/src/rust/engine/graph/src/entry.rs index 5f2627c3b8b..c8254a73edd 100644 --- a/src/rust/engine/graph/src/entry.rs +++ b/src/rust/engine/graph/src/entry.rs @@ -18,10 +18,10 @@ use boxfuture::{BoxFuture, Boxable}; /// the Node was `cleared`), the work is discarded. See `Entry::complete` for more information. /// #[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub(crate) struct RunToken(u32); +pub struct RunToken(u32); impl RunToken { - fn initial() -> RunToken { + pub fn initial() -> RunToken { RunToken(0) } @@ -40,10 +40,10 @@ impl RunToken { /// incremented when the output of a node has changed. /// #[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub(crate) struct Generation(u32); +pub struct Generation(u32); impl Generation { - fn initial() -> Generation { + pub fn initial() -> Generation { Generation(0) } @@ -65,7 +65,7 @@ impl Generation { /// If the value is Clean, the consumer can simply use the value as-is. /// #[derive(Clone, Debug)] -pub(crate) enum EntryResult { +pub enum EntryResult { Clean(Result), Dirty(Result), Uncacheable( @@ -118,7 +118,7 @@ impl AsRef> for EntryResult { #[allow(clippy::type_complexity)] #[derive(Debug)] -pub(crate) enum EntryState { +pub enum EntryState { // A node that has either been explicitly cleared, or has not yet started Running. In this state // there is no need for a dirty bit because the RunToken is either in its initial state, or has // been explicitly incremented when the node was cleared. @@ -174,7 +174,7 @@ pub struct Entry { // maps is painful. node: N, - state: Arc>>, + pub state: Arc>>, } impl Entry { diff --git a/src/rust/engine/graph/src/lib.rs b/src/rust/engine/graph/src/lib.rs index 139968308f4..e703578605e 100644 --- a/src/rust/engine/graph/src/lib.rs +++ b/src/rust/engine/graph/src/lib.rs @@ -29,10 +29,12 @@ use hashing; use petgraph; -mod entry; +// make the entry module public for testing purposes. We use it to contruct mock +// graph entries in the notify watch tests. +pub mod entry; mod node; -pub use crate::entry::Entry; +pub use crate::entry::{Entry, EntryState}; use crate::entry::{Generation, RunToken}; use std::collections::binary_heap::BinaryHeap; @@ -1007,6 +1009,45 @@ impl Graph { Ok(()) } } + +} + +// This module provides a trait which contains functions that +// should only be used in tests. A user must explicitly import the trait +// to use the extra test functions, and they should only be imported into +// test modules. +pub mod test_support { + use super::{EntryState, EntryId, Node}; + pub trait TestGraph { + fn set_fixture_entry_state_for_id(&self, id: EntryId, state: EntryState); + fn add_fixture_entry(&self, node: N) -> EntryId; + fn entry_state(&self, id: EntryId) -> &str; + } +} + +impl test_support::TestGraph for Graph { + fn set_fixture_entry_state_for_id(&self, id: EntryId, state: EntryState) { + let mut inner = self.inner.lock(); + let entry = inner.entry_for_id_mut(id).unwrap(); + let mut entry_state = entry.state.lock(); + *entry_state = state; + } + + fn add_fixture_entry(&self, node: N) -> EntryId { + let mut inner = self.inner.lock(); + inner.ensure_entry(node) + } + + fn entry_state(&self, id: EntryId) -> &str { + let mut inner = self.inner.lock(); + let entry = inner.entry_for_id_mut(id).unwrap(); + let entry_state = entry.state.lock(); + match *entry_state { + EntryState::Completed { .. } => "completed", + EntryState::Running { .. } => "running", + EntryState::NotStarted { .. } => "not started", + } + } } /// diff --git a/src/rust/engine/src/lib.rs b/src/rust/engine/src/lib.rs index 42ae5929f44..0d6efd13dd4 100644 --- a/src/rust/engine/src/lib.rs +++ b/src/rust/engine/src/lib.rs @@ -50,3 +50,6 @@ pub use crate::scheduler::{ }; pub use crate::tasks::{Rule, Tasks}; pub use crate::types::Types; + +#[cfg(test)] +mod watch_tests; diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index e88f05475da..8b250804f07 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -39,6 +39,11 @@ impl InvalidationWatcher { graph: Weak>, build_root: PathBuf, ) -> Result { + // Inotify events contain canonical paths to the files being watched. + // If the build_root contains a symlink the paths returned in notify events + // wouldn't have the build_root as a prefix, and so we would miss invalidating certain nodes. + // We canonicalize the build_root once so this isn't a problem. + let canonical_build_root = std::fs::canonicalize(build_root.as_path()).map_err(|e| format!("{:?}", e))?.to_path_buf(); let (watch_sender, watch_receiver) = crossbeam_channel::unbounded(); let watcher = Arc::new(Mutex::new( Watcher::new(watch_sender, Duration::from_millis(50)) @@ -65,8 +70,8 @@ impl InvalidationWatcher { // relativize paths to build root. let mut paths_to_invalidate: Vec = vec![]; let path_relative_to_build_root = { - if path.starts_with(&build_root) { - path.strip_prefix(&build_root).unwrap().into() + if path.starts_with(&canonical_build_root) { + path.strip_prefix(&canonical_build_root).unwrap().into() } else { path } diff --git a/src/rust/engine/src/watch_tests.rs b/src/rust/engine/src/watch_tests.rs new file mode 100644 index 00000000000..afc000b6b8d --- /dev/null +++ b/src/rust/engine/src/watch_tests.rs @@ -0,0 +1,53 @@ +use std::sync::Arc; +use std::path::{PathBuf}; +use std::thread::sleep; +use std::time::Duration; +use crate::watch::InvalidationWatcher; +use graph::{Graph, test_support::TestGraph}; +use hashing::EMPTY_DIGEST; +use graph::entry::{RunToken, Generation, EntryState, EntryResult}; +use crate::nodes::{DigestFile, NodeKey, NodeResult}; +use fs::File; +use testutil::make_file; + +#[test] +fn receive_watch_event_on_file_change() { + env_logger::init(); + // setup a build_root with a file in it to watch. + let build_root = tempfile::TempDir::new().unwrap(); + let content = "contents".as_bytes().to_vec(); + let file_path = build_root.path().join("watch_me.txt"); + make_file(&file_path, &content, 0o600); + + // set up a node in the graph to check that it gets cleared by the invalidation watcher. + let node = NodeKey::DigestFile(DigestFile(File {path: PathBuf::from("watch_me.txt"), is_executable: false})); + let graph = Arc::new(Graph::new()); + let entry_id = graph.add_fixture_entry(node); + let completed_state = EntryState::Completed { + run_token: RunToken::initial(), + generation: Generation::initial(), + result: EntryResult::Clean(Ok(NodeResult::Digest(EMPTY_DIGEST))), + dep_generations: vec![], + }; + graph.set_fixture_entry_state_for_id(entry_id, completed_state); + // Assert the nodes initial state is completed + assert!(graph.entry_state(entry_id) == "completed"); + // Instantiate a watcher and watch the file in question. + let watcher = InvalidationWatcher::new(Arc::downgrade(&graph), build_root.path().to_path_buf()).expect("Couldn't create InvalidationWatcher"); + let mut rt = tokio::runtime::Runtime::new().unwrap(); + rt.block_on(watcher.watch(file_path.clone())).unwrap(); + // Update the content of the file being watched. + let new_content = "stnetonc".as_bytes().to_vec(); + make_file(&file_path, &new_content, 0o600); + // Wait for watcher background thread to trigger a node invalidation, + // by checking the entry state for the node. It will be reset to EntryState::NotStarted + // when Graph::invalidate_from_roots calls clear on the node. + for _ in 0..10 { + sleep(Duration::from_millis(100)); + if graph.entry_state(entry_id) == "not started" { + return + } + } + // If we didn't find a new state fail the test. + assert!(false, "Nodes EntryState was not invalidated, or reset to NotStarted.") +} diff --git a/tests/python/pants_test/engine/test_fs.py b/tests/python/pants_test/engine/test_fs.py index 36cdb9a544f..71e4606bffc 100644 --- a/tests/python/pants_test/engine/test_fs.py +++ b/tests/python/pants_test/engine/test_fs.py @@ -736,7 +736,8 @@ def test_file_content_invalidated(self) -> None: break else: raise AssertionError( - f"New content {new_data} was not found in the FilesContent of the modified file {path_to_fname}, instead we found {new_content[fname]}" + f"New content {new_data} was not found in the FilesContent of the " + "modified file {path_to_fname}, instead we found {new_content[fname]}" ) def test_file_content_invalidated_after_parent_deletion(self) -> None: From d9dd5def2388d1b32702a24dc6571381b2e6cdef Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Fri, 20 Mar 2020 19:32:41 -0700 Subject: [PATCH 05/15] Refactor Python tests. Return watch errors as core::Failure all the way to user. Check notify event type when deciding whether to invalidate parents. Move task executor onto invalidation watcher. Move test_support trait impl into test_support mod. --- src/python/pants/engine/scheduler.py | 3 ++ src/rust/engine/graph/src/lib.rs | 48 ++++++++++--------- src/rust/engine/src/context.rs | 3 +- src/rust/engine/src/core.rs | 2 + src/rust/engine/src/externs.rs | 1 + src/rust/engine/src/nodes.rs | 16 ++++--- src/rust/engine/src/watch.rs | 56 +++++++++++++++-------- src/rust/engine/src/watch_tests.rs | 39 ++++++++++------ src/rust/engine/testutil/src/lib.rs | 5 ++ tests/python/pants_test/engine/test_fs.py | 46 +++++++++++++------ 10 files changed, 141 insertions(+), 78 deletions(-) diff --git a/src/python/pants/engine/scheduler.py b/src/python/pants/engine/scheduler.py index 6c3af88b611..424725e3d19 100644 --- a/src/python/pants/engine/scheduler.py +++ b/src/python/pants/engine/scheduler.py @@ -235,7 +235,10 @@ def rule_subgraph_visualization(self, root_subject_type, product_type): yield line.rstrip() def invalidate_files(self, direct_filenames): + # NB: Watchman no longer triggers events when children are created/deleted under a directory, + # so we always need to invalidate the direct parent as well. filenames = set(direct_filenames) + filenames.update(os.path.dirname(f) for f in direct_filenames) filenames_buf = self._native.context.utf8_buf_buf(filenames) return self._native.lib.graph_invalidate(self._scheduler, filenames_buf) diff --git a/src/rust/engine/graph/src/lib.rs b/src/rust/engine/graph/src/lib.rs index e703578605e..51a60a546d8 100644 --- a/src/rust/engine/graph/src/lib.rs +++ b/src/rust/engine/graph/src/lib.rs @@ -1009,43 +1009,41 @@ impl Graph { Ok(()) } } - } -// This module provides a trait which contains functions that +// This module provides a trait which contains functions that // should only be used in tests. A user must explicitly import the trait -// to use the extra test functions, and they should only be imported into +// to use the extra test functions, and they should only be imported into // test modules. pub mod test_support { - use super::{EntryState, EntryId, Node}; + use super::{EntryId, EntryState, Graph, Node}; pub trait TestGraph { fn set_fixture_entry_state_for_id(&self, id: EntryId, state: EntryState); fn add_fixture_entry(&self, node: N) -> EntryId; fn entry_state(&self, id: EntryId) -> &str; } -} - -impl test_support::TestGraph for Graph { - fn set_fixture_entry_state_for_id(&self, id: EntryId, state: EntryState) { - let mut inner = self.inner.lock(); - let entry = inner.entry_for_id_mut(id).unwrap(); - let mut entry_state = entry.state.lock(); - *entry_state = state; - } + impl TestGraph for Graph { + fn set_fixture_entry_state_for_id(&self, id: EntryId, state: EntryState) { + let mut inner = self.inner.lock(); + let entry = inner.entry_for_id_mut(id).unwrap(); + let mut entry_state = entry.state.lock(); + *entry_state = state; + } - fn add_fixture_entry(&self, node: N) -> EntryId { - let mut inner = self.inner.lock(); - inner.ensure_entry(node) - } + fn add_fixture_entry(&self, node: N) -> EntryId { + let mut inner = self.inner.lock(); + inner.ensure_entry(node) + } - fn entry_state(&self, id: EntryId) -> &str { - let mut inner = self.inner.lock(); - let entry = inner.entry_for_id_mut(id).unwrap(); - let entry_state = entry.state.lock(); - match *entry_state { - EntryState::Completed { .. } => "completed", - EntryState::Running { .. } => "running", - EntryState::NotStarted { .. } => "not started", + fn entry_state(&self, id: EntryId) -> &str { + let mut inner = self.inner.lock(); + let entry = inner.entry_for_id_mut(id).unwrap(); + let entry_state = entry.state.lock(); + match *entry_state { + EntryState::Completed { .. } => "completed", + EntryState::Running { .. } => "running", + EntryState::NotStarted { .. } => "not started", + } } } } diff --git a/src/rust/engine/src/context.rs b/src/rust/engine/src/context.rs index 2a2b84de3ce..6914a617433 100644 --- a/src/rust/engine/src/context.rs +++ b/src/rust/engine/src/context.rs @@ -221,7 +221,8 @@ impl Core { )); } let graph = Arc::new(Graph::new()); - let watcher = InvalidationWatcher::new(Arc::downgrade(&graph), build_root.clone())?; + let watcher = + InvalidationWatcher::new(Arc::downgrade(&graph), executor.clone(), build_root.clone())?; let http_client = reqwest::r#async::Client::new(); let rule_graph = RuleGraph::new(tasks.as_map(), root_subject_types); diff --git a/src/rust/engine/src/core.rs b/src/rust/engine/src/core.rs index 2eb2faa27cb..ae343980a35 100644 --- a/src/rust/engine/src/core.rs +++ b/src/rust/engine/src/core.rs @@ -289,6 +289,7 @@ pub enum Failure { Invalidated, /// A rule raised an exception. Throw(Value, String), + FileWatch(String), } impl fmt::Display for Failure { @@ -296,6 +297,7 @@ impl fmt::Display for Failure { match self { Failure::Invalidated => write!(f, "Exhausted retries due to changed files."), Failure::Throw(exc, _) => write!(f, "{}", externs::val_to_str(exc)), + Failure::FileWatch(failure) => write!(f, "{}", failure), } } } diff --git a/src/rust/engine/src/externs.rs b/src/rust/engine/src/externs.rs index 33c9b745a6f..68fcf11e404 100644 --- a/src/rust/engine/src/externs.rs +++ b/src/rust/engine/src/externs.rs @@ -462,6 +462,7 @@ impl From> for PyResult { let val = match f { f @ Failure::Invalidated => create_exception(&format!("{}", f)), Failure::Throw(exc, _) => exc, + Failure::FileWatch(failure) => create_exception(&failure), }; PyResult { is_throw: true, diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index 52539e2bb09..6ccc9e3b282 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -929,7 +929,7 @@ impl NodeVisualizer for Visualizer { let max_colors = 12; match entry.peek(context) { None => "white".to_string(), - Some(Err(Failure::Throw(..))) => "4".to_string(), + Some(Err(Failure::Throw(..))) | Some(Err(Failure::FileWatch(..))) => "4".to_string(), Some(Err(Failure::Invalidated)) => "12".to_string(), Some(Ok(_)) => { let viz_colors_len = self.viz_colors.len(); @@ -950,6 +950,7 @@ impl NodeTracer for Tracer { match result { Some(Err(Failure::Invalidated)) => false, Some(Err(Failure::Throw(..))) => false, + Some(Err(Failure::FileWatch(..))) => false, Some(Ok(_)) => true, None => { // A Node with no state is either still running, or effectively cancelled @@ -974,6 +975,7 @@ impl NodeTracer for Tracer { .join("\n") ), Some(Err(Failure::Invalidated)) => "Invalidated".to_string(), + Some(Err(Failure::FileWatch(failure))) => format!("FileWatch failed: {}", failure), } } } @@ -1060,17 +1062,17 @@ impl Node for NodeKey { move || { if let Some(path) = self2.fs_subject() { let abs_path = context.core.build_root.join(path); - context - .core - .executor - .spawn_on_io_pool(context.core.watcher.watch(abs_path)) - .to_boxed() + context.core.watcher.watch(abs_path) } else { future::ok(()).to_boxed() } } }) - .then(|_| { + // This will cause a node to fail if we cannot watch its fs_subject. That doesn't + // seem too farfetched, but there may be unknown consequences. We can + // ignore notify::ErrorKind::PathNotFound if needed. + .map_err(|e| Failure::FileWatch(format!("{:?}", e))) + .and_then(|()| { future::lazy(|| { if let Some(span_id) = maybe_span_id { set_parent_id(span_id); diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 8b250804f07..9435e3aa753 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -10,10 +10,10 @@ use std::time::Duration; use boxfuture::{BoxFuture, Boxable}; use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; use futures01 as futures; -use futures01::future::Future; use log::{debug, error, info, warn}; -use notify::{RecommendedWatcher, RecursiveMode, Watcher}; +use notify::{event::EventKind, RecommendedWatcher, RecursiveMode, Watcher}; use parking_lot::Mutex; +use task_executor::Executor; use graph::{Graph, InvalidationResult}; use logging; @@ -29,21 +29,30 @@ use crate::nodes::NodeKey; /// /// TODO: Need the above polling /// +/// TODO: To simplify testing the InvalidationWatcher we could impl a trait which +/// has an `invalidate_from_roots` method that is called from the background event thread. +/// Then we wouldn't have to mock out a Graph object in watch_tests.rs. This will probably +/// only be possible when we remove watchman invalidation, when the code path for invaldation will be +/// the notify background thread. +/// pub struct InvalidationWatcher { watcher: Arc>, + executor: Executor, liveness: Receiver<()>, } impl InvalidationWatcher { pub fn new( graph: Weak>, + executor: Executor, build_root: PathBuf, ) -> Result { // Inotify events contain canonical paths to the files being watched. // If the build_root contains a symlink the paths returned in notify events // wouldn't have the build_root as a prefix, and so we would miss invalidating certain nodes. // We canonicalize the build_root once so this isn't a problem. - let canonical_build_root = std::fs::canonicalize(build_root.as_path()).map_err(|e| format!("{:?}", e))?.to_path_buf(); + let canonical_build_root = + std::fs::canonicalize(build_root.as_path()).map_err(|e| format!("{:?}", e))?; let (watch_sender, watch_receiver) = crossbeam_channel::unbounded(); let watcher = Arc::new(Mutex::new( Watcher::new(watch_sender, Duration::from_millis(50)) @@ -63,12 +72,12 @@ impl InvalidationWatcher { }; match event_res { Ok(Ok(ev)) => { + let event_kind = ev.kind.clone(); let paths: HashSet<_> = ev .paths .into_iter() .map(|path| { // relativize paths to build root. - let mut paths_to_invalidate: Vec = vec![]; let path_relative_to_build_root = { if path.starts_with(&canonical_build_root) { path.strip_prefix(&canonical_build_root).unwrap().into() @@ -76,11 +85,25 @@ impl InvalidationWatcher { path } }; - paths_to_invalidate.push(path_relative_to_build_root.clone()); - if let Some(parent_dir) = path_relative_to_build_root.parent() { - paths_to_invalidate.push(parent_dir.to_path_buf()); + match event_kind { + EventKind::Access(..) | EventKind::Other => vec![], + // If the event is modifying an existing path then we can + // invalidate only matching nodes. + EventKind::Modify(..) => vec![path_relative_to_build_root], + // If the event is creating a new file under a watched path + // then we have to invalidate the parent path as well because + // Scandir nodes will be invalid. EventKind::Any is a catch all for + // unknown events, we should be safe in these cases, and invalidate + // parent paths as well. + EventKind::Create(..) | EventKind::Remove(..) | EventKind::Any => { + let mut paths = vec![]; + if let Some(parent_path) = path_relative_to_build_root.parent() { + paths.push(parent_path.to_path_buf()) + } + paths.push(path_relative_to_build_root); + paths + } } - paths_to_invalidate }) .flatten() .collect(); @@ -110,6 +133,7 @@ impl InvalidationWatcher { Ok(InvalidationWatcher { watcher, + executor, liveness: thread_liveness_receiver, }) } @@ -117,17 +141,13 @@ impl InvalidationWatcher { /// /// Watch the given path non-recursively. /// - pub fn watch(&self, path: PathBuf) -> BoxFuture<(), ()> { + pub fn watch(&self, path: PathBuf) -> BoxFuture<(), notify::Error> { let watcher = self.watcher.clone(); - let path2 = path.clone(); - futures::lazy(move || watcher.lock().watch(path, RecursiveMode::NonRecursive)) - .then(move |r| match r { - Ok(_) => futures::future::ok(()).to_boxed(), - Err(e) => { - warn!("Failed to watch path {:?}, with error {:?}", path2, e); - futures::future::err(()).to_boxed() - } - }) + self + .executor + .spawn_on_io_pool(futures::lazy(move || { + watcher.lock().watch(path, RecursiveMode::NonRecursive) + })) .to_boxed() } diff --git a/src/rust/engine/src/watch_tests.rs b/src/rust/engine/src/watch_tests.rs index afc000b6b8d..f2f6a0b442f 100644 --- a/src/rust/engine/src/watch_tests.rs +++ b/src/rust/engine/src/watch_tests.rs @@ -1,14 +1,15 @@ +use crate::nodes::{DigestFile, NodeKey, NodeResult}; +use crate::watch::InvalidationWatcher; +use fs::File; +use graph::entry::{EntryResult, EntryState, Generation, RunToken}; +use graph::{test_support::TestGraph, Graph}; +use hashing::EMPTY_DIGEST; +use std::path::PathBuf; use std::sync::Arc; -use std::path::{PathBuf}; use std::thread::sleep; use std::time::Duration; -use crate::watch::InvalidationWatcher; -use graph::{Graph, test_support::TestGraph}; -use hashing::EMPTY_DIGEST; -use graph::entry::{RunToken, Generation, EntryState, EntryResult}; -use crate::nodes::{DigestFile, NodeKey, NodeResult}; -use fs::File; -use testutil::make_file; +use task_executor::Executor; +use testutil::{append_to_exisiting_file, make_file}; #[test] fn receive_watch_event_on_file_change() { @@ -20,7 +21,10 @@ fn receive_watch_event_on_file_change() { make_file(&file_path, &content, 0o600); // set up a node in the graph to check that it gets cleared by the invalidation watcher. - let node = NodeKey::DigestFile(DigestFile(File {path: PathBuf::from("watch_me.txt"), is_executable: false})); + let node = NodeKey::DigestFile(DigestFile(File { + path: PathBuf::from("watch_me.txt"), + is_executable: false, + })); let graph = Arc::new(Graph::new()); let entry_id = graph.add_fixture_entry(node); let completed_state = EntryState::Completed { @@ -33,21 +37,30 @@ fn receive_watch_event_on_file_change() { // Assert the nodes initial state is completed assert!(graph.entry_state(entry_id) == "completed"); // Instantiate a watcher and watch the file in question. - let watcher = InvalidationWatcher::new(Arc::downgrade(&graph), build_root.path().to_path_buf()).expect("Couldn't create InvalidationWatcher"); + let executor = Executor::new(); + let watcher = InvalidationWatcher::new( + Arc::downgrade(&graph), + executor, + build_root.path().to_path_buf(), + ) + .expect("Couldn't create InvalidationWatcher"); let mut rt = tokio::runtime::Runtime::new().unwrap(); rt.block_on(watcher.watch(file_path.clone())).unwrap(); // Update the content of the file being watched. let new_content = "stnetonc".as_bytes().to_vec(); - make_file(&file_path, &new_content, 0o600); + append_to_exisiting_file(&file_path, &new_content); // Wait for watcher background thread to trigger a node invalidation, // by checking the entry state for the node. It will be reset to EntryState::NotStarted // when Graph::invalidate_from_roots calls clear on the node. for _ in 0..10 { sleep(Duration::from_millis(100)); if graph.entry_state(entry_id) == "not started" { - return + return; } } // If we didn't find a new state fail the test. - assert!(false, "Nodes EntryState was not invalidated, or reset to NotStarted.") + assert!( + false, + "Nodes EntryState was not invalidated, or reset to NotStarted." + ) } diff --git a/src/rust/engine/testutil/src/lib.rs b/src/rust/engine/testutil/src/lib.rs index 075623877ee..342a5b0c24a 100644 --- a/src/rust/engine/testutil/src/lib.rs +++ b/src/rust/engine/testutil/src/lib.rs @@ -53,3 +53,8 @@ pub fn make_file(path: &Path, contents: &[u8], mode: u32) { permissions.set_mode(mode); file.set_permissions(permissions).unwrap(); } + +pub fn append_to_exisiting_file(path: &Path, contents: &[u8]) { + let mut file = std::fs::OpenOptions::new().write(true).open(&path).unwrap(); + file.write_all(contents).unwrap(); +} diff --git a/tests/python/pants_test/engine/test_fs.py b/tests/python/pants_test/engine/test_fs.py index 71e4606bffc..1fbda3c0ab7 100644 --- a/tests/python/pants_test/engine/test_fs.py +++ b/tests/python/pants_test/engine/test_fs.py @@ -12,7 +12,9 @@ from contextlib import contextmanager from http.server import BaseHTTPRequestHandler from pathlib import Path +from typing import Callable +from pants.base.file_system_project_tree import FileSystemProjectTree from pants.engine.fs import ( EMPTY_DIRECTORY_DIGEST, Digest, @@ -141,7 +143,7 @@ def test_walk_parent_link(self): def test_walk_escaping_symlink(self): link = "subdir/escaping" - dest = "../../this-is-probably-nonexistent" + dest = "../../" def prepare(project_tree): link_path = os.path.join(project_tree.build_root, link) @@ -728,13 +730,15 @@ def test_file_content_invalidated(self) -> None: path_to_fname = os.path.join(project_tree.build_root, fname) with open(path_to_fname, "w") as f: f.write(new_data) - for i in range(4): - time.sleep(0.1 * i) + + def assertion_fn(): new_content = self.read_file_content(scheduler, [fname]) if new_content[fname].decode("utf-8") == new_data: # successfully read new data - break - else: + return True + return False + + if not self.try_with_backoff(assertion_fn): raise AssertionError( f"New content {new_data} was not found in the FilesContent of the " "modified file {path_to_fname}, instead we found {new_content[fname]}" @@ -751,17 +755,21 @@ def test_file_content_invalidated_after_parent_deletion(self) -> None: self.assertIn(fname, original_content) path_to_parent_dir = os.path.join(project_tree.build_root, "a/b/") shutil.rmtree(path_to_parent_dir) - for i in range(4): - time.sleep(0.1 * i) + + def assertion_fn(): new_content = self.read_file_content(scheduler, [fname]) if new_content.get(fname) is None: - break - else: + return True + return False + + if not self.try_with_backoff(assertion_fn): raise AssertionError( f"Deleting parent dir and could still read file from original snapshot." ) - def assert_mutated_directory_digest(self, mutation_function): + def assert_mutated_directory_digest( + self, mutation_function: Callable[[FileSystemProjectTree, str], Exception] + ): with self.mk_project_tree() as project_tree: scheduler = self.mk_scheduler(rules=create_fs_rules(), project_tree=project_tree) dir_path = "a/" @@ -771,18 +779,28 @@ def assert_mutated_directory_digest(self, mutation_function): ).value assert not initial_snapshot.is_empty assertion_error = mutation_function(project_tree, dir_path) - for i in range(4): - time.sleep(0.1 * i) + + def assertion_fn(): new_snapshot = self.execute_expecting_one_result( scheduler, Snapshot, self.path_globs([dir_glob]) ).value assert not new_snapshot.is_empty if initial_snapshot.directory_digest != new_snapshot.directory_digest: # successfully invalidated snapshot and got a new digest - break - else: + return True + return False + + if not self.try_with_backoff(assertion_fn): raise assertion_error + @staticmethod + def try_with_backoff(assertion_fn: Callable[[], bool]) -> bool: + for i in range(4): + time.sleep(0.1 * i) + if assertion_fn(): + return True + return False + def test_directory_digest_invalidated_by_child_removal(self): def mutation_function(project_tree, dir_path): removed_path = os.path.join(project_tree.build_root, dir_path, "3.txt") From 6dd0288e4d0611fa69e0820b0c14bb042272ae34 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Sat, 21 Mar 2020 15:40:55 -0700 Subject: [PATCH 06/15] Remove notify event specific handling. Get rid of unncessary future::lazy --- src/rust/engine/src/nodes.rs | 19 ++++++++----------- src/rust/engine/src/watch.rs | 34 +++++++++++----------------------- 2 files changed, 19 insertions(+), 34 deletions(-) diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index 6ccc9e3b282..9a37ddf3f2c 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -1056,18 +1056,15 @@ impl Node for NodeKey { }; let context2 = context.clone(); - future::lazy({ - let context = context.clone(); - let self2 = self.clone(); - move || { - if let Some(path) = self2.fs_subject() { - let abs_path = context.core.build_root.join(path); - context.core.watcher.watch(abs_path) - } else { - future::ok(()).to_boxed() - } + let maybe_watch = { + if let Some(path) = self.fs_subject() { + let abs_path = context.core.build_root.join(path); + context.core.watcher.watch(abs_path) + } else { + future::ok(()).to_boxed() } - }) + }; + maybe_watch // This will cause a node to fail if we cannot watch its fs_subject. That doesn't // seem too farfetched, but there may be unknown consequences. We can // ignore notify::ErrorKind::PathNotFound if needed. diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 9435e3aa753..6fb37e1147f 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -11,7 +11,7 @@ use boxfuture::{BoxFuture, Boxable}; use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; use futures01 as futures; use log::{debug, error, info, warn}; -use notify::{event::EventKind, RecommendedWatcher, RecursiveMode, Watcher}; +use notify::{RecommendedWatcher, RecursiveMode, Watcher}; use parking_lot::Mutex; use task_executor::Executor; @@ -29,11 +29,13 @@ use crate::nodes::NodeKey; /// /// TODO: Need the above polling /// -/// TODO: To simplify testing the InvalidationWatcher we could impl a trait which -/// has an `invalidate_from_roots` method that is called from the background event thread. +/// TODO: To simplify testing the InvalidationWatcher we could create a trait which +/// has an `invalidate_from_roots` method and impl it on the Graph. Then we could make the InvalidationWatcher +/// take an argument that implements the trait. /// Then we wouldn't have to mock out a Graph object in watch_tests.rs. This will probably -/// only be possible when we remove watchman invalidation, when the code path for invaldation will be +/// only be possible when we remove watchman invalidation, when the one code path for invaldation will be /// the notify background thread. +/// Potential impl here: https://github.com/pantsbuild/pants/pull/9318#discussion_r396005978 /// pub struct InvalidationWatcher { watcher: Arc>, @@ -72,12 +74,12 @@ impl InvalidationWatcher { }; match event_res { Ok(Ok(ev)) => { - let event_kind = ev.kind.clone(); let paths: HashSet<_> = ev .paths .into_iter() .map(|path| { // relativize paths to build root. + let mut paths_to_invalidate: Vec = vec![]; let path_relative_to_build_root = { if path.starts_with(&canonical_build_root) { path.strip_prefix(&canonical_build_root).unwrap().into() @@ -85,25 +87,11 @@ impl InvalidationWatcher { path } }; - match event_kind { - EventKind::Access(..) | EventKind::Other => vec![], - // If the event is modifying an existing path then we can - // invalidate only matching nodes. - EventKind::Modify(..) => vec![path_relative_to_build_root], - // If the event is creating a new file under a watched path - // then we have to invalidate the parent path as well because - // Scandir nodes will be invalid. EventKind::Any is a catch all for - // unknown events, we should be safe in these cases, and invalidate - // parent paths as well. - EventKind::Create(..) | EventKind::Remove(..) | EventKind::Any => { - let mut paths = vec![]; - if let Some(parent_path) = path_relative_to_build_root.parent() { - paths.push(parent_path.to_path_buf()) - } - paths.push(path_relative_to_build_root); - paths - } + paths_to_invalidate.push(path_relative_to_build_root.clone()); + if let Some(parent_dir) = path_relative_to_build_root.parent() { + paths_to_invalidate.push(parent_dir.to_path_buf()); } + paths_to_invalidate }) .flatten() .collect(); From e9160894e19bb91ae6b1823ddd610ef26353ab43 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Sun, 22 Mar 2020 11:29:50 -0700 Subject: [PATCH 07/15] add warn to scandir run --- src/rust/engine/src/nodes.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index 9a37ddf3f2c..1f6206e9abc 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -13,6 +13,7 @@ use std::{self, fmt}; use futures01::future::{self, Future}; use futures01::Stream; use url::Url; +use log::warn; use crate::context::{Context, Core}; use crate::core::{throw, Failure, Key, Params, TypeId, Value}; @@ -1058,6 +1059,7 @@ impl Node for NodeKey { let context2 = context.clone(); let maybe_watch = { if let Some(path) = self.fs_subject() { + warn!("for node {} waching fs_subject {:?}", self, path); let abs_path = context.core.build_root.join(path); context.core.watcher.watch(abs_path) } else { From 263fc05d3734284b59507797b25a9681edab1b43 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Mon, 23 Mar 2020 12:28:01 -0700 Subject: [PATCH 08/15] use futures lock on watcher --- src/rust/engine/Cargo.lock | 13 +++++++++++++ src/rust/engine/Cargo.toml | 2 ++ src/rust/engine/src/nodes.rs | 4 ++-- src/rust/engine/src/watch.rs | 20 ++++++++++++-------- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/rust/engine/Cargo.lock b/src/rust/engine/Cargo.lock index 1efaade1e8b..40130e14c4b 100644 --- a/src/rust/engine/Cargo.lock +++ b/src/rust/engine/Cargo.lock @@ -702,6 +702,7 @@ dependencies = [ name = "engine" version = "0.0.1" dependencies = [ + "async_semaphore 0.0.1", "boxfuture 0.0.1", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "concrete_time 0.0.1", @@ -710,6 +711,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fs 0.0.1", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-locks 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "graph 0.0.1", "hashing 0.0.1", "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1035,6 +1037,16 @@ name = "futures-io" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "futures-locks" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "futures-macro" version = "0.3.4" @@ -3884,6 +3896,7 @@ dependencies = [ "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" "checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" +"checksum futures-locks 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5658075ca5ae3918993c5bc95b43fcf22f927227660556a947da598f9f8981" "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index b465386c211..42e7c59a773 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -81,6 +81,7 @@ default-members = [ ] [dependencies] +async_semaphore = { path = "async_semaphore" } boxfuture = { path = "boxfuture" } bytes = "0.4.5" concrete_time = { path = "concrete_time" } @@ -88,6 +89,7 @@ crossbeam-channel = "0.3" fnv = "1.0.5" fs = { path = "fs" } futures01 = { package = "futures", version = "0.1" } +futures-locks = "0.3.0" graph = { path = "graph" } hashing = { path = "hashing" } indexmap = "1.0.2" diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index 1f6206e9abc..a873cd1b023 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -13,7 +13,7 @@ use std::{self, fmt}; use futures01::future::{self, Future}; use futures01::Stream; use url::Url; -use log::warn; +//use log::warn; use crate::context::{Context, Core}; use crate::core::{throw, Failure, Key, Params, TypeId, Value}; @@ -1059,7 +1059,7 @@ impl Node for NodeKey { let context2 = context.clone(); let maybe_watch = { if let Some(path) = self.fs_subject() { - warn!("for node {} waching fs_subject {:?}", self, path); + //warn!("for node {} waching fs_subject {:?}", self, path); let abs_path = context.core.build_root.join(path); context.core.watcher.watch(abs_path) } else { diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 6fb37e1147f..8548ecde87a 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -9,10 +9,10 @@ use std::time::Duration; use boxfuture::{BoxFuture, Boxable}; use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; -use futures01 as futures; +use futures01::future::{Future, IntoFuture}; +use futures_locks::Mutex; use log::{debug, error, info, warn}; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; -use parking_lot::Mutex; use task_executor::Executor; use graph::{Graph, InvalidationResult}; @@ -131,12 +131,16 @@ impl InvalidationWatcher { /// pub fn watch(&self, path: PathBuf) -> BoxFuture<(), notify::Error> { let watcher = self.watcher.clone(); - self - .executor - .spawn_on_io_pool(futures::lazy(move || { - watcher.lock().watch(path, RecursiveMode::NonRecursive) - })) - .to_boxed() + let path2 = path.clone(); + let executor = self.executor.clone(); + watcher.lock() + .map_err(move |()| notify::Error::new(notify::ErrorKind::Generic(format!("Could not get lock on notify watcher to watch path {:?}", path2)))) + .and_then(move |mut watcher_lock| { + executor + .spawn_on_io_pool( + watcher_lock.watch(path, RecursiveMode::NonRecursive).into_future() + ) + }).to_boxed() } /// From 974b3ce1aff3e133b12ab59308ec1342eb79fc1c Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Mon, 23 Mar 2020 16:07:12 -0700 Subject: [PATCH 09/15] Move rust engine target directory to pants cache so it doesn't interfere with file watching. Format watch and nodes files. --- build-support/bin/check_rust_formatting.sh | 4 ++ .../bin/check_rust_target_headers.sh | 4 ++ build-support/bin/native/bootstrap_code.sh | 9 ++- build-support/common.sh | 4 ++ src/rust/engine/src/nodes.rs | 58 +++++++++---------- src/rust/engine/src/watch.rs | 26 ++++++--- 6 files changed, 65 insertions(+), 40 deletions(-) diff --git a/build-support/bin/check_rust_formatting.sh b/build-support/bin/check_rust_formatting.sh index 03e28ebfd76..07a21afc828 100755 --- a/build-support/bin/check_rust_formatting.sh +++ b/build-support/bin/check_rust_formatting.sh @@ -2,6 +2,10 @@ REPO_ROOT="$(git rev-parse --show-toplevel)" +# exports the CARGO_TARGET_DIR location +# shellcheck source=build-support/common.sh +source "${REPO_ROOT}/build-support/common.sh" + function usage() { echo "Checks formatting of rust files, optionally fixing mis-formatted files." echo diff --git a/build-support/bin/check_rust_target_headers.sh b/build-support/bin/check_rust_target_headers.sh index cc6c6473814..5dc4a80450d 100755 --- a/build-support/bin/check_rust_target_headers.sh +++ b/build-support/bin/check_rust_target_headers.sh @@ -2,6 +2,10 @@ REPO_ROOT="$(git rev-parse --show-toplevel)" +# exports the CARGO_TARGET_DIR location +# shellcheck source=build-support/common.sh +source "${REPO_ROOT}/build-support/common.sh" + cargo="${REPO_ROOT}/build-support/bin/native/cargo" "${cargo}" ensure-installed --package cargo-ensure-prefix --version 0.1.3 diff --git a/build-support/bin/native/bootstrap_code.sh b/build-support/bin/native/bootstrap_code.sh index 5c4b213e04b..7163a25da7f 100644 --- a/build-support/bin/native/bootstrap_code.sh +++ b/build-support/bin/native/bootstrap_code.sh @@ -69,7 +69,7 @@ function _build_native_code() { "${REPO_ROOT}/build-support/bin/native/cargo" build ${MODE_FLAG} \ --manifest-path "${NATIVE_ROOT}/Cargo.toml" -p engine_cffi ) || die - echo "${NATIVE_ROOT}/target/${MODE}/libengine_cffi.${LIB_EXTENSION}" + echo "${CARGO_TARGET_DIR}/${MODE}/libengine_cffi.${LIB_EXTENSION}" } function bootstrap_native_code() { @@ -79,6 +79,13 @@ function bootstrap_native_code() { local engine_version_hdr="engine_version: ${native_engine_version}" local target_binary="${NATIVE_ENGINE_CACHE_DIR}/${native_engine_version}/${NATIVE_ENGINE_BINARY}" local target_binary_metadata="${target_binary}.metadata" + if [[ -d "${NATIVE_ROOT}/target" ]] + then + die "The old native code cache ${NATIVE_ROOT}/target has been replaced +with ${CARGO_TARGET_DIR}\n +Please remove the old directory with: \`rm -rf ${NATIVE_ROOT}/target\`" + fi + if [[ ! -f "${target_binary}" || ! -f "${target_binary_metadata}" ]] then local -r native_binary="$(_build_native_code)" diff --git a/build-support/common.sh b/build-support/common.sh index d614535eac0..6dba4cb736e 100644 --- a/build-support/common.sh +++ b/build-support/common.sh @@ -2,6 +2,10 @@ # shellcheck disable=SC2034 CACHE_ROOT=${XDG_CACHE_HOME:-$HOME/.cache}/pants +# Set cargo to put compile artifacts into the pants cache, +# so they don't interfere with file watching. +export CARGO_TARGET_DIR="${CACHE_ROOT}/rust/target" + TRAVIS_FOLD_STATE="/tmp/.travis_fold_current" CLEAR_LINE="\x1b[K" diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index a873cd1b023..375427b1d1c 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -13,7 +13,6 @@ use std::{self, fmt}; use futures01::future::{self, Future}; use futures01::Stream; use url::Url; -//use log::warn; use crate::context::{Context, Core}; use crate::core::{throw, Failure, Key, Params, TypeId, Value}; @@ -1059,7 +1058,6 @@ impl Node for NodeKey { let context2 = context.clone(); let maybe_watch = { if let Some(path) = self.fs_subject() { - //warn!("for node {} waching fs_subject {:?}", self, path); let abs_path = context.core.build_root.join(path); context.core.watcher.watch(abs_path) } else { @@ -1067,36 +1065,36 @@ impl Node for NodeKey { } }; maybe_watch - // This will cause a node to fail if we cannot watch its fs_subject. That doesn't - // seem too farfetched, but there may be unknown consequences. We can - // ignore notify::ErrorKind::PathNotFound if needed. - .map_err(|e| Failure::FileWatch(format!("{:?}", e))) - .and_then(|()| { - future::lazy(|| { - if let Some(span_id) = maybe_span_id { - set_parent_id(span_id); - } - match self { - NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::MultiPlatformExecuteProcess(n) => { - n.run(context).map(NodeResult::from).to_boxed() + // This will cause a node to fail if we cannot watch its fs_subject. That doesn't + // seem too farfetched, but there may be unknown consequences. We can + // ignore notify::ErrorKind::PathNotFound if needed. + .map_err(|e| Failure::FileWatch(format!("{:?}", e))) + .and_then(|()| { + future::lazy(|| { + if let Some(span_id) = maybe_span_id { + set_parent_id(span_id); } - NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Scandir(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Select(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).to_boxed(), - NodeKey::Task(n) => n.run(context).map(NodeResult::from).to_boxed(), - } - }) - .inspect(move |_: &NodeResult| { - if let Some(started_workunit) = maybe_started_workunit { - let workunit: WorkUnit = started_workunit.finish(); - context2.session.workunit_store().add_workunit(workunit) - } + match self { + NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::MultiPlatformExecuteProcess(n) => { + n.run(context).map(NodeResult::from).to_boxed() + } + NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Scandir(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Select(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).to_boxed(), + NodeKey::Task(n) => n.run(context).map(NodeResult::from).to_boxed(), + } + }) + .inspect(move |_: &NodeResult| { + if let Some(started_workunit) = maybe_started_workunit { + let workunit: WorkUnit = started_workunit.finish(); + context2.session.workunit_store().add_workunit(workunit) + } + }) }) - }) - .to_boxed() + .to_boxed() } fn digest(res: NodeResult) -> Option { diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 8548ecde87a..a43a4645a97 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -35,7 +35,7 @@ use crate::nodes::NodeKey; /// Then we wouldn't have to mock out a Graph object in watch_tests.rs. This will probably /// only be possible when we remove watchman invalidation, when the one code path for invaldation will be /// the notify background thread. -/// Potential impl here: https://github.com/pantsbuild/pants/pull/9318#discussion_r396005978 +/// Potential impl here: https://github.com/pantsbuild/pants/pull/9318#discussion_r396005978 /// pub struct InvalidationWatcher { watcher: Arc>, @@ -133,14 +133,22 @@ impl InvalidationWatcher { let watcher = self.watcher.clone(); let path2 = path.clone(); let executor = self.executor.clone(); - watcher.lock() - .map_err(move |()| notify::Error::new(notify::ErrorKind::Generic(format!("Could not get lock on notify watcher to watch path {:?}", path2)))) - .and_then(move |mut watcher_lock| { - executor - .spawn_on_io_pool( - watcher_lock.watch(path, RecursiveMode::NonRecursive).into_future() - ) - }).to_boxed() + watcher + .lock() + .map_err(move |()| { + notify::Error::new(notify::ErrorKind::Generic(format!( + "Could not get lock on notify watcher to watch path {:?}", + path2 + ))) + }) + .and_then(move |mut watcher_lock| { + executor.spawn_on_io_pool( + watcher_lock + .watch(path, RecursiveMode::NonRecursive) + .into_future(), + ) + }) + .to_boxed() } /// From 3c5dc63c7189e1b36a2ad96e1b22823c1b3432ac Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Mon, 23 Mar 2020 18:50:17 -0700 Subject: [PATCH 10/15] Revert "Move rust engine target directory to pants cache so it doesn't interfere" This reverts commit 974b3ce1aff3e133b12ab59308ec1342eb79fc1c. [ci skip-jvm-tests] # No JVM changes made. --- build-support/bin/check_rust_formatting.sh | 4 ---- build-support/bin/check_rust_target_headers.sh | 4 ---- build-support/bin/native/bootstrap_code.sh | 9 +-------- build-support/common.sh | 4 ---- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/build-support/bin/check_rust_formatting.sh b/build-support/bin/check_rust_formatting.sh index 07a21afc828..03e28ebfd76 100755 --- a/build-support/bin/check_rust_formatting.sh +++ b/build-support/bin/check_rust_formatting.sh @@ -2,10 +2,6 @@ REPO_ROOT="$(git rev-parse --show-toplevel)" -# exports the CARGO_TARGET_DIR location -# shellcheck source=build-support/common.sh -source "${REPO_ROOT}/build-support/common.sh" - function usage() { echo "Checks formatting of rust files, optionally fixing mis-formatted files." echo diff --git a/build-support/bin/check_rust_target_headers.sh b/build-support/bin/check_rust_target_headers.sh index 5dc4a80450d..cc6c6473814 100755 --- a/build-support/bin/check_rust_target_headers.sh +++ b/build-support/bin/check_rust_target_headers.sh @@ -2,10 +2,6 @@ REPO_ROOT="$(git rev-parse --show-toplevel)" -# exports the CARGO_TARGET_DIR location -# shellcheck source=build-support/common.sh -source "${REPO_ROOT}/build-support/common.sh" - cargo="${REPO_ROOT}/build-support/bin/native/cargo" "${cargo}" ensure-installed --package cargo-ensure-prefix --version 0.1.3 diff --git a/build-support/bin/native/bootstrap_code.sh b/build-support/bin/native/bootstrap_code.sh index 0f05b7f086c..c6a83826be5 100644 --- a/build-support/bin/native/bootstrap_code.sh +++ b/build-support/bin/native/bootstrap_code.sh @@ -43,7 +43,7 @@ function _build_native_code() { "${REPO_ROOT}/build-support/bin/native/cargo" build ${MODE_FLAG} \ --manifest-path "${NATIVE_ROOT}/Cargo.toml" -p engine_cffi ) || die - echo "${CARGO_TARGET_DIR}/${MODE}/libengine_cffi.${LIB_EXTENSION}" + echo "${NATIVE_ROOT}/target/${MODE}/libengine_cffi.${LIB_EXTENSION}" } function bootstrap_native_code() { @@ -53,13 +53,6 @@ function bootstrap_native_code() { local engine_version_hdr="engine_version: ${native_engine_version}" local target_binary="${NATIVE_ENGINE_CACHE_DIR}/${native_engine_version}/${NATIVE_ENGINE_BINARY}" local target_binary_metadata="${target_binary}.metadata" - if [[ -d "${NATIVE_ROOT}/target" ]] - then - die "The old native code cache ${NATIVE_ROOT}/target has been replaced -with ${CARGO_TARGET_DIR}\n -Please remove the old directory with: \`rm -rf ${NATIVE_ROOT}/target\`" - fi - if [[ ! -f "${target_binary}" || ! -f "${target_binary_metadata}" ]] then local -r native_binary="$(_build_native_code)" diff --git a/build-support/common.sh b/build-support/common.sh index 2a465ded695..db1b618c45f 100644 --- a/build-support/common.sh +++ b/build-support/common.sh @@ -2,10 +2,6 @@ # shellcheck disable=SC2034 CACHE_ROOT=${XDG_CACHE_HOME:-$HOME/.cache}/pants -# Set cargo to put compile artifacts into the pants cache, -# so they don't interfere with file watching. -export CARGO_TARGET_DIR="${CACHE_ROOT}/rust/target" - TRAVIS_FOLD_STATE="/tmp/.travis_fold_current" CLEAR_LINE="\x1b[K" From 1602241c8492413ce923b56eb2df0c782ce515ab Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Mon, 23 Mar 2020 19:08:18 -0700 Subject: [PATCH 11/15] no need for futures locks anymore # Delete this line to force CI to run the JVM tests. [ci skip-jvm-tests] # No JVM changes made. --- src/rust/engine/Cargo.lock | 12 ------------ src/rust/engine/Cargo.toml | 1 - 2 files changed, 13 deletions(-) diff --git a/src/rust/engine/Cargo.lock b/src/rust/engine/Cargo.lock index f4eb180e26b..6ed67571e53 100644 --- a/src/rust/engine/Cargo.lock +++ b/src/rust/engine/Cargo.lock @@ -695,7 +695,6 @@ dependencies = [ "fs 0.0.1", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-locks 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "graph 0.0.1", "hashing 0.0.1", "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1008,16 +1007,6 @@ name = "futures-io" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "futures-locks" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "futures-macro" version = "0.3.4" @@ -3907,7 +3896,6 @@ dependencies = [ "checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" "checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" "checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" -"checksum futures-locks 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5658075ca5ae3918993c5bc95b43fcf22f927227660556a947da598f9f8981" "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index ccbf874fae0..33d52db540b 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -90,7 +90,6 @@ crossbeam-channel = "0.3" fnv = "1.0.5" fs = { path = "fs" } futures01 = { package = "futures", version = "0.1" } -futures-locks = "0.3.0" futures = { version = "0.3", features = ["compat"] } graph = { path = "graph" } hashing = { path = "hashing" } From 77f734cae34c34827503acf5a76c1caa0aff6237 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Mon, 23 Mar 2020 21:41:45 -0700 Subject: [PATCH 12/15] only watch on scandir nodes # Delete this line to force CI to run the JVM tests. [ci skip-jvm-tests] # No JVM changes made. --- pants.toml | 1 + src/rust/engine/Cargo.lock | 12 ++++++++ src/rust/engine/Cargo.toml | 1 + src/rust/engine/src/nodes.rs | 53 ++++++++++++++++++++---------------- src/rust/engine/src/watch.rs | 24 ++++++++++++---- 5 files changed, 61 insertions(+), 30 deletions(-) diff --git a/pants.toml b/pants.toml index 608db4a4aa0..cf868611373 100644 --- a/pants.toml +++ b/pants.toml @@ -88,6 +88,7 @@ pants_ignore.add = [ "/build-support/bin/native/src", # We shouldn't walk or watch the rust compiler artifacts because it is slow. "/src/rust/engine/target", + "/**/*/__pycache__", ] [cache] diff --git a/src/rust/engine/Cargo.lock b/src/rust/engine/Cargo.lock index 6ed67571e53..f4eb180e26b 100644 --- a/src/rust/engine/Cargo.lock +++ b/src/rust/engine/Cargo.lock @@ -695,6 +695,7 @@ dependencies = [ "fs 0.0.1", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-locks 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "graph 0.0.1", "hashing 0.0.1", "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1007,6 +1008,16 @@ name = "futures-io" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "futures-locks" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "futures-macro" version = "0.3.4" @@ -3896,6 +3907,7 @@ dependencies = [ "checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" "checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" "checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" +"checksum futures-locks 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5658075ca5ae3918993c5bc95b43fcf22f927227660556a947da598f9f8981" "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index 33d52db540b..5924f6bffb5 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -91,6 +91,7 @@ fnv = "1.0.5" fs = { path = "fs" } futures01 = { package = "futures", version = "0.1" } futures = { version = "0.3", features = ["compat"] } +futures-locks = "0.3.0" graph = { path = "graph" } hashing = { path = "hashing" } indexmap = "1.0.2" diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index b7a9fa66c1e..d24da49ffe3 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -1069,33 +1069,38 @@ impl Node for NodeKey { scope_task_parent_id(maybe_span_id, async move { let context2 = context.clone(); + let self2 = self.clone(); - let maybe_watch = if let Some(path) = self.fs_subject() { - let abs_path = context.core.build_root.join(path); - context - .core - .watcher - .watch(abs_path) - .map_err(|e| Failure::FileWatch(format!("{:?}", e))) - .await - } else { - Ok(()) - }; - - let result = match maybe_watch { - Ok(()) => match self { - NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::MultiPlatformExecuteProcess(n) => { + let result = match self { + NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::MultiPlatformExecuteProcess(n) => { + n.run(context).map(NodeResult::from).compat().await + } + NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Scandir(n) => { + // We only need to add watches to scandir nodes. Notify will watch + // all direct descendents of the scandir fs subject. We will only ever digest + // a file or read a link which is part of a directory we have scanned. + // The main reason for doing this is performance. Adding watches to files + // adds significant overhead to cold builds or builds not running pantsd. + let path = self2.fs_subject().unwrap(); + let abs_path = context.core.build_root.join(path); + if let Err(e) = context + .core + .watcher + .watch(abs_path) + .map_err(|e| Failure::FileWatch(format!("{:?}", e))) + .await + { + Err(e) + } else { n.run(context).map(NodeResult::from).compat().await } - NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Scandir(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Select(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Task(n) => n.run(context).map(NodeResult::from).compat().await, - }, - Err(e) => Err(e), + } + NodeKey::Select(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Task(n) => n.run(context).map(NodeResult::from).compat().await, }; if let Some(started_workunit) = maybe_started_workunit { let workunit: WorkUnit = started_workunit.finish(); diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index 43ef61a945e..ce38b0e725d 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -10,7 +10,9 @@ use std::time::Duration; use crossbeam_channel::{self, Receiver, RecvTimeoutError, TryRecvError}; use log::{debug, error, info, warn}; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; -use parking_lot::Mutex; +//use parking_lot::Mutex; +use futures::compat::Future01CompatExt; +use futures_locks::Mutex; use task_executor::Executor; use graph::{Graph, InvalidationResult}; @@ -128,11 +130,21 @@ impl InvalidationWatcher { /// Watch the given path non-recursively. /// pub async fn watch(&self, path: PathBuf) -> Result<(), notify::Error> { - let watcher = self.watcher.clone(); - self - .executor - .spawn_blocking(move || watcher.lock().watch(path, RecursiveMode::NonRecursive)) - .await + // Using a futurized mutex here because for some reason using a regular mutex + // to block the io pool causes the v2 ui to not update which nodes its working + // on properly. + let watcher_lock = self.watcher.lock().compat().await; + match watcher_lock { + Ok(mut watcher_lock) => { + self + .executor + .spawn_blocking(move || watcher_lock.watch(path, RecursiveMode::NonRecursive)) + .await + } + Err(()) => Err(notify::Error::new(notify::ErrorKind::Generic( + "Couldn't lock mutex for invalidation watcher".to_string(), + ))), + } } /// From de31d180d0405ba0a609659e0ef09cd804f8be7a Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Tue, 24 Mar 2020 14:46:43 -0700 Subject: [PATCH 13/15] empty commit for ci trigger # Delete this line to force CI to run the JVM tests. [ci skip-jvm-tests] # No JVM changes made. From 04b8746730c0da1f612f87c14016302a3a23cdec Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Tue, 24 Mar 2020 15:39:28 -0700 Subject: [PATCH 14/15] remove tokio 0.1 from engine dev-dependencies # Delete this line to force CI to run the JVM tests. [ci skip-jvm-tests] # No JVM changes made. --- src/rust/engine/Cargo.lock | 238 ------------------------------------- src/rust/engine/Cargo.toml | 1 - 2 files changed, 239 deletions(-) diff --git a/src/rust/engine/Cargo.lock b/src/rust/engine/Cargo.lock index f4eb180e26b..49ac0dd8fdc 100644 --- a/src/rust/engine/Cargo.lock +++ b/src/rust/engine/Cargo.lock @@ -496,39 +496,6 @@ dependencies = [ "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crossbeam-deque" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-queue" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-utils" version = "0.6.6" @@ -718,7 +685,6 @@ dependencies = [ "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "testutil 0.0.1", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "ui 0.0.1", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1576,14 +1542,6 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "lock_api" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "log" version = "0.3.9" @@ -1636,14 +1594,6 @@ name = "memchr" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "memoffset" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mime" version = "0.3.16" @@ -1996,16 +1946,6 @@ dependencies = [ "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot_core" version = "0.2.14" @@ -2029,20 +1969,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "percent-encoding" version = "1.0.1" @@ -2673,11 +2599,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "sct" version = "0.6.0" @@ -3128,29 +3049,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-uds 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio" version = "0.2.13" @@ -3173,16 +3071,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-codec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-connect" version = "0.1.0" @@ -3210,16 +3098,6 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-fs" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-io" version = "0.1.13" @@ -3240,24 +3118,6 @@ dependencies = [ "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-reactor" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-rustls" version = "0.13.0" @@ -3269,86 +3129,6 @@ dependencies = [ "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-sync" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-udp" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-uds" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-util" version = "0.2.0" @@ -3862,9 +3642,6 @@ dependencies = [ "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" "checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" -"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum crypto-hash 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8a77162240fd97248d19a564a565eb563a3f592b386e4136fb300909e67dddca" @@ -3960,14 +3737,12 @@ dependencies = [ "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" -"checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" "checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" -"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" "checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" @@ -4003,10 +3778,8 @@ dependencies = [ "checksum owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" -"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" -"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" "checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" @@ -4070,7 +3843,6 @@ dependencies = [ "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" "checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" "checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" "checksum security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "97bbedbe81904398b6ebb054b3e912f99d55807125790f3198ac990d98def5b0" "checksum security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "06fd2f23e31ef68dd2328cc383bd493142e46107a3a0e24f7d734e3f3b80fe4c" @@ -4112,23 +3884,13 @@ dependencies = [ "checksum thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcbb6aa301e5d3b0b5ef639c9a9c7e2f1c944f177b460c04dc24c69b1fa2bd99" "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" "checksum tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616" -"checksum tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" "checksum tokio-connect 0.1.0 (git+https://github.com/pantsbuild/tokio-connect?rev=f7ad1ca437973d6e24037ac6f7d5ef1013833c0b)" = "" "checksum tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" "checksum tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -"checksum tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" "checksum tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" "checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" -"checksum tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" "checksum tokio-rustls 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4adb8b3e5f86b707f1b54e7c15b6de52617a823608ccda98a15d3a24222f265a" -"checksum tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" -"checksum tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" -"checksum tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" -"checksum tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" -"checksum tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" -"checksum tokio-uds 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5076db410d6fdc6523df7595447629099a1fdc47b3d9f896220780fa48faf798" "checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" diff --git a/src/rust/engine/Cargo.toml b/src/rust/engine/Cargo.toml index 5924f6bffb5..4b32107f994 100644 --- a/src/rust/engine/Cargo.toml +++ b/src/rust/engine/Cargo.toml @@ -126,7 +126,6 @@ workunit_store = { path = "workunit_store" } [dev-dependencies] testutil = { path = "./testutil" } fs = { path = "./fs" } -tokio = "0.1" env_logger = "0.5.4" [patch.crates-io] From 3f52ee519f74ad2d860dc5b75fa5cfda6f40a214 Mon Sep 17 00:00:00 2001 From: Henry Fuller Date: Tue, 24 Mar 2020 19:28:46 -0700 Subject: [PATCH 15/15] Platform specific watching behavior. On Darwin recursively watch the build root at startup. On Linux watch individual directory roots. [ci skip-jvm-tests] # No JVM changes made. --- pants.toml | 1 - src/rust/engine/src/nodes.rs | 52 ++++++++++++++---------------- src/rust/engine/src/watch.rs | 61 +++++++++++++++++++++++++----------- 3 files changed, 65 insertions(+), 49 deletions(-) diff --git a/pants.toml b/pants.toml index cf868611373..608db4a4aa0 100644 --- a/pants.toml +++ b/pants.toml @@ -88,7 +88,6 @@ pants_ignore.add = [ "/build-support/bin/native/src", # We shouldn't walk or watch the rust compiler artifacts because it is slow. "/src/rust/engine/target", - "/**/*/__pycache__", ] [cache] diff --git a/src/rust/engine/src/nodes.rs b/src/rust/engine/src/nodes.rs index d24da49ffe3..8a477e00683 100644 --- a/src/rust/engine/src/nodes.rs +++ b/src/rust/engine/src/nodes.rs @@ -1069,38 +1069,32 @@ impl Node for NodeKey { scope_task_parent_id(maybe_span_id, async move { let context2 = context.clone(); - let self2 = self.clone(); + let maybe_watch = if let Some(path) = self.fs_subject() { + let abs_path = context.core.build_root.join(path); + context + .core + .watcher + .watch(abs_path) + .map_err(|e| Failure::FileWatch(format!("{:?}", e))) + .await + } else { + Ok(()) + }; - let result = match self { - NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::MultiPlatformExecuteProcess(n) => { - n.run(context).map(NodeResult::from).compat().await - } - NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Scandir(n) => { - // We only need to add watches to scandir nodes. Notify will watch - // all direct descendents of the scandir fs subject. We will only ever digest - // a file or read a link which is part of a directory we have scanned. - // The main reason for doing this is performance. Adding watches to files - // adds significant overhead to cold builds or builds not running pantsd. - let path = self2.fs_subject().unwrap(); - let abs_path = context.core.build_root.join(path); - if let Err(e) = context - .core - .watcher - .watch(abs_path) - .map_err(|e| Failure::FileWatch(format!("{:?}", e))) - .await - { - Err(e) - } else { + let result = match maybe_watch { + Ok(()) => match self { + NodeKey::DigestFile(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::DownloadedFile(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::MultiPlatformExecuteProcess(n) => { n.run(context).map(NodeResult::from).compat().await } - } - NodeKey::Select(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).compat().await, - NodeKey::Task(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::ReadLink(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Scandir(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Select(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Snapshot(n) => n.run(context).map(NodeResult::from).compat().await, + NodeKey::Task(n) => n.run(context).map(NodeResult::from).compat().await, + }, + Err(e) => Err(e), }; if let Some(started_workunit) = maybe_started_workunit { let workunit: WorkUnit = started_workunit.finish(); diff --git a/src/rust/engine/src/watch.rs b/src/rust/engine/src/watch.rs index ce38b0e725d..82ee2c9be89 100644 --- a/src/rust/engine/src/watch.rs +++ b/src/rust/engine/src/watch.rs @@ -13,6 +13,7 @@ use notify::{RecommendedWatcher, RecursiveMode, Watcher}; //use parking_lot::Mutex; use futures::compat::Future01CompatExt; use futures_locks::Mutex; +use process_execution::Platform; use task_executor::Executor; use graph::{Graph, InvalidationResult}; @@ -41,6 +42,7 @@ pub struct InvalidationWatcher { watcher: Arc>, executor: Executor, liveness: Receiver<()>, + current_platform: Platform, } impl InvalidationWatcher { @@ -55,11 +57,25 @@ impl InvalidationWatcher { // We canonicalize the build_root once so this isn't a problem. let canonical_build_root = std::fs::canonicalize(build_root.as_path()).map_err(|e| format!("{:?}", e))?; + let current_platform = Platform::current()?; let (watch_sender, watch_receiver) = crossbeam_channel::unbounded(); - let watcher = Arc::new(Mutex::new( - Watcher::new(watch_sender, Duration::from_millis(50)) - .map_err(|e| format!("Failed to begin watching the filesystem: {}", e))?, - )); + let mut watcher: RecommendedWatcher = Watcher::new(watch_sender, Duration::from_millis(50)) + .map_err(|e| format!("Failed to begin watching the filesystem: {}", e))?; + // On darwin the notify API is much more efficient if you watch the build root + // recursively, so we set up that watch here and then return early when watch() is + // called by nodes that are running. On Linux the notify crate handles adding paths to watch + // much more efficiently so we do that instead on Linux. + if current_platform == Platform::Darwin { + watcher + .watch(canonical_build_root.clone(), RecursiveMode::Recursive) + .map_err(|e| { + format!( + "Failed to begin recursively watching files in the build root: {}", + e + ) + })? + } + let wrapped_watcher = Arc::new(Mutex::new(watcher)); let (thread_liveness_sender, thread_liveness_receiver) = crossbeam_channel::unbounded(); thread::spawn(move || { @@ -95,7 +111,7 @@ impl InvalidationWatcher { }) .flatten() .collect(); - info!("notify invalidating {:?} because of {:?}", paths, ev.kind); + debug!("notify invalidating {:?} because of {:?}", paths, ev.kind); InvalidationWatcher::invalidate(&graph, &paths, "notify"); } Ok(Err(err)) => { @@ -120,9 +136,10 @@ impl InvalidationWatcher { }); Ok(InvalidationWatcher { - watcher, + watcher: wrapped_watcher, executor, liveness: thread_liveness_receiver, + current_platform, }) } @@ -130,20 +147,26 @@ impl InvalidationWatcher { /// Watch the given path non-recursively. /// pub async fn watch(&self, path: PathBuf) -> Result<(), notify::Error> { - // Using a futurized mutex here because for some reason using a regular mutex - // to block the io pool causes the v2 ui to not update which nodes its working - // on properly. - let watcher_lock = self.watcher.lock().compat().await; - match watcher_lock { - Ok(mut watcher_lock) => { - self - .executor - .spawn_blocking(move || watcher_lock.watch(path, RecursiveMode::NonRecursive)) - .await + // Short circuit here if we are on a Darwin platform because we should be watching + // the entire build root recursively already. + if self.current_platform == Platform::Darwin { + Ok(()) + } else { + // Using a futurized mutex here because for some reason using a regular mutex + // to block the io pool causes the v2 ui to not update which nodes its working + // on properly. + let watcher_lock = self.watcher.lock().compat().await; + match watcher_lock { + Ok(mut watcher_lock) => { + self + .executor + .spawn_blocking(move || watcher_lock.watch(path, RecursiveMode::NonRecursive)) + .await + } + Err(()) => Err(notify::Error::new(notify::ErrorKind::Generic( + "Couldn't lock mutex for invalidation watcher".to_string(), + ))), } - Err(()) => Err(notify::Error::new(notify::ErrorKind::Generic( - "Couldn't lock mutex for invalidation watcher".to_string(), - ))), } }