diff --git a/.env.sample b/.env.sample index 2610c5e2a..138ea8b5c 100644 --- a/.env.sample +++ b/.env.sample @@ -8,6 +8,7 @@ export DOCSRS_TOOLCHAIN=nightly export AWS_ACCESS_KEY_ID=cratesfyi export AWS_SECRET_ACCESS_KEY=secret_key export S3_ENDPOINT=http://localhost:9000 +export DOCSRS_S3_STATIC_ROOT_PATH=http://localhost:9000/rust-docs-rs export DOCSRS_INCLUDE_DEFAULT_TARGETS=false export DOCSRS_DOCKER_IMAGE=ghcr.io/rust-lang/crates-build-env/linux-micro export SENTRY_ENVIRONMENT=dev diff --git a/Cargo.lock b/Cargo.lock index 14f801586..b8d26c34f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -172,16 +178,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", + "syn 2.0.18", ] [[package]] @@ -218,9 +215,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "fc00553f5f3c06ffd4510a9d576f92143618706c45ea6ff81e84ad9be9588abd" +checksum = "bcdcf0d683fe9c23d32cf5b53c9918ea0a500375a9fb20109802552658e576c9" dependencies = [ "aws-credential-types", "aws-http", @@ -248,9 +245,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4cb57ac6088805821f78d282c0ba8aec809f11cbee10dda19a97b03ab040ccc2" +checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -262,9 +259,9 @@ dependencies = [ [[package]] name = "aws-endpoint" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "9c5f6f84a4f46f95a9bb71d9300b73cd67eb868bc43ae84f66ad34752299f4ac" +checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -276,9 +273,9 @@ dependencies = [ [[package]] name = "aws-http" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a754683c322f7dc5167484266489fdebdcd04d26e53c162cad1f3f949f2c5671" +checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -295,9 +292,9 @@ dependencies = [ [[package]] name = "aws-sdk-cloudfront" -version = "0.26.0" +version = "0.28.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "56719be8e1235c990c55adfa91d23a66f0092bc0ae8654eaefa148956ceeb335" +checksum = "b1f272178001e0025eb646fed1580641c635869787eee364e4cb3756104c3e30" dependencies = [ "aws-credential-types", "aws-endpoint", @@ -321,9 +318,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "0.26.0" +version = "0.28.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "d4b64fc8b7d76d09e53f4a64ebe2cd44894adb902011a26878aebd0576234d41" +checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f" dependencies = [ "aws-credential-types", "aws-endpoint", @@ -354,9 +351,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "0.27.0" +version = "0.28.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "babfd626348836a31785775e3c08a4c345a5ab4c6e06dfd9167f2bee0e6295d6" +checksum = "c8b812340d86d4a766b2ca73f740dfd47a97c2dff0c06c8517a16d88241957e4" dependencies = [ "aws-credential-types", "aws-endpoint", @@ -379,9 +376,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "0.27.0" +version = "0.28.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2d0fbe3c2c342bc8dfea4bb43937405a8ec06f99140a0dcb9c7b59e54dfa93a1" +checksum = "265fac131fbfc188e5c3d96652ea90ecc676a934e3174eaaee523c6cec040b3b" dependencies = [ "aws-credential-types", "aws-endpoint", @@ -405,9 +402,9 @@ dependencies = [ [[package]] name = "aws-sig-auth" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "84dc92a63ede3c2cbe43529cb87ffa58763520c96c6a46ca1ced80417afba845" +checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -420,9 +417,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "392fefab9d6fcbd76d518eb3b1c040b84728ab50f58df0c3c53ada4bea9d327e" +checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", @@ -441,9 +438,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "ae23b9fe7a07d0919000116c4c5c0578303fbce6fc8d32efca1f7759d4c20faf" +checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880" dependencies = [ "futures-util", "pin-project-lite", @@ -453,9 +450,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a6367acbd6849b8c7c659e166955531274ae147bf83ab4312885991f6b6706cb" +checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -474,9 +471,9 @@ dependencies = [ [[package]] name = "aws-smithy-client" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5230d25d244a51339273b8870f0f77874cd4449fb4f8f629b21188ae10cfc0ba" +checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -493,6 +490,7 @@ dependencies = [ "pin-project-lite", "rustls", "serde", + "serde_json", "tokio", "tower", "tracing", @@ -500,9 +498,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "22d2a2bcc16e5c4d949ffd2b851da852b9bbed4bb364ed4ae371b42137ca06d9" +checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8" dependencies = [ "aws-smithy-types", "bytes", @@ -511,9 +509,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b60e2133beb9fe6ffe0b70deca57aaeff0a35ad24a9c6fab2fd3b4f45b99fdb5" +checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" dependencies = [ "aws-smithy-eventstream", "aws-smithy-types", @@ -534,9 +532,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-tower" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3a4d94f556c86a0dd916a5d7c39747157ea8cb909ca469703e20fee33e448b67" +checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -550,18 +548,18 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5ce3d6e6ebb00b2cce379f079ad5ec508f9bcc3a9510d9b9c1840ed1d6f8af39" +checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-protocol-test" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "9e9e1c9b00289a3bfe5d616ed00d0b2d8a5a07647e55b49d4f98cefa09f19fbb" +checksum = "aabbf8d2bfefa4870ba497c1ae3b40e5e26be18af1cb8c871856b0a393a15ffa" dependencies = [ "assert-json-diff 1.1.0", "http", @@ -574,9 +572,9 @@ dependencies = [ [[package]] name = "aws-smithy-query" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "d58edfca32ef9bfbc1ca394599e17ea329cb52d6a07359827be74235b64b3298" +checksum = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d" dependencies = [ "aws-smithy-types", "urlencoding", @@ -584,9 +582,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "58db46fc1f4f26be01ebdb821751b4e2482cd43aa2b64a0348fb89762defaffa" +checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8" dependencies = [ "base64-simd", "itoa 1.0.6", @@ -597,9 +595,9 @@ dependencies = [ [[package]] name = "aws-smithy-types-convert" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "641f27a35715504a92eb27e27b1cd0f4f864ec4c441c48922911aa10affa5e2b" +checksum = "08d826bceaef81b3a8435f99b5da0e7e9ad3379bc91c8893e87cd3daa63c4423" dependencies = [ "aws-smithy-types", "chrono", @@ -607,18 +605,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "fb557fe4995bd9ec87fb244bbb254666a971dc902a783e9da8b7711610e9664c" +checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.55.2" +version = "0.55.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "de0869598bfe46ec44ffe17e063ed33336e59df90356ca8ff0e8da6f7c1d994b" +checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -725,9 +723,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64-simd" @@ -756,9 +754,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.2.1" +version = "2.3.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "24a6904aef64d73cf10ab17ebace7befb918b82164785cb89907993be7f83813" +checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84" [[package]] name = "block-buffer" @@ -771,9 +769,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.4.0" +version = "1.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" dependencies = [ "memchr", "once_cell", @@ -792,9 +790,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytecount" +version = "0.6.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" [[package]] name = "byteorder" @@ -818,12 +822,6 @@ dependencies = [ "either", ] -[[package]] -name = "bytesize" -version = "1.2.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "38fcc2979eff34a4b84e1cf9a1e3da42a7d44b3b690a40cdcb23e3d556cfb2e5" - [[package]] name = "bzip2" version = "0.4.4" @@ -846,20 +844,42 @@ dependencies = [ ] [[package]] -name = "cast" -version = "0.3.0" +name = "camino" +version = "1.1.4" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +dependencies = [ + "serde", +] [[package]] -name = "castaway" -version = "0.2.2" +name = "cargo-platform" +version = "0.1.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" dependencies = [ - "rustversion", + "serde", ] +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" version = "1.0.79" @@ -877,12 +897,12 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", "serde", "winapi", @@ -912,9 +932,9 @@ dependencies = [ [[package]] name = "ciborium" -version = "0.2.0" +version = "0.2.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", @@ -923,15 +943,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.0" +version = "0.2.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" -version = "0.2.0" +version = "0.2.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half", @@ -939,21 +959,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.25" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap", - "textwrap", -] - -[[package]] -name = "clap" -version = "4.2.5" +version = "4.3.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "8a1f23fa97e1d1641371b51f35535cb26959b8e27ab50d167a8b996b5bada819" +checksum = "93aae7a4192245f70fe75dd9157fc7b4a5bf53e88d30bd4396f7d8f9284d5acc" dependencies = [ "clap_builder", "clap_derive", @@ -962,43 +970,34 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.2.5" +version = "4.3.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0fdc5d93c358224b4d6867ef1356d740de2303e9892edc06c5340daeccd96bab" +checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990" dependencies = [ "anstream", "anstyle", "bitflags 1.3.2", - "clap_lex 0.4.1", + "clap_lex", "strsim", ] [[package]] name = "clap_derive" -version = "4.2.0" +version = "4.3.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +checksum = "191d9573962933b4027f932c600cd252ce27a8ad5979418fe78e43c07996f27b" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.15", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", + "syn 2.0.18", ] [[package]] name = "clap_lex" -version = "0.4.1" +version = "0.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "clru" @@ -1021,16 +1020,6 @@ version = "0.1.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "colorchoice" version = "1.0.0" @@ -1048,17 +1037,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "compact_str" -version = "0.6.1" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5138945395949e7dfba09646dc9e766b548ff48e23deb5246890e6b64ae9e1b9" -dependencies = [ - "castaway", - "itoa 1.0.6", - "ryu", -] - [[package]] name = "comrak" version = "0.18.0" @@ -1107,9 +1085,9 @@ dependencies = [ [[package]] name = "crates-index" -version = "0.18.11" +version = "0.19.10" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "599f67b56f40863598cb30450427049935d05de2e36c61d33c050f04d7ec8cf2" +checksum = "65aa5fcd68f892b56202f15a18a53308b2d489b728958dbce48d2d1f3bbaa685" dependencies = [ "git2", "hex", @@ -1122,15 +1100,15 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smartstring", - "toml 0.5.11", + "smol_str", + "toml 0.7.4", ] [[package]] name = "crates-index-diff" -version = "16.0.1" +version = "17.0.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3a9ab62e768890b279e6fac79a453a9bc599a0a4758a39f72c282648fb65f312" +checksum = "f701c590516a2bf36d282e81609acf1c5e5128ff951a02728dd97b7a4cca9795" dependencies = [ "ahash 0.8.3", "bstr", @@ -1163,19 +1141,19 @@ dependencies = [ [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", - "clap 3.2.25", + "clap", "criterion-plot", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -1328,9 +1306,9 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.61+curl-8.0.1" +version = "0.4.63+curl-8.1.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "14d05c10f541ae6f3bc5b3d923c20001f47db7d5f0b2bc6ad16490133842db79" +checksum = "aeb0fef7046022a1e2ad67a004978f0e3cacb9e3123dc62ce768f92197b771dc" dependencies = [ "cc", "libc", @@ -1341,50 +1319,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cxx" -version = "1.0.94" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.94" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.15", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.94" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.94" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.15", -] - [[package]] name = "dashmap" version = "5.4.0" @@ -1435,35 +1369,15 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", "subtle", ] -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "docs-rs" version = "0.6.0" @@ -1478,10 +1392,10 @@ dependencies = [ "axum", "axum-extra", "backtrace", - "base64 0.21.0", + "base64 0.21.2", "bzip2", "chrono", - "clap 4.2.5", + "clap", "comrak", "crates-index", "crates-index-diff", @@ -1508,6 +1422,7 @@ dependencies = [ "mime", "mime_guess", "mockito", + "moka", "num_cpus", "once_cell", "path-slash", @@ -1518,10 +1433,12 @@ dependencies = [ "prometheus", "r2d2", "r2d2_postgres", + "r2d2_sqlite", "rand 0.8.5", "rayon", "regex", "reqwest", + "rusqlite", "rustwide", "schemamama", "schemamama_postgres", @@ -1547,7 +1464,7 @@ dependencies = [ "thread_local", "time", "tokio", - "toml 0.7.3", + "toml 0.7.4", "tower", "tower-http", "tower-service", @@ -1633,6 +1550,15 @@ dependencies = [ "libc", ] +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + [[package]] name = "extend" version = "0.1.2" @@ -1673,6 +1599,12 @@ version = "0.2.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "1.9.0" @@ -1713,7 +1645,7 @@ source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "libz-sys", + "libz-ng-sys", "miniz_oxide 0.7.1", ] @@ -1725,7 +1657,7 @@ checksum = "2cd66269887534af4b0c3e3337404591daa8dc8b9b2b3db71f9523beb4bafb41" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -1812,7 +1744,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -1893,9 +1825,9 @@ checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" [[package]] name = "git2" -version = "0.14.4" +version = "0.17.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "d0155506aab710a86160ddb504a480d2964d7ab5b9e62419be69e0032bc5931c" +checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044" dependencies = [ "bitflags 1.3.2", "libc", @@ -1908,9 +1840,9 @@ dependencies = [ [[package]] name = "gix" -version = "0.37.2" +version = "0.44.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f4bd774f338c0e403983e3d34bca57a798eb4142f8b96009a2b2c2daed52d4d6" +checksum = "6bf41b61f7df395284f7a579c0fa1a7e012c5aede655174d4e91299ef1cac643" dependencies = [ "gix-actor", "gix-attributes", @@ -1920,9 +1852,11 @@ dependencies = [ "gix-diff", "gix-discover", "gix-features", + "gix-fs", "gix-glob", "gix-hash", "gix-hashtable", + "gix-ignore", "gix-index", "gix-lock", "gix-mailmap", @@ -1940,11 +1874,11 @@ dependencies = [ "gix-transport", "gix-traverse", "gix-url", + "gix-utils", "gix-validate", "gix-worktree", "log", "once_cell", - "prodash", "signal-hook", "smallvec", "thiserror", @@ -1953,30 +1887,31 @@ dependencies = [ [[package]] name = "gix-actor" -version = "0.17.2" +version = "0.20.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "381153ea93b9d8a5c6894a5c734b2e9c15d623063adfd2bda4342ecf90f9a5f8" +checksum = "848efa0f1210cea8638f95691c82a46f98a74b9e3524f01d4955ebc25a8f84f3" dependencies = [ "bstr", "btoi", "gix-date", "itoa 1.0.6", "nom", - "quick-error", + "thiserror", ] [[package]] name = "gix-attributes" -version = "0.8.3" +version = "0.12.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "df09b20424fd4cee04c43b50df954c4b119c45b769639b60d80ee8bb6d84e0aa" +checksum = "3015baa01ad2122fbcaab7863c857a603eb7b7ec12ac8141207c42c6439805e2" dependencies = [ "bstr", - "compact_str", - "gix-features", "gix-glob", "gix-path", "gix-quote", + "kstring", + "log", + "smallvec", "thiserror", "unicode-bom", ] @@ -2010,9 +1945,9 @@ dependencies = [ [[package]] name = "gix-config" -version = "0.16.3" +version = "0.22.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b3f91bda4599d9d434e256fd8778fd0f368f7ae5c2015a55934899ac5b70ca99" +checksum = "1d252a0eddb6df74600d3d8872dc9fe98835a7da43110411d705b682f49d4ac1" dependencies = [ "bstr", "gix-config-value", @@ -2021,6 +1956,7 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", + "log", "memchr", "nom", "once_cell", @@ -2031,11 +1967,11 @@ dependencies = [ [[package]] name = "gix-config-value" -version = "0.10.2" +version = "0.12.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "d09154c0c8677e4da0ec35e896f56ee3e338e741b9599fae06075edd83a4081c" +checksum = "786861e84a5793ad5f863d846de5eb064cd23b87e61ad708c8c402608202e7be" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.3.1", "bstr", "gix-path", "libc", @@ -2044,9 +1980,9 @@ dependencies = [ [[package]] name = "gix-credentials" -version = "0.9.2" +version = "0.14.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5d1536399f70146825bd10321adc5307032e3de93f4954a3c54184281f2e6955" +checksum = "4874a4fc11ffa844a3c2b87a66957bda30a73b577ef1acf15ac34df5745de5ff" dependencies = [ "bstr", "gix-command", @@ -2060,9 +1996,9 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.4.3" +version = "0.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b96271912ce39822501616f177dea7218784e6c63be90d5f36322ff3a722aae2" +checksum = "99056f37270715f5c7584fd8b46899a2296af9cae92463bf58b8bd1f5a78e553" dependencies = [ "bstr", "itoa 1.0.6", @@ -2072,9 +2008,9 @@ dependencies = [ [[package]] name = "gix-diff" -version = "0.26.3" +version = "0.29.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "31cdac2ae475ff7a13b9d5c80c0661245f14d9bf8d9268d4bb9c748cfe246d36" +checksum = "644a0f2768bc42d7a69289ada80c9e15c589caefc6a315d2307202df83ed1186" dependencies = [ "gix-hash", "gix-object", @@ -2084,9 +2020,9 @@ dependencies = [ [[package]] name = "gix-discover" -version = "0.13.1" +version = "0.18.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "38029783886cb46fbe63e61b02a70404aa04cfeacfb53ed336832c20fcb1e281" +checksum = "1a6b61363e63e7cdaa3e6f96acb0257ebdb3d8883e21eba5930c99f07f0a5fc0" dependencies = [ "bstr", "dunce", @@ -2099,43 +2035,52 @@ dependencies = [ [[package]] name = "gix-features" -version = "0.26.5" +version = "0.29.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3402b831ea4bb3af36369d61dbf250eb0e1a8577d3cb77b9719c11a82485bfe9" +checksum = "cf69b0f5c701cc3ae22d3204b671907668f6437ca88862d355eaf9bc47a4f897" dependencies = [ "bytes", "crc32fast", "crossbeam-channel", - "crossbeam-utils", "flate2", "gix-hash", "jwalk", "libc", - "num_cpus", "once_cell", "parking_lot", "prodash", - "quick-error", "sha1", "sha1_smol", + "thiserror", "walkdir", ] +[[package]] +name = "gix-fs" +version = "0.1.1" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "9b37a1832f691fdc09910bd267f9a2e413737c1f9ec68c6e31f9e802616278a9" +dependencies = [ + "gix-features", +] + [[package]] name = "gix-glob" -version = "0.5.5" +version = "0.7.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "93e43efd776bc543f46f0fd0ca3d920c37af71a764a16f2aebd89765e9ff2993" +checksum = "c07c98204529ac3f24b34754540a852593d2a4c7349008df389240266627a72a" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.3.1", "bstr", + "gix-features", + "gix-path", ] [[package]] name = "gix-hash" -version = "0.10.4" +version = "0.11.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2a258595457bc192d1f1c59d0d168a1e34e2be9b97a614e14995416185de41a7" +checksum = "078eec3ac2808cc03f0bddd2704cb661da5c5dc33b41a9d7947b141d499c7c42" dependencies = [ "hex", "thiserror", @@ -2143,24 +2088,36 @@ dependencies = [ [[package]] name = "gix-hashtable" -version = "0.1.3" +version = "0.2.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e4e55e40dfd694884f0eb78796c5bddcf2f8b295dace47039099dd7e76534973" +checksum = "afebb85691c6a085b114e01a27f4a61364519298c5826cb87a45c304802299bc" dependencies = [ "gix-hash", "hashbrown 0.13.2", "parking_lot", ] +[[package]] +name = "gix-ignore" +version = "0.2.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "ba205b6df563e2906768bb22834c82eb46c5fdfcd86ba2c347270bc8309a05b2" +dependencies = [ + "bstr", + "gix-glob", + "gix-path", + "unicode-bom", +] + [[package]] name = "gix-index" -version = "0.12.4" +version = "0.16.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "decb345476c25434a202f1cf8a24aa71133c567b7b502c549fd57211c51ed78a" +checksum = "f39c1ccc8f1912cbbd5191efc28dbc5f0d0598042aa56bc09427b7c34efab3ba" dependencies = [ - "atoi", - "bitflags 1.3.2", + "bitflags 2.3.1", "bstr", + "btoi", "filetime", "gix-bitmap", "gix-features", @@ -2176,31 +2133,31 @@ dependencies = [ [[package]] name = "gix-lock" -version = "3.0.2" +version = "5.0.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e5fe84f09afadec78a7227d80f58cb5412d216dbae4b7fa060b619c0ce62b55d" +checksum = "2c693d7f05730fa74a7c467150adc7cea393518410c65f0672f80226b8111555" dependencies = [ - "fastrand", "gix-tempfile", - "quick-error", + "gix-utils", + "thiserror", ] [[package]] name = "gix-mailmap" -version = "0.9.3" +version = "0.12.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a28214e75835ab33d34210a18981110642728bf169f5e339dbfb6f6380b94318" +checksum = "e8856cec3bdc3610c06970d28b6cb20a0c6621621cf9a8ec48cbd23f2630f362" dependencies = [ "bstr", "gix-actor", - "quick-error", + "thiserror", ] [[package]] name = "gix-object" -version = "0.26.4" +version = "0.29.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "edce7170ebcf6fc1487304631556f8bc2b70c8bcbf997a2d73634688bcc92f4e" +checksum = "2d96bd620fd08accdd37f70b2183cfa0b001b4f1c6ade8b7f6e15cb3d9e261ce" dependencies = [ "bstr", "btoi", @@ -2217,9 +2174,9 @@ dependencies = [ [[package]] name = "gix-odb" -version = "0.40.2" +version = "0.45.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0bd81ab7cd13c0f78bd619f967509953094f415288f8693dbb63a084e5bb39c4" +checksum = "bca2f324aa67672b6d0f2c0fa93f96eb6a7029d260e4c1df5dce3c015f5e5add" dependencies = [ "arc-swap", "gix-features", @@ -2235,13 +2192,11 @@ dependencies = [ [[package]] name = "gix-pack" -version = "0.30.3" +version = "0.35.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "26143c5c8bc145a39e9b335cc74504f2eba2ce68b1724661d8e6cb4484ab187e" +checksum = "164a515900a83257ae4aa80e741655bee7a2e39113fb535d7a5ac623b445ff20" dependencies = [ - "bytesize", "clru", - "dashmap", "gix-chunk", "gix-diff", "gix-features", @@ -2260,9 +2215,9 @@ dependencies = [ [[package]] name = "gix-packetline" -version = "0.14.3" +version = "0.16.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "d63e5e5a9a92d4fc6b63ff9d94954d25c779ce25c98d5bbe2e4399aa42f7073c" +checksum = "65d1f86074ba792af1716a1a1046cccc100b88c0eecd0fe4d90719ff9b3002a4" dependencies = [ "bstr", "hex", @@ -2271,32 +2226,34 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.7.3" +version = "0.8.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "32370dce200bb951df013e03dff35b4233fc7a89458642b047629b91734a7e19" +checksum = "4fc78f47095a0c15aea0e66103838f0748f4494bf7a9555dfe0f00425400396c" dependencies = [ "bstr", + "home", + "once_cell", "thiserror", ] [[package]] name = "gix-prompt" -version = "0.3.3" +version = "0.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0f3034d4d935aef2c7bf719aaa54b88c520e82413118d886ae880a31d5bdee57" +checksum = "330d11fdf88fff3366c2491efde2f3e454958efe7d5ddf60272e8fb1d944bb01" dependencies = [ "gix-command", "gix-config-value", - "nix 0.26.2", "parking_lot", + "rustix 0.37.19", "thiserror", ] [[package]] name = "gix-protocol" -version = "0.26.4" +version = "0.32.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "bfa35fd6d272a351ac631b28a940a937aedd50cb5c6955a5dcb8f853ac9ebeed" +checksum = "877e49417f1730f4dbc2f7d9a2ab0f8b2f49ef08f97270691403ecde3d961e3a" dependencies = [ "bstr", "btoi", @@ -2322,12 +2279,13 @@ dependencies = [ [[package]] name = "gix-ref" -version = "0.24.1" +version = "0.29.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "93e85abee11aa093f24da7336bf0a8ad598f15da396b28cf1270ab1091137d35" +checksum = "1e03989e9d49954368e1b526578230fc7189d1634acdfbe79e9ba1de717e15d5" dependencies = [ "gix-actor", "gix-features", + "gix-fs", "gix-hash", "gix-lock", "gix-object", @@ -2341,9 +2299,9 @@ dependencies = [ [[package]] name = "gix-refspec" -version = "0.7.3" +version = "0.10.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "ac80b201eeeb3bc554583fd0127cb6bc9e20981cabb085149c9740329f8a2319" +checksum = "0a6ea733820df67e4cd7797deb12727905824d8f5b7c59d943c456d314475892" dependencies = [ "bstr", "gix-hash", @@ -2355,9 +2313,9 @@ dependencies = [ [[package]] name = "gix-revision" -version = "0.10.4" +version = "0.13.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "107a10d92379a797bea0f1d0eceded58e08913e0a706c8d436592673c6c6503f" +checksum = "810f35e9afeccca999d5d348b239f9c162353127d2e13ff3240e31b919e35476" dependencies = [ "bstr", "gix-date", @@ -2369,26 +2327,26 @@ dependencies = [ [[package]] name = "gix-sec" -version = "0.6.2" +version = "0.8.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e8ffa5bf0772f9b01de501c035b6b084cf9b8bb07dec41e3afc6a17336a65f47" +checksum = "794520043d5a024dfeac335c6e520cb616f6963e30dab995892382e998c12897" dependencies = [ - "bitflags 1.3.2", - "dirs", + "bitflags 2.3.1", "gix-path", "libc", - "windows 0.43.0", + "windows", ] [[package]] name = "gix-tempfile" -version = "3.0.2" +version = "5.0.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "48590cb5de0b8feadee42466a90028877ba67b9fd894c5493b4b64f5e3217c17" +checksum = "d71a0d32f34e71e86586124225caefd78dabc605d0486de580d717653addf182" dependencies = [ - "dashmap", + "gix-fs", "libc", "once_cell", + "parking_lot", "signal-hook", "signal-hook-registry", "tempfile", @@ -2396,11 +2354,11 @@ dependencies = [ [[package]] name = "gix-transport" -version = "0.25.6" +version = "0.31.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "365792888dfa467c251afcdcd8bf9367bbaa445033a234f3752aaf09b0658915" +checksum = "f01c2bf7b989c679695ef635fc7d9e80072e08101be4b53193c8e8b649900102" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "bstr", "curl", "gix-command", @@ -2415,9 +2373,9 @@ dependencies = [ [[package]] name = "gix-traverse" -version = "0.22.2" +version = "0.25.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2b86456d713143fac5aea6787eb3ec6efc0f6dd90ed625fb3f0badf7936ef084" +checksum = "a5be1e807f288c33bb005075111886cceb43ed8a167b3182a0f62c186e2a0dd1" dependencies = [ "gix-hash", "gix-hashtable", @@ -2427,9 +2385,9 @@ dependencies = [ [[package]] name = "gix-url" -version = "0.13.3" +version = "0.18.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4d6e3e05267f7873099b3e510ab8eebdfc28920a915ab2e3d549493abe0fd9f0" +checksum = "dfc77f89054297cc81491e31f1bab4027e554b5ef742a44bd7035db9a0f78b76" dependencies = [ "bstr", "gix-features", @@ -2439,6 +2397,15 @@ dependencies = [ "url", ] +[[package]] +name = "gix-utils" +version = "0.1.1" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "c10b69beac219acb8df673187a1f07dde2d74092f974fb3f9eb385aeb667c909" +dependencies = [ + "fastrand", +] + [[package]] name = "gix-validate" version = "0.7.4" @@ -2451,15 +2418,18 @@ dependencies = [ [[package]] name = "gix-worktree" -version = "0.12.3" +version = "0.17.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "da7ddd5b042c85cfe768d5ea97bb204cf1ed2b9413148f482146f4e831ca172e" +checksum = "a69eaff0ae973a9d37c40f02ae5ae50fa726c8fc2fd3ab79d0a19eb61975aafa" dependencies = [ "bstr", + "filetime", "gix-attributes", "gix-features", + "gix-fs", "gix-glob", "gix-hash", + "gix-ignore", "gix-index", "gix-object", "gix-path", @@ -2467,6 +2437,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "globset" version = "0.4.10" @@ -2493,18 +2469,18 @@ dependencies = [ [[package]] name = "grass" -version = "0.12.3" +version = "0.12.4" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f4bfa010e6f9fe2f40727b4aedf67aa54e0439c57f855458efb1f43d730a028f" +checksum = "85cc4b64880a2264a41f9eab431780e72a68a6c88b9bddef361ba638812d572e" dependencies = [ "grass_compiler", ] [[package]] name = "grass_compiler" -version = "0.12.3" +version = "0.12.4" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "abe05b48c9c96f5ec64ad9af20c9016a8d57ec8b979e0f6dbdd9747f32b16df3" +checksum = "8e4feeef87d958eebd4d55431040768b93a5b088202198e0b203adc3c1d468c6" dependencies = [ "codemap", "indexmap", @@ -2515,9 +2491,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.18" +version = "0.3.19" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", @@ -2562,6 +2538,15 @@ dependencies = [ "ahash 0.8.3", ] +[[package]] +name = "hashlink" +version = "0.8.2" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "0761a1b9491c4f2e3d66aa0f62d0fba0af9a0e2852e4d48ea506632a4b56e6aa" +dependencies = [ + "hashbrown 0.13.2", +] + [[package]] name = "headers" version = "0.3.8" @@ -2709,12 +2694,6 @@ version = "1.0.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "human_format" -version = "1.0.3" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "86cce260d758a9aa3d7c4b99d55c815a540f8a37514ba6046ab6be402a157cb0" - [[package]] name = "humansize" version = "1.1.1" @@ -2790,17 +2769,16 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] @@ -2877,9 +2855,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.10" +version = "1.0.11" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.1", "libc", @@ -2900,7 +2878,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.18", + "rustix 0.37.19", "windows-sys 0.48.0", ] @@ -2936,9 +2914,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] @@ -2953,6 +2931,15 @@ dependencies = [ "rayon", ] +[[package]] +name = "kstring" +version = "2.0.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747" +dependencies = [ + "static_assertions", +] + [[package]] name = "kuchiki" version = "0.8.1" @@ -2988,15 +2975,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.144" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libgit2-sys" -version = "0.13.5+1.4.5" +version = "0.15.2+1.6.4" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "51e5ea06c26926f1002dd553fded6cfcdc9784c1f60feeb58368b4d9b07b6dba" +checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa" dependencies = [ "cc", "libc", @@ -3006,11 +2993,22 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libsqlite3-sys" +version = "0.26.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "libssh2-sys" -version = "0.2.23" +version = "0.3.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" dependencies = [ "cc", "libc", @@ -3021,25 +3019,25 @@ dependencies = [ ] [[package]] -name = "libz-sys" +name = "libz-ng-sys" version = "1.1.9" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +checksum = "2468756f34903b582fe7154dc1ffdebd89d0562c4a43b53c621bb0f1b1043ccb" dependencies = [ - "cc", "cmake", "libc", - "pkg-config", - "vcpkg", ] [[package]] -name = "link-cplusplus" -version = "1.0.8" +name = "libz-sys" +version = "1.1.9" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" dependencies = [ "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] @@ -3056,9 +3054,9 @@ checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" [[package]] name = "linux-raw-sys" -version = "0.3.6" +version = "0.3.8" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b64f40e5e03e0d54f03845c8197d0291253cdbedfb1cb46b13c2c117554a9f4c" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "lock_api" @@ -3072,20 +3070,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "lol_html" -version = "0.3.3" +version = "1.0.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3334b64837c6ea62ca7d8c3ba04ca7aa921b307b664002b882e14332ee2f80f1" +checksum = "ce59b33732efed2480f7d15722ed56905e81004b402196a738f7532ff44d9798" dependencies = [ - "bitflags 2.2.1", + "bitflags 2.3.1", "cfg-if", "cssparser", "encoding_rs", @@ -3241,14 +3236,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -3269,6 +3263,28 @@ dependencies = [ "similar", ] +[[package]] +name = "moka" +version = "0.11.1" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "36506f2f935238463605f3bb13b362f1949daafc3b347d05d60ae08836db2bd2" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "num_cpus", + "once_cell", + "parking_lot", + "rustc_version", + "scheduled-thread-pool", + "skeptic", + "smallvec", + "tagptr", + "thiserror", + "triomphe", + "uuid", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -3307,18 +3323,6 @@ dependencies = [ "pin-utils", ] -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "static_assertions", -] - [[package]] name = "nodrop" version = "0.1.14" @@ -3403,9 +3407,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.17.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" dependencies = [ "parking_lot_core", ] @@ -3440,9 +3444,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.54" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "69b3f656a17a6cbc115b5c7a40c616947d213ba182135b014d6051b73ab6f019" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -3461,7 +3465,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -3472,9 +3476,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.88" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "c2ce0f250f34a308dcfdbb351f511359857d4ed2134ba715a4eadd46e1ffd617" dependencies = [ "cc", "libc", @@ -3493,12 +3497,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "os_str_bytes" -version = "6.5.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - [[package]] name = "output_vt100" version = "0.1.3" @@ -3594,7 +3592,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -3747,22 +3745,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", ] [[package]] @@ -3779,9 +3777,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "plotters" @@ -3833,7 +3831,7 @@ checksum = "070ffaa78859c779b19f9358ce035480479cf2619e968593ffbe72abcb6e0fcf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -3842,7 +3840,7 @@ version = "0.6.5" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "78b7fa9f396f51dffd61546fd8573ee20592287996568e6175ceb0f8699ad75d" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "byteorder", "bytes", "fallible-iterator", @@ -3925,9 +3923,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.59" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] @@ -3944,7 +3942,7 @@ dependencies = [ "flate2", "hex", "lazy_static", - "rustix 0.36.13", + "rustix 0.36.14", ] [[package]] @@ -3952,11 +3950,6 @@ name = "prodash" version = "23.1.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "9516b775656bc3e8985e19cd4b8c0c0de045095074e453d2c0a513b5f978392d" -dependencies = [ - "bytesize", - "human_format", - "parking_lot", -] [[package]] name = "prometheus" @@ -3973,16 +3966,21 @@ dependencies = [ ] [[package]] -name = "quick-error" -version = "2.0.1" +name = "pulldown-cmark" +version = "0.9.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.28" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -4008,6 +4006,17 @@ dependencies = [ "r2d2", ] +[[package]] +name = "r2d2_sqlite" +version = "0.22.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "99f31323d6161385f385046738df520e0e8694fa74852d35891fc0be08348ddc" +dependencies = [ + "r2d2", + "rusqlite", + "uuid", +] + [[package]] name = "rand" version = "0.7.3" @@ -4129,26 +4138,15 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.9", - "redox_syscall 0.2.16", - "thiserror", -] - [[package]] name = "regex" -version = "1.8.1" +version = "1.8.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ "aho-corasick 1.0.1", "memchr", - "regex-syntax 0.7.1", + "regex-syntax 0.7.2", ] [[package]] @@ -4168,9 +4166,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "remove_dir_all" @@ -4187,11 +4185,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.17" +version = "0.11.18" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "bytes", "encoding_rs", "futures-core", @@ -4246,6 +4244,20 @@ dependencies = [ "xmlparser", ] +[[package]] +name = "rusqlite" +version = "0.29.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" +dependencies = [ + "bitflags 2.3.1", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -4269,9 +4281,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.13" +version = "0.36.14" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3a38f9520be93aba504e8ca974197f46158de5dcaa9fa04b57c57cd6a679d658" +checksum = "14e4d67015953998ad0eb82887a0eb0129e18a7e2f3b7b0f6c422fddcd503d62" dependencies = [ "bitflags 1.3.2", "errno", @@ -4283,15 +4295,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.18" +version = "0.37.19" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "8bbfc1d1c7c40c01715f47d71444744a81669ca84e8b63e25a55e169b1f86433" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys 0.3.6", + "linux-raw-sys 0.3.8", "windows-sys 0.48.0", ] @@ -4325,7 +4337,7 @@ version = "1.0.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", ] [[package]] @@ -4336,9 +4348,9 @@ checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" [[package]] name = "rustwide" -version = "0.15.2" +version = "0.16.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b1b0070cdf593a5b66ba6160974bbfb504a837f8c06f3357a623c9a7b6619c64" +checksum = "4f77082ac67ce0958dca987d10f5a994114cd98ee0a81afa6f5bc44fb2e416f0" dependencies = [ "attohttpc", "base64 0.13.1", @@ -4351,7 +4363,7 @@ dependencies = [ "http", "lazy_static", "log", - "nix 0.25.1", + "nix", "percent-encoding", "remove_dir_all", "scopeguard", @@ -4431,12 +4443,6 @@ version = "1.1.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "scratch" -version = "1.0.5" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" - [[package]] name = "sct" version = "0.7.0" @@ -4449,9 +4455,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -4462,9 +4468,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" dependencies = [ "core-foundation-sys", "libc", @@ -4501,9 +4507,9 @@ dependencies = [ [[package]] name = "sentry" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b5ce6d3512e2617c209ec1e86b0ca2fea06454cd34653c91092bf0f3ec41f8e3" +checksum = "de31c6e03322af2175d3c850c5b5e11efcadc01948cd1fb7b5ad0a7c7b6c7ff2" dependencies = [ "httpdate", "native-tls", @@ -4513,15 +4519,16 @@ dependencies = [ "sentry-core", "sentry-debug-images", "sentry-panic", + "sentry-tracing", "tokio", "ureq", ] [[package]] name = "sentry-anyhow" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2d29d7126d9f4912d817eb2ecef8c8bcb46098ddfc2a24afb7c01f6094d9894d" +checksum = "4df1501f58a7821af9d3bd11435d1c0c74121a6e6931f7615592fdfa85a5fb84" dependencies = [ "anyhow", "sentry-backtrace", @@ -4530,9 +4537,9 @@ dependencies = [ [[package]] name = "sentry-backtrace" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0e7fe408d4d1f8de188a9309916e02e129cbe51ca19e55badea5a64899399b1a" +checksum = "264e3ad27da3d1ad81b499dbcceae0a50e0e6ffc4b65b93f47d5180d46827644" dependencies = [ "backtrace", "once_cell", @@ -4542,9 +4549,9 @@ dependencies = [ [[package]] name = "sentry-contexts" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5695096a059a89973ec541062d331ff4c9aeef9c2951416c894f0fff76340e7d" +checksum = "7144590f7950647e4df5bd95f234c3aa29124729c54bd2457e1224d701d1a91c" dependencies = [ "hostname", "libc", @@ -4556,9 +4563,9 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "5b22828bfd118a7b660cf7a155002a494755c0424cebb7061e4743ecde9c7dbc" +checksum = "35614ecf115f55d93583baa02a85cb63acb6567cf91b17690d1147bac1739ca4" dependencies = [ "once_cell", "rand 0.8.5", @@ -4569,9 +4576,9 @@ dependencies = [ [[package]] name = "sentry-debug-images" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0a9164d44a2929b1b7670afd7e87552514b70d3ae672ca52884639373d912a3d" +checksum = "53c4288a1b255e6ff55f111d2e14a48d369da76e86fae15a00ee26a371d82ad4" dependencies = [ "findshlibs", "once_cell", @@ -4580,9 +4587,9 @@ dependencies = [ [[package]] name = "sentry-panic" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "1f4ced2a7a8c14899d58eec402d946f69d5ed26a3fc363a7e8b1e5cb88473a01" +checksum = "0a941028a24baf0a5a994d8a39670cecc72a61971bb0155f771537447a46211a" dependencies = [ "sentry-backtrace", "sentry-core", @@ -4590,9 +4597,9 @@ dependencies = [ [[package]] name = "sentry-tower" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "6cc8fbfebf7c3bec6dc4bdac677028ae8663fc720a7e1ffa5a3969a0928aed36" +checksum = "08b268d4a40bb501e7c744c71a62744e81523a2d20e6a749e26aa4fbff6edae2" dependencies = [ "http", "pin-project", @@ -4604,10 +4611,11 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3f4eda5496b64975306ce37b7ccdc5f264fd1da25c1d5aac324b460edab29ded" +checksum = "eec56ebafd7cfc1175bccdf277be582ccc3308b8c353dca5831261a967a6e28c" dependencies = [ + "sentry-backtrace", "sentry-core", "tracing-core", "tracing-subscriber", @@ -4615,9 +4623,9 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.30.0" +version = "0.31.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "360ee3270f7a4a1eee6c667f7d38360b995431598a73b740dfe420da548d9cc9" +checksum = "9c56f616602a3b282bf4b4e8e5b4d10bcf9412a987df91c592b95a1f6ef1ee43" dependencies = [ "debugid", "getrandom 0.2.9", @@ -4632,9 +4640,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.160" +version = "1.0.163" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] @@ -4651,13 +4659,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.163" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -4682,9 +4690,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.1" +version = "0.6.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" dependencies = [ "serde", ] @@ -4789,6 +4797,21 @@ version = "0.3.10" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + [[package]] name = "slab" version = "0.4.8" @@ -4825,6 +4848,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "smol_str" +version = "0.2.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +dependencies = [ + "serde", +] + [[package]] name = "socket2" version = "0.4.9" @@ -4837,9 +4869,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.2" +version = "0.5.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "6d283f86695ae989d1e18440a943880967156325ba025f05049946bff47bcc2b" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ "libc", "windows-sys 0.48.0", @@ -4929,9 +4961,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -4946,9 +4978,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.18" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -5009,6 +5041,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tar" version = "0.4.38" @@ -5029,7 +5067,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.18", + "rustix 0.37.19", "windows-sys 0.45.0", ] @@ -5066,15 +5104,6 @@ dependencies = [ "unic-segment", ] -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - [[package]] name = "test-case" version = "3.1.0" @@ -5110,12 +5139,6 @@ dependencies = [ "test-case-core", ] -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thin-slice" version = "0.1.1" @@ -5139,7 +5162,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -5154,9 +5177,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.21" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" dependencies = [ "itoa 1.0.6", "libc", @@ -5168,15 +5191,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.9" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" dependencies = [ "time-core", ] @@ -5208,9 +5231,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.0" +version = "1.28.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", @@ -5233,7 +5256,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -5265,7 +5288,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "socket2 0.5.2", + "socket2 0.5.3", "tokio", "tokio-util", ] @@ -5317,9 +5340,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.3" +version = "0.7.4" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" dependencies = [ "serde", "serde_spanned", @@ -5329,18 +5352,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.10" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ "indexmap", "serde", @@ -5423,14 +5446,14 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -5463,6 +5486,12 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "triomphe" +version = "0.1.8" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "f1ee9bd9239c339d714d657fac840c6d2a4f9c45f4f9ec7b0975113458be78db" + [[package]] name = "try-lock" version = "0.2.4" @@ -5507,9 +5536,9 @@ dependencies = [ [[package]] name = "uncased" -version = "0.9.7" +version = "0.9.9" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" +checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" dependencies = [ "version_check", ] @@ -5581,15 +5610,15 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-bom" -version = "1.1.4" +version = "2.0.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "63ec69f541d875b783ca40184d655f2927c95f0bffd486faa83cd3ac3529ec32" +checksum = "98e90c70c9f0d4d1ee6d0a7d04aa06cb9bbd53d8cfbdd62a0269a7c2eb640552" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.9" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" @@ -5600,12 +5629,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -5669,11 +5692,12 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.3.2" +version = "1.3.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" +checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" dependencies = [ "getrandom 0.2.9", + "rand 0.8.5", "serde", ] @@ -5735,9 +5759,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.86" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5745,24 +5769,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.86" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.36" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" dependencies = [ "cfg-if", "js-sys", @@ -5772,9 +5796,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.86" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5782,28 +5806,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.86" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.86" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5856,21 +5880,6 @@ version = "0.4.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.43.0" -source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows" version = "0.48.0" @@ -6072,9 +6081,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.5" +version = "0.4.6" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "69af645a61644c6dd379ade8b77cc87efb5393c988707bad12d3c8e00c50f669" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] @@ -6126,9 +6135,9 @@ checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" [[package]] name = "zip" -version = "0.6.4" +version = "0.6.6" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ "byteorder", "bzip2", diff --git a/Cargo.toml b/Cargo.toml index 5dff498f4..c07d8adcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ edition = "2021" [workspace] exclude = [ "ignored", + "tests", ".workspace", ".rustwide-docker", ] @@ -19,26 +20,27 @@ exclude = [ consistency_check = ["crates-index", "itertools"] [dependencies] -sentry = "0.30.0" -sentry-panic = "0.30.0" -sentry-tracing = "0.30.0" -sentry-tower = { version = "0.30.0", features = ["http"] } -sentry-anyhow = { version = "0.30.0", features = ["backtrace"] } +sentry = "0.31.0" +sentry-panic = "0.31.0" +sentry-tracing = "0.31.0" +sentry-tower = { version = "0.31.0", features = ["http"] } +sentry-anyhow = { version = "0.31.0", features = ["backtrace"] } log = "0.4" tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", default-features = false, features = ["ansi", "fmt", "env-filter"] } tracing-log = "0.1.3" regex = "1" clap = { version = "4.0.22", features = [ "derive" ] } -crates-index = { version = "0.18.5", optional = true } +crates-index = { version = "0.19", optional = true } rayon = "1.6.1" num_cpus = "1.15.0" -crates-index-diff = { version = "16.0.1", features = [ "max-performance" ]} +crates-index-diff = { version = "17.0.0", features = [ "max-performance" ]} reqwest = { version = "0.11", features = ["blocking", "json"] } # TODO: Remove blocking when async is ready semver = { version = "1.0.4", features = ["serde"] } slug = "0.1.1" r2d2 = "0.8" r2d2_postgres = "0.18" +r2d2_sqlite = "0.22.0" url = { version = "2.1.1", features = ["serde"] } docsrs-metadata = { path = "crates/metadata" } anyhow = { version = "1.0.42", features = ["backtrace"]} @@ -51,7 +53,7 @@ toml = "0.7.2" schemamama = "0.3" schemamama_postgres = "0.3" prometheus = { version = "0.13.0", default-features = false } -rustwide = { version = "0.15.0", features = ["unstable-toolchain-ci"] } +rustwide = { version = "0.16.0", features = ["unstable-toolchain-ci", "unstable"] } mime_guess = "2" zstd = "0.12.0" hostname = "0.3.1" @@ -59,7 +61,7 @@ path-slash = "0.2.0" once_cell = { version = "1.4.0", features = ["parking_lot"] } base64 = "0.21" strum = { version = "0.24.0", features = ["derive"] } -lol_html = "0.3" +lol_html = "1.0.0" font-awesome-as-a-crate = { path = "crates/font-awesome-as-a-crate" } dashmap = "5.1.0" string_cache = "0.8.0" @@ -70,13 +72,15 @@ serde_cbor = "0.11.1" getrandom = "0.2.1" itertools = { version = "0.10.5", optional = true} sysinfo = { version = "0.28.2", default-features = false } +rusqlite = { version = "0.29.0", features = ["bundled"] } +moka = { version ="0.11.0", default-features = false, features = ["sync"]} # Async tokio = { version = "1.0", features = ["rt-multi-thread", "signal", "macros"] } futures-util = "0.3.5" aws-config = "0.55.1" -aws-sdk-s3 = "0.26.0" -aws-sdk-cloudfront = "0.26.0" +aws-sdk-s3 = "0.28.0" +aws-sdk-cloudfront = "0.28.0" aws-smithy-types-convert = { version = "0.55.1", features = ["convert-chrono"] } http = "0.2.6" uuid = "1.1.2" @@ -120,7 +124,7 @@ features = ["with-chrono-0_4", "with-serde_json-1"] procfs = "0.15.1" [dev-dependencies] -criterion = "0.4" +criterion = "0.5.1" kuchiki = "0.8" rand = "0.8" mockito = "0.31.0" @@ -131,7 +135,7 @@ indoc = "2.0.0" [build-dependencies] time = "0.3" -gix = { version = "0.37.2", default-features = false } +gix = { version = "0.44.1", default-features = false } string_cache_codegen = "0.5.1" walkdir = "2" anyhow = { version = "1.0.42", features = ["backtrace"] } diff --git a/README.md b/README.md index 17b904cdb..97d65b2f4 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,8 @@ docker-compose up -d db s3 # anything that doesn't run via docker-compose needs the settings defined in # .env. Either via `. ./.env` as below, or via any dotenv shell integration. . ./.env +# allow downloads from the s3 container to support the /crate/.../download endpoint +mcli policy set download docsrs/rust-docs-rs # Setup the database you just created cargo run -- database migrate # Build a sample crate to make sure it works diff --git a/src/bin/cratesfyi.rs b/src/bin/cratesfyi.rs index 2e84a1a4f..99acd3bd1 100644 --- a/src/bin/cratesfyi.rs +++ b/src/bin/cratesfyi.rs @@ -10,7 +10,8 @@ use docs_rs::cdn::CdnBackend; use docs_rs::db::{self, add_path_into_database, Overrides, Pool, PoolClient}; use docs_rs::repositories::RepositoryStatsUpdater; use docs_rs::utils::{ - get_config, queue_builder, remove_crate_priority, set_crate_priority, ConfigName, + get_config, get_crate_pattern_and_priority, list_crate_priorities, queue_builder, + remove_crate_priority, set_crate_priority, ConfigName, }; use docs_rs::{ start_web_server, BuildQueue, Config, Context, Index, Metrics, PackageKind, RustwideBuilder, @@ -200,7 +201,8 @@ enum QueueSubcommand { name = "BUILD_PRIORITY", short = 'p', long = "priority", - default_value = "5" + default_value = "5", + allow_negative_numbers = true )] build_priority: i32, }, @@ -210,6 +212,21 @@ enum QueueSubcommand { #[command(subcommand)] subcommand: PrioritySubcommand, }, + + /// Get the registry watcher's last seen reference + GetLastSeenReference, + + /// Set the registry watcher's last seen reference + #[command(arg_required_else_help(true))] + SetLastSeenReference { + /// The reference to set to, required unless flag used + #[arg(conflicts_with("head"))] + reference: Option, + + /// Fetch the current HEAD of the remote index and use it + #[arg(long, conflicts_with("reference"))] + head: bool, + }, } impl QueueSubcommand { @@ -226,6 +243,29 @@ impl QueueSubcommand { ctx.config()?.registry_url.as_deref(), )?, + Self::GetLastSeenReference => { + if let Some(reference) = ctx.build_queue()?.last_seen_reference()? { + println!("Last seen reference: {reference}"); + } else { + println!("No last seen reference available"); + } + } + + Self::SetLastSeenReference { reference, head } => { + let reference = match (reference, head) { + (Some(reference), false) => reference, + (None, true) => { + println!("Fetching changes to set reference to HEAD"); + let (_, oid) = ctx.index()?.diff()?.peek_changes()?; + oid + } + (_, _) => unreachable!(), + }; + + ctx.build_queue()?.set_last_seen_reference(reference)?; + println!("Set last seen reference: {reference}"); + } + Self::DefaultPriority { subcommand } => subcommand.handle_args(ctx)?, } Ok(()) @@ -234,12 +274,21 @@ impl QueueSubcommand { #[derive(Debug, Clone, PartialEq, Eq, Subcommand)] enum PrioritySubcommand { + /// Get priority for a crate + /// + /// (returns only the first matching pattern, there may be other matching patterns) + Get { crate_name: String }, + + /// List priorities for all patterns + List, + /// Set all crates matching a pattern to a priority level Set { /// See https://www.postgresql.org/docs/current/functions-matching.html for pattern syntax #[arg(name = "PATTERN")] pattern: String, /// The priority to give crates matching the given `PATTERN` + #[arg(allow_negative_numbers = true)] priority: i32, }, @@ -253,19 +302,37 @@ enum PrioritySubcommand { impl PrioritySubcommand { fn handle_args(self, ctx: BinContext) -> Result<()> { + let conn = &mut *ctx.conn()?; match self { + Self::List => { + for (pattern, priority) in list_crate_priorities(conn)? { + println!("{pattern:>20} : {priority:>3}"); + } + } + + Self::Get { crate_name } => { + if let Some((pattern, priority)) = + get_crate_pattern_and_priority(conn, &crate_name)? + { + println!("{pattern} : {priority}"); + } else { + println!("No priority found for {crate_name}"); + } + } + Self::Set { pattern, priority } => { - set_crate_priority(&mut *ctx.conn()?, &pattern, priority) + set_crate_priority(conn, &pattern, priority) .context("Could not set pattern's priority")?; + println!("Set pattern '{pattern}' to priority {priority}"); } Self::Remove { pattern } => { - if let Some(priority) = remove_crate_priority(&mut *ctx.conn()?, &pattern) + if let Some(priority) = remove_crate_priority(conn, &pattern) .context("Could not remove pattern's priority")? { - println!("Removed pattern with priority {priority}"); + println!("Removed pattern '{pattern}' with priority {priority}"); } else { - println!("Pattern did not exist and so was not removed"); + println!("Pattern '{pattern}' did not exist and so was not removed"); } } } diff --git a/src/build_queue.rs b/src/build_queue.rs index adf4ef771..e828b6a25 100644 --- a/src/build_queue.rs +++ b/src/build_queue.rs @@ -58,7 +58,7 @@ impl BuildQueue { Ok(None) } - fn set_last_seen_reference(&self, oid: crates_index_diff::gix::ObjectId) -> Result<()> { + pub fn set_last_seen_reference(&self, oid: crates_index_diff::gix::ObjectId) -> Result<()> { let mut conn = self.db.get()?; set_config( &mut conn, @@ -77,7 +77,7 @@ impl BuildQueue { registry: Option<&str>, ) -> Result<()> { self.db.get()?.execute( - "INSERT INTO queue (name, version, priority, registry) + "INSERT INTO queue (name, version, priority, registry) VALUES ($1, $2, $3, $4) ON CONFLICT (name, version) DO UPDATE SET priority = EXCLUDED.priority, @@ -104,10 +104,10 @@ impl BuildQueue { pub(crate) fn pending_count_by_priority(&self) -> Result> { let res = self.db.get()?.query( - "SELECT - priority, - COUNT(*) - FROM queue + "SELECT + priority, + COUNT(*) + FROM queue WHERE attempt < $1 GROUP BY priority", &[&self.max_attempts], @@ -154,9 +154,9 @@ impl BuildQueue { .query_opt( "SELECT id FROM queue - WHERE - attempt < $1 AND - name = $2 AND + WHERE + attempt < $1 AND + name = $2 AND version = $3 ", &[&self.max_attempts, &name, &version], @@ -183,7 +183,7 @@ impl BuildQueue { FROM queue WHERE attempt < $1 ORDER BY priority ASC, attempt ASC, id ASC - LIMIT 1 + LIMIT 1 FOR UPDATE SKIP LOCKED", &[&self.max_attempts], )? @@ -268,9 +268,17 @@ impl BuildQueue { pub fn get_new_crates(&self, index: &Index) -> Result { let mut conn = self.db.get()?; let diff = index.diff()?; - let (mut changes, oid) = diff.peek_changes_ordered()?; + + let last_seen_reference = self + .last_seen_reference()? + .context("no last_seen_reference set in database")?; + diff.set_last_seen_reference(last_seen_reference)?; + + let (mut changes, new_reference) = diff.peek_changes_ordered()?; let mut crates_added = 0; + debug!("queueing changes from {last_seen_reference} to {new_reference}"); + // I believe this will fix ordering of queue if we get more than one crate from changes changes.reverse(); @@ -341,14 +349,10 @@ impl BuildQueue { } } - // additionally set the reference in the database + // set the reference in the database // so this survives recreating the registry watcher // server. - self.set_last_seen_reference(oid)?; - - // store the last seen reference as git reference in - // the local crates.io index repo. - diff.set_last_seen_reference(oid)?; + self.set_last_seen_reference(new_reference)?; Ok(crates_added) } @@ -482,7 +486,7 @@ mod tests { let mut conn = env.db().conn(); conn.execute( " - INSERT INTO queue (name, version, priority, attempt ) + INSERT INTO queue (name, version, priority, attempt ) VALUES ('failed_crate', '0.1.1', 0, 99)", &[], )?; @@ -496,7 +500,7 @@ mod tests { let row = conn .query_opt( "SELECT priority, attempt - FROM queue + FROM queue WHERE name = $1 AND version = $2", &[&"failed_crate", &"0.1.1"], )? diff --git a/src/config.rs b/src/config.rs index c46b2ed41..0cf907626 100644 --- a/src/config.rs +++ b/src/config.rs @@ -14,6 +14,9 @@ pub struct Config { pub(crate) max_pool_size: u32, pub(crate) min_pool_idle: u32, + // local pool for sqlite connections + pub(crate) max_sqlite_pool_size: u64, + // Storage params pub(crate) storage_backend: StorageKind, @@ -136,6 +139,7 @@ impl Config { database_url: require_env("DOCSRS_DATABASE_URL")?, max_pool_size: env("DOCSRS_MAX_POOL_SIZE", 90)?, + max_sqlite_pool_size: env("DOCSRS_MAX_SQLITE_POOL_SIZE", 500)?, min_pool_idle: env("DOCSRS_MIN_POOL_IDLE", 10)?, storage_backend: env("DOCSRS_STORAGE_BACKEND", StorageKind::Database)?, diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 0e7b96a21..1e77631a8 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -17,7 +17,7 @@ use crate::RUSTDOC_STATIC_STORAGE_PREFIX; use crate::{db::blacklist::is_blacklisted, utils::MetadataPackage}; use crate::{Config, Context, Index, Metrics, Storage}; use anyhow::{anyhow, bail, Context as _, Error}; -use docsrs_metadata::{Metadata, DEFAULT_TARGETS, HOST_TARGET}; +use docsrs_metadata::{BuildTargets, Metadata, DEFAULT_TARGETS, HOST_TARGET}; use failure::Error as FailureError; use postgres::Client; use regex::Regex; @@ -373,6 +373,7 @@ impl RustwideBuilder { let mut build_dir = self.workspace.build_dir(&format!("{name}-{version}")); build_dir.purge().map_err(FailureError::compat)?; + let is_local = matches!(kind, PackageKind::Local(_)); let krate = match kind { PackageKind::Local(path) => Crate::local(path), PackageKind::CratesIo => Crate::crates_io(name, version), @@ -389,44 +390,47 @@ impl RustwideBuilder { let successful = build_dir .build(&self.toolchain, &krate, self.prepare_sandbox(&limits)) .run(|build| { - (|| -> Result { - use docsrs_metadata::BuildTargets; - - let release_data = match self - .index - .api() - .get_release_data(name, version) - .context("error fetching release data from crates.io") + let metadata = Metadata::from_crate_root(build.host_source_dir())?; + let BuildTargets { + default_target, + other_targets, + } = metadata.targets(self.config.include_default_targets); + let mut targets = vec![default_target]; + targets.extend(&other_targets); + // Fetch this before we enter the sandbox, so networking isn't blocked. + build.fetch_build_std_dependencies(&targets)?; + + let release_data = match self + .index + .api() + .get_release_data(name, version) + .context("error fetching release data from crates.io") + { + Ok(data) => data, + Err(err) => { + warn!("{:#?}", err); + ReleaseData::default() + } + }; + + if let Some(ref published_by) = release_data.published_by { + info!( + host_target_dir=?build.host_target_dir(), + published_by_id=published_by.id, + published_by_login=published_by.login, + "restoring artifact cache", + ); + if let Err(err) = self + .artifact_cache + .restore_to(&published_by.id.to_string(), build.host_target_dir()) { - Ok(data) => data, - Err(err) => { - warn!("{:#?}", err); - ReleaseData::default() - } - }; - - if let Some(ref published_by) = release_data.published_by { - info!( - host_target_dir=?build.host_target_dir(), - published_by_id=published_by.id, - published_by_login=published_by.login, - "restoring artifact cache", - ); - if let Err(err) = self - .artifact_cache - .restore_to(&published_by.id.to_string(), build.host_target_dir()) - { - warn!(?err, "could not restore artifact cache"); - } + warn!(?err, "could not restore artifact cache"); } + } + (|| -> Result { let mut has_docs = false; let mut successful_targets = Vec::new(); - let metadata = Metadata::from_crate_root(build.host_source_dir())?; - let BuildTargets { - default_target, - other_targets, - } = metadata.targets(self.config.include_default_targets); // Perform an initial build let mut res = @@ -522,19 +526,24 @@ impl RustwideBuilder { self.metrics.non_library_builds.inc(); } - let release_data = match self - .index - .api() - .get_release_data(name, version) - .with_context(|| { - format!("could not fetch releases-data for {name}-{version}") - }) { - Ok(data) => data, - Err(err) => { - report_error(&err); - ReleaseData::default() + let release_data = if !is_local { + match self + .index + .api() + .get_release_data(name, version) + .with_context(|| { + format!("could not fetch releases-data for {name}-{version}") + }) { + Ok(data) => Some(data), + Err(err) => { + report_error(&err); + None + } } - }; + } else { + None + } + .unwrap_or_default(); let cargo_metadata = res.cargo_metadata.root(); let repository = self.get_repo(cargo_metadata)?; @@ -564,11 +573,13 @@ impl RustwideBuilder { self.storage.store_one(build_log_path, res.build_log)?; // Some crates.io crate data is mutable, so we proactively update it during a release - match self.index.api().get_crate_data(name) { - Ok(crate_data) => { - update_crate_data_in_database(&mut conn, name, &crate_data)? + if !is_local { + match self.index.api().get_crate_data(name) { + Ok(crate_data) => { + update_crate_data_in_database(&mut conn, name, &crate_data)? + } + Err(err) => warn!("{:#?}", err), } - Err(err) => warn!("{:#?}", err), } if let Some(ref published_by) = release_data.published_by { @@ -775,14 +786,6 @@ impl RustwideBuilder { limits: &Limits, mut rustdoc_flags_extras: Vec, ) -> Result> { - // If the explicit target is not a tier one target, we need to install it. - if !docsrs_metadata::DEFAULT_TARGETS.contains(&target) { - // This is a no-op if the target is already installed. - self.toolchain - .add_target(&self.workspace, target) - .map_err(FailureError::compat)?; - } - // Add docs.rs specific arguments let mut cargo_args = vec![ "--offline".into(), @@ -831,6 +834,18 @@ impl RustwideBuilder { rustdoc_flags_extras.extend(UNCONDITIONAL_ARGS.iter().map(|&s| s.to_owned())); let cargo_args = metadata.cargo_args(&cargo_args, &rustdoc_flags_extras); + // If the explicit target is not a tier one target, we need to install it. + let has_build_std = cargo_args.windows(2).any(|args| { + args[0].starts_with("-Zbuild-std") + || (args[0] == "-Z" && args[1].starts_with("build-std")) + }) || cargo_args.last().unwrap().starts_with("-Zbuild-std"); + if !docsrs_metadata::DEFAULT_TARGETS.contains(&target) && !has_build_std { + // This is a no-op if the target is already installed. + self.toolchain + .add_target(&self.workspace, target) + .map_err(FailureError::compat)?; + } + let mut command = build .cargo() .timeout(Some(limits.timeout())) @@ -1268,4 +1283,14 @@ mod tests { Ok(()) }); } + + #[test] + #[ignore] + fn test_build_std() { + wrapper(|env| { + assert!(RustwideBuilder::init(env)? + .build_local_package(Path::new("tests/crates/build-std"))?); + Ok(()) + }) + } } diff --git a/src/index/mod.rs b/src/index/mod.rs index 5ea73a397..c0edde96e 100644 --- a/src/index/mod.rs +++ b/src/index/mod.rs @@ -73,7 +73,7 @@ impl Index { }) } - pub(crate) fn diff(&self) -> Result { + pub fn diff(&self) -> Result { let options = self .repository_url .clone() diff --git a/src/storage/archive_index.rs b/src/storage/archive_index.rs index f01488d46..1bb401743 100644 --- a/src/storage/archive_index.rs +++ b/src/storage/archive_index.rs @@ -2,13 +2,15 @@ use crate::error::Result; use crate::storage::{compression::CompressionAlgorithm, FileRange}; use anyhow::{bail, Context as _}; use memmap2::MmapOptions; +use rusqlite::{Connection, OptionalExtension}; use serde::de::DeserializeSeed; use serde::de::{IgnoredAny, MapAccess, Visitor}; use serde::{Deserialize, Deserializer, Serialize}; -use std::collections::HashMap; -use std::fmt; -use std::path::Path; -use std::{fs, io}; +use std::{collections::HashMap, fmt, fs, fs::File, io, io::Read, path::Path}; + +use super::sqlite_pool::SqliteConnectionPool; + +static SQLITE_FILE_HEADER: &[u8] = b"SQLite format 3\0"; #[derive(Deserialize, Serialize)] pub(crate) struct FileInfo { @@ -30,33 +32,62 @@ struct Index { files: HashMap, } -pub(crate) fn create( +/// create an archive index based on a zipfile. +/// +/// Will delete the destination file if it already exists. +pub(crate) fn create>( zipfile: &mut R, - writer: &mut W, + destination: P, ) -> Result<()> { + if destination.as_ref().exists() { + fs::remove_file(&destination)?; + } + let mut archive = zip::ZipArchive::new(zipfile)?; - // get file locations - let mut files: HashMap = HashMap::with_capacity(archive.len()); + let conn = rusqlite::Connection::open(&destination)?; + conn.execute("PRAGMA synchronous = FULL", ())?; + conn.execute("BEGIN", ())?; + conn.execute( + " + CREATE TABLE files ( + id INTEGER PRIMARY KEY, + path TEXT UNIQUE, + start INTEGER, + end INTEGER, + compression INTEGER + ); + ", + (), + )?; + for i in 0..archive.len() { let zf = archive.by_index(i)?; - files.insert( - zf.name().to_string(), - FileInfo { - range: FileRange::new(zf.data_start(), zf.data_start() + zf.compressed_size() - 1), - compression: match zf.compression() { - zip::CompressionMethod::Bzip2 => CompressionAlgorithm::Bzip2, + let compression_bzip = CompressionAlgorithm::Bzip2 as i32; + + conn.execute( + "INSERT INTO files (path, start, end, compression) VALUES (?, ?, ?, ?)", + ( + zf.name(), + zf.data_start(), + zf.data_start() + zf.compressed_size() - 1, + match zf.compression() { + zip::CompressionMethod::Bzip2 => compression_bzip, c => bail!("unsupported compression algorithm {} in zip-file", c), }, - }, - ); + ), + )?; } - serde_cbor::to_writer(writer, &Index { files }).context("serialization error") + conn.execute("CREATE INDEX idx_files_path ON files (path);", ())?; + conn.execute("END", ())?; + conn.execute("VACUUM", ())?; + + Ok(()) } -pub(crate) fn find_in_slice(bytes: &[u8], search_for: &str) -> Result> { +fn find_in_slice(bytes: &[u8], search_for: &str) -> Result> { let mut deserializer = serde_cbor::Deserializer::from_slice(bytes); /// This visitor will just find the `files` element in the top-level map. @@ -155,18 +186,77 @@ pub(crate) fn find_in_slice(bytes: &[u8], search_for: &str) -> Result Result> { + let mut stmt = conn.prepare( + " + SELECT start, end, compression + FROM files + WHERE path = ? + ", + )?; + + stmt.query_row((search_for,), |row| { + let compression: i32 = row.get(2)?; + + Ok(FileInfo { + range: row.get(0)?..=row.get(1)?, + compression: compression.try_into().map_err(|value| { + rusqlite::Error::FromSqlConversionFailure( + 2, + rusqlite::types::Type::Integer, + format!("invalid compression algorithm '{}' in database", value).into(), + ) + })?, + }) + }) + .optional() + .context("error fetching SQLite data") +} + +/// quick check if a file is a SQLite file. +/// +/// Helpful for the transition phase where an archive-index might be +/// old (CBOR) or new (SQLite) format. +/// +/// See +/// https://raw.githubusercontent.com/rusqlite/rusqlite/master/libsqlite3-sys/sqlite3/sqlite3.c +/// and +/// https://en.wikipedia.org/wiki/SQLite (-> _Magic number_) +/// ```text +/// > FORMAT DETAILS +/// > OFFSET SIZE DESCRIPTION +/// > 0 16 Header string: "SQLite format 3\000" +/// > [...] +fn is_sqlite_file>(archive_index_path: P) -> Result { + let mut f = File::open(archive_index_path)?; + + let mut buffer = [0; 16]; + match f.read_exact(&mut buffer) { + Ok(()) => Ok(buffer == SQLITE_FILE_HEADER), + Err(err) if err.kind() == io::ErrorKind::UnexpectedEof => Ok(false), + Err(err) => Err(err.into()), + } +} + pub(crate) fn find_in_file>( archive_index_path: P, search_for: &str, + pool: &SqliteConnectionPool, ) -> Result> { - let file = fs::File::open(archive_index_path).context("could not open file")?; - let mmap = unsafe { - MmapOptions::new() - .map(&file) - .context("could not create memory map")? - }; - - find_in_slice(&mmap, search_for) + if is_sqlite_file(&archive_index_path)? { + pool.with_connection(archive_index_path, |connection| { + find_in_sqlite_index(connection, search_for) + }) + } else { + let file = fs::File::open(archive_index_path).context("could not open file")?; + let mmap = unsafe { + MmapOptions::new() + .map(&file) + .context("could not create memory map")? + }; + + find_in_slice(&mmap, search_for) + } } #[cfg(test)] @@ -175,8 +265,37 @@ mod tests { use std::io::Write; use zip::write::FileOptions; - #[test] - fn index_create_save_load() { + /// legacy archive index creation, only for testing that reading them still works + fn create_cbor_index( + zipfile: &mut R, + writer: &mut W, + ) -> Result<()> { + let mut archive = zip::ZipArchive::new(zipfile)?; + + // get file locations + let mut files: HashMap = HashMap::with_capacity(archive.len()); + for i in 0..archive.len() { + let zf = archive.by_index(i)?; + + files.insert( + zf.name().to_string(), + FileInfo { + range: FileRange::new( + zf.data_start(), + zf.data_start() + zf.compressed_size() - 1, + ), + compression: match zf.compression() { + zip::CompressionMethod::Bzip2 => CompressionAlgorithm::Bzip2, + c => bail!("unsupported compression algorithm {} in zip-file", c), + }, + }, + ); + } + + serde_cbor::to_writer(writer, &Index { files }).context("serialization error") + } + + fn create_test_archive() -> fs::File { let mut tf = tempfile::tempfile().unwrap(); let objectcontent: Vec = (0..255).collect(); @@ -190,9 +309,14 @@ mod tests { .unwrap(); archive.write_all(&objectcontent).unwrap(); tf = archive.finish().unwrap(); + tf + } + #[test] + fn index_create_save_load_cbor_direct() { + let mut tf = create_test_archive(); let mut buf = Vec::new(); - create(&mut tf, &mut buf).unwrap(); + create_cbor_index(&mut tf, &mut buf).unwrap(); let fi = find_in_slice(&buf, "testfile1").unwrap().unwrap(); assert_eq!(fi.range, FileRange::new(39, 459)); @@ -200,4 +324,77 @@ mod tests { assert!(find_in_slice(&buf, "some_other_file").unwrap().is_none()); } + + #[test] + fn index_create_save_load_cbor_as_fallback() { + let mut tf = create_test_archive(); + let mut cbor_buf = Vec::new(); + create_cbor_index(&mut tf, &mut cbor_buf).unwrap(); + let mut cbor_index_file = tempfile::NamedTempFile::new().unwrap(); + io::copy(&mut &cbor_buf[..], &mut cbor_index_file).unwrap(); + + assert!(!is_sqlite_file(&cbor_index_file).unwrap()); + + let fi = find_in_file( + cbor_index_file.path(), + "testfile1", + &SqliteConnectionPool::default(), + ) + .unwrap() + .unwrap(); + assert_eq!(fi.range, FileRange::new(39, 459)); + assert_eq!(fi.compression, CompressionAlgorithm::Bzip2); + + assert!(find_in_file( + cbor_index_file.path(), + "some_other_file", + &SqliteConnectionPool::default(), + ) + .unwrap() + .is_none()); + } + + #[test] + fn index_create_save_load_sqlite() { + let mut tf = create_test_archive(); + + let tempfile = tempfile::NamedTempFile::new().unwrap().into_temp_path(); + create(&mut tf, &tempfile).unwrap(); + assert!(is_sqlite_file(&tempfile).unwrap()); + + let fi = find_in_file(&tempfile, "testfile1", &SqliteConnectionPool::default()) + .unwrap() + .unwrap(); + + assert_eq!(fi.range, FileRange::new(39, 459)); + assert_eq!(fi.compression, CompressionAlgorithm::Bzip2); + + assert!(find_in_file( + &tempfile, + "some_other_file", + &SqliteConnectionPool::default(), + ) + .unwrap() + .is_none()); + } + + #[test] + fn is_sqlite_file_empty() { + let tempfile = tempfile::NamedTempFile::new().unwrap().into_temp_path(); + assert!(!is_sqlite_file(tempfile).unwrap()); + } + + #[test] + fn is_sqlite_file_other_content() { + let mut tempfile = tempfile::NamedTempFile::new().unwrap(); + tempfile.write_all(b"some_bytes").unwrap(); + assert!(!is_sqlite_file(tempfile.path()).unwrap()); + } + + #[test] + fn is_sqlite_file_specific_headers() { + let mut tempfile = tempfile::NamedTempFile::new().unwrap(); + tempfile.write_all(SQLITE_FILE_HEADER).unwrap(); + assert!(is_sqlite_file(tempfile.path()).unwrap()); + } } diff --git a/src/storage/mod.rs b/src/storage/mod.rs index d838d6a80..a65c51d58 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -2,16 +2,20 @@ mod archive_index; mod compression; mod database; mod s3; +mod sqlite_pool; pub use self::compression::{compress, decompress, CompressionAlgorithm, CompressionAlgorithms}; use self::database::DatabaseBackend; use self::s3::S3Backend; +use self::sqlite_pool::SqliteConnectionPool; use crate::error::Result; use crate::web::metrics::RenderingTimesRecorder; use crate::{db::Pool, Config, Metrics}; use anyhow::{anyhow, ensure}; use chrono::{DateTime, Utc}; use path_slash::PathExt; +use std::io::BufReader; +use std::num::NonZeroU64; use std::{ collections::{HashMap, HashSet}, ffi::OsStr, @@ -112,6 +116,7 @@ enum StorageBackend { pub struct Storage { backend: StorageBackend, config: Arc, + sqlite_pool: SqliteConnectionPool, } impl Storage { @@ -122,6 +127,10 @@ impl Storage { runtime: Arc, ) -> Result { Ok(Storage { + sqlite_pool: SqliteConnectionPool::new( + NonZeroU64::new(config.max_sqlite_pool_size) + .ok_or_else(|| anyhow!("invalid sqlite pool size"))?, + ), config: config.clone(), backend: match config.storage_backend { StorageKind::Database => { @@ -228,7 +237,9 @@ impl Storage { pub(crate) fn exists_in_archive(&self, archive_path: &str, path: &str) -> Result { match self.get_index_filename(archive_path) { - Ok(index_filename) => Ok(archive_index::find_in_file(index_filename, path)?.is_some()), + Ok(index_filename) => { + Ok(archive_index::find_in_file(index_filename, path, &self.sqlite_pool)?.is_some()) + } Err(err) => { if err.downcast_ref::().is_some() { Ok(false) @@ -305,8 +316,12 @@ impl Storage { if let Some(ref mut t) = fetch_time { t.step("find path in index"); } - let info = archive_index::find_in_file(self.get_index_filename(archive_path)?, path)? - .ok_or(PathNotFoundError)?; + let info = archive_index::find_in_file( + self.get_index_filename(archive_path)?, + path, + &self.sqlite_pool, + )? + .ok_or(PathNotFoundError)?; if let Some(t) = fetch_time { t.step("range request"); @@ -361,24 +376,19 @@ impl Storage { } let mut zip_content = zip.finish()?.into_inner(); - let mut index_content = vec![]; - archive_index::create(&mut io::Cursor::new(&mut zip_content), &mut index_content)?; - let alg = CompressionAlgorithm::default(); - let compressed_index_content = compress(&index_content[..], alg)?; let remote_index_path = format!("{}.index", &archive_path); - // additionally store the index in the local cache, so it's directly available let local_index_path = self .config .local_archive_cache_path .join(&remote_index_path); - if local_index_path.exists() { - fs::remove_file(&local_index_path)?; - } fs::create_dir_all(local_index_path.parent().unwrap())?; - let mut local_index_file = fs::File::create(&local_index_path)?; - local_index_file.write_all(&index_content)?; + archive_index::create(&mut io::Cursor::new(&mut zip_content), &local_index_path)?; + + let alg = CompressionAlgorithm::default(); + let compressed_index_content = + compress(BufReader::new(fs::File::open(&local_index_path)?), alg)?; self.store_inner( vec![ diff --git a/src/storage/sqlite_pool.rs b/src/storage/sqlite_pool.rs new file mode 100644 index 000000000..e0e4c3104 --- /dev/null +++ b/src/storage/sqlite_pool.rs @@ -0,0 +1,102 @@ +use anyhow::Result; +use moka::sync::Cache; +use r2d2_sqlite::SqliteConnectionManager; +use rusqlite::{Connection, OpenFlags}; +use std::{ + num::NonZeroU64, + path::{Path, PathBuf}, + time::Duration, +}; + +static MAX_IDLE_TIME: Duration = Duration::from_secs(10 * 60); +static MAX_LIFE_TIME: Duration = Duration::from_secs(60 * 60); + +/// SQLite connection pool. +/// +/// Typical connection pools handle many connections to a single database, +/// while this one handles some connections to many databases. +/// +/// The more connections we keep alive, the more open files we have, +/// so you might need to tweak this limit based on the max open files +/// on your system. +/// +/// We open the databases in readonly mode. +/// We are using an additional connection pool per database to parallel requests +/// can be efficiently answered. Because of this the actual max connection count +/// might be higher than the given max_connections. +/// +/// We keep at minimum of one connection per database, for one hour. +/// Any additional connections will be dropped after 10 minutes of inactivity. +/// +/// * `max_databases` is the maximum amout of databases in the pool. +/// * for each of the databases, we manage a pool of 1-10 connections +#[derive(Clone)] +pub(crate) struct SqliteConnectionPool { + pools: Cache>, +} + +impl Default for SqliteConnectionPool { + fn default() -> Self { + Self::new(NonZeroU64::new(10).unwrap()) + } +} + +impl SqliteConnectionPool { + pub(crate) fn new(max_databases: NonZeroU64) -> Self { + Self { + pools: Cache::builder() + .max_capacity(max_databases.get()) + .time_to_idle(MAX_LIFE_TIME) + .build(), + } + } + + pub(crate) fn with_connection, F: Fn(&Connection) -> Result>( + &self, + path: P, + f: F, + ) -> Result { + let path = path.as_ref().to_owned(); + + let pool = self + .pools + .entry(path.clone()) + .or_insert_with(|| { + let manager = SqliteConnectionManager::file(path) + .with_flags(OpenFlags::SQLITE_OPEN_READ_ONLY | OpenFlags::SQLITE_OPEN_NO_MUTEX); + r2d2::Pool::builder() + .min_idle(Some(1)) + .max_lifetime(Some(MAX_LIFE_TIME)) + .idle_timeout(Some(MAX_IDLE_TIME)) + .max_size(10) + .build_unchecked(manager) + }) + .into_value(); + + let conn = pool.get()?; + f(&conn) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_simple_connection() { + let filename = tempfile::NamedTempFile::new().unwrap().into_temp_path(); + rusqlite::Connection::open(&filename).unwrap(); + + let pool = SqliteConnectionPool::new(NonZeroU64::new(1).unwrap()); + + pool.with_connection(&filename, |conn| { + conn.query_row("SELECT 1", [], |row| { + assert_eq!(row.get::<_, i32>(0).unwrap(), 1); + Ok(()) + }) + .unwrap(); + Ok(()) + }) + .unwrap(); + } +} diff --git a/src/utils/daemon.rs b/src/utils/daemon.rs index 90353eb57..07dadbd45 100644 --- a/src/utils/daemon.rs +++ b/src/utils/daemon.rs @@ -12,7 +12,7 @@ use anyhow::{anyhow, Context as _, Error}; use std::sync::Arc; use std::thread; use std::time::{Duration, Instant}; -use tracing::{debug, error, info}; +use tracing::{debug, info}; /// Run the registry watcher /// NOTE: this should only be run once, otherwise crates would be added @@ -24,22 +24,6 @@ pub fn watch_registry( ) -> Result<(), Error> { let mut last_gc = Instant::now(); - // On startup we fetch the last seen index reference from - // the database and set it in the local index repository. - match build_queue.last_seen_reference() { - Ok(Some(oid)) => { - index.diff()?.set_last_seen_reference(oid)?; - } - Ok(None) => {} - Err(err) => { - error!( - "queue locked because of invalid last_seen_index_reference in database: {:?}", - err - ); - build_queue.lock()?; - } - } - loop { if build_queue.is_locked()? { debug!("Queue is locked, skipping checking new crates"); diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 409d6c5b0..c58d05aba 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -4,7 +4,10 @@ pub(crate) use self::cargo_metadata::{CargoMetadata, Package as MetadataPackage} pub(crate) use self::copy::copy_dir_all; pub use self::daemon::{start_daemon, watch_registry}; pub(crate) use self::html::rewrite_lol; -pub use self::queue::{get_crate_priority, remove_crate_priority, set_crate_priority}; +pub use self::queue::{ + get_crate_pattern_and_priority, get_crate_priority, list_crate_priorities, + remove_crate_priority, set_crate_priority, +}; pub use self::queue_builder::queue_builder; pub(crate) use self::rustc_version::{get_correct_docsrs_style_file, parse_rustc_version}; @@ -62,7 +65,7 @@ pub fn set_config( ) -> anyhow::Result<()> { let name: &'static str = name.into(); conn.execute( - "INSERT INTO config (name, value) + "INSERT INTO config (name, value) VALUES ($1, $2) ON CONFLICT (name) DO UPDATE SET value = $2;", &[&name, &serde_json::to_value(value)?], diff --git a/src/utils/queue.rs b/src/utils/queue.rs index 1bd6463cc..b5c605aec 100644 --- a/src/utils/queue.rs +++ b/src/utils/queue.rs @@ -5,22 +5,40 @@ use postgres::Client; const DEFAULT_PRIORITY: i32 = 0; -/// Get the build queue priority for a crate -pub fn get_crate_priority(conn: &mut Client, name: &str) -> Result { +/// Get the build queue priority for a crate, returns the matching pattern too +pub fn list_crate_priorities(conn: &mut Client) -> Result> { + Ok(conn + .query("SELECT pattern, priority FROM crate_priorities", &[])? + .into_iter() + .map(|r| (r.get(0), r.get(1))) + .collect()) +} + +/// Get the build queue priority for a crate with its matching pattern +pub fn get_crate_pattern_and_priority( + conn: &mut Client, + name: &str, +) -> Result> { // Search the `priority` table for a priority where the crate name matches the stored pattern let query = conn.query( - "SELECT priority FROM crate_priorities WHERE $1 LIKE pattern LIMIT 1", + "SELECT pattern, priority FROM crate_priorities WHERE $1 LIKE pattern LIMIT 1", &[&name], )?; // If no match is found, return the default priority if let Some(row) = query.get(0) { - Ok(row.get(0)) + Ok(Some((row.get(0), row.get(1)))) } else { - Ok(DEFAULT_PRIORITY) + Ok(None) } } +/// Get the build queue priority for a crate +pub fn get_crate_priority(conn: &mut Client, name: &str) -> Result { + Ok(get_crate_pattern_and_priority(conn, name)? + .map_or(DEFAULT_PRIORITY, |(_, priority)| priority)) +} + /// Set all crates that match [`pattern`] to have a certain priority /// /// Note: `pattern` is used in a `LIKE` statement, so it must follow the postgres like syntax diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 94fcd28e8..ed2b1ddcc 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -38,7 +38,7 @@ pub struct CrateDetails { release_time: DateTime, build_status: bool, last_successful_build: Option, - rustdoc_status: bool, + pub rustdoc_status: bool, pub archive_storage: bool, repository_url: Option, homepage_url: Option, diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index f56e801c1..d833188fa 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -473,6 +473,15 @@ pub(crate) async fn rustdoc_html_server_handler( .await? .ok_or(AxumNope::ResourceNotFound)?; + if !krate.rustdoc_status { + rendering_time.step("redirect to crate"); + return Ok(axum_cached_redirect( + format!("/crate/{}/{}", params.name, version_or_latest), + CachePolicy::ForeverInCdn, + )? + .into_response()); + } + // if visiting the full path to the default target, remove the target from the path // expects a req_path that looks like `[/:target]/.*` if req_path.first().copied() == Some(&krate.metadata.default_target) { @@ -2589,4 +2598,28 @@ mod test { Ok(()) }) } + + #[test_case("/something/1.2.3/some_path/", "/crate/something/1.2.3")] + #[test_case("/something/latest/some_path/", "/crate/something/latest")] + fn rustdoc_page_from_failed_build_redirects_to_crate(path: &str, expected: &str) { + wrapper(|env| { + env.fake_release() + .name("something") + .version("1.2.3") + .archive_storage(true) + .build_result_failed() + .create()?; + let web = env.frontend(); + + assert_redirect_cached( + path, + expected, + CachePolicy::ForeverInCdn, + web, + &env.config(), + )?; + + Ok(()) + }) + } } diff --git a/tests/crates/build-std/Cargo.lock b/tests/crates/build-std/Cargo.lock new file mode 100644 index 000000000..1235124d2 --- /dev/null +++ b/tests/crates/build-std/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "build-std" +version = "0.1.0" diff --git a/tests/crates/build-std/Cargo.toml b/tests/crates/build-std/Cargo.toml new file mode 100644 index 000000000..9ed4a17b7 --- /dev/null +++ b/tests/crates/build-std/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "build-std" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] +cargo-args = ["-Zbuild-std=core"] diff --git a/tests/crates/build-std/src/lib.rs b/tests/crates/build-std/src/lib.rs new file mode 100644 index 000000000..7d12d9af8 --- /dev/null +++ b/tests/crates/build-std/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +}