diff --git a/Cargo.lock b/Cargo.lock index 11c843b60..6dd33083e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,6 +69,11 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "autocfg" version = "1.0.0" @@ -363,7 +368,7 @@ dependencies = [ "rusoto_core 0.45.0 (registry+https://github.com/rust-lang/crates.io-index)", "rusoto_credential 0.45.0 (registry+https://github.com/rust-lang/crates.io-index)", "rusoto_s3 0.45.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustwide 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustwide 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "sass-rs 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "schemamama 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "schemamama_postgres 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -767,6 +772,11 @@ dependencies = [ "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -1818,6 +1828,14 @@ dependencies = [ "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "phf" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "phf" version = "0.8.0" @@ -1828,6 +1846,15 @@ dependencies = [ "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "phf_codegen" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "phf_codegen" version = "0.8.0" @@ -1837,6 +1864,15 @@ dependencies = [ "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "phf_generator" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "phf_generator" version = "0.8.0" @@ -1859,6 +1895,14 @@ dependencies = [ "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "phf_shared" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "phf_shared" version = "0.8.0" @@ -2077,6 +2121,24 @@ dependencies = [ "r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" version = "0.7.3" @@ -2090,6 +2152,15 @@ dependencies = [ "rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -2099,6 +2170,19 @@ dependencies = [ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rand_core" version = "0.5.1" @@ -2107,6 +2191,14 @@ dependencies = [ "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -2115,6 +2207,46 @@ dependencies = [ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand_pcg" version = "0.2.1" @@ -2123,6 +2255,14 @@ dependencies = [ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rayon" version = "1.3.0" @@ -2145,6 +2285,14 @@ dependencies = [ "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "redox_syscall" version = "0.1.56" @@ -2368,10 +2516,10 @@ dependencies = [ [[package]] name = "rustwide" -version = "0.7.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2388,6 +2536,7 @@ dependencies = [ "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", "tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2647,6 +2796,11 @@ dependencies = [ "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "siphasher" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "siphasher" version = "0.3.3" @@ -3556,6 +3710,7 @@ dependencies = [ "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" "checksum async-trait 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a265e3abeffdce30b2e26b7a11b222fe37c6067404001b434101457d0385eb92" "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" "checksum backtrace 0.3.48 (registry+https://github.com/rust-lang/crates.io-index)" = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" "checksum base-x 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b20b618342cf9891c292c4f5ac2cde7287cc5c87e87e9c769d617793607dec1" @@ -3629,6 +3784,7 @@ dependencies = [ "checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" "checksum fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" "checksum fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" @@ -3746,10 +3902,14 @@ dependencies = [ "checksum pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" "checksum pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" "checksum pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +"checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" "checksum phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +"checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" "checksum phf_codegen 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" "checksum phf_generator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" "checksum phf_macros 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" "checksum phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" "checksum pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" "checksum pin-project-internal 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" @@ -3775,13 +3935,24 @@ dependencies = [ "checksum quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" "checksum r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" "checksum r2d2_postgres 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "707d27f66f43bac1081141f6d9611fffcce7da2841ae97c7ac53619d098efe8f" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" "checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" "checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" "checksum regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" @@ -3801,7 +3972,7 @@ dependencies = [ "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rusttype 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dc7c727aded0be18c5b80c1640eae0ac8e396abf6fa8477d96cb37d18ee5ec59" -"checksum rustwide 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6e97a51dfbb3333ed70d6373d7980165d20dbd84a8173ab184c2c4d8f27bd122" +"checksum rustwide 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "417d578ebc7fa963bcd06f365f7987c091abeba70eac22dba94b7fd922a95c09" "checksum ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" @@ -3830,6 +4001,7 @@ dependencies = [ "checksum sha2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1" "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" +"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum siphasher 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39af1ce888a1253c8b9fcfa36626557650fb487c013620a743262d2769a3e9f3" diff --git a/Cargo.toml b/Cargo.toml index e9b155df5..c44bab9da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ schemamama = "0.3" schemamama_postgres = "0.3" systemstat = "0.1.4" prometheus = { version = "0.7.0", default-features = false } -rustwide = "0.7.1" +rustwide = "0.10.0" mime_guess = "2" dotenv = "0.15" zstd = "0.5" diff --git a/src/db/add_package.rs b/src/db/add_package.rs index 90d8de0e6..9995ab944 100644 --- a/src/db/add_package.rs +++ b/src/db/add_package.rs @@ -5,7 +5,7 @@ use std::{ }; use crate::{ - docbuilder::BuildResult, + docbuilder::{BuildResult, DocCoverage}, error::Result, index::api::{CrateData, CrateOwner, ReleaseData}, storage::CompressionAlgorithm, @@ -130,6 +130,29 @@ pub(crate) fn add_package_into_database( Ok(release_id) } +pub(crate) fn add_doc_coverage( + conn: &mut Client, + release_id: i32, + doc_coverage: DocCoverage, +) -> Result { + debug!("Adding doc coverage into database"); + let rows = conn.query( + "INSERT INTO doc_coverage (release_id, total_items, documented_items) + VALUES ($1, $2, $3) + ON CONFLICT (release_id) DO UPDATE + SET + total_items = $2, + documented_items = $3 + RETURNING release_id", + &[ + &release_id, + &doc_coverage.total_items, + &doc_coverage.documented_items, + ], + )?; + Ok(rows[0].get(0)) +} + /// Adds a build into database pub(crate) fn add_build_into_database( conn: &mut Client, diff --git a/src/db/delete.rs b/src/db/delete.rs index 0f354d3d3..be73ecfd4 100644 --- a/src/db/delete.rs +++ b/src/db/delete.rs @@ -54,6 +54,7 @@ const METADATA: &[(&str, &str)] = &[ ("keyword_rels", "rid"), ("builds", "rid"), ("compression_rels", "release"), + ("doc_coverage", "release_id"), ]; fn delete_version_from_database(conn: &mut Client, name: &str, version: &str) -> Result<(), Error> { diff --git a/src/db/migrate.rs b/src/db/migrate.rs index ad4361439..d658008b2 100644 --- a/src/db/migrate.rs +++ b/src/db/migrate.rs @@ -381,6 +381,23 @@ pub fn migrate(version: Option, conn: &mut Client) -> CratesfyiResult<( -- Nope, this is a pure database fix, no going back. " ), + migration!( + context, + // version + 16, + // description + "Create new table for doc coverage", + // upgrade query + " + CREATE TABLE doc_coverage ( + release_id INT UNIQUE REFERENCES releases(id), + total_items INT, + documented_items INT + ); + ", + // downgrade query + "DROP TABLE doc_coverage;" + ), ]; for migration in migrations { diff --git a/src/db/mod.rs b/src/db/mod.rs index e1f8db097..c506ada11 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,7 +1,9 @@ //! Database operations pub use self::add_package::update_crate_data_in_database; -pub(crate) use self::add_package::{add_build_into_database, add_package_into_database}; +pub(crate) use self::add_package::{ + add_build_into_database, add_doc_coverage, add_package_into_database, +}; pub use self::delete::{delete_crate, delete_version}; pub use self::file::add_path_into_database; pub use self::migrate::migrate; diff --git a/src/docbuilder/mod.rs b/src/docbuilder/mod.rs index ede7d2ac8..fb1277be0 100644 --- a/src/docbuilder/mod.rs +++ b/src/docbuilder/mod.rs @@ -7,8 +7,8 @@ mod rustwide_builder; pub(crate) use self::limits::Limits; pub(self) use self::metadata::Metadata; -pub(crate) use self::rustwide_builder::BuildResult; pub use self::rustwide_builder::RustwideBuilder; +pub(crate) use self::rustwide_builder::{BuildResult, DocCoverage}; use crate::db::Pool; use crate::error::Result; diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 4afe9cf05..c836633f5 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -3,7 +3,8 @@ use super::Metadata; use crate::db::blacklist::is_blacklisted; use crate::db::file::add_path_into_database; use crate::db::{ - add_build_into_database, add_package_into_database, update_crate_data_in_database, Pool, + add_build_into_database, add_doc_coverage, add_package_into_database, + update_crate_data_in_database, Pool, }; use crate::docbuilder::{crates::crates_from_path, Limits}; use crate::error::Result; @@ -19,7 +20,7 @@ use rustwide::toolchain::ToolchainError; use rustwide::{Build, Crate, Toolchain, Workspace, WorkspaceBuilder}; use serde_json::Value; use std::borrow::Cow; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use std::path::Path; use std::sync::Arc; @@ -428,6 +429,10 @@ impl RustwideBuilder { algs, )?; + if let Some(doc_coverage) = res.result.doc_coverage { + add_doc_coverage(&mut conn, release_id, doc_coverage)?; + } + add_build_into_database(&mut conn, release_id, &res.result)?; // Some crates.io crate data is mutable, so we proactively update it during a release @@ -469,6 +474,55 @@ impl RustwideBuilder { Ok(()) } + fn get_coverage( + &self, + target: &str, + build: &Build, + metadata: &Metadata, + limits: &Limits, + ) -> Result> { + let rustdoc_flags = vec![ + "--output-format".to_string(), + "json".to_string(), + "--show-coverage".to_string(), + ]; + + #[derive(serde::Deserialize)] + struct FileCoverage { + total: i32, + with_docs: i32, + } + + let mut coverage = DocCoverage { + total_items: 0, + documented_items: 0, + }; + + self.prepare_command(build, target, metadata, limits, rustdoc_flags)? + .process_lines(&mut |line, _| { + if line.starts_with('{') && line.ends_with('}') { + let parsed = match serde_json::from_str::>(line) { + Ok(parsed) => parsed, + Err(_) => return, + }; + for file in parsed.values() { + coverage.total_items += file.total; + coverage.documented_items += file.with_docs; + } + } + }) + .log_output(false) + .run()?; + + Ok( + if coverage.total_items == 0 && coverage.documented_items == 0 { + None + } else { + Some(coverage) + }, + ) + } + fn execute_build( &self, target: &str, @@ -480,16 +534,8 @@ impl RustwideBuilder { let cargo_metadata = CargoMetadata::load(&self.workspace, &self.toolchain, &build.host_source_dir())?; - let mut rustdoc_flags: Vec = vec![ - "-Z".to_string(), - "unstable-options".to_string(), - "--resource-suffix".to_string(), - format!("-{}", parse_rustc_version(&self.rustc_version)?), - "--static-root-path".to_string(), - "/".to_string(), - "--cap-lints".to_string(), - "warn".to_string(), - ]; + let mut rustdoc_flags = Vec::new(); + for dep in &cargo_metadata.root_dependencies() { rustdoc_flags.push("--extern-html-root-url".to_string()); rustdoc_flags.push(format!( @@ -499,63 +545,25 @@ impl RustwideBuilder { dep.version )); } - if let Some(package_rustdoc_args) = &metadata.rustdoc_args { - rustdoc_flags.append(&mut package_rustdoc_args.iter().map(|s| s.to_owned()).collect()); - } - let mut cargo_args = vec!["doc", "--lib", "--no-deps"]; - if target != HOST_TARGET { - // If the explicit target is not a tier one target, we need to install it. - if !TARGETS.contains(&target) { - // This is a no-op if the target is already installed. - self.toolchain.add_target(&self.workspace, target)?; - } - cargo_args.push("--target"); - cargo_args.push(target); - }; - - let tmp_jobs; - if let Some(cpu_limit) = self.cpu_limit { - tmp_jobs = format!("-j{}", cpu_limit); - cargo_args.push(&tmp_jobs); - } - let tmp; - if let Some(features) = &metadata.features { - cargo_args.push("--features"); - tmp = features.join(" "); - cargo_args.push(&tmp); - } - if metadata.all_features { - cargo_args.push("--all-features"); - } - if metadata.no_default_features { - cargo_args.push("--no-default-features"); - } + rustdoc_flags.extend(vec![ + "--resource-suffix".to_string(), + format!("-{}", parse_rustc_version(&self.rustc_version)?), + ]); let mut storage = LogStorage::new(LevelFilter::Info); storage.set_max_size(limits.max_log_size()); let successful = logging::capture(&storage, || { - build - .cargo() - .timeout(Some(limits.timeout())) - .no_output_timeout(None) - .env( - "RUSTFLAGS", - metadata - .rustc_args - .as_ref() - .map(|args| args.join(" ")) - .unwrap_or_default(), - ) - .env("RUSTDOCFLAGS", rustdoc_flags.join(" ")) - // For docs.rs detection from build script: - // https://github.com/rust-lang/docs.rs/issues/147 - .env("DOCS_RS", "1") - .args(&cargo_args) - .run() + self.prepare_command(build, target, metadata, limits, rustdoc_flags) + .and_then(|command| command.run().map_err(failure::Error::from)) .is_ok() }); + let doc_coverage = if successful { + self.get_coverage(target, build, metadata, limits)? + } else { + None + }; // If we're passed a default_target which requires a cross-compile, // cargo will put the output in `target//doc`. // However, if this is the default build, we don't want it there, @@ -575,12 +583,87 @@ impl RustwideBuilder { rustc_version: self.rustc_version.clone(), docsrs_version: format!("docsrs {}", crate::BUILD_VERSION), successful, + doc_coverage, }, cargo_metadata, target: target.to_string(), }) } + fn prepare_command<'ws, 'pl>( + &self, + build: &'ws Build, + target: &str, + metadata: &Metadata, + limits: &Limits, + rustdoc_flags_extras: Vec, + ) -> Result> { + let mut cargo_args = vec!["doc", "--lib", "--no-deps"]; + if target != HOST_TARGET { + // If the explicit target is not a tier one target, we need to install it. + if !TARGETS.contains(&target) { + // This is a no-op if the target is already installed. + self.toolchain.add_target(&self.workspace, target)?; + } + cargo_args.push("--target"); + cargo_args.push(target); + }; + + let tmp; + if let Some(cpu_limit) = self.cpu_limit { + tmp = format!("-j{}", cpu_limit); + cargo_args.push(&tmp); + } + + let tmp; + if let Some(features) = &metadata.features { + cargo_args.push("--features"); + tmp = features.join(" "); + cargo_args.push(&tmp); + } + if metadata.all_features { + cargo_args.push("--all-features"); + } + if metadata.no_default_features { + cargo_args.push("--no-default-features"); + } + + let mut rustdoc_flags = vec![ + "-Z".to_string(), + "unstable-options".to_string(), + "--static-root-path".to_string(), + "/".to_string(), + "--cap-lints".to_string(), + "warn".to_string(), + ]; + + if let Some(package_rustdoc_args) = &metadata.rustdoc_args { + rustdoc_flags.append(&mut package_rustdoc_args.clone()); + } + + rustdoc_flags.extend(rustdoc_flags_extras); + + let command = build + .cargo() + .timeout(Some(limits.timeout())) + .no_output_timeout(None) + .env( + "RUSTFLAGS", + metadata + .rustc_args + .as_ref() + .map(|args| args.join(" ")) + .unwrap_or_default(), + ) + .env("RUSTDOCFLAGS", rustdoc_flags.join(" ")) + // For docs.rs detection from build script: + // https://github.com/rust-lang/docs.rs/issues/147 + .env("DOCS_RS", "1") + .args(&cargo_args); + + Ok(command) + } + fn copy_docs( &self, target_dir: &Path, @@ -626,9 +709,19 @@ struct FullBuildResult { cargo_metadata: CargoMetadata, } +#[derive(Clone, Copy)] +pub(crate) struct DocCoverage { + /// The total items that could be documented in the current crate, used to calculate + /// documentation coverage. + pub(crate) total_items: i32, + /// The items of the crate that are documented, used to calculate documentation coverage. + pub(crate) documented_items: i32, +} + pub(crate) struct BuildResult { pub(crate) rustc_version: String, pub(crate) docsrs_version: String, pub(crate) build_log: String, pub(crate) successful: bool, + pub(crate) doc_coverage: Option, } diff --git a/src/test/fakes.rs b/src/test/fakes.rs index 01a0e2515..4d4fa3bd9 100644 --- a/src/test/fakes.rs +++ b/src/test/fakes.rs @@ -1,5 +1,5 @@ use super::TestDatabase; -use crate::docbuilder::BuildResult; +use crate::docbuilder::{BuildResult, DocCoverage}; use crate::index::api::{CrateData, CrateOwner, ReleaseData}; use crate::storage::Storage; use crate::utils::{Dependency, MetadataPackage, Target}; @@ -59,6 +59,10 @@ impl<'a> FakeRelease<'a> { docsrs_version: "docs.rs 1.0.0 (000000000 1970-01-01)".into(), build_log: "It works!".into(), successful: true, + doc_coverage: Some(DocCoverage { + total_items: 10, + documented_items: 6, + }), }, source_files: Vec::new(), rustdoc_files: Vec::new(), @@ -276,6 +280,11 @@ impl<'a> FakeRelease<'a> { &self.registry_crate_data, )?; crate::db::add_build_into_database(&mut db.conn(), release_id, &self.build_result)?; + crate::db::add_doc_coverage( + &mut db.conn(), + release_id, + self.build_result.doc_coverage.clone().unwrap(), + )?; Ok(release_id) } diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 032ae5614..fb02b173a 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -44,6 +44,8 @@ pub struct CrateDetails { pub(crate) doc_targets: Vec, license: Option, documentation_url: Option, + total_items: Option, + documented_items: Option, } fn optional_markdown(markdown: &Option, serializer: S) -> Result @@ -97,9 +99,12 @@ impl CrateDetails { releases.doc_targets, releases.license, releases.documentation_url, - releases.default_target + releases.default_target, + doc_coverage.total_items, + doc_coverage.documented_items FROM releases INNER JOIN crates ON releases.crate_id = crates.id + LEFT JOIN doc_coverage ON doc_coverage.release_id = releases.id WHERE crates.name = $1 AND releases.version = $2;"; let rows = conn.query(query, &[&name, &version]).unwrap(); @@ -150,6 +155,9 @@ impl CrateDetails { .unwrap_or_else(Vec::new) }; + let documented_items: Option = krate.get("documented_items"); + let total_items: Option = krate.get("total_items"); + let mut crate_details = CrateDetails { name: krate.get("name"), version: krate.get("version"), @@ -180,6 +188,8 @@ impl CrateDetails { doc_targets, license: krate.get("license"), documentation_url: krate.get("documentation_url"), + documented_items: documented_items.map(|v| v as f32), + total_items: total_items.map(|v| v as f32), }; if let Some(repository_url) = crate_details.repository_url.clone() { diff --git a/src/web/mod.rs b/src/web/mod.rs index 51b3d0eb7..cecd8da38 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -668,6 +668,14 @@ mod test { node.select("#clipboard").unwrap().count() == 1 } + fn check_doc_coverage_is_present_for_path(path: &str, web: &TestFrontend) -> bool { + let data = web.get(path).send().unwrap().text().unwrap(); + let node = kuchiki::parse_html().one(data); + node.select(".pure-menu-heading") + .unwrap() + .any(|e| e.text_contents().contains("Coverage")) + } + #[test] fn test_index_returns_success() { wrapper(|env| { @@ -677,6 +685,28 @@ mod test { }); } + #[test] + fn test_doc_coverage_for_crate_pages() { + wrapper(|env| { + env.fake_release() + .name("fake_crate") + .version("0.0.1") + .source_file("test.rs", &[]) + .create() + .unwrap(); + let web = env.frontend(); + assert!(check_doc_coverage_is_present_for_path( + "/crate/fake_crate/0.0.1", + web + )); + assert!(check_doc_coverage_is_present_for_path( + "/fake_crate/0.0.1/fake_crate", + web + )); + Ok(()) + }); + } + #[test] fn test_show_clipboard_for_crate_pages() { wrapper(|env| { diff --git a/templates/crate/details.html b/templates/crate/details.html index 15a5e8c3f..d4b83e188 100644 --- a/templates/crate/details.html +++ b/templates/crate/details.html @@ -16,6 +16,13 @@
    + {%- if details.documented_items and details.total_items -%} + {% set percent = details.documented_items * 100 / details.total_items %} +
  • Coverage
  • +
  • {{ percent | round(precision=2) }} %
    + {{ details.documented_items }} out of {{ details.total_items }} items documented +
  • + {%- endif -%} {# List the release author's names and a link to their docs.rs profile #}
  • Authors
  • {%- for author in details.authors -%} diff --git a/templates/rustdoc/body.html b/templates/rustdoc/body.html index e74067451..c3aaa7bb5 100644 --- a/templates/rustdoc/body.html +++ b/templates/rustdoc/body.html @@ -114,6 +114,20 @@
+ {%- if krate.documented_items and krate.total_items -%} + {% set percent = krate.documented_items * 100 / krate.total_items %} + + {%- endif -%} +