summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--front_end/src/bin/crate_pages.rs4
-rw-r--r--front_end/src/crate_page.rs29
-rw-r--r--kitchen_sink/src/lib_kitchen_sink.rs17
-rw-r--r--reindex/src/bin/reindex_crates.rs7
4 files changed, 28 insertions, 29 deletions
diff --git a/front_end/src/bin/crate_pages.rs b/front_end/src/bin/crate_pages.rs
index ae1047a..383b2db 100644
--- a/front_end/src/bin/crate_pages.rs
+++ b/front_end/src/bin/crate_pages.rs
@@ -67,6 +67,7 @@ async fn run(filter: Option<String>) -> Result<(), failure::Error> {
let image_filter = Arc::new(ImageOptimAPIFilter::new("czjpqfbdkz", crates.main_cache_dir().join("images.db"))?);
let markup = &Renderer::new_filter(Some(Highlighter::new()), image_filter);
+ let handle = Arc::new(tokio::runtime::Handle::current());
rayon::scope(move |s1| {
let tmp;
let always_render = filter.is_some();
@@ -86,9 +87,10 @@ async fn run(filter: Option<String>) -> Result<(), failure::Error> {
}
let origin = origin.clone();
let crates = Arc::clone(&crates);
+ let handle = Arc::clone(&handle);
let path = PathBuf::from(format!("public/crates/{}.html", origin.short_crate_name()));
s1.spawn(move |_| {
- if let Err(e) = kitchen_sink::block_on(render(&origin, &crates, &path, markup, always_render)) {
+ if let Err(e) = handle.enter(|| futures::executor::block_on(render(&origin, &crates, &path, markup, always_render))) {
eprintln!("••• error: {} — {}", e, path.display());
for c in e.iter_chain().skip(1) {
eprintln!("•  error: -- {}", c);
diff --git a/front_end/src/crate_page.rs b/front_end/src/crate_page.rs
index d2cc4d4..2fdf934 100644
--- a/front_end/src/crate_page.rs
+++ b/front_end/src/crate_page.rs
@@ -1,3 +1,4 @@
+use tokio::runtime::Handle;
use futures::future::join_all;
use crate::download_graph::DownloadsGraph;
use crate::templates;
@@ -58,6 +59,7 @@ pub struct CratePage<'a> {
pub viral_license: Option<CrateLicense>,
top_category: Option<(u32, &'static Category)>,
is_build_or_dev: (bool, bool),
+ handle: Handle,
}
/// Helper used to find most "interesting" versions
@@ -120,6 +122,7 @@ impl<'a> CratePage<'a> {
viral_license: None,
top_category,
is_build_or_dev,
+ handle: Handle::current(),
};
let (sizes, lang_stats, viral_license) = page.crate_size_and_viral_license(deps?).await?;
page.sizes = Some(sizes);
@@ -190,7 +193,7 @@ impl<'a> CratePage<'a> {
}
pub fn dependents_stats(&self) -> Option<(u32, u32, Option<&str>)> {
- kitchen_sink::block_on(self.kitchen_sink.crates_io_dependents_stats_of(self.ver.origin()))
+ self.handle.enter(|| futures::executor::block_on(self.kitchen_sink.crates_io_dependents_stats_of(self.ver.origin())))
.map_err(|e| eprintln!("{}", e))
.ok().and_then(|x| x)
.map(|d| (
@@ -355,18 +358,20 @@ impl<'a> CratePage<'a> {
if richdep.dep.req() == "*" {
return "common";
}
- let (matches_latest, pop) = richdep.dep.req().parse().ok().and_then(|req| {
- if !richdep.dep.is_crates_io() {
- return None;
+ self.handle.enter(|| {
+ let (matches_latest, pop) = richdep.dep.req().parse().ok().and_then(|req| {
+ if !richdep.dep.is_crates_io() {
+ return None;
+ }
+ futures::executor::block_on(self.kitchen_sink.version_popularity(&richdep.package, &req)).expect("deps")
+ }).unwrap_or((false, 0.));
+ match pop {
+ x if x >= 0.5 && matches_latest => "top",
+ x if x >= 0.75 || matches_latest => "common",
+ x if x >= 0.25 => "outdated",
+ _ => "obsolete",
}
- kitchen_sink::block_on(self.kitchen_sink.version_popularity(&richdep.package, &req)).expect("deps")
- }).unwrap_or((false, 0.));
- match pop {
- x if x >= 0.5 && matches_latest => "top",
- x if x >= 0.75 || matches_latest => "common",
- x if x >= 0.25 => "outdated",
- _ => "obsolete",
- }
+ })
}
/// The rule is - last displayed digit may change (except 0.x)
diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs
index a4c3d37..2a97f8b 100644
--- a/kitchen_sink/src/lib_kitchen_sink.rs
+++ b/kitchen_sink/src/lib_kitchen_sink.rs
@@ -161,6 +161,7 @@ pub struct KitchenSink {
main_cache_dir: PathBuf,
yearly: AllDownloads,
category_overrides: HashMap<String, Vec<Cow<'static, str>>>,
+ handle: Handle,
}
impl KitchenSink {
@@ -178,10 +179,7 @@ impl KitchenSink {
}
pub async fn new(data_path: &Path, github_token: &str) -> CResult<Self> {
- // just testing whether runtime is on
let handle = Handle::current();
- handle.spawn(async {});
-
let main_cache_dir = data_path.to_owned();
let ((crates_io, gh), index) = rayon::join(|| rayon::join(
@@ -204,6 +202,7 @@ impl KitchenSink {
yearly: AllDownloads::new(&main_cache_dir),
main_cache_dir,
category_overrides: Self::load_category_overrides(&data_path.join("category_overrides.txt"))?,
+ handle,
})
}
@@ -511,7 +510,7 @@ impl KitchenSink {
///
/// There's no support for getting anything else than the latest version.
pub fn rich_crate_version(&self, origin: &Origin) -> CResult<RichCrateVersion> {
- block_on(self.rich_crate_version_async(origin))
+ self.handle.enter(|| futures::executor::block_on(self.rich_crate_version_async(origin)))
}
pub async fn rich_crate_version_async(&self, origin: &Origin) -> CResult<RichCrateVersion> {
@@ -1897,13 +1896,3 @@ async fn fetch_uppercase_name() {
let _ = k.rich_crate(&Origin::from_crates_io_name("inflector")).unwrap();
}
-pub fn block_on<O>(f: impl futures::Future<Output=O>) -> O {
- match tokio::runtime::Handle::try_current() {
- Ok(h) => h.enter(|| futures::executor::block_on(f)),
- Err(_) => {
- eprintln!("Boo, needs to set up a Tokio runtime");
- let mut rt = tokio::runtime::Runtime::new().expect("tokio runtime");
- rt.block_on(f)
- }
- }
-}
diff --git a/reindex/src/bin/reindex_crates.rs b/reindex/src/bin/reindex_crates.rs
index 51b9059..b4eb3f8 100644
--- a/reindex/src/bin/reindex_crates.rs
+++ b/reindex/src/bin/reindex_crates.rs
@@ -62,6 +62,8 @@ async fn main() {
}
});
+ let handle = Arc::new(tokio::runtime::Handle::current());
+
let seen_repos = &Mutex::new(HashSet::new());
let _ = pre.join().unwrap();
rayon::scope(move |scope| {
@@ -79,6 +81,7 @@ async fn main() {
return;
}
let crates = Arc::clone(&crates);
+ let handle = Arc::clone(&handle);
let renderer = Arc::clone(&renderer);
let tx = tx.clone();
scope.spawn(move |scope| {
@@ -86,7 +89,7 @@ async fn main() {
return;
}
print!("{} ", i);
- match kitchen_sink::block_on(crates.index_crate_highest_version(&origin)) {
+ match handle.enter(|| futures::executor::block_on(crates.index_crate_highest_version(&origin))) {
Ok(()) => {},
err => {
print_res(err);
@@ -94,7 +97,7 @@ async fn main() {
},
}
scope.spawn(move |scope| {
- match kitchen_sink::block_on(index_crate(&crates, &origin, &renderer, &tx)) {
+ match handle.enter(|| futures::executor::block_on(index_crate(&crates, &origin, &renderer, &tx))) {
Ok(v) => {
if repos {
scope.spawn(move |_| {