Skip to content

Commit d6ae29d

Browse files
committed
fix some edge cases & add some more tests for incomplete builds in db
1 parent b324b67 commit d6ae29d

14 files changed

+499
-30
lines changed

.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-8965c22711d10959507118e8e58f4d76a1b03d3a8ca37c18b7a5b9296b94d4ea.json

+51
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-db5310437b42896e57cc7de345f64cef8932b6f5e37f9ce9480eb9684b8c88ce.json

+52
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-df2a6468276a174f7993ba7cb5740bd7ce1a9eeae15b48c36a8a5abeaaa4314c.json renamed to .sqlx/query-e579486925d3d1927232675b2a03d5f8dd826d7136cdbba1331faf6e64c1f5eb.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

migrations/20240313103708_make_release_fields_optional.down.sql

+15
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
DELETE FROM builds WHERE rid in (
2+
SELECT id FROM releases WHERE (
3+
release_time IS NULL OR
4+
target_name IS NULL OR
5+
yanked IS NULL OR
6+
is_library IS NULL OR
7+
rustdoc_status IS NULL OR
8+
have_examples IS NULL OR
9+
downloads IS NULL OR
10+
doc_targets IS NULL OR
11+
default_target IS NULL OR
12+
archive_storage IS NULL
13+
)
14+
);
15+
116
DELETE FROM releases WHERE (
217
release_time IS NULL OR
318
target_name IS NULL OR

src/db/add_package.rs

+112
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,118 @@ mod test {
608608
use crate::utils::CargoMetadata;
609609
use test_case::test_case;
610610

611+
#[test]
612+
fn test_set_build_to_error() {
613+
async_wrapper(|env| async move {
614+
let mut conn = env.async_db().await.async_conn().await;
615+
let crate_id = initialize_crate(&mut conn, "krate").await?;
616+
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
617+
let build_id = initialize_build(&mut conn, release_id).await?;
618+
619+
update_build_with_error(&mut conn, build_id, Some("error message")).await?;
620+
621+
let row = sqlx::query!(
622+
r#"SELECT
623+
rustc_version,
624+
docsrs_version,
625+
build_status as "build_status: BuildStatus",
626+
errors
627+
FROM builds
628+
WHERE id = $1"#,
629+
build_id
630+
)
631+
.fetch_one(&mut *conn)
632+
.await?;
633+
634+
assert!(row.rustc_version.is_none());
635+
assert!(row.docsrs_version.is_none());
636+
assert_eq!(row.build_status, BuildStatus::Failure);
637+
assert_eq!(row.errors, Some("error message".into()));
638+
639+
Ok(())
640+
})
641+
}
642+
643+
#[test]
644+
fn test_finish_build_success() {
645+
async_wrapper(|env| async move {
646+
let mut conn = env.async_db().await.async_conn().await;
647+
let crate_id = initialize_crate(&mut conn, "krate").await?;
648+
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
649+
let build_id = initialize_build(&mut conn, release_id).await?;
650+
651+
finish_build(
652+
&mut conn,
653+
build_id,
654+
"rustc_version",
655+
"docsrs_version",
656+
BuildStatus::Success,
657+
None,
658+
)
659+
.await?;
660+
661+
let row = sqlx::query!(
662+
r#"SELECT
663+
rustc_version,
664+
docsrs_version,
665+
build_status as "build_status: BuildStatus",
666+
errors
667+
FROM builds
668+
WHERE id = $1"#,
669+
build_id
670+
)
671+
.fetch_one(&mut *conn)
672+
.await?;
673+
674+
assert_eq!(row.rustc_version, Some("rustc_version".into()));
675+
assert_eq!(row.docsrs_version, Some("docsrs_version".into()));
676+
assert_eq!(row.build_status, BuildStatus::Success);
677+
assert!(row.errors.is_none());
678+
679+
Ok(())
680+
})
681+
}
682+
683+
#[test]
684+
fn test_finish_build_error() {
685+
async_wrapper(|env| async move {
686+
let mut conn = env.async_db().await.async_conn().await;
687+
let crate_id = initialize_crate(&mut conn, "krate").await?;
688+
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
689+
let build_id = initialize_build(&mut conn, release_id).await?;
690+
691+
finish_build(
692+
&mut conn,
693+
build_id,
694+
"rustc_version",
695+
"docsrs_version",
696+
BuildStatus::Failure,
697+
Some("error message"),
698+
)
699+
.await?;
700+
701+
let row = sqlx::query!(
702+
r#"SELECT
703+
rustc_version,
704+
docsrs_version,
705+
build_status as "build_status: BuildStatus",
706+
errors
707+
FROM builds
708+
WHERE id = $1"#,
709+
build_id
710+
)
711+
.fetch_one(&mut *conn)
712+
.await?;
713+
714+
assert_eq!(row.rustc_version, Some("rustc_version".into()));
715+
assert_eq!(row.docsrs_version, Some("docsrs_version".into()));
716+
assert_eq!(row.build_status, BuildStatus::Failure);
717+
assert_eq!(row.errors, Some("error message".into()));
718+
719+
Ok(())
720+
})
721+
}
722+
611723
#[test]
612724
fn new_keywords() {
613725
wrapper(|env| {

src/docbuilder/rustwide_builder.rs

+52-3
Original file line numberDiff line numberDiff line change
@@ -1062,21 +1062,24 @@ mod tests {
10621062
let mut conn = env.db().conn();
10631063
let row = conn
10641064
.query_one(
1065-
"SELECT
1065+
r#"SELECT
10661066
r.rustdoc_status,
10671067
r.default_target,
10681068
r.doc_targets,
10691069
r.archive_storage,
10701070
cov.total_items,
1071-
b.id as build_id
1071+
b.id as build_id,
1072+
b.build_status::TEXT as build_status,
1073+
b.docsrs_version,
1074+
b.rustc_version
10721075
FROM
10731076
crates as c
10741077
INNER JOIN releases AS r ON c.id = r.crate_id
10751078
INNER JOIN builds as b ON r.id = b.rid
10761079
LEFT OUTER JOIN doc_coverage AS cov ON r.id = cov.release_id
10771080
WHERE
10781081
c.name = $1 AND
1079-
r.version = $2",
1082+
r.version = $2"#,
10801083
&[&crate_, &version],
10811084
)
10821085
.unwrap();
@@ -1085,6 +1088,9 @@ mod tests {
10851088
assert_eq!(row.get::<_, String>("default_target"), default_target);
10861089
assert!(row.get::<_, Option<i32>>("total_items").is_some());
10871090
assert!(row.get::<_, bool>("archive_storage"));
1091+
assert!(!row.get::<_, String>("docsrs_version").is_empty());
1092+
assert!(!row.get::<_, String>("rustc_version").is_empty());
1093+
assert_eq!(row.get::<_, String>("build_status"), "success");
10881094

10891095
let mut targets: Vec<String> = row
10901096
.get::<_, Value>("doc_targets")
@@ -1363,6 +1369,49 @@ mod tests {
13631369
});
13641370
}
13651371

1372+
#[test]
1373+
#[ignore]
1374+
fn test_build_failures_before_build() {
1375+
wrapper(|env| {
1376+
// https://github.com/rust-lang/docs.rs/issues/2491
1377+
// package without Cargo.toml, so fails directly in the fetch stage.
1378+
let crate_ = "emheap";
1379+
let version = "0.1.0";
1380+
let mut builder = RustwideBuilder::init(env).unwrap();
1381+
builder.update_toolchain()?;
1382+
1383+
// `Result` is `Ok`, but the build-result is `false`
1384+
assert!(!builder.build_package(crate_, version, PackageKind::CratesIo)?);
1385+
1386+
let row = env.runtime().block_on(async {
1387+
let mut conn = env.async_db().await.async_conn().await;
1388+
sqlx::query!(
1389+
r#"SELECT
1390+
rustc_version,
1391+
docsrs_version,
1392+
build_status as "build_status: BuildStatus",
1393+
errors
1394+
FROM
1395+
crates as c
1396+
INNER JOIN releases as r on c.id = r.crate_id
1397+
INNER JOIN builds as b on b.rid = r.id
1398+
WHERE c.name = $1 and r.version = $2"#,
1399+
crate_,
1400+
version,
1401+
)
1402+
.fetch_one(&mut *conn)
1403+
.await
1404+
})?;
1405+
1406+
assert!(row.rustc_version.is_none());
1407+
assert!(row.docsrs_version.is_none());
1408+
assert_eq!(row.build_status, BuildStatus::Failure);
1409+
assert!(row.errors.unwrap().contains("missing Cargo.toml"));
1410+
1411+
Ok(())
1412+
});
1413+
}
1414+
13661415
#[test]
13671416
#[ignore]
13681417
fn test_implicit_features_for_optional_dependencies() {

0 commit comments

Comments
 (0)