Skip to content

Commit 967d5af

Browse files
pietroalbiniJoshua Nelson
authored andcommitted
docbuilder: switch to a more robust implementation of should_build
1 parent 2c31d6e commit 967d5af

File tree

2 files changed

+27
-31
lines changed

2 files changed

+27
-31
lines changed

src/docbuilder/mod.rs

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ use crate::error::Result;
1313
use crate::index::Index;
1414
use crate::BuildQueue;
1515
use crate::DocBuilderOptions;
16-
use log::debug;
17-
use std::collections::BTreeSet;
1816
use std::fs;
1917
use std::path::PathBuf;
2018
use std::sync::Arc;
@@ -25,7 +23,6 @@ pub struct DocBuilder {
2523
index: Index,
2624
db: Pool,
2725
build_queue: Arc<BuildQueue>,
28-
db_cache: BTreeSet<String>,
2926
}
3027

3128
impl DocBuilder {
@@ -36,28 +33,9 @@ impl DocBuilder {
3633
options,
3734
index,
3835
db,
39-
db_cache: BTreeSet::new(),
4036
}
4137
}
4238

43-
fn load_database_cache(&mut self) -> Result<()> {
44-
debug!("Loading database cache");
45-
46-
let mut conn = self.db.get()?;
47-
for row in &mut conn.query(
48-
"SELECT name, version FROM crates, releases \
49-
WHERE crates.id = releases.crate_id",
50-
&[],
51-
)? {
52-
let name: String = row.get(0);
53-
let version: String = row.get(1);
54-
55-
self.db_cache.insert(format!("{}-{}", name, version));
56-
}
57-
58-
Ok(())
59-
}
60-
6139
fn lock_path(&self) -> PathBuf {
6240
self.options.prefix.join("cratesfyi.lock")
6341
}
@@ -91,10 +69,4 @@ impl DocBuilder {
9169
pub fn options(&self) -> &DocBuilderOptions {
9270
&self.options
9371
}
94-
95-
fn should_build(&mut self, name: &str, version: &str) -> Result<bool> {
96-
self.load_database_cache()?;
97-
Ok(!(self.options.skip_if_exists
98-
&& self.db_cache.contains(&format!("{}-{}", name, version))))
99-
}
10072
}

src/docbuilder/rustwide_builder.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::{Metrics, Storage};
1414
use docsrs_metadata::{Metadata, DEFAULT_TARGETS, HOST_TARGET};
1515
use failure::ResultExt;
1616
use log::{debug, info, warn, LevelFilter};
17+
use postgres::Client;
1718
use rustwide::cmd::{Command, SandboxBuilder};
1819
use rustwide::logging::{self, LogStorage};
1920
use rustwide::toolchain::ToolchainError;
@@ -297,16 +298,16 @@ impl RustwideBuilder {
297298
version: &str,
298299
local: Option<&Path>,
299300
) -> Result<bool> {
300-
if !doc_builder.should_build(name, version)? {
301+
let mut conn = self.db.get()?;
302+
303+
if !self.should_build(&mut conn, &doc_builder, name, version)? {
301304
return Ok(false);
302305
}
303306

304307
self.update_toolchain()?;
305308

306309
info!("building package {} {}", name, version);
307310

308-
let mut conn = self.db.get()?;
309-
310311
if is_blacklisted(&mut conn, name)? {
311312
info!("skipping build of {}, crate has been blacklisted", name);
312313
return Ok(false);
@@ -648,6 +649,29 @@ impl RustwideBuilder {
648649
)
649650
.map(|t| t.1)
650651
}
652+
653+
fn should_build(
654+
&self,
655+
conn: &mut Client,
656+
docbuilder: &DocBuilder,
657+
name: &str,
658+
version: &str,
659+
) -> Result<bool> {
660+
if docbuilder.options().skip_if_exists {
661+
// Check whether no successful builds are present in the database.
662+
Ok(conn
663+
.query(
664+
"SELECT 1 FROM crates, releases, builds
665+
WHERE crates.id = releases.crate_id AND releases.id = builds.rid
666+
AND crates.name = $1 AND releases.version = $2
667+
AND builds.build_status = TRUE;",
668+
&[&name, &version],
669+
)?
670+
.is_empty())
671+
} else {
672+
Ok(true)
673+
}
674+
}
651675
}
652676

653677
struct FullBuildResult {

0 commit comments

Comments
 (0)