diff --git a/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json b/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json new file mode 100644 index 000000000..a825d08b1 --- /dev/null +++ b/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM builds_logs AS bl\n USING builds AS b\n JOIN releases AS r ON b.rid = r.id\n WHERE bl.build_id = b.id AND r.crate_id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a" +} diff --git a/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json b/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json index 8a1259bdd..31e5cb180 100644 --- a/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json +++ b/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json @@ -13,7 +13,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json b/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json deleted file mode 100644 index 7e974f7ff..000000000 --- a/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n CASE\n WHEN builds.build_started IS NULL\n -- for old builds, `build_started` is empty.\n THEN NULL\n ELSE\n CASE\n -- for in-progress builds we show the duration until now\n WHEN builds.build_status = 'in_progress' THEN (CURRENT_TIMESTAMP - builds.build_started)\n -- there are broken builds where the status is `error`, and `build_finished` is NULL\n WHEN builds.build_finished IS NULL THEN NULL\n -- for finished builds we can show the full duration\n ELSE (builds.build_finished - builds.build_started)\n END\n END AS \"build_duration?: Duration\",\n builds.memory_peak,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: BuildId", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 4, - "name": "build_time", - "type_info": "Timestamptz" - }, - { - "ordinal": 5, - "name": "build_duration?: Duration", - "type_info": "Interval" - }, - { - "ordinal": 6, - "name": "memory_peak", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "errors", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - true, - true, - false, - null, - null, - true, - true - ] - }, - "hash": "20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e" -} diff --git a/crates/bin/docs_rs_web/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json b/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json similarity index 63% rename from crates/bin/docs_rs_web/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json rename to .sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json index 68c85967b..f360c7daf 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json +++ b/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n builds.error_kind,\n releases.default_target\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", + "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n builds.error_kind,\n releases.default_target,\n (\n SELECT array_agg(row(bl.log_filename, bl.success))\n FROM (\n SELECT log_filename, success\n FROM builds_logs\n WHERE builds_logs.build_id = builds.id\n ORDER BY log_filename\n ) bl\n ) AS \"logs: Vec<(String, bool)>\"\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", "describe": { "columns": [ { @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } @@ -53,6 +54,11 @@ "ordinal": 7, "name": "default_target", "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "logs: Vec<(String, bool)>", + "type_info": "RecordArray" } ], "parameters": { @@ -70,8 +76,9 @@ true, true, true, - true + true, + null ] }, - "hash": "9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4" + "hash": "28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9" } diff --git a/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json b/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json new file mode 100644 index 000000000..2109f69cf --- /dev/null +++ b/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM builds_logs bl\n USING builds b\n JOIN releases r ON b.rid = r.id\n WHERE bl.build_id = b.id AND r.crate_id = $1 AND r.version = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214" +} diff --git a/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json b/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json new file mode 100644 index 000000000..b144694d4 --- /dev/null +++ b/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json @@ -0,0 +1,77 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n CASE\n WHEN builds.build_status = 'success'::build_status THEN\n CASE\n WHEN COALESCE(\n (SELECT bool_and(builds_logs.success)\n FROM builds_logs\n WHERE builds_logs.build_id = builds.id),\n TRUE\n ) = TRUE THEN 'success'::build_status\n ELSE 'partial_failure'::build_status\n END\n ELSE builds.build_status\n END as \"build_status!: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n CASE\n WHEN builds.build_started IS NULL\n -- for old builds, `build_started` is empty.\n THEN NULL\n ELSE\n CASE\n -- for in-progress builds we show the duration until now\n WHEN builds.build_status = 'in_progress' THEN (CURRENT_TIMESTAMP - builds.build_started)\n -- there are broken builds where the status is `error`, and `build_finished` is NULL\n WHEN builds.build_finished IS NULL THEN NULL\n -- for finished builds we can show the full duration\n ELSE (builds.build_finished - builds.build_started)\n END\n END AS \"build_duration?: Duration\",\n builds.memory_peak,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: BuildId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "rustc_version", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "docsrs_version", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "build_status!: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure", + "partial_failure" + ] + } + } + } + }, + { + "ordinal": 4, + "name": "build_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "build_duration?: Duration", + "type_info": "Interval" + }, + { + "ordinal": 6, + "name": "memory_peak", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "errors", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + true, + true, + null, + null, + null, + true, + true + ] + }, + "hash": "4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734" +} diff --git a/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json b/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json index 9c5e18816..8331779b6 100644 --- a/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json +++ b/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/.sqlx/query-45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede.json b/.sqlx/query-bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e.json similarity index 64% rename from .sqlx/query-45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede.json rename to .sqlx/query-bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e.json index b4228a578..14c5615b6 100644 --- a/.sqlx/query-45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede.json +++ b/.sqlx/query-bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n r.rustdoc_status,\n r.default_target,\n r.doc_targets,\n r.archive_storage,\n r.source_size as \"source_size!\",\n cov.total_items,\n b.id as build_id,\n b.build_status::TEXT as build_status,\n b.docsrs_version,\n b.rustc_version,\n b.documentation_size,\n b.memory_peak\n FROM\n crates as c\n INNER JOIN releases AS r ON c.id = r.crate_id\n INNER JOIN builds as b ON r.id = b.rid\n LEFT OUTER JOIN doc_coverage AS cov ON r.id = cov.release_id\n WHERE\n c.name = $1 AND\n r.version = $2", + "query": "SELECT\n r.rustdoc_status,\n r.default_target,\n r.doc_targets,\n r.archive_storage,\n r.source_size as \"source_size!\",\n cov.total_items,\n b.id as build_id,\n b.build_status::TEXT as build_status,\n b.docsrs_version,\n b.rustc_version,\n b.documentation_size,\n b.memory_peak,\n (\n SELECT array_agg(row(bl.log_filename, bl.success))\n FROM (\n SELECT log_filename, success\n FROM builds_logs\n WHERE builds_logs.build_id = b.id\n ORDER BY id\n ) bl\n ) AS \"logs: Vec<(String, bool)>\"\n FROM\n crates as c\n INNER JOIN releases AS r ON c.id = r.crate_id\n INNER JOIN builds as b ON r.id = b.rid\n LEFT OUTER JOIN doc_coverage AS cov ON r.id = cov.release_id\n WHERE\n c.name = $1 AND\n r.version = $2", "describe": { "columns": [ { @@ -62,6 +62,11 @@ "ordinal": 11, "name": "memory_peak", "type_info": "Int8" + }, + { + "ordinal": 12, + "name": "logs: Vec<(String, bool)>", + "type_info": "RecordArray" } ], "parameters": { @@ -82,8 +87,9 @@ true, true, true, - true + true, + null ] }, - "hash": "45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede" + "hash": "bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e" } diff --git a/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json b/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json index f8702582d..0d9e16c11 100644 --- a/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json +++ b/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json @@ -58,7 +58,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json index 8699a9ded..5b10b179f 100644 --- a/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ b/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json @@ -13,7 +13,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/cratesfyi/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json b/crates/bin/cratesfyi/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json new file mode 100644 index 000000000..a825d08b1 --- /dev/null +++ b/crates/bin/cratesfyi/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM builds_logs AS bl\n USING builds AS b\n JOIN releases AS r ON b.rid = r.id\n WHERE bl.build_id = b.id AND r.crate_id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a" +} diff --git a/crates/bin/cratesfyi/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json b/crates/bin/cratesfyi/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json deleted file mode 100644 index 7e974f7ff..000000000 --- a/crates/bin/cratesfyi/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n CASE\n WHEN builds.build_started IS NULL\n -- for old builds, `build_started` is empty.\n THEN NULL\n ELSE\n CASE\n -- for in-progress builds we show the duration until now\n WHEN builds.build_status = 'in_progress' THEN (CURRENT_TIMESTAMP - builds.build_started)\n -- there are broken builds where the status is `error`, and `build_finished` is NULL\n WHEN builds.build_finished IS NULL THEN NULL\n -- for finished builds we can show the full duration\n ELSE (builds.build_finished - builds.build_started)\n END\n END AS \"build_duration?: Duration\",\n builds.memory_peak,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: BuildId", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 4, - "name": "build_time", - "type_info": "Timestamptz" - }, - { - "ordinal": 5, - "name": "build_duration?: Duration", - "type_info": "Interval" - }, - { - "ordinal": 6, - "name": "memory_peak", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "errors", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - true, - true, - false, - null, - null, - true, - true - ] - }, - "hash": "20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e" -} diff --git a/crates/bin/cratesfyi/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json b/crates/bin/cratesfyi/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json similarity index 63% rename from crates/bin/cratesfyi/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json rename to crates/bin/cratesfyi/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json index 68c85967b..f360c7daf 100644 --- a/crates/bin/cratesfyi/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json +++ b/crates/bin/cratesfyi/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n builds.error_kind,\n releases.default_target\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", + "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n builds.error_kind,\n releases.default_target,\n (\n SELECT array_agg(row(bl.log_filename, bl.success))\n FROM (\n SELECT log_filename, success\n FROM builds_logs\n WHERE builds_logs.build_id = builds.id\n ORDER BY log_filename\n ) bl\n ) AS \"logs: Vec<(String, bool)>\"\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", "describe": { "columns": [ { @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } @@ -53,6 +54,11 @@ "ordinal": 7, "name": "default_target", "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "logs: Vec<(String, bool)>", + "type_info": "RecordArray" } ], "parameters": { @@ -70,8 +76,9 @@ true, true, true, - true + true, + null ] }, - "hash": "9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4" + "hash": "28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9" } diff --git a/crates/bin/cratesfyi/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json b/crates/bin/cratesfyi/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json new file mode 100644 index 000000000..2109f69cf --- /dev/null +++ b/crates/bin/cratesfyi/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM builds_logs bl\n USING builds b\n JOIN releases r ON b.rid = r.id\n WHERE bl.build_id = b.id AND r.crate_id = $1 AND r.version = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214" +} diff --git a/crates/bin/cratesfyi/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/cratesfyi/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/crates/bin/cratesfyi/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/crates/bin/cratesfyi/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/cratesfyi/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json b/crates/bin/cratesfyi/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json new file mode 100644 index 000000000..b144694d4 --- /dev/null +++ b/crates/bin/cratesfyi/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json @@ -0,0 +1,77 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n CASE\n WHEN builds.build_status = 'success'::build_status THEN\n CASE\n WHEN COALESCE(\n (SELECT bool_and(builds_logs.success)\n FROM builds_logs\n WHERE builds_logs.build_id = builds.id),\n TRUE\n ) = TRUE THEN 'success'::build_status\n ELSE 'partial_failure'::build_status\n END\n ELSE builds.build_status\n END as \"build_status!: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n CASE\n WHEN builds.build_started IS NULL\n -- for old builds, `build_started` is empty.\n THEN NULL\n ELSE\n CASE\n -- for in-progress builds we show the duration until now\n WHEN builds.build_status = 'in_progress' THEN (CURRENT_TIMESTAMP - builds.build_started)\n -- there are broken builds where the status is `error`, and `build_finished` is NULL\n WHEN builds.build_finished IS NULL THEN NULL\n -- for finished builds we can show the full duration\n ELSE (builds.build_finished - builds.build_started)\n END\n END AS \"build_duration?: Duration\",\n builds.memory_peak,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: BuildId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "rustc_version", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "docsrs_version", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "build_status!: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure", + "partial_failure" + ] + } + } + } + }, + { + "ordinal": 4, + "name": "build_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "build_duration?: Duration", + "type_info": "Interval" + }, + { + "ordinal": 6, + "name": "memory_peak", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "errors", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + true, + true, + null, + null, + null, + true, + true + ] + }, + "hash": "4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734" +} diff --git a/crates/bin/cratesfyi/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/crates/bin/cratesfyi/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/crates/bin/cratesfyi/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/crates/bin/cratesfyi/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/cratesfyi/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/crates/bin/cratesfyi/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/crates/bin/cratesfyi/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/crates/bin/cratesfyi/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/cratesfyi/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/cratesfyi/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/crates/bin/cratesfyi/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/crates/bin/cratesfyi/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/cratesfyi/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/crates/bin/cratesfyi/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/crates/bin/cratesfyi/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/crates/bin/cratesfyi/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json b/crates/bin/cratesfyi/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json index f8702582d..0d9e16c11 100644 --- a/crates/bin/cratesfyi/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json +++ b/crates/bin/cratesfyi/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json @@ -58,7 +58,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/cratesfyi/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/bin/cratesfyi/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json index 8699a9ded..5b10b179f 100644 --- a/crates/bin/cratesfyi/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ b/crates/bin/cratesfyi/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json @@ -13,7 +13,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_admin/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/docs_rs_admin/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/crates/bin/docs_rs_admin/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/crates/bin/docs_rs_admin/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_admin/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/crates/bin/docs_rs_admin/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/crates/bin/docs_rs_admin/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/crates/bin/docs_rs_admin/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_admin/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/crates/bin/docs_rs_admin/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/crates/bin/docs_rs_admin/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/crates/bin/docs_rs_admin/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_admin/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/docs_rs_admin/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/crates/bin/docs_rs_admin/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/crates/bin/docs_rs_admin/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_admin/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/crates/bin/docs_rs_admin/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/crates/bin/docs_rs_admin/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/crates/bin/docs_rs_builder/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/docs_rs_builder/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_builder/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/crates/bin/docs_rs_builder/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_builder/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/crates/bin/docs_rs_builder/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_builder/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json b/crates/bin/docs_rs_builder/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json index 9c5e18816..8331779b6 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-99961669a88e08e3803172d1755caffd9f0ee426e02cb3512df288434e40029f.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_builder/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/docs_rs_builder/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_builder/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/crates/bin/docs_rs_builder/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/crates/bin/docs_rs_builder/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/crates/bin/docs_rs_builder/.sqlx/query-45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede.json b/crates/bin/docs_rs_builder/.sqlx/query-bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e.json similarity index 64% rename from crates/bin/docs_rs_builder/.sqlx/query-45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede.json rename to crates/bin/docs_rs_builder/.sqlx/query-bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e.json index b4228a578..14c5615b6 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n r.rustdoc_status,\n r.default_target,\n r.doc_targets,\n r.archive_storage,\n r.source_size as \"source_size!\",\n cov.total_items,\n b.id as build_id,\n b.build_status::TEXT as build_status,\n b.docsrs_version,\n b.rustc_version,\n b.documentation_size,\n b.memory_peak\n FROM\n crates as c\n INNER JOIN releases AS r ON c.id = r.crate_id\n INNER JOIN builds as b ON r.id = b.rid\n LEFT OUTER JOIN doc_coverage AS cov ON r.id = cov.release_id\n WHERE\n c.name = $1 AND\n r.version = $2", + "query": "SELECT\n r.rustdoc_status,\n r.default_target,\n r.doc_targets,\n r.archive_storage,\n r.source_size as \"source_size!\",\n cov.total_items,\n b.id as build_id,\n b.build_status::TEXT as build_status,\n b.docsrs_version,\n b.rustc_version,\n b.documentation_size,\n b.memory_peak,\n (\n SELECT array_agg(row(bl.log_filename, bl.success))\n FROM (\n SELECT log_filename, success\n FROM builds_logs\n WHERE builds_logs.build_id = b.id\n ORDER BY id\n ) bl\n ) AS \"logs: Vec<(String, bool)>\"\n FROM\n crates as c\n INNER JOIN releases AS r ON c.id = r.crate_id\n INNER JOIN builds as b ON r.id = b.rid\n LEFT OUTER JOIN doc_coverage AS cov ON r.id = cov.release_id\n WHERE\n c.name = $1 AND\n r.version = $2", "describe": { "columns": [ { @@ -62,6 +62,11 @@ "ordinal": 11, "name": "memory_peak", "type_info": "Int8" + }, + { + "ordinal": 12, + "name": "logs: Vec<(String, bool)>", + "type_info": "RecordArray" } ], "parameters": { @@ -82,8 +87,9 @@ true, true, true, - true + true, + null ] }, - "hash": "45430d90ec9c871622a0b4d85da622930ec24b54edba59a4cdd0581ef9ce1ede" + "hash": "bff5c350f929e3fc29a23bbf3444c02087c2ac7004626c4c0c069f313500d23e" } diff --git a/crates/bin/docs_rs_builder/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/bin/docs_rs_builder/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json index 8699a9ded..5b10b179f 100644 --- a/crates/bin/docs_rs_builder/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ b/crates/bin/docs_rs_builder/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json @@ -13,7 +13,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_builder/src/docbuilder/rustwide_builder.rs b/crates/bin/docs_rs_builder/src/docbuilder/rustwide_builder.rs index 1be47adcd..8643d605a 100644 --- a/crates/bin/docs_rs_builder/src/docbuilder/rustwide_builder.rs +++ b/crates/bin/docs_rs_builder/src/docbuilder/rustwide_builder.rs @@ -10,8 +10,9 @@ use docs_rs_context::Context; use docs_rs_database::{ Pool, releases::{ - add_doc_coverage, finish_build, finish_release, initialize_build, initialize_crate, - initialize_release, update_build_with_error, update_crate_data_in_database, + add_build_logs, add_doc_coverage, finish_build, finish_release, initialize_build, + initialize_crate, initialize_release, update_build_with_error, + update_crate_data_in_database, }, service_config::{ConfigName, get_config, set_config}, }; @@ -739,7 +740,8 @@ impl RustwideBuilder { &metadata, collect_metrics, )?; - target_build_logs.insert(target, target_res.build_log); + let successful = target_res.successful(); + target_build_logs.insert(target, (target_res.build_log, successful)); } let (file_list, new_alg) = @@ -778,13 +780,19 @@ impl RustwideBuilder { let successful = res.successful(); { + let mut build_logs = Vec::new(); + let _span = info_span!("store_build_logs").entered(); let build_log_path = format!("build-logs/{build_id}/{default_target}.txt"); + let successful = res.successful(); self.blocking_storage.store_one(build_log_path, res.build_log)?; - for (target, log) in target_build_logs { + build_logs.push((format!("{default_target}.txt"), successful)); + for (target, (log, successful)) in target_build_logs { let build_log_path = format!("build-logs/{build_id}/{target}.txt"); self.blocking_storage.store_one(build_log_path, log)?; + build_logs.push((format!("{target}.txt"), successful)); } + self.runtime.block_on(add_build_logs(&mut async_conn, build_id, build_logs))?; } if successful { @@ -1483,7 +1491,16 @@ mod tests { b.docsrs_version, b.rustc_version, b.documentation_size, - b.memory_peak + b.memory_peak, + ( + SELECT array_agg(row(bl.log_filename, bl.success)) + FROM ( + SELECT log_filename, success + FROM builds_logs + WHERE builds_logs.build_id = b.id + ORDER BY id + ) bl + ) AS "logs: Vec<(String, bool)>" FROM crates as c INNER JOIN releases AS r ON c.id = r.crate_id @@ -1510,6 +1527,18 @@ mod tests { assert!(row.source_size > 0); assert!(row.documentation_size.unwrap() > 0); assert!(row.memory_peak.unwrap() > 10 * 1024 * 1024); // 10 MiB, in my test it was > 100 MiB + let mut logs = row.logs.unwrap(); + logs.sort(); + let mut expected = vec![ + ("x86_64-unknown-linux-gnu.txt".to_owned(), true), + ("i686-pc-windows-msvc.txt".to_owned(), true), + ("aarch64-unknown-linux-gnu.txt".to_owned(), true), + ("x86_64-pc-windows-msvc.txt".to_owned(), true), + ("aarch64-apple-darwin.txt".to_owned(), true), + ]; + expected.sort(); + + assert_eq!(logs, expected); let mut targets: Vec = row .doc_targets diff --git a/crates/bin/docs_rs_import_release/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/docs_rs_import_release/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/crates/bin/docs_rs_import_release/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/crates/bin/docs_rs_import_release/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_import_release/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/crates/bin/docs_rs_import_release/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/crates/bin/docs_rs_import_release/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/crates/bin/docs_rs_import_release/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_import_release/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/crates/bin/docs_rs_import_release/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/crates/bin/docs_rs_import_release/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/crates/bin/docs_rs_import_release/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_import_release/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/docs_rs_import_release/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/crates/bin/docs_rs_import_release/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/crates/bin/docs_rs_import_release/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_import_release/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/crates/bin/docs_rs_import_release/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/crates/bin/docs_rs_import_release/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json b/crates/bin/docs_rs_watcher/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json new file mode 100644 index 000000000..a825d08b1 --- /dev/null +++ b/crates/bin/docs_rs_watcher/.sqlx/query-074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM builds_logs AS bl\n USING builds AS b\n JOIN releases AS r ON b.rid = r.id\n WHERE bl.build_id = b.id AND r.crate_id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "074d3b1cc144fdceba8e3094c20b7c62552364513c0827f1b334d2945b49917a" +} diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json b/crates/bin/docs_rs_watcher/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json new file mode 100644 index 000000000..2109f69cf --- /dev/null +++ b/crates/bin/docs_rs_watcher/.sqlx/query-2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM builds_logs bl\n USING builds b\n JOIN releases r ON b.rid = r.id\n WHERE bl.build_id = b.id AND r.crate_id = $1 AND r.version = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "2dc065cc08f262c937c54f9cc8629e35750da2bea995fb0c433893addb253214" +} diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/docs_rs_watcher/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/crates/bin/docs_rs_watcher/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/crates/bin/docs_rs_watcher/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/crates/bin/docs_rs_watcher/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/crates/bin/docs_rs_watcher/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/crates/bin/docs_rs_watcher/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/crates/bin/docs_rs_watcher/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/crates/bin/docs_rs_watcher/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/crates/bin/docs_rs_watcher/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/docs_rs_watcher/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/crates/bin/docs_rs_watcher/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/crates/bin/docs_rs_watcher/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/crates/bin/docs_rs_watcher/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/crates/bin/docs_rs_watcher/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/crates/bin/docs_rs_watcher/src/db/delete.rs b/crates/bin/docs_rs_watcher/src/db/delete.rs index 18970a26d..dbfa0e58e 100644 --- a/crates/bin/docs_rs_watcher/src/db/delete.rs +++ b/crates/bin/docs_rs_watcher/src/db/delete.rs @@ -154,6 +154,17 @@ async fn delete_version_from_database( .fetch_all(&mut *transaction) .await?; + sqlx::query!( + "DELETE FROM builds_logs bl + USING builds b + JOIN releases r ON b.rid = r.id + WHERE bl.build_id = b.id AND r.crate_id = $1 AND r.version = $2;", + crate_id as _, + version as _ + ) + .execute(&mut *transaction) + .await?; + for &(table, column) in METADATA { sqlx::query( format!("DELETE FROM {table} WHERE {column} IN (SELECT id FROM releases WHERE crate_id = $1 AND version = $2)").as_str()) @@ -212,6 +223,16 @@ async fn delete_crate_from_database( .execute(&mut *transaction) .await?; + sqlx::query!( + "DELETE FROM builds_logs AS bl + USING builds AS b + JOIN releases AS r ON b.rid = r.id + WHERE bl.build_id = b.id AND r.crate_id = $1;", + crate_id as _ + ) + .execute(&mut *transaction) + .await?; + for &(table, column) in METADATA { sqlx::query( format!( diff --git a/crates/bin/docs_rs_web/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json b/crates/bin/docs_rs_web/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json index 8a1259bdd..31e5cb180 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json +++ b/crates/bin/docs_rs_web/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json @@ -13,7 +13,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_web/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json b/crates/bin/docs_rs_web/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json deleted file mode 100644 index 7e974f7ff..000000000 --- a/crates/bin/docs_rs_web/.sqlx/query-20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n CASE\n WHEN builds.build_started IS NULL\n -- for old builds, `build_started` is empty.\n THEN NULL\n ELSE\n CASE\n -- for in-progress builds we show the duration until now\n WHEN builds.build_status = 'in_progress' THEN (CURRENT_TIMESTAMP - builds.build_started)\n -- there are broken builds where the status is `error`, and `build_finished` is NULL\n WHEN builds.build_finished IS NULL THEN NULL\n -- for finished builds we can show the full duration\n ELSE (builds.build_finished - builds.build_started)\n END\n END AS \"build_duration?: Duration\",\n builds.memory_peak,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: BuildId", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 4, - "name": "build_time", - "type_info": "Timestamptz" - }, - { - "ordinal": 5, - "name": "build_duration?: Duration", - "type_info": "Interval" - }, - { - "ordinal": 6, - "name": "memory_peak", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "errors", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - true, - true, - false, - null, - null, - true, - true - ] - }, - "hash": "20e978cf93a568649b762fb1f93c63ad7d64bfa34b5663ace054d30113ab833e" -} diff --git a/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json b/crates/bin/docs_rs_web/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json similarity index 63% rename from .sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json rename to crates/bin/docs_rs_web/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json index 68c85967b..f360c7daf 100644 --- a/.sqlx/query-9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4.json +++ b/crates/bin/docs_rs_web/.sqlx/query-28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n builds.error_kind,\n releases.default_target\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", + "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n builds.error_kind,\n releases.default_target,\n (\n SELECT array_agg(row(bl.log_filename, bl.success))\n FROM (\n SELECT log_filename, success\n FROM builds_logs\n WHERE builds_logs.build_id = builds.id\n ORDER BY log_filename\n ) bl\n ) AS \"logs: Vec<(String, bool)>\"\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", "describe": { "columns": [ { @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } @@ -53,6 +54,11 @@ "ordinal": 7, "name": "default_target", "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "logs: Vec<(String, bool)>", + "type_info": "RecordArray" } ], "parameters": { @@ -70,8 +76,9 @@ true, true, true, - true + true, + null ] }, - "hash": "9cc5a9e57ba5da30aea23342ea590b53abd0867ebbd6ed2fe109984b1960c6d4" + "hash": "28a93198f116f697ad7a32a55882bd94e0b9278ce0837a52cb063c8570688aa9" } diff --git a/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json index ca0a44f4b..37e35380f 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json +++ b/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -23,7 +23,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_web/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json b/crates/bin/docs_rs_web/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json new file mode 100644 index 000000000..b144694d4 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734.json @@ -0,0 +1,77 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n CASE\n WHEN builds.build_status = 'success'::build_status THEN\n CASE\n WHEN COALESCE(\n (SELECT bool_and(builds_logs.success)\n FROM builds_logs\n WHERE builds_logs.build_id = builds.id),\n TRUE\n ) = TRUE THEN 'success'::build_status\n ELSE 'partial_failure'::build_status\n END\n ELSE builds.build_status\n END as \"build_status!: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n CASE\n WHEN builds.build_started IS NULL\n -- for old builds, `build_started` is empty.\n THEN NULL\n ELSE\n CASE\n -- for in-progress builds we show the duration until now\n WHEN builds.build_status = 'in_progress' THEN (CURRENT_TIMESTAMP - builds.build_started)\n -- there are broken builds where the status is `error`, and `build_finished` is NULL\n WHEN builds.build_finished IS NULL THEN NULL\n -- for finished builds we can show the full duration\n ELSE (builds.build_finished - builds.build_started)\n END\n END AS \"build_duration?: Duration\",\n builds.memory_peak,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: BuildId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "rustc_version", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "docsrs_version", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "build_status!: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure", + "partial_failure" + ] + } + } + } + }, + { + "ordinal": 4, + "name": "build_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "build_duration?: Duration", + "type_info": "Interval" + }, + { + "ordinal": 6, + "name": "memory_peak", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "errors", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + true, + true, + null, + null, + null, + true, + true + ] + }, + "hash": "4ace444e76b6d04dcbece120521d2a215ba8bba98a7dbea0e0944712e6741734" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json b/crates/bin/docs_rs_web/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json index 8aa1f8db9..41bf6a35b 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json +++ b/crates/bin/docs_rs_web/.sqlx/query-7633edc3884e73fc8edad8f5e1539b79ab4ea2ff504cf2319324403b979365e1.json @@ -18,7 +18,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_web/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json b/crates/bin/docs_rs_web/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json index 53108f498..5db534183 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json +++ b/crates/bin/docs_rs_web/.sqlx/query-96038b2acad7957be667de55421e59e078a8dd8972e65dc6223d94eecfcbf4ad.json @@ -20,7 +20,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json index 9439ea53a..12420249e 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json +++ b/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -19,7 +19,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_web/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json b/crates/bin/docs_rs_web/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json new file mode 100644 index 000000000..6cba4c5a1 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds_logs(build_id, log_filename, success)\n SELECT $1, * FROM UNNEST($2::text[], $3::bool[])", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray", + "BoolArray" + ] + }, + "nullable": [] + }, + "hash": "b416fa78f39cf3cb37dcec19355f33328df2318930d263711df076995e1a1ad3" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json b/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json index f8702582d..0d9e16c11 100644 --- a/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json +++ b/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json @@ -58,7 +58,8 @@ "Enum": [ "in_progress", "success", - "failure" + "failure", + "partial_failure" ] } } diff --git a/crates/bin/docs_rs_web/src/handlers/build_details.rs b/crates/bin/docs_rs_web/src/handlers/build_details.rs index f8992619e..45f9fe43b 100644 --- a/crates/bin/docs_rs_web/src/handlers/build_details.rs +++ b/crates/bin/docs_rs_web/src/handlers/build_details.rs @@ -36,7 +36,7 @@ pub(crate) struct BuildDetails { struct BuildDetailsPage { metadata: MetaData, build_details: BuildDetails, - all_log_filenames: Vec, + all_log_filenames: Vec<(String, Option)>, current_filename: Option, params: RustdocParams, } @@ -92,7 +92,16 @@ pub(crate) async fn build_details_handler( builds.output, builds.errors, builds.error_kind, - releases.default_target + releases.default_target, + ( + SELECT array_agg(row(bl.log_filename, bl.success)) + FROM ( + SELECT log_filename, success + FROM builds_logs + WHERE builds_logs.build_id = builds.id + ORDER BY log_filename + ) bl + ) AS "logs: Vec<(String, bool)>" FROM builds INNER JOIN releases ON releases.id = builds.rid INNER JOIN crates ON releases.crate_id = crates.id @@ -127,16 +136,29 @@ pub(crate) async fn build_details_handler( // toFor a long time only for one target, then we started storing the logs for other // targets. In any case, all the logfiles are put into a folder we can just query. let prefix = format!("build-logs/{id}/"); - let all_log_filenames: Vec<_> = storage - .list_prefix(&prefix) // the result from S3 is ordered by key - .await - .map_ok(|path| { - path.strip_prefix(&prefix) - .expect("since we query for the prefix, it has to be always there") - .to_owned() - }) - .try_collect() - .await?; + + // A list of `(path, build_successful)`. + let all_log_filenames: Vec<(String, Option)> = if let Some(logs) = row.logs + && !logs.is_empty() + { + logs.into_iter() + .map(|(path, success)| (path, Some(success))) + .collect() + } else { + storage + .list_prefix(&prefix) // the result from S3 is ordered by key + .await + .map_ok(|path| { + ( + path.strip_prefix(&prefix) + .expect("since we query for the prefix, it has to be always there") + .to_owned(), + None, + ) + }) + .try_collect() + .await? + }; let current_filename = if let Some(filename) = build_params.filename { // if we have a given filename in the URL, we use that one. @@ -145,7 +167,10 @@ pub(crate) async fn build_details_handler( // without a filename in the URL, we try to show the build log // for the default target, if we have one. let wanted_filename = format!("{default_target}.txt"); - if all_log_filenames.contains(&wanted_filename) { + if all_log_filenames + .iter() + .any(|(filename, _)| *filename == wanted_filename) + { Some(wanted_filename) } else { None @@ -351,7 +376,7 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default().s3_build_log("A build log")]) + .builds(vec![FakeBuild::default().s3_build_log("A build log", true)]) .create() .await?; @@ -405,8 +430,8 @@ mod tests { .version("0.1.0") .builds(vec![ FakeBuild::default() - .s3_build_log("A build log") - .build_log_for_other_target("other_target", "other target build log"), + .s3_build_log("A build log", true) + .build_log_for_other_target("other_target", "other target build log", true), ]) .create() .await?; @@ -428,7 +453,8 @@ mod tests { assert!(log.contains("A build log")); - let all_log_links = get_all_log_links(&page); + let mut all_log_links = get_all_log_links(&page); + all_log_links.sort_unstable(); assert_eq!( all_log_links, vec![ @@ -471,7 +497,7 @@ mod tests { .version("0.1.0") .builds(vec![ FakeBuild::default() - .s3_build_log("A build log") + .s3_build_log("A build log", true) .db_build_log("Another build log"), ]) .create() diff --git a/crates/bin/docs_rs_web/src/handlers/builds.rs b/crates/bin/docs_rs_web/src/handlers/builds.rs index 7700425e8..b90f7909d 100644 --- a/crates/bin/docs_rs_web/src/handlers/builds.rs +++ b/crates/bin/docs_rs_web/src/handlers/builds.rs @@ -190,7 +190,19 @@ async fn get_builds( builds.id as "id: BuildId", builds.rustc_version, builds.docsrs_version, - builds.build_status as "build_status: BuildStatus", + CASE + WHEN builds.build_status = 'success'::build_status THEN + CASE + WHEN COALESCE( + (SELECT bool_and(builds_logs.success) + FROM builds_logs + WHERE builds_logs.build_id = builds.id), + TRUE + ) = TRUE THEN 'success'::build_status + ELSE 'partial_failure'::build_status + END + ELSE builds.build_status + END as "build_status!: BuildStatus", COALESCE(builds.build_finished, builds.build_started) as build_time, CASE WHEN builds.build_started IS NULL @@ -224,6 +236,7 @@ async fn get_builds( #[cfg(test)] mod tests { + use super::get_builds; use crate::{ Config, cache::CachePolicy, @@ -238,10 +251,11 @@ mod tests { use docs_rs_test_fakes::{FakeBuild, fake_release_that_failed_before_build}; use docs_rs_types::{ BuildStatus, SimpleBuildError, - testing::{FOO, V1, V2}, + testing::{FOO, V0_1, V1, V2}, }; use kuchikiki::traits::TendrilSink; use reqwest::StatusCode; + use test_case::{test_case, test_matrix}; use tower::ServiceExt; #[test] @@ -713,4 +727,138 @@ mod tests { Ok(()) }); } + + #[tokio::test(flavor = "multi_thread")] + #[test_case(BuildStatus::Success)] + #[test_case(BuildStatus::Failure)] + #[test_case(BuildStatus::InProgress)] + async fn get_builds_legacy_logs_just_passes_build_status( + build_status: BuildStatus, + ) -> Result<()> { + let env = TestEnvironment::new().await?; + env.fake_release() + .await + .name(FOO) + .version(V0_1) + .builds(vec![ + FakeBuild::default() + .build_status(build_status) + .legacy_build_logs(true), + ]) + .create() + .await?; + + let mut conn = env.async_conn().await?; + + assert_eq!( + get_builds(&mut conn, &FOO, &V0_1) + .await? + .into_iter() + .map(|b| b.build_status) + .next() + .unwrap(), + build_status, + ); + + Ok(()) + } + + #[tokio::test(flavor = "multi_thread")] + #[test_matrix( + [BuildStatus::InProgress, BuildStatus::Failure], + [true, false] + )] + async fn get_builds_new_logs_just_passes_build_status_if_not_success( + build_status: BuildStatus, + build_log_success: bool, + ) -> Result<()> { + let env = TestEnvironment::new().await?; + env.fake_release() + .await + .name(FOO) + .version(V0_1) + .builds(vec![ + FakeBuild::default() + .build_status(build_status) + .s3_build_log("some log", build_log_success), + ]) + .create() + .await?; + + let mut conn = env.async_conn().await?; + + assert_eq!( + get_builds(&mut conn, &FOO, &V0_1) + .await? + .into_iter() + .map(|b| b.build_status) + .next() + .unwrap(), + build_status, + ); + + Ok(()) + } + + #[tokio::test(flavor = "multi_thread")] + async fn get_builds_new_logs_all_logs_ok_means_success() -> Result<()> { + let env = TestEnvironment::new().await?; + env.fake_release() + .await + .name(FOO) + .version(V0_1) + .builds(vec![ + FakeBuild::default() + .build_status(BuildStatus::Success) + .s3_build_log("some log", true) + .build_log_for_other_target("other-target", "other log", true), + ]) + .create() + .await?; + + let mut conn = env.async_conn().await?; + + assert_eq!( + get_builds(&mut conn, &FOO, &V0_1) + .await? + .into_iter() + .map(|b| b.build_status) + .next() + .unwrap(), + BuildStatus::Success, + ); + + Ok(()) + } + + #[tokio::test(flavor = "multi_thread")] + async fn get_builds_new_logs_partial_success() -> Result<()> { + let env = TestEnvironment::new().await?; + env.fake_release() + .await + .name(FOO) + .version(V0_1) + .builds(vec![ + FakeBuild::default() + .build_status(BuildStatus::Success) + .s3_build_log("some log", true) + .build_log_for_other_target("other-target", "other log", false), + ]) + .create() + .await?; + + let mut conn = env.async_conn().await?; + + assert_eq!( + get_builds(&mut conn, &FOO, &V0_1) + .await? + .into_iter() + .map(|b| b.build_status) + .next() + .unwrap(), + BuildStatus::PartialFailure + ); + + Ok(()) + } } diff --git a/crates/bin/docs_rs_web/templates/crate/build_details.html b/crates/bin/docs_rs_web/templates/crate/build_details.html index 1d3165834..fab29462d 100644 --- a/crates/bin/docs_rs_web/templates/crate/build_details.html +++ b/crates/bin/docs_rs_web/templates/crate/build_details.html @@ -31,11 +31,20 @@

Build #{{ build_details.id }} {%- endif -%}