diff --git a/.sqlx/query-081663d386dd8dac6fbf3e47ef39fa7238f29192674ced1b3a46329db6cc3b64.json b/.sqlx/query-081663d386dd8dac6fbf3e47ef39fa7238f29192674ced1b3a46329db6cc3b64.json deleted file mode 100644 index c41e1a2e1..000000000 --- a/.sqlx/query-081663d386dd8dac6fbf3e47ef39fa7238f29192674ced1b3a46329db6cc3b64.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n kw.name as \"name!\",\n kw.slug as \"slug!\"\n FROM keywords as kw\n INNER JOIN keyword_rels as kwr on kw.id = kwr.kid\n WHERE kwr.rid = $1\n ORDER BY kw.name,kw.slug", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name!", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "slug!", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - true, - false - ] - }, - "hash": "081663d386dd8dac6fbf3e47ef39fa7238f29192674ced1b3a46329db6cc3b64" -} diff --git a/.sqlx/query-09cfb32d3ce685cbb748a703fee395f8b9da75636522a343363c6e88a6e6dfb1.json b/.sqlx/query-09cfb32d3ce685cbb748a703fee395f8b9da75636522a343363c6e88a6e6dfb1.json deleted file mode 100644 index 9f5c2b08d..000000000 --- a/.sqlx/query-09cfb32d3ce685cbb748a703fee395f8b9da75636522a343363c6e88a6e6dfb1.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT o.login\n FROM owners o, owner_rels r\n WHERE\n o.id = r.oid AND\n r.cid = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "09cfb32d3ce685cbb748a703fee395f8b9da75636522a343363c6e88a6e6dfb1" -} diff --git a/.sqlx/query-0da90d737b6bf2c1c1b0ab6b14c73c8363125578b1d6e30a99e70aa6bf7842c2.json b/.sqlx/query-0da90d737b6bf2c1c1b0ab6b14c73c8363125578b1d6e30a99e70aa6bf7842c2.json deleted file mode 100644 index 78624ea28..000000000 --- a/.sqlx/query-0da90d737b6bf2c1c1b0ab6b14c73c8363125578b1d6e30a99e70aa6bf7842c2.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n rustc_version,\n docsrs_version,\n build_status as \"build_status: BuildStatus\",\n documentation_size,\n errors\n FROM builds\n WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 3, - "name": "documentation_size", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "errors", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - true, - true, - false, - true, - true - ] - }, - "hash": "0da90d737b6bf2c1c1b0ab6b14c73c8363125578b1d6e30a99e70aa6bf7842c2" -} diff --git a/.sqlx/query-16dfb0d87266568fb8a84585614387c8bfa4790b9e8d317159b37397e42b7ceb.json b/.sqlx/query-16dfb0d87266568fb8a84585614387c8bfa4790b9e8d317159b37397e42b7ceb.json deleted file mode 100644 index 591b42a07..000000000 --- a/.sqlx/query-16dfb0d87266568fb8a84585614387c8bfa4790b9e8d317159b37397e42b7ceb.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT login, avatar, kind as \"kind: OwnerKind\"\n FROM owners", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "avatar", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "kind: OwnerKind", - "type_info": { - "Custom": { - "name": "owner_kind", - "kind": { - "Enum": [ - "user", - "team" - ] - } - } - } - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "16dfb0d87266568fb8a84585614387c8bfa4790b9e8d317159b37397e42b7ceb" -} diff --git a/.sqlx/query-1e48486ba272a4e2ea8793114e412c14ed13f652419b1467c21e1829f31cd573.json b/.sqlx/query-1e48486ba272a4e2ea8793114e412c14ed13f652419b1467c21e1829f31cd573.json deleted file mode 100644 index 438d11b06..000000000 --- a/.sqlx/query-1e48486ba272a4e2ea8793114e412c14ed13f652419b1467c21e1829f31cd573.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT login, avatar, kind as \"kind: OwnerKind\" FROM owners", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "avatar", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "kind: OwnerKind", - "type_info": { - "Custom": { - "name": "owner_kind", - "kind": { - "Enum": [ - "user", - "team" - ] - } - } - } - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "1e48486ba272a4e2ea8793114e412c14ed13f652419b1467c21e1829f31cd573" -} diff --git a/.sqlx/query-23c1c88674c09e208738ebdd705db4c30d6dba6e24ca6c7c7fbf06d49d40994f.json b/.sqlx/query-23c1c88674c09e208738ebdd705db4c30d6dba6e24ca6c7c7fbf06d49d40994f.json deleted file mode 100644 index d520c5471..000000000 --- a/.sqlx/query-23c1c88674c09e208738ebdd705db4c30d6dba6e24ca6c7c7fbf06d49d40994f.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT name FROM crates WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "23c1c88674c09e208738ebdd705db4c30d6dba6e24ca6c7c7fbf06d49d40994f" -} diff --git a/.sqlx/query-3e9eb6292735559d232316d155c7dc463098408a0ca28f2b0c13bc6f4e3c32b6.json b/.sqlx/query-3e9eb6292735559d232316d155c7dc463098408a0ca28f2b0c13bc6f4e3c32b6.json deleted file mode 100644 index fb5281405..000000000 --- a/.sqlx/query-3e9eb6292735559d232316d155c7dc463098408a0ca28f2b0c13bc6f4e3c32b6.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT o.login\n FROM owners o, owner_rels r\n WHERE\n o.id = r.oid AND\n r.cid = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "3e9eb6292735559d232316d155c7dc463098408a0ca28f2b0c13bc6f4e3c32b6" -} diff --git a/.sqlx/query-45dce653c51bb8a13c9b091b1aa5f997fccf6a563f654c7943b4593598acccbc.json b/.sqlx/query-45dce653c51bb8a13c9b091b1aa5f997fccf6a563f654c7943b4593598acccbc.json deleted file mode 100644 index ca87c1cb2..000000000 --- a/.sqlx/query-45dce653c51bb8a13c9b091b1aa5f997fccf6a563f654c7943b4593598acccbc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n version as \"version: Version\"\n FROM releases\n WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "version: Version", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "45dce653c51bb8a13c9b091b1aa5f997fccf6a563f654c7943b4593598acccbc" -} diff --git a/.sqlx/query-4ec79e1fa4249f4e1b085d1bbdffa537d1e3160d642e4a3325f4aea6c21974eb.json b/.sqlx/query-4ec79e1fa4249f4e1b085d1bbdffa537d1e3160d642e4a3325f4aea6c21974eb.json deleted file mode 100644 index 3f8fdef82..000000000 --- a/.sqlx/query-4ec79e1fa4249f4e1b085d1bbdffa537d1e3160d642e4a3325f4aea6c21974eb.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM config", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "4ec79e1fa4249f4e1b085d1bbdffa537d1e3160d642e4a3325f4aea6c21974eb" -} diff --git a/.sqlx/query-5a927fd22f0ad007a48820a7af73747f6a3f03e02097065cbb8958d50366a2b3.json b/.sqlx/query-5a927fd22f0ad007a48820a7af73747f6a3f03e02097065cbb8958d50366a2b3.json deleted file mode 100644 index 2c6ed4d89..000000000 --- a/.sqlx/query-5a927fd22f0ad007a48820a7af73747f6a3f03e02097065cbb8958d50366a2b3.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n kw.name as \"name!\",\n kw.slug as \"slug!\"\n FROM keywords as kw\n INNER JOIN keyword_rels as kwr on kw.id = kwr.kid\n WHERE kwr.rid = $1\n ORDER BY kw.name,kw.slug", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name!", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "slug!", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - true, - false - ] - }, - "hash": "5a927fd22f0ad007a48820a7af73747f6a3f03e02097065cbb8958d50366a2b3" -} diff --git a/.sqlx/query-60dccddc0096cbf97fba82a98168207c271cca9a18cebbade496d79eb1e5cae4.json b/.sqlx/query-60dccddc0096cbf97fba82a98168207c271cca9a18cebbade496d79eb1e5cae4.json deleted file mode 100644 index 207adf0d5..000000000 --- a/.sqlx/query-60dccddc0096cbf97fba82a98168207c271cca9a18cebbade496d79eb1e5cae4.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id as \"id: BuildId\" FROM builds WHERE rid = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: BuildId", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "60dccddc0096cbf97fba82a98168207c271cca9a18cebbade496d79eb1e5cae4" -} diff --git a/.sqlx/query-64d91ec806ed67d6cffd1a797da5059cc8fb44b37f94dc77877c88d266c5ac9b.json b/.sqlx/query-64d91ec806ed67d6cffd1a797da5059cc8fb44b37f94dc77877c88d266c5ac9b.json deleted file mode 100644 index 4eb0f97f7..000000000 --- a/.sqlx/query-64d91ec806ed67d6cffd1a797da5059cc8fb44b37f94dc77877c88d266c5ac9b.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n rustc_version,\n docsrs_version,\n build_status as \"build_status: BuildStatus\",\n documentation_size,\n errors,\n rustc_nightly_date\n FROM builds\n WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 3, - "name": "documentation_size", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "errors", - "type_info": "Text" - }, - { - "ordinal": 5, - "name": "rustc_nightly_date", - "type_info": "Date" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - true, - true, - false, - true, - true, - true - ] - }, - "hash": "64d91ec806ed67d6cffd1a797da5059cc8fb44b37f94dc77877c88d266c5ac9b" -} diff --git a/.sqlx/query-83dc17977f99a0b182f11efa80cf9b9afc273e362160421dda768d45c62f71b7.json b/.sqlx/query-83dc17977f99a0b182f11efa80cf9b9afc273e362160421dda768d45c62f71b7.json deleted file mode 100644 index 7ca47cfe4..000000000 --- a/.sqlx/query-83dc17977f99a0b182f11efa80cf9b9afc273e362160421dda768d45c62f71b7.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id as \"id: ReleaseId\" FROM releases WHERE crate_id = $1 and version = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: ReleaseId", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "83dc17977f99a0b182f11efa80cf9b9afc273e362160421dda768d45c62f71b7" -} diff --git a/.sqlx/query-8552f463bfc719f100e0e678b1400ea593a24d5d0c9ef291f786a27669cd626d.json b/.sqlx/query-8552f463bfc719f100e0e678b1400ea593a24d5d0c9ef291f786a27669cd626d.json deleted file mode 100644 index 773538685..000000000 --- a/.sqlx/query-8552f463bfc719f100e0e678b1400ea593a24d5d0c9ef291f786a27669cd626d.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n rustc_version,\n docsrs_version,\n build_started,\n build_status as \"build_status: BuildStatus\",\n errors\n FROM builds\n WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "build_started", - "type_info": "Timestamptz" - }, - { - "ordinal": 3, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 4, - "name": "errors", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - true, - true, - true, - false, - true - ] - }, - "hash": "8552f463bfc719f100e0e678b1400ea593a24d5d0c9ef291f786a27669cd626d" -} diff --git a/.sqlx/query-a23b671c7833d7c58238dbc7e8e9f46cae9db2b0c273e3245d9458614bf1243d.json b/.sqlx/query-a23b671c7833d7c58238dbc7e8e9f46cae9db2b0c273e3245d9458614bf1243d.json deleted file mode 100644 index f001ab425..000000000 --- a/.sqlx/query-a23b671c7833d7c58238dbc7e8e9f46cae9db2b0c273e3245d9458614bf1243d.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO queue (name, version, priority, attempt, last_attempt )\n VALUES ($1, $2, 0, 99, NOW())", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "a23b671c7833d7c58238dbc7e8e9f46cae9db2b0c273e3245d9458614bf1243d" -} diff --git a/.sqlx/query-bcb6953f312804ebdad0370c2eaf2c816378c236c5d2028c3882a1b12c6362a1.json b/.sqlx/query-bcb6953f312804ebdad0370c2eaf2c816378c236c5d2028c3882a1b12c6362a1.json deleted file mode 100644 index 4315981d1..000000000 --- a/.sqlx/query-bcb6953f312804ebdad0370c2eaf2c816378c236c5d2028c3882a1b12c6362a1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE queue SET attempt = 6", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "bcb6953f312804ebdad0370c2eaf2c816378c236c5d2028c3882a1b12c6362a1" -} diff --git a/.sqlx/query-c955871bcda914feac9cfb23fe010399c0b3f75e92ac425fa4ec337e9b250c26.json b/.sqlx/query-c955871bcda914feac9cfb23fe010399c0b3f75e92ac425fa4ec337e9b250c26.json deleted file mode 100644 index 61ff84b5f..000000000 --- a/.sqlx/query-c955871bcda914feac9cfb23fe010399c0b3f75e92ac425fa4ec337e9b250c26.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n rustc_version,\n docsrs_version,\n build_status as \"build_status: BuildStatus\",\n errors,\n rustc_nightly_date\n FROM builds\n WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "rustc_version", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "docsrs_version", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - }, - { - "ordinal": 3, - "name": "errors", - "type_info": "Text" - }, - { - "ordinal": 4, - "name": "rustc_nightly_date", - "type_info": "Date" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - true, - true, - false, - true, - true - ] - }, - "hash": "c955871bcda914feac9cfb23fe010399c0b3f75e92ac425fa4ec337e9b250c26" -} diff --git a/.sqlx/query-e323820d9273ae10886a7a5db1864e11f94477ddef83a14b16f420c2f7b02bd0.json b/.sqlx/query-e323820d9273ae10886a7a5db1864e11f94477ddef83a14b16f420c2f7b02bd0.json deleted file mode 100644 index 0caa0c20e..000000000 --- a/.sqlx/query-e323820d9273ae10886a7a5db1864e11f94477ddef83a14b16f420c2f7b02bd0.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT priority, attempt, last_attempt\n FROM queue\n WHERE name = $1 AND version = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "priority", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "attempt", - "type_info": "Int4" - }, - { - "ordinal": 2, - "name": "last_attempt", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - true - ] - }, - "hash": "e323820d9273ae10886a7a5db1864e11f94477ddef83a14b16f420c2f7b02bd0" -} diff --git a/.sqlx/query-f418e582d28081864c3c571139a441dfc4f45a3f078cea8ae229531663376e7b.json b/.sqlx/query-f418e582d28081864c3c571139a441dfc4f45a3f078cea8ae229531663376e7b.json deleted file mode 100644 index 2f3ac6baf..000000000 --- a/.sqlx/query-f418e582d28081864c3c571139a441dfc4f45a3f078cea8ae229531663376e7b.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT login FROM owners order by login", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "f418e582d28081864c3c571139a441dfc4f45a3f078cea8ae229531663376e7b" -} diff --git a/.sqlx/query-f8cb592ce46398544f35bafe57abb0abbf27ebba1645489e9e8142a0f3c1df93.json b/.sqlx/query-f8cb592ce46398544f35bafe57abb0abbf27ebba1645489e9e8142a0f3c1df93.json deleted file mode 100644 index bf63783e8..000000000 --- a/.sqlx/query-f8cb592ce46398544f35bafe57abb0abbf27ebba1645489e9e8142a0f3c1df93.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE queue SET last_attempt = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Timestamptz" - ] - }, - "nullable": [] - }, - "hash": "f8cb592ce46398544f35bafe57abb0abbf27ebba1645489e9e8142a0f3c1df93" -} diff --git a/.sqlx/query-f9e5a70e03175f8bbf44552e4def1aae33c0f1aba515ac53d1ddaf922bb1f9d9.json b/.sqlx/query-f9e5a70e03175f8bbf44552e4def1aae33c0f1aba515ac53d1ddaf922bb1f9d9.json deleted file mode 100644 index fc50ff412..000000000 --- a/.sqlx/query-f9e5a70e03175f8bbf44552e4def1aae33c0f1aba515ac53d1ddaf922bb1f9d9.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT slug FROM keywords ORDER BY slug", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "slug", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "f9e5a70e03175f8bbf44552e4def1aae33c0f1aba515ac53d1ddaf922bb1f9d9" -} diff --git a/Cargo.lock b/Cargo.lock index e0351d739..bd1b6cb04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1897,20 +1897,24 @@ name = "docs_rs_admin" version = "0.6.0" dependencies = [ "anyhow", + "bon", "chrono", "clap", "docs_rs_build_limits", "docs_rs_build_queue", - "docs_rs_builder", "docs_rs_context", "docs_rs_database", "docs_rs_logging", + "docs_rs_opentelemetry", + "docs_rs_storage", + "docs_rs_test_fakes", "docs_rs_types", "docs_rs_utils", - "docs_rs_watcher", "futures-util", + "pretty_assertions", "sqlx", "tokio", + "tracing", ] [[package]] @@ -1923,8 +1927,10 @@ dependencies = [ "docs_rs_opentelemetry", "docs_rs_types", "futures-util", + "pretty_assertions", "serde", "sqlx", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -1966,24 +1972,22 @@ dependencies = [ "docs_rs_opentelemetry", "docs_rs_registry_api", "docs_rs_repository_stats", + "docs_rs_rustdoc_json", "docs_rs_storage", "docs_rs_types", "docs_rs_utils", "docsrs-metadata", - "futures-util", "itertools 0.14.0", "log", "opentelemetry", "pretty_assertions", "regex", "rustwide", - "serde", "serde_json", "sqlx", "sysinfo", "tempfile", "test-case", - "thiserror 2.0.17", "tokio", "toml 0.9.10+spec-1.1.0", "tracing", @@ -2173,6 +2177,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "docs_rs_rustdoc_json" +version = "0.1.0" +dependencies = [ + "anyhow", + "docs_rs_types", + "serde", + "serde_json", + "strum", + "test-case", +] + [[package]] name = "docs_rs_storage" version = "0.1.0" @@ -2192,6 +2208,7 @@ dependencies = [ "docs_rs_logging", "docs_rs_mimes", "docs_rs_opentelemetry", + "docs_rs_rustdoc_json", "docs_rs_types", "docs_rs_utils", "flate2", @@ -2221,10 +2238,10 @@ dependencies = [ "anyhow", "base64", "chrono", - "docs_rs_builder", "docs_rs_cargo_metadata", "docs_rs_database", "docs_rs_registry_api", + "docs_rs_rustdoc_json", "docs_rs_storage", "docs_rs_types", "serde_json", @@ -2281,7 +2298,6 @@ name = "docs_rs_watcher" version = "0.6.0" dependencies = [ "anyhow", - "chrono", "clap", "crates-index", "crates-index-diff", @@ -2293,6 +2309,7 @@ dependencies = [ "docs_rs_logging", "docs_rs_opentelemetry", "docs_rs_repository_stats", + "docs_rs_rustdoc_json", "docs_rs_storage", "docs_rs_test_fakes", "docs_rs_types", @@ -2326,7 +2343,6 @@ dependencies = [ "derive_more 2.1.1", "docs_rs_build_limits", "docs_rs_build_queue", - "docs_rs_builder", "docs_rs_cargo_metadata", "docs_rs_context", "docs_rs_database", @@ -2336,6 +2352,7 @@ dependencies = [ "docs_rs_mimes", "docs_rs_opentelemetry", "docs_rs_registry_api", + "docs_rs_rustdoc_json", "docs_rs_storage", "docs_rs_test_fakes", "docs_rs_types", diff --git a/crates/bin/cratesfyi/.sqlx/query-dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295.json b/crates/bin/cratesfyi/.sqlx/query-dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295.json deleted file mode 100644 index 8019026f4..000000000 --- a/crates/bin/cratesfyi/.sqlx/query-dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n c.name AS \"name: KrateName\",\n r.version AS \"version: Version\"\n FROM crates AS c\n JOIN releases AS r\n ON c.id = r.crate_id\n JOIN release_build_status AS rbs\n ON rbs.rid = r.id\n JOIN builds AS b\n ON b.rid = r.id\n AND b.build_finished = rbs.last_build_time\n AND b.rustc_nightly_date >= $1\n AND b.rustc_nightly_date < $2\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name: KrateName", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "version: Version", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Date", - "Date" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff.json b/crates/bin/docs_rs_admin/.sqlx/query-007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff.json new file mode 100644 index 000000000..f13d5b020 --- /dev/null +++ b/crates/bin/docs_rs_admin/.sqlx/query-007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE builds SET output = $2 WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff" +} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-014a054d852f0937191e1a54f742d4b4c454361689fb3841cc12fd7dd1094948.json b/crates/bin/docs_rs_admin/.sqlx/query-014a054d852f0937191e1a54f742d4b4c454361689fb3841cc12fd7dd1094948.json deleted file mode 100644 index 253c81642..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-014a054d852f0937191e1a54f742d4b4c454361689fb3841cc12fd7dd1094948.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM releases WHERE crate_id = $1 AND version = $2 RETURNING is_library", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "is_library", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Int4", - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "014a054d852f0937191e1a54f742d4b4c454361689fb3841cc12fd7dd1094948" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9.json b/crates/bin/docs_rs_admin/.sqlx/query-1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9.json new file mode 100644 index 000000000..f1374e312 --- /dev/null +++ b/crates/bin/docs_rs_admin/.sqlx/query-1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO repositories (host, host_id, name, description, last_commit, stars, forks, issues, updated_at)\n VALUES ('github.com', $1, $2, 'Fake description!', NOW(), $3, $4, $5, NOW())\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int4", + "Int4", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9" +} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-25d29a471a449e741843246190149a6028edf072940cd5a1a2a6cc4d2978aeb5.json b/crates/bin/docs_rs_admin/.sqlx/query-25d29a471a449e741843246190149a6028edf072940cd5a1a2a6cc4d2978aeb5.json deleted file mode 100644 index a7edcc96f..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-25d29a471a449e741843246190149a6028edf072940cd5a1a2a6cc4d2978aeb5.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n BOOL_OR(releases.is_library) AS has_library\n FROM releases\n WHERE releases.crate_id = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "has_library", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - null - ] - }, - "hash": "25d29a471a449e741843246190149a6028edf072940cd5a1a2a6cc4d2978aeb5" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-2bdcde85b92839f75ee67864fca58c2a4e9c177ee442eb4828e3f3f14f7c8853.json b/crates/bin/docs_rs_admin/.sqlx/query-2bdcde85b92839f75ee67864fca58c2a4e9c177ee442eb4828e3f3f14f7c8853.json deleted file mode 100644 index f091d6c52..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-2bdcde85b92839f75ee67864fca58c2a4e9c177ee442eb4828e3f3f14f7c8853.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT i.* FROM (\n SELECT\n c.name as \"name: KrateName\",\n r.version as \"version: Version\",\n (\n SELECT MAX(COALESCE(b.build_finished, b.build_started))\n FROM builds AS b\n WHERE b.rid = r.id\n ) AS last_build_attempt\n FROM crates AS c\n INNER JOIN releases AS r ON c.latest_version_id = r.id\n\n WHERE\n r.rustdoc_status = TRUE\n ) as i\n ORDER BY i.last_build_attempt ASC\n LIMIT $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name: KrateName", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "version: Version", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "last_build_attempt", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [ - false, - false, - null - ] - }, - "hash": "2bdcde85b92839f75ee67864fca58c2a4e9c177ee442eb4828e3f3f14f7c8853" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json b/crates/bin/docs_rs_admin/.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json new file mode 100644 index 000000000..60e1078e6 --- /dev/null +++ b/crates/bin/docs_rs_admin/.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE builds\n SET\n build_status = 'failure',\n errors = $2\n WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc" +} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-80df8947b7230ea7ab2bd08206c7ad00f4a16c3964bbd1e71ce646186be20c4e.json b/crates/bin/docs_rs_admin/.sqlx/query-80df8947b7230ea7ab2bd08206c7ad00f4a16c3964bbd1e71ce646186be20c4e.json deleted file mode 100644 index e178e2e36..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-80df8947b7230ea7ab2bd08206c7ad00f4a16c3964bbd1e71ce646186be20c4e.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM crates WHERE id = $1;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [] - }, - "hash": "80df8947b7230ea7ab2bd08206c7ad00f4a16c3964bbd1e71ce646186be20c4e" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-89b622b38ef47d34450476f2e91b60b482d8351a50df34fb71cf4724ce78fe3b.json b/crates/bin/docs_rs_admin/.sqlx/query-89b622b38ef47d34450476f2e91b60b482d8351a50df34fb71cf4724ce78fe3b.json deleted file mode 100644 index 79feba8ee..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-89b622b38ef47d34450476f2e91b60b482d8351a50df34fb71cf4724ce78fe3b.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n name as \"name!: KrateName\",\n version as \"version!: Version\",\n yanked\n FROM (\n SELECT\n crates.name,\n releases.version,\n releases.yanked\n FROM crates\n INNER JOIN releases ON releases.crate_id = crates.id\n UNION ALL\n -- crates & releases that are already queued\n -- don't have to be requeued.\n SELECT\n queue.name,\n queue.version,\n NULL as yanked\n FROM queue\n LEFT OUTER JOIN crates ON crates.name = queue.name\n LEFT OUTER JOIN releases ON (\n releases.crate_id = crates.id AND\n releases.version = queue.version\n )\n WHERE queue.attempt < $1 AND (\n crates.id IS NULL OR\n releases.id IS NULL\n )\n ) AS inp\n ORDER BY name", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name!: KrateName", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "version!: Version", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "yanked", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - null, - null, - null - ] - }, - "hash": "89b622b38ef47d34450476f2e91b60b482d8351a50df34fb71cf4724ce78fe3b" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-8f9ba7439b7282048989dcf36fd6cd88e2ea238a0b8e1b42a7515f23d97eddfb.json b/crates/bin/docs_rs_admin/.sqlx/query-8f9ba7439b7282048989dcf36fd6cd88e2ea238a0b8e1b42a7515f23d97eddfb.json deleted file mode 100644 index 76a6e7969..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-8f9ba7439b7282048989dcf36fd6cd88e2ea238a0b8e1b42a7515f23d97eddfb.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE releases\n SET yanked = $3\n FROM crates\n WHERE crates.id = releases.crate_id\n AND name = $1\n AND version = $2\n RETURNING crates.id as \"id: CrateId\"\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: CrateId", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [ - false - ] - }, - "hash": "8f9ba7439b7282048989dcf36fd6cd88e2ea238a0b8e1b42a7515f23d97eddfb" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f.json b/crates/bin/docs_rs_admin/.sqlx/query-915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f.json new file mode 100644 index 000000000..80e54a1b7 --- /dev/null +++ b/crates/bin/docs_rs_admin/.sqlx/query-915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT COUNT(*) FROM repositories", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + }, + "hash": "915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f" +} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-92415d8f64477bce37d6a1393c6906e42a9dc37176ac1d357abd9ff1cfbb9c64.json b/crates/bin/docs_rs_admin/.sqlx/query-92415d8f64477bce37d6a1393c6906e42a9dc37176ac1d357abd9ff1cfbb9c64.json deleted file mode 100644 index 5745997b7..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-92415d8f64477bce37d6a1393c6906e42a9dc37176ac1d357abd9ff1cfbb9c64.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT id as \"id: CrateId\"\n FROM crates\n WHERE normalize_crate_name(name) = normalize_crate_name($1)\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id: CrateId", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [ - false - ] - }, - "hash": "92415d8f64477bce37d6a1393c6906e42a9dc37176ac1d357abd9ff1cfbb9c64" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-92ea6c595b720132a0c3da609414e499a13b3c2c74be2e530fb55bd27aa070e4.json b/crates/bin/docs_rs_admin/.sqlx/query-92ea6c595b720132a0c3da609414e499a13b3c2c74be2e530fb55bd27aa070e4.json deleted file mode 100644 index 80e74ab5f..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-92ea6c595b720132a0c3da609414e499a13b3c2c74be2e530fb55bd27aa070e4.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM owner_rels WHERE cid = $1;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [] - }, - "hash": "92ea6c595b720132a0c3da609414e499a13b3c2c74be2e530fb55bd27aa070e4" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722.json b/crates/bin/docs_rs_admin/.sqlx/query-96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722.json new file mode 100644 index 000000000..984eff3ac --- /dev/null +++ b/crates/bin/docs_rs_admin/.sqlx/query-96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT relname\n FROM pg_class\n INNER JOIN pg_namespace ON\n pg_class.relnamespace = pg_namespace.oid\n WHERE pg_class.relkind = 'S'\n AND pg_namespace.nspname = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "relname", + "type_info": "Name" + } + ], + "parameters": { + "Left": [ + "Name" + ] + }, + "nullable": [ + false + ] + }, + "hash": "96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722" +} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-aaa2cc1b0b88255cb0be16259e6b53571ead374e51fc62b9a646a77fc84b4d6d.json b/crates/bin/docs_rs_admin/.sqlx/query-aaa2cc1b0b88255cb0be16259e6b53571ead374e51fc62b9a646a77fc84b4d6d.json deleted file mode 100644 index d800017a7..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-aaa2cc1b0b88255cb0be16259e6b53571ead374e51fc62b9a646a77fc84b4d6d.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM releases WHERE crate_id = $1;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [] - }, - "hash": "aaa2cc1b0b88255cb0be16259e6b53571ead374e51fc62b9a646a77fc84b4d6d" -} diff --git a/crates/bin/docs_rs_admin/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/bin/docs_rs_admin/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json deleted file mode 100644 index 8699a9ded..000000000 --- a/crates/bin/docs_rs_admin/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT build_status AS \"build_status: BuildStatus\"\n FROM release_build_status\n WHERE rid = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374" -} diff --git a/crates/bin/docs_rs_admin/Cargo.toml b/crates/bin/docs_rs_admin/Cargo.toml index 7ccb3fe7a..857944a71 100644 --- a/crates/bin/docs_rs_admin/Cargo.toml +++ b/crates/bin/docs_rs_admin/Cargo.toml @@ -12,8 +12,6 @@ chrono = { workspace = true } clap = { workspace = true } docs_rs_build_limits = { path = "../../lib/docs_rs_build_limits" } docs_rs_build_queue = { path = "../../lib/docs_rs_build_queue" } -docs_rs_builder = { path = "../docs_rs_builder" } -docs_rs_watcher = { path = "../docs_rs_watcher" } docs_rs_context = { path = "../../lib/docs_rs_context" } docs_rs_database = { path = "../../lib/docs_rs_database" } docs_rs_logging = { path = "../../lib/docs_rs_logging" } @@ -22,3 +20,13 @@ docs_rs_utils = { path = "../../lib/docs_rs_utils" } futures-util = { workspace = true } sqlx = { workspace = true } tokio = { workspace = true } +tracing = { workspace = true } + +[dev-dependencies] +bon = { workspace = true } +docs_rs_database = { path = "../../lib/docs_rs_database", features = ["testing"] } +docs_rs_opentelemetry = { path = "../../lib/docs_rs_opentelemetry", features = ["testing"] } +docs_rs_storage = { path = "../../lib/docs_rs_storage", features = ["testing"] } +docs_rs_test_fakes = { path = "../../lib/docs_rs_test_fakes" } +docs_rs_types = { path = "../../lib/docs_rs_types", features = ["testing"] } +pretty_assertions = { workspace = true } diff --git a/crates/bin/docs_rs_admin/src/main.rs b/crates/bin/docs_rs_admin/src/main.rs index 1b2180bb8..975031cdd 100644 --- a/crates/bin/docs_rs_admin/src/main.rs +++ b/crates/bin/docs_rs_admin/src/main.rs @@ -1,20 +1,23 @@ +mod rebuilds; +#[cfg(test)] +pub(crate) mod testing; + use anyhow::{Context as _, Result}; use chrono::NaiveDate; use clap::{Parser, Subcommand}; -use docs_rs_build_limits::Overrides; +use docs_rs_build_limits::{Overrides, blacklist}; use docs_rs_build_queue::priority::{ get_crate_pattern_and_priority, list_crate_priorities, remove_crate_priority, set_crate_priority, }; -use docs_rs_builder::blacklist; use docs_rs_context::Context; use docs_rs_database::{ crate_details, service_config::{ConfigName, set_config}, }; use docs_rs_types::{CrateId, KrateName, Version}; -use docs_rs_watcher::queue_rebuilds_faulty_rustdoc; use futures_util::StreamExt; +use rebuilds::queue_rebuilds_faulty_rustdoc; #[tokio::main] async fn main() -> Result<()> { diff --git a/crates/bin/docs_rs_admin/src/rebuilds.rs b/crates/bin/docs_rs_admin/src/rebuilds.rs new file mode 100644 index 000000000..d340685e4 --- /dev/null +++ b/crates/bin/docs_rs_admin/src/rebuilds.rs @@ -0,0 +1,256 @@ +use anyhow::Result; +use chrono::NaiveDate; +use docs_rs_build_queue::{AsyncBuildQueue, PRIORITY_BROKEN_RUSTDOC}; +use docs_rs_types::{KrateName, Version}; +use futures_util::StreamExt; +use tracing::{info, instrument}; + +/// Queue rebuilds for failed crates due to a faulty version of rustdoc +/// +/// It is assumed that the version of rustdoc matches the one of rustc, which is persisted in the DB. +/// The priority of the resulting rebuild requests will be lower than previously failed builds. +/// If a crate is already queued to be rebuilt, it will not be requeued. +/// Start date is inclusive, end date is exclusive. +#[instrument(skip_all)] +pub(crate) async fn queue_rebuilds_faulty_rustdoc( + conn: &mut sqlx::PgConnection, + queue: &AsyncBuildQueue, + start_nightly_date: &NaiveDate, + end_nightly_date: &Option, +) -> Result { + let end_nightly_date = + end_nightly_date.unwrap_or_else(|| start_nightly_date.succ_opt().unwrap()); + let mut results = sqlx::query!( + r#" + SELECT + c.name AS "name: KrateName", + r.version AS "version: Version" + FROM crates AS c + JOIN releases AS r + ON c.id = r.crate_id + JOIN release_build_status AS rbs + ON rbs.rid = r.id + JOIN builds AS b + ON b.rid = r.id + AND b.build_finished = rbs.last_build_time + AND b.rustc_nightly_date >= $1 + AND b.rustc_nightly_date < $2 + "#, + start_nightly_date, + end_nightly_date + ) + .fetch(&mut *conn); + + let mut results_count = 0; + while let Some(row) = results.next().await { + let row = row?; + + if !queue.has_build_queued(&row.name, &row.version).await? { + results_count += 1; + info!( + name=%row.name, + version=%row.version, + priority=PRIORITY_BROKEN_RUSTDOC, + "queueing rebuild" + ); + queue + .add_crate(&row.name, &row.version, PRIORITY_BROKEN_RUSTDOC, None) + .await?; + } + } + + Ok(results_count) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::testing::TestEnvironment; + use docs_rs_test_fakes::FakeBuild; + use docs_rs_types::{ + BuildStatus, + testing::{BAR, FOO, V1, V2}, + }; + use pretty_assertions::assert_eq; + + /// Verifies whether a rebuild is queued for all releases with the latest build performed with a specific nightly version of rustdoc + #[tokio::test(flavor = "multi_thread")] + async fn test_rebuild_broken_rustdoc_specific_date_simple() -> Result<()> { + let env = TestEnvironment::new().await?; + + // Matrix of test builds (crate name, nightly date, version) + let build_matrix = [ + // Should be skipped since this is not the latest build for this release + (FOO, NaiveDate::from_ymd_opt(2020, 10, 1).unwrap(), V1), + // All those should match + (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), + (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V2), + (BAR, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), + // Should be skipped since the nightly doesn't match + (BAR, NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), V2), + ]; + for build in build_matrix.into_iter() { + let (crate_name, nightly, version) = build; + env.fake_release() + .await + .name(&crate_name) + .version(version) + .builds(vec![ + FakeBuild::default() + .rustc_version( + format!( + "rustc 1.84.0-nightly (e7c0d2750 {})", + nightly.format("%Y-%m-%d") + ) + .as_str(), + ) + .build_status(BuildStatus::Failure), + ]) + .create() + .await?; + } + + let build_queue = env.build_queue()?; + assert!(build_queue.queued_crates().await?.is_empty()); + + let mut conn = env.async_conn().await?; + queue_rebuilds_faulty_rustdoc( + &mut conn, + build_queue, + &NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), + &None, + ) + .await?; + + let queue = build_queue.queued_crates().await?; + assert_eq!(queue.len(), 3); + assert_eq!(queue[0].name, FOO); + assert_eq!(queue[0].version, V1); + assert_eq!(queue[0].priority, PRIORITY_BROKEN_RUSTDOC); + assert_eq!(queue[1].name, FOO); + assert_eq!(queue[1].version, V2); + assert_eq!(queue[1].priority, PRIORITY_BROKEN_RUSTDOC); + assert_eq!(queue[2].name, BAR); + assert_eq!(queue[2].version, V1); + assert_eq!(queue[2].priority, PRIORITY_BROKEN_RUSTDOC); + + Ok(()) + } + + /// Verifies whether a rebuild is NOT queued for any crate if the nightly specified doesn't match any latest build of any release + #[tokio::test(flavor = "multi_thread")] + async fn test_rebuild_broken_rustdoc_specific_date_skipped() -> Result<()> { + let env = TestEnvironment::new().await?; + + // Matrix of test builds (crate name, nightly date, version) + let build_matrix = [ + // Should be skipped since this is not the latest build for this release even if the nightly matches + (FOO, NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), V1), + // Should be skipped since the nightly doesn't match + (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), + // Should be skipped since the nightly doesn't match + (BAR, NaiveDate::from_ymd_opt(2020, 10, 4).unwrap(), V1), + ]; + for build in build_matrix.into_iter() { + let (crate_name, nightly, version) = build; + env.fake_release() + .await + .name(&crate_name) + .version(version) + .builds(vec![ + FakeBuild::default() + .rustc_version( + format!( + "rustc 1.84.0-nightly (e7c0d2750 {})", + nightly.format("%Y-%m-%d") + ) + .as_str(), + ) + .build_status(BuildStatus::Failure), + ]) + .create() + .await?; + } + + let build_queue = env.build_queue()?; + assert!(build_queue.queued_crates().await?.is_empty()); + + let mut conn = env.async_conn().await?; + queue_rebuilds_faulty_rustdoc( + &mut conn, + build_queue, + &NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), + &None, + ) + .await?; + + let queue = build_queue.queued_crates().await?; + assert_eq!(queue.len(), 0); + + Ok(()) + } + + /// Verifies whether a rebuild is queued for all releases with the latest build performed with a nightly version between two dates + #[tokio::test(flavor = "multi_thread")] + async fn test_rebuild_broken_rustdoc_date_range() -> Result<()> { + let env = TestEnvironment::new().await?; + + // Matrix of test builds (crate name, nightly date, version) + let build_matrix = [ + // Should be skipped since this is not the latest build for this release + (FOO, NaiveDate::from_ymd_opt(2020, 10, 1).unwrap(), V1), + // All those should match + (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), + (FOO, NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), V2), + (BAR, NaiveDate::from_ymd_opt(2020, 10, 4).unwrap(), V1), + // Should be skipped since the nightly doesn't match (end date is exclusive) + (BAR, NaiveDate::from_ymd_opt(2020, 10, 5).unwrap(), V2), + ]; + for build in build_matrix.into_iter() { + let (crate_name, nightly, version) = build; + env.fake_release() + .await + .name(&crate_name) + .version(version) + .builds(vec![ + FakeBuild::default() + .rustc_version( + format!( + "rustc 1.84.0-nightly (e7c0d2750 {})", + nightly.format("%Y-%m-%d") + ) + .as_str(), + ) + .build_status(BuildStatus::Failure), + ]) + .create() + .await?; + } + + let build_queue = env.build_queue()?; + assert!(build_queue.queued_crates().await?.is_empty()); + + let mut conn = env.async_conn().await?; + queue_rebuilds_faulty_rustdoc( + &mut conn, + build_queue, + &NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), + &NaiveDate::from_ymd_opt(2020, 10, 5), + ) + .await?; + + let queue = build_queue.queued_crates().await?; + assert_eq!(queue.len(), 3); + assert_eq!(queue[0].name, FOO); + assert_eq!(queue[0].version, V1); + assert_eq!(queue[0].priority, PRIORITY_BROKEN_RUSTDOC); + assert_eq!(queue[1].name, FOO); + assert_eq!(queue[1].version, V2); + assert_eq!(queue[1].priority, PRIORITY_BROKEN_RUSTDOC); + assert_eq!(queue[2].name, BAR); + assert_eq!(queue[2].version, V1); + assert_eq!(queue[2].priority, PRIORITY_BROKEN_RUSTDOC); + + Ok(()) + } +} diff --git a/crates/bin/docs_rs_admin/src/testing/mod.rs b/crates/bin/docs_rs_admin/src/testing/mod.rs new file mode 100644 index 000000000..19d3e6241 --- /dev/null +++ b/crates/bin/docs_rs_admin/src/testing/mod.rs @@ -0,0 +1,3 @@ +mod test_env; + +pub(crate) use test_env::TestEnvironment; diff --git a/crates/bin/docs_rs_admin/src/testing/test_env.rs b/crates/bin/docs_rs_admin/src/testing/test_env.rs new file mode 100644 index 000000000..2357dd396 --- /dev/null +++ b/crates/bin/docs_rs_admin/src/testing/test_env.rs @@ -0,0 +1,75 @@ +use anyhow::Result; +use bon::bon; +use docs_rs_build_queue::AsyncBuildQueue; +use docs_rs_context::Context; +use docs_rs_database::{AsyncPoolClient, Config as DatabaseConfig, testing::TestDatabase}; +use docs_rs_opentelemetry::testing::TestMetrics; +use docs_rs_storage::{Config as StorageConfig, StorageKind, testing::TestStorage}; +use docs_rs_test_fakes::FakeRelease; +use std::sync::Arc; + +pub(crate) struct TestEnvironment { + pub(crate) context: Arc, + // so we can allow asserting collected metrics later. + #[allow(dead_code)] // we need to keep the metrics so they can be collected & cleaned + pub(crate) metrics: TestMetrics, + #[allow(dead_code)] // we need to keep the storage so it can be cleaned up. + pub(crate) storage: TestStorage, + #[allow(dead_code)] // we need to keep the storage so it can be cleaned up. + pub(crate) db: TestDatabase, +} + +#[bon] +impl TestEnvironment { + pub(crate) async fn new() -> Result { + // NOTE: compiler crashes when I change the return to + // `Self::builder().build().await + #[allow(clippy::needless_question_mark)] + Ok(Self::builder().build().await?) + } + + #[builder(finish_fn = build)] + pub(crate) async fn builder() -> Result { + docs_rs_logging::testing::init(); + + let metrics = TestMetrics::new(); + + let db_config = DatabaseConfig::test_config()?; + let db = TestDatabase::new(&db_config, metrics.provider()).await?; + + let storage_config = Arc::new(StorageConfig::test_config(StorageKind::Memory)?); + + let test_storage = + TestStorage::from_config(storage_config.clone(), metrics.provider()).await?; + + Ok(Self { + context: Context::builder() + .with_runtime() + .await? + .meter_provider(metrics.provider().clone()) + .pool(db_config.into(), db.pool().clone()) + .storage(storage_config.clone(), test_storage.storage()) + .with_build_queue()? + .build()? + .into(), + db, + storage: test_storage, + metrics, + }) + } + + pub(crate) fn build_queue(&self) -> Result<&Arc> { + self.context.build_queue() + } + + pub(crate) async fn async_conn(&self) -> Result { + self.context.pool()?.get_async().await.map_err(Into::into) + } + + pub async fn fake_release(&self) -> FakeRelease<'_> { + FakeRelease::new( + self.context.pool().unwrap().clone(), + self.context.storage().unwrap().clone(), + ) + } +} diff --git a/crates/bin/docs_rs_builder/Cargo.toml b/crates/bin/docs_rs_builder/Cargo.toml index 19f60742d..fe7bf4156 100644 --- a/crates/bin/docs_rs_builder/Cargo.toml +++ b/crates/bin/docs_rs_builder/Cargo.toml @@ -20,22 +20,20 @@ docs_rs_logging = { path = "../../lib/docs_rs_logging" } docs_rs_opentelemetry = { path = "../../lib/docs_rs_opentelemetry" } docs_rs_registry_api = { path = "../../lib/docs_rs_registry_api" } docs_rs_repository_stats = { path = "../../lib/docs_rs_repository_stats" } +docs_rs_rustdoc_json = { path = "../../lib/docs_rs_rustdoc_json" } docs_rs_storage = { path = "../../lib/docs_rs_storage" } docs_rs_types = { path = "../../lib/docs_rs_types" } docs_rs_utils = { path = "../../lib/docs_rs_utils" } docsrs-metadata = { path = "../../lib/metadata" } -futures-util = { workspace = true } itertools = { workspace = true } log = "0.4" opentelemetry = { workspace = true } regex = { workspace = true } rustwide = { version = "0.21.0", features = ["unstable-toolchain-ci", "unstable"] } -serde = { workspace = true } serde_json = { workspace = true } sqlx = { workspace = true } sysinfo = { version = "0.37.2", default-features = false, features = ["system"] } tempfile = { workspace = true } -thiserror = { workspace = true } tokio = { workspace = true } toml = { workspace = true } tracing = { workspace = true } 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 3d6029212..9fe7f3c6a 100644 --- a/crates/bin/docs_rs_builder/src/docbuilder/rustwide_builder.rs +++ b/crates/bin/docs_rs_builder/src/docbuilder/rustwide_builder.rs @@ -1,8 +1,6 @@ -use crate::{ - Config, blacklist::is_blacklisted, metrics::BuilderMetrics, utils::copy::copy_dir_all, -}; +use crate::{Config, metrics::BuilderMetrics, utils::copy::copy_dir_all}; use anyhow::{Context as _, Error, Result, anyhow, bail}; -use docs_rs_build_limits::Limits; +use docs_rs_build_limits::{Limits, blacklist::is_blacklisted}; use docs_rs_build_queue::BuildPackageSummary; use docs_rs_cargo_metadata::{CargoMetadata, MetadataPackage}; use docs_rs_context::Context; @@ -16,13 +14,16 @@ use docs_rs_database::{ }; use docs_rs_registry_api::RegistryApi; use docs_rs_repository_stats::RepositoryStatsUpdater; +use docs_rs_rustdoc_json::{ + RUSTDOC_JSON_COMPRESSION_ALGORITHMS, RustdocJsonFormatVersion, + read_format_version_from_rustdoc_json, +}; use docs_rs_storage::{ - AsyncStorage, RustdocJsonFormatVersion, Storage, add_path_into_database, - add_path_into_remote_archive, compress, file_list_to_json, get_file_list, rustdoc_archive_path, - rustdoc_json_path, source_archive_path, + AsyncStorage, Storage, add_path_into_database, add_path_into_remote_archive, compress, + file_list_to_json, get_file_list, rustdoc_archive_path, rustdoc_json_path, source_archive_path, }; use docs_rs_types::{ - BuildId, BuildStatus, CompressionAlgorithm, CrateId, KrateName, ReleaseId, Version, + BuildId, BuildStatus, CrateId, KrateName, ReleaseId, Version, doc_coverage::{self, DocCoverage}, }; use docs_rs_utils::{RUSTDOC_STATIC_STORAGE_PREFIX, retry, rustc_version::parse_rustc_version}; @@ -35,7 +36,6 @@ use rustwide::{ logging::{self, LogStorage}, toolchain::ToolchainError, }; -use serde::Deserialize; use std::{ collections::{HashMap, HashSet}, fs::{self, File}, @@ -52,27 +52,6 @@ const COMPONENTS: &[&str] = &["llvm-tools-preview", "rustc-dev", "rustfmt"]; const DUMMY_CRATE_NAME: &str = "empty-library"; const DUMMY_CRATE_VERSION: Version = Version::new(1, 0, 0); -pub const RUSTDOC_JSON_COMPRESSION_ALGORITHMS: &[CompressionAlgorithm] = - &[CompressionAlgorithm::Zstd, CompressionAlgorithm::Gzip]; - -/// read the format version from a rustdoc JSON file. -pub fn read_format_version_from_rustdoc_json( - reader: impl std::io::Read, -) -> Result { - let reader = BufReader::new(reader); - - #[derive(Deserialize)] - struct RustdocJson { - format_version: u16, - } - - let rustdoc_json: RustdocJson = serde_json::from_reader(reader)?; - - Ok(RustdocJsonFormatVersion::Version( - rustdoc_json.format_version, - )) -} - async fn get_configured_toolchain(conn: &mut sqlx::PgConnection) -> Result { let name: String = get_config(conn, ConfigName::Toolchain) .await? diff --git a/crates/bin/docs_rs_builder/src/lib.rs b/crates/bin/docs_rs_builder/src/lib.rs index 94d071804..047e64bb3 100644 --- a/crates/bin/docs_rs_builder/src/lib.rs +++ b/crates/bin/docs_rs_builder/src/lib.rs @@ -1,4 +1,3 @@ -pub mod blacklist; mod build_queue; mod config; pub mod docbuilder; @@ -10,9 +9,6 @@ mod testing; mod utils; pub use config::Config; -pub use docbuilder::rustwide_builder::{ - PackageKind, RUSTDOC_JSON_COMPRESSION_ALGORITHMS, RustwideBuilder, - read_format_version_from_rustdoc_json, -}; +pub use docbuilder::rustwide_builder::{PackageKind, RustwideBuilder}; pub use metrics::BuilderMetrics; pub use queue_builder::queue_builder; diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295.json b/crates/bin/docs_rs_watcher/.sqlx/query-dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295.json deleted file mode 100644 index 8019026f4..000000000 --- a/crates/bin/docs_rs_watcher/.sqlx/query-dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n c.name AS \"name: KrateName\",\n r.version AS \"version: Version\"\n FROM crates AS c\n JOIN releases AS r\n ON c.id = r.crate_id\n JOIN release_build_status AS rbs\n ON rbs.rid = r.id\n JOIN builds AS b\n ON b.rid = r.id\n AND b.build_finished = rbs.last_build_time\n AND b.rustc_nightly_date >= $1\n AND b.rustc_nightly_date < $2\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name: KrateName", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "version: Version", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Date", - "Date" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "dc6fda3230424886a21b26c0adf41e814712a9d3e6c771468109858c7f8ad295" -} diff --git a/crates/bin/docs_rs_watcher/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/bin/docs_rs_watcher/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json deleted file mode 100644 index 8699a9ded..000000000 --- a/crates/bin/docs_rs_watcher/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT build_status AS \"build_status: BuildStatus\"\n FROM release_build_status\n WHERE rid = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374" -} diff --git a/crates/bin/docs_rs_watcher/Cargo.toml b/crates/bin/docs_rs_watcher/Cargo.toml index f1c450df1..00c83d879 100644 --- a/crates/bin/docs_rs_watcher/Cargo.toml +++ b/crates/bin/docs_rs_watcher/Cargo.toml @@ -8,7 +8,6 @@ edition = "2024" [dependencies] anyhow = { workspace = true } -chrono = { workspace = true } clap = { workspace = true } crates-index = { version = "3.0.0", default-features = false, features = ["git", "git-https", "git-performance", "parallel"] } crates-index-diff = { version = "29.0.0", features = [ "max-performance" ]} @@ -34,6 +33,7 @@ tracing = { workspace = true } [dev-dependencies] docs_rs_database = { path = "../../lib/docs_rs_database", features = ["testing"] } docs_rs_fastly = { path = "../../lib/docs_rs_fastly", features = ["testing"] } +docs_rs_rustdoc_json = { path = "../../lib/docs_rs_rustdoc_json" } docs_rs_storage = { path = "../../lib/docs_rs_storage", features = ["testing"] } docs_rs_test_fakes = { path = "../../lib/docs_rs_test_fakes" } docs_rs_types = { path = "../../lib/docs_rs_types", features = ["testing"] } diff --git a/crates/bin/docs_rs_watcher/src/db/delete.rs b/crates/bin/docs_rs_watcher/src/db/delete.rs index 9c1b060c6..1d5a1b26c 100644 --- a/crates/bin/docs_rs_watcher/src/db/delete.rs +++ b/crates/bin/docs_rs_watcher/src/db/delete.rs @@ -202,7 +202,8 @@ mod tests { use crate::testing::TestEnvironment; use super::*; - use docs_rs_storage::{RustdocJsonFormatVersion, rustdoc_json_path}; + use docs_rs_rustdoc_json::RustdocJsonFormatVersion; + use docs_rs_storage::rustdoc_json_path; use docs_rs_test_fakes::{CrateOwner, OwnerKind, fake_release_that_failed_before_build}; use docs_rs_types::{ CompressionAlgorithm, ReleaseId, diff --git a/crates/bin/docs_rs_watcher/src/lib.rs b/crates/bin/docs_rs_watcher/src/lib.rs index c22d76f88..76383ee6d 100644 --- a/crates/bin/docs_rs_watcher/src/lib.rs +++ b/crates/bin/docs_rs_watcher/src/lib.rs @@ -11,7 +11,7 @@ mod testing; pub use config::Config; pub use db::{delete_crate, delete_version}; pub use index::Index; -pub use rebuilds::{queue_rebuilds, queue_rebuilds_faulty_rustdoc}; +pub use rebuilds::queue_rebuilds; use crate::{index_watcher::get_new_crates, service_metrics::OtelServiceMetrics}; use anyhow::Result; diff --git a/crates/bin/docs_rs_watcher/src/rebuilds.rs b/crates/bin/docs_rs_watcher/src/rebuilds.rs index 4b833ce97..f84b7a18d 100644 --- a/crates/bin/docs_rs_watcher/src/rebuilds.rs +++ b/crates/bin/docs_rs_watcher/src/rebuilds.rs @@ -1,7 +1,6 @@ use crate::Config; use anyhow::Result; -use chrono::NaiveDate; -use docs_rs_build_queue::{AsyncBuildQueue, PRIORITY_BROKEN_RUSTDOC, PRIORITY_CONTINUOUS}; +use docs_rs_build_queue::{AsyncBuildQueue, PRIORITY_CONTINUOUS}; use docs_rs_types::{KrateName, Version}; use futures_util::StreamExt; use tracing::{info, instrument}; @@ -77,72 +76,12 @@ pub async fn queue_rebuilds( Ok(()) } -/// Queue rebuilds for failed crates due to a faulty version of rustdoc -/// -/// It is assumed that the version of rustdoc matches the one of rustc, which is persisted in the DB. -/// The priority of the resulting rebuild requests will be lower than previously failed builds. -/// If a crate is already queued to be rebuilt, it will not be requeued. -/// Start date is inclusive, end date is exclusive. -#[instrument(skip_all)] -pub async fn queue_rebuilds_faulty_rustdoc( - conn: &mut sqlx::PgConnection, - queue: &AsyncBuildQueue, - start_nightly_date: &NaiveDate, - end_nightly_date: &Option, -) -> Result { - let end_nightly_date = - end_nightly_date.unwrap_or_else(|| start_nightly_date.succ_opt().unwrap()); - let mut results = sqlx::query!( - r#" - SELECT - c.name AS "name: KrateName", - r.version AS "version: Version" - FROM crates AS c - JOIN releases AS r - ON c.id = r.crate_id - JOIN release_build_status AS rbs - ON rbs.rid = r.id - JOIN builds AS b - ON b.rid = r.id - AND b.build_finished = rbs.last_build_time - AND b.rustc_nightly_date >= $1 - AND b.rustc_nightly_date < $2 - "#, - start_nightly_date, - end_nightly_date - ) - .fetch(&mut *conn); - - let mut results_count = 0; - while let Some(row) = results.next().await { - let row = row?; - - if !queue.has_build_queued(&row.name, &row.version).await? { - results_count += 1; - info!( - name=%row.name, - version=%row.version, - priority=PRIORITY_BROKEN_RUSTDOC, - "queueing rebuild" - ); - queue - .add_crate(&row.name, &row.version, PRIORITY_BROKEN_RUSTDOC, None) - .await?; - } - } - - Ok(results_count) -} - #[cfg(test)] mod tests { use super::*; use crate::testing::TestEnvironment; use docs_rs_test_fakes::FakeBuild; - use docs_rs_types::{ - BuildStatus, - testing::{BAR, BAZ, FOO, V1, V2}, - }; + use docs_rs_types::testing::{BAR, BAZ, FOO, V1}; use pretty_assertions::assert_eq; #[tokio::test(flavor = "multi_thread")] @@ -176,187 +115,6 @@ mod tests { Ok(()) } - /// Verifies whether a rebuild is queued for all releases with the latest build performed with a specific nightly version of rustdoc - #[tokio::test(flavor = "multi_thread")] - async fn test_rebuild_broken_rustdoc_specific_date_simple() -> Result<()> { - let env = TestEnvironment::new().await?; - - // Matrix of test builds (crate name, nightly date, version) - let build_matrix = [ - // Should be skipped since this is not the latest build for this release - (FOO, NaiveDate::from_ymd_opt(2020, 10, 1).unwrap(), V1), - // All those should match - (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), - (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V2), - (BAR, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), - // Should be skipped since the nightly doesn't match - (BAR, NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), V2), - ]; - for build in build_matrix.into_iter() { - let (crate_name, nightly, version) = build; - env.fake_release() - .await - .name(&crate_name) - .version(version) - .builds(vec![ - FakeBuild::default() - .rustc_version( - format!( - "rustc 1.84.0-nightly (e7c0d2750 {})", - nightly.format("%Y-%m-%d") - ) - .as_str(), - ) - .build_status(BuildStatus::Failure), - ]) - .create() - .await?; - } - - let build_queue = env.build_queue()?; - assert!(build_queue.queued_crates().await?.is_empty()); - - let mut conn = env.async_conn().await?; - queue_rebuilds_faulty_rustdoc( - &mut conn, - build_queue, - &NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), - &None, - ) - .await?; - - let queue = build_queue.queued_crates().await?; - assert_eq!(queue.len(), 3); - assert_eq!(queue[0].name, FOO); - assert_eq!(queue[0].version, V1); - assert_eq!(queue[0].priority, PRIORITY_BROKEN_RUSTDOC); - assert_eq!(queue[1].name, FOO); - assert_eq!(queue[1].version, V2); - assert_eq!(queue[1].priority, PRIORITY_BROKEN_RUSTDOC); - assert_eq!(queue[2].name, BAR); - assert_eq!(queue[2].version, V1); - assert_eq!(queue[2].priority, PRIORITY_BROKEN_RUSTDOC); - - Ok(()) - } - - /// Verifies whether a rebuild is NOT queued for any crate if the nightly specified doesn't match any latest build of any release - #[tokio::test(flavor = "multi_thread")] - async fn test_rebuild_broken_rustdoc_specific_date_skipped() -> Result<()> { - let env = TestEnvironment::new().await?; - - // Matrix of test builds (crate name, nightly date, version) - let build_matrix = [ - // Should be skipped since this is not the latest build for this release even if the nightly matches - (FOO, NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), V1), - // Should be skipped since the nightly doesn't match - (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), - // Should be skipped since the nightly doesn't match - (BAR, NaiveDate::from_ymd_opt(2020, 10, 4).unwrap(), V1), - ]; - for build in build_matrix.into_iter() { - let (crate_name, nightly, version) = build; - env.fake_release() - .await - .name(&crate_name) - .version(version) - .builds(vec![ - FakeBuild::default() - .rustc_version( - format!( - "rustc 1.84.0-nightly (e7c0d2750 {})", - nightly.format("%Y-%m-%d") - ) - .as_str(), - ) - .build_status(BuildStatus::Failure), - ]) - .create() - .await?; - } - - let build_queue = env.build_queue()?; - assert!(build_queue.queued_crates().await?.is_empty()); - - let mut conn = env.async_conn().await?; - queue_rebuilds_faulty_rustdoc( - &mut conn, - build_queue, - &NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), - &None, - ) - .await?; - - let queue = build_queue.queued_crates().await?; - assert_eq!(queue.len(), 0); - - Ok(()) - } - - /// Verifies whether a rebuild is queued for all releases with the latest build performed with a nightly version between two dates - #[tokio::test(flavor = "multi_thread")] - async fn test_rebuild_broken_rustdoc_date_range() -> Result<()> { - let env = TestEnvironment::new().await?; - - // Matrix of test builds (crate name, nightly date, version) - let build_matrix = [ - // Should be skipped since this is not the latest build for this release - (FOO, NaiveDate::from_ymd_opt(2020, 10, 1).unwrap(), V1), - // All those should match - (FOO, NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), V1), - (FOO, NaiveDate::from_ymd_opt(2020, 10, 3).unwrap(), V2), - (BAR, NaiveDate::from_ymd_opt(2020, 10, 4).unwrap(), V1), - // Should be skipped since the nightly doesn't match (end date is exclusive) - (BAR, NaiveDate::from_ymd_opt(2020, 10, 5).unwrap(), V2), - ]; - for build in build_matrix.into_iter() { - let (crate_name, nightly, version) = build; - env.fake_release() - .await - .name(&crate_name) - .version(version) - .builds(vec![ - FakeBuild::default() - .rustc_version( - format!( - "rustc 1.84.0-nightly (e7c0d2750 {})", - nightly.format("%Y-%m-%d") - ) - .as_str(), - ) - .build_status(BuildStatus::Failure), - ]) - .create() - .await?; - } - - let build_queue = env.build_queue()?; - assert!(build_queue.queued_crates().await?.is_empty()); - - let mut conn = env.async_conn().await?; - queue_rebuilds_faulty_rustdoc( - &mut conn, - build_queue, - &NaiveDate::from_ymd_opt(2020, 10, 2).unwrap(), - &NaiveDate::from_ymd_opt(2020, 10, 5), - ) - .await?; - - let queue = build_queue.queued_crates().await?; - assert_eq!(queue.len(), 3); - assert_eq!(queue[0].name, FOO); - assert_eq!(queue[0].version, V1); - assert_eq!(queue[0].priority, PRIORITY_BROKEN_RUSTDOC); - assert_eq!(queue[1].name, FOO); - assert_eq!(queue[1].version, V2); - assert_eq!(queue[1].priority, PRIORITY_BROKEN_RUSTDOC); - assert_eq!(queue[2].name, BAR); - assert_eq!(queue[2].version, V1); - assert_eq!(queue[2].priority, PRIORITY_BROKEN_RUSTDOC); - - Ok(()) - } - #[tokio::test(flavor = "multi_thread")] async fn test_still_rebuild_when_full_with_failed() -> Result<()> { let mut config = Config::test_config()?; diff --git a/crates/bin/docs_rs_web/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/bin/docs_rs_web/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json deleted file mode 100644 index 8699a9ded..000000000 --- a/crates/bin/docs_rs_web/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT build_status AS \"build_status: BuildStatus\"\n FROM release_build_status\n WHERE rid = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374" -} diff --git a/crates/bin/docs_rs_web/Cargo.toml b/crates/bin/docs_rs_web/Cargo.toml index a90244778..c677a6f28 100644 --- a/crates/bin/docs_rs_web/Cargo.toml +++ b/crates/bin/docs_rs_web/Cargo.toml @@ -31,6 +31,7 @@ docs_rs_logging = { path = "../../lib/docs_rs_logging" } docs_rs_mimes = { path = "../../lib/docs_rs_mimes" } docs_rs_opentelemetry = { path = "../../lib/docs_rs_opentelemetry" } docs_rs_registry_api = { path = "../../lib/docs_rs_registry_api" } +docs_rs_rustdoc_json = { path = "../../lib/docs_rs_rustdoc_json" } docs_rs_storage = { path = "../../lib/docs_rs_storage" } docs_rs_types = { path = "../../lib/docs_rs_types" } docs_rs_uri = { path = "../../lib/docs_rs_uri" } @@ -75,7 +76,6 @@ time = "0.3" walkdir = { workspace = true } [dev-dependencies] -docs_rs_builder = { path = "../docs_rs_builder" } docs_rs_context = { path = "../../lib/docs_rs_context", features = ["testing"] } docs_rs_database = { path = "../../lib/docs_rs_database", features = ["testing"] } docs_rs_headers = { path = "../../lib/docs_rs_headers", features = ["testing"] } diff --git a/crates/bin/docs_rs_web/src/handlers/rustdoc.rs b/crates/bin/docs_rs_web/src/handlers/rustdoc.rs index 988ae1a45..a3e333b5c 100644 --- a/crates/bin/docs_rs_web/src/handlers/rustdoc.rs +++ b/crates/bin/docs_rs_web/src/handlers/rustdoc.rs @@ -36,9 +36,9 @@ use axum_extra::{ use docs_rs_cargo_metadata::Dependency; use docs_rs_headers::{ETagComputer, IfNoneMatch, X_ROBOTS_TAG}; use docs_rs_registry_api::OwnerKind; +use docs_rs_rustdoc_json::RustdocJsonFormatVersion; use docs_rs_storage::{ - AsyncStorage, PathNotFoundError, RustdocJsonFormatVersion, StreamingBlob, rustdoc_archive_path, - rustdoc_json_path, + AsyncStorage, PathNotFoundError, StreamingBlob, rustdoc_archive_path, rustdoc_json_path, }; use docs_rs_types::{CompressionAlgorithm, KrateName, ReqVersion}; use docs_rs_uri::EscapedURI; @@ -1043,11 +1043,11 @@ mod test { use crate::{Config, cache::CachePolicy, testing::*}; use anyhow::{Context, Result}; use chrono::{NaiveDate, Utc}; - use docs_rs_builder::{ - RUSTDOC_JSON_COMPRESSION_ALGORITHMS, read_format_version_from_rustdoc_json, - }; use docs_rs_cargo_metadata::Dependency; use docs_rs_registry_api::{CrateOwner, OwnerKind}; + use docs_rs_rustdoc_json::{ + RUSTDOC_JSON_COMPRESSION_ALGORITHMS, read_format_version_from_rustdoc_json, + }; use docs_rs_storage::{decompress, testing::check_archive_consistency}; use docs_rs_types::Version; use docs_rs_uri::encode_url_path; diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json b/crates/lib/docs_rs_build_limits/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json similarity index 100% rename from crates/lib/docs_rs_test_fakes/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json rename to crates/lib/docs_rs_build_limits/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json b/crates/lib/docs_rs_build_limits/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json similarity index 100% rename from crates/lib/docs_rs_test_fakes/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json rename to crates/lib/docs_rs_build_limits/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json b/crates/lib/docs_rs_build_limits/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json similarity index 100% rename from crates/lib/docs_rs_test_fakes/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json rename to crates/lib/docs_rs_build_limits/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json b/crates/lib/docs_rs_build_limits/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json similarity index 100% rename from crates/lib/docs_rs_test_fakes/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json rename to crates/lib/docs_rs_build_limits/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json diff --git a/crates/lib/docs_rs_build_limits/Cargo.toml b/crates/lib/docs_rs_build_limits/Cargo.toml index d7cc8ed24..5bc092a05 100644 --- a/crates/lib/docs_rs_build_limits/Cargo.toml +++ b/crates/lib/docs_rs_build_limits/Cargo.toml @@ -13,10 +13,12 @@ futures-util = { workspace = true } serde = { workspace = true} sqlx = { workspace = true } tracing = { workspace = true } +thiserror = { workspace = true } [dev-dependencies] docs_rs_database = { path = "../docs_rs_database", features = ["testing"] } docs_rs_opentelemetry = { path = "../docs_rs_opentelemetry", features = ["testing"] } docs_rs_types = { path = "../docs_rs_types", features = ["testing"] } +pretty_assertions = { workspace = true } tokio = { workspace = true } diff --git a/crates/bin/docs_rs_builder/src/blacklist.rs b/crates/lib/docs_rs_build_limits/src/blacklist.rs similarity index 100% rename from crates/bin/docs_rs_builder/src/blacklist.rs rename to crates/lib/docs_rs_build_limits/src/blacklist.rs diff --git a/crates/lib/docs_rs_build_limits/src/lib.rs b/crates/lib/docs_rs_build_limits/src/lib.rs index 7f9a11c1b..dea25dd64 100644 --- a/crates/lib/docs_rs_build_limits/src/lib.rs +++ b/crates/lib/docs_rs_build_limits/src/lib.rs @@ -1,3 +1,4 @@ +pub mod blacklist; mod config; mod limits; mod overrides; diff --git a/crates/lib/docs_rs_context/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json b/crates/lib/docs_rs_context/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json new file mode 100644 index 000000000..dcc82bf13 --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO blacklisted_crates (crate_name) VALUES ($1);", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae" +} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json b/crates/lib/docs_rs_context/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json similarity index 51% rename from crates/lib/docs_rs_test_fakes/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json rename to crates/lib/docs_rs_context/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json index 945d619af..cc5d0f370 100644 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json +++ b/crates/lib/docs_rs_context/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "DELETE FROM sandbox_overrides WHERE crate_name = $1", + "query": "DELETE FROM blacklisted_crates WHERE crate_name = $1;", "describe": { "columns": [], "parameters": { @@ -10,5 +10,5 @@ }, "nullable": [] }, - "hash": "de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579" + "hash": "864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6" } diff --git a/crates/lib/docs_rs_context/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json b/crates/lib/docs_rs_context/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json new file mode 100644 index 000000000..a5bdecf4a --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n crate_name as \"crate_name: KrateName\"\n FROM blacklisted_crates\n ORDER BY crate_name asc;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_name: KrateName", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418" +} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json b/crates/lib/docs_rs_context/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json similarity index 55% rename from crates/lib/docs_rs_test_fakes/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json rename to crates/lib/docs_rs_context/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json index a95b272dd..150257361 100644 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json +++ b/crates/lib/docs_rs_context/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json @@ -1,11 +1,11 @@ { "db_name": "PostgreSQL", - "query": "SELECT id FROM crates WHERE crates.name = $1", + "query": "SELECT 1 FROM blacklisted_crates WHERE crate_name = $1;", "describe": { "columns": [ { "ordinal": 0, - "name": "id", + "name": "?column?", "type_info": "Int4" } ], @@ -15,8 +15,8 @@ ] }, "nullable": [ - false + null ] }, - "hash": "4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb" + "hash": "e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b" } diff --git a/crates/lib/docs_rs_rustdoc_json/Cargo.toml b/crates/lib/docs_rs_rustdoc_json/Cargo.toml new file mode 100644 index 000000000..8a13ee877 --- /dev/null +++ b/crates/lib/docs_rs_rustdoc_json/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "docs_rs_rustdoc_json" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = { workspace = true } +docs_rs_types = { path = "../docs_rs_types" } +serde = { workspace = true } +serde_json = { workspace = true } +strum = { workspace = true } + +[dev-dependencies] +test-case = { workspace = true } diff --git a/crates/lib/docs_rs_rustdoc_json/src/lib.rs b/crates/lib/docs_rs_rustdoc_json/src/lib.rs new file mode 100644 index 000000000..57c0796de --- /dev/null +++ b/crates/lib/docs_rs_rustdoc_json/src/lib.rs @@ -0,0 +1,59 @@ +use anyhow::Result; +use docs_rs_types::CompressionAlgorithm; +use serde::Deserialize; +use std::{io::BufReader, num::ParseIntError, str::FromStr}; + +pub const RUSTDOC_JSON_COMPRESSION_ALGORITHMS: &[CompressionAlgorithm] = + &[CompressionAlgorithm::Zstd, CompressionAlgorithm::Gzip]; + +/// read the format version from a rustdoc JSON file. +pub fn read_format_version_from_rustdoc_json( + reader: impl std::io::Read, +) -> Result { + let reader = BufReader::new(reader); + + #[derive(Deserialize)] + struct RustdocJson { + format_version: u16, + } + + let rustdoc_json: RustdocJson = serde_json::from_reader(reader)?; + + Ok(RustdocJsonFormatVersion::Version( + rustdoc_json.format_version, + )) +} + +#[derive(strum::Display, Debug, PartialEq, Eq, Clone, Copy)] +#[strum(serialize_all = "snake_case")] +pub enum RustdocJsonFormatVersion { + #[strum(serialize = "{0}")] + Version(u16), + Latest, +} + +impl FromStr for RustdocJsonFormatVersion { + type Err = ParseIntError; + fn from_str(s: &str) -> Result { + if s == "latest" { + Ok(RustdocJsonFormatVersion::Latest) + } else { + s.parse::().map(RustdocJsonFormatVersion::Version) + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use test_case::test_case; + + #[test_case("latest", RustdocJsonFormatVersion::Latest)] + #[test_case("42", RustdocJsonFormatVersion::Version(42))] + fn test_json_format_version(input: &str, expected: RustdocJsonFormatVersion) { + // test Display + assert_eq!(expected.to_string(), input); + // test FromStr + assert_eq!(expected, input.parse().unwrap()); + } +} diff --git a/crates/lib/docs_rs_storage/Cargo.toml b/crates/lib/docs_rs_storage/Cargo.toml index b046df3ac..d54976e32 100644 --- a/crates/lib/docs_rs_storage/Cargo.toml +++ b/crates/lib/docs_rs_storage/Cargo.toml @@ -20,6 +20,7 @@ docs_rs_headers = { path = "../docs_rs_headers" } docs_rs_logging = { path = "../docs_rs_logging", optional = true } docs_rs_mimes = { path = "../docs_rs_mimes" } docs_rs_opentelemetry = { path = "../docs_rs_opentelemetry" } +docs_rs_rustdoc_json = { path = "../docs_rs_rustdoc_json" } docs_rs_types = { path = "../docs_rs_types" } docs_rs_utils = { path = "../docs_rs_utils" } flate2 = "1.1.1" diff --git a/crates/lib/docs_rs_storage/src/lib.rs b/crates/lib/docs_rs_storage/src/lib.rs index ac4a9cc72..d4f330b17 100644 --- a/crates/lib/docs_rs_storage/src/lib.rs +++ b/crates/lib/docs_rs_storage/src/lib.rs @@ -20,7 +20,7 @@ pub use file::FileEntry; pub use file::{add_path_into_database, add_path_into_remote_archive, file_list_to_json}; pub use storage::blocking::Storage; pub use storage::non_blocking::AsyncStorage; -pub use types::{RustdocJsonFormatVersion, StorageKind}; +pub use types::StorageKind; pub use utils::{ file_list::get_file_list, storage_path::{rustdoc_archive_path, rustdoc_json_path, source_archive_path}, diff --git a/crates/lib/docs_rs_storage/src/types.rs b/crates/lib/docs_rs_storage/src/types.rs index 2235b68bc..2b3e4d84a 100644 --- a/crates/lib/docs_rs_storage/src/types.rs +++ b/crates/lib/docs_rs_storage/src/types.rs @@ -1,4 +1,4 @@ -use std::{num::ParseIntError, ops::RangeInclusive, str::FromStr}; +use std::ops::RangeInclusive; use strum::EnumString; pub type FileRange = RangeInclusive; @@ -19,37 +19,3 @@ impl Default for StorageKind { return StorageKind::S3; } } - -#[derive(strum::Display, Debug, PartialEq, Eq, Clone, Copy)] -#[strum(serialize_all = "snake_case")] -pub enum RustdocJsonFormatVersion { - #[strum(serialize = "{0}")] - Version(u16), - Latest, -} - -impl FromStr for RustdocJsonFormatVersion { - type Err = ParseIntError; - fn from_str(s: &str) -> Result { - if s == "latest" { - Ok(RustdocJsonFormatVersion::Latest) - } else { - s.parse::().map(RustdocJsonFormatVersion::Version) - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use test_case::test_case; - - #[test_case("latest", RustdocJsonFormatVersion::Latest)] - #[test_case("42", RustdocJsonFormatVersion::Version(42))] - fn test_json_format_version(input: &str, expected: RustdocJsonFormatVersion) { - // test Display - assert_eq!(expected.to_string(), input); - // test FromStr - assert_eq!(expected, input.parse().unwrap()); - } -} diff --git a/crates/lib/docs_rs_storage/src/utils/storage_path.rs b/crates/lib/docs_rs_storage/src/utils/storage_path.rs index 981435b16..48ba13c5c 100644 --- a/crates/lib/docs_rs_storage/src/utils/storage_path.rs +++ b/crates/lib/docs_rs_storage/src/utils/storage_path.rs @@ -1,4 +1,4 @@ -use crate::types::RustdocJsonFormatVersion; +use docs_rs_rustdoc_json::RustdocJsonFormatVersion; use docs_rs_types::{CompressionAlgorithm, Version}; pub fn rustdoc_archive_path(name: &str, version: &Version) -> String { diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec.json deleted file mode 100644 index fd127620f..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO crate_priorities (pattern, priority) VALUES ($1, $2)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c.json deleted file mode 100644 index 14efdbfd4..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE queue\n SET priority = GREATEST(priority, $1)\n WHERE\n name = $2\n AND version != $3\n AND attempt < $4\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4", - "Text", - "Text", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527.json deleted file mode 100644 index a88c69335..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT host_id\n FROM repositories\n WHERE host = $1 AND updated_at < NOW() - INTERVAL '1 day';", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "host_id", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349.json deleted file mode 100644 index ae5a0b475..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n id,\n name as \"name: KrateName\",\n version as \"version: Version\",\n priority,\n registry,\n attempt\n FROM queue\n WHERE\n attempt < $1 AND\n (last_attempt IS NULL OR last_attempt < NOW() - make_interval(secs => $2))\n ORDER BY priority ASC, attempt ASC, id ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "name: KrateName", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "version: Version", - "type_info": "Text" - }, - { - "ordinal": 3, - "name": "priority", - "type_info": "Int4" - }, - { - "ordinal": 4, - "name": "registry", - "type_info": "Text" - }, - { - "ordinal": 5, - "name": "attempt", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Float8" - ] - }, - "nullable": [ - false, - false, - false, - false, - true, - false - ] - }, - "hash": "48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2.json deleted file mode 100644 index 6d306761e..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE\n FROM queue\n WHERE\n name = $1 AND\n version = $2\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05.json deleted file mode 100644 index cc79bd27a..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE releases SET repository_id = $1 WHERE id = $2;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965.json deleted file mode 100644 index 032419e27..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO repositories (\n host, host_id, name, description, last_commit, stars, forks, issues, updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, NOW())\n ON CONFLICT (host, host_id) DO\n UPDATE SET\n name = $3,\n description = $4,\n last_commit = $5,\n stars = $6,\n forks = $7,\n issues = $8,\n updated_at = NOW()\n RETURNING id;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Timestamptz", - "Int4", - "Int4", - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json deleted file mode 100644 index 6f21daee0..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO sandbox_overrides (\n crate_name, max_memory_bytes, max_targets, timeout_seconds\n )\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (crate_name) DO UPDATE\n SET\n max_memory_bytes = $2,\n max_targets = $3,\n timeout_seconds = $4\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Int8", - "Int4", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67.json deleted file mode 100644 index 55b209a3f..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO queue (name, version, priority, registry)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (name, version) DO UPDATE\n SET priority = EXCLUDED.priority,\n registry = EXCLUDED.registry,\n attempt = 0,\n last_attempt = NULL\n ;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Int4", - "Text" - ] - }, - "nullable": [] - }, - "hash": "743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168.json deleted file mode 100644 index 59d4a4eaf..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n id,\n name as \"name: KrateName\",\n version as \"version: Version\",\n priority,\n registry,\n attempt\n FROM queue\n WHERE attempt < $1\n ORDER BY priority ASC, attempt ASC, id ASC", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "name: KrateName", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "version: Version", - "type_info": "Text" - }, - { - "ordinal": 3, - "name": "priority", - "type_info": "Int4" - }, - { - "ordinal": 4, - "name": "registry", - "type_info": "Text" - }, - { - "ordinal": 5, - "name": "attempt", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false, - false, - false, - false, - true, - false - ] - }, - "hash": "7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0.json deleted file mode 100644 index 9af771395..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT pattern, priority FROM crate_priorities", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "pattern", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "priority", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false - ] - }, - "hash": "8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54.json deleted file mode 100644 index 7e7ce93f0..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT pattern, priority FROM crate_priorities WHERE $1 LIKE pattern LIMIT 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "pattern", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "priority", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323.json deleted file mode 100644 index 33a64a917..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT releases.id, crates.name, releases.version, releases.repository_url\n FROM releases\n INNER JOIN crates ON (crates.id = releases.crate_id)\n WHERE repository_id IS NULL AND repository_url LIKE $1;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "name", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "version", - "type_info": "Text" - }, - { - "ordinal": 3, - "name": "repository_url", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true - ] - }, - "hash": "97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4.json deleted file mode 100644 index fff5127ec..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE queue\n SET\n attempt = attempt + 1,\n last_attempt = NOW()\n WHERE id = $1\n RETURNING attempt;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "attempt", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json deleted file mode 100644 index 87fe73890..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT * FROM sandbox_overrides WHERE crate_name = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "crate_name", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "max_memory_bytes", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "timeout_seconds", - "type_info": "Int4" - }, - { - "ordinal": 3, - "name": "max_targets", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - true, - true, - true - ] - }, - "hash": "a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3.json deleted file mode 100644 index 4f561d6a6..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n priority,\n COUNT(*) as \"count!\"\n FROM queue\n WHERE attempt < $1\n GROUP BY priority", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "priority", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "count!", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false, - null - ] - }, - "hash": "a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb.json deleted file mode 100644 index b76920724..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM queue WHERE id = $1;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [] - }, - "hash": "c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301.json deleted file mode 100644 index 5dc057abf..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM crate_priorities WHERE pattern = $1 RETURNING priority", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "priority", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2.json deleted file mode 100644 index 4200b5330..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id FROM repositories WHERE name = $1 AND host = $2 LIMIT 1;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa.json deleted file mode 100644 index 6bfe26455..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM repositories WHERE host_id = $1 AND host = $2;", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570.json deleted file mode 100644 index ba6be127c..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT COUNT(*) as \"count!\" FROM queue WHERE attempt >= $1;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count!", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - null - ] - }, - "hash": "d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json deleted file mode 100644 index 8699a9ded..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT build_status AS \"build_status: BuildStatus\"\n FROM release_build_status\n WHERE rid = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "build_status: BuildStatus", - "type_info": { - "Custom": { - "name": "build_status", - "kind": { - "Enum": [ - "in_progress", - "success", - "failure" - ] - } - } - } - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c.json deleted file mode 100644 index 403de85f9..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id\n FROM queue\n WHERE\n attempt < $1 AND\n name = $2 AND\n version = $3\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Text", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00.json deleted file mode 100644 index 937d9c012..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE\n FROM queue\n WHERE name = $1\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00" -} diff --git a/crates/lib/docs_rs_test_fakes/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json b/crates/lib/docs_rs_test_fakes/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json deleted file mode 100644 index 4223b877d..000000000 --- a/crates/lib/docs_rs_test_fakes/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n crate_name as \"crate_name: KrateName\",\n max_memory_bytes,\n timeout_seconds,\n max_targets\n FROM sandbox_overrides\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "crate_name: KrateName", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "max_memory_bytes", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "timeout_seconds", - "type_info": "Int4" - }, - { - "ordinal": 3, - "name": "max_targets", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - true, - true, - true - ] - }, - "hash": "fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8" -} diff --git a/crates/lib/docs_rs_test_fakes/Cargo.toml b/crates/lib/docs_rs_test_fakes/Cargo.toml index 70eba0438..c2b2803e8 100644 --- a/crates/lib/docs_rs_test_fakes/Cargo.toml +++ b/crates/lib/docs_rs_test_fakes/Cargo.toml @@ -9,13 +9,13 @@ edition = "2024" anyhow = { workspace = true } base64 = { workspace = true } chrono = { workspace = true } -docs_rs_builder = { path = "../../bin/docs_rs_builder" } docs_rs_cargo_metadata = { path = "../docs_rs_cargo_metadata", features = ["testing"] } docs_rs_database = { path = "../docs_rs_database" } docs_rs_registry_api = { path = "../docs_rs_registry_api" } +docs_rs_rustdoc_json = { path = "../../lib/docs_rs_rustdoc_json" } docs_rs_storage = { path = "../docs_rs_storage" } docs_rs_types = { path = "../docs_rs_types" } +serde_json = { workspace = true } sqlx = { workspace = true } -tracing = { workspace = true } tempfile = { workspace = true } -serde_json = { workspace = true } +tracing = { workspace = true } diff --git a/crates/lib/docs_rs_test_fakes/src/legacy.rs b/crates/lib/docs_rs_test_fakes/src/legacy.rs index 132aadbbc..520bdec3d 100644 --- a/crates/lib/docs_rs_test_fakes/src/legacy.rs +++ b/crates/lib/docs_rs_test_fakes/src/legacy.rs @@ -1,17 +1,16 @@ use anyhow::{Context as _, Result, bail}; use base64::{Engine, engine::general_purpose::STANDARD as b64}; use chrono::{DateTime, Utc}; -use docs_rs_builder::RUSTDOC_JSON_COMPRESSION_ALGORITHMS; use docs_rs_cargo_metadata::{Dependency, MetadataPackage, Target}; use docs_rs_database::{ Pool, releases::{initialize_build, initialize_crate, initialize_release, update_build_status}, }; use docs_rs_registry_api::{CrateData, CrateOwner, ReleaseData}; +use docs_rs_rustdoc_json::{RUSTDOC_JSON_COMPRESSION_ALGORITHMS, RustdocJsonFormatVersion}; use docs_rs_storage::{ - AsyncStorage, FileEntry, RustdocJsonFormatVersion, add_path_into_database, - add_path_into_remote_archive, compress, file_list_to_json, rustdoc_archive_path, - rustdoc_json_path, source_archive_path, + AsyncStorage, FileEntry, add_path_into_database, add_path_into_remote_archive, compress, + file_list_to_json, rustdoc_archive_path, rustdoc_json_path, source_archive_path, }; use docs_rs_types::{ BuildId, BuildStatus, CompressionAlgorithm, DocCoverage, ReleaseId, Version, VersionReq,