diff --git a/Cargo.lock b/Cargo.lock index 6259aac4..adc7bd51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,115 +1,154 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] -name = "autocfg" -version = "1.0.1" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" -version = "0.7.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "block-padding", - "byte-tools", - "byteorder", "generic-array", ] [[package]] -name = "block-padding" -version = "0.1.5" +name = "cc" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ - "byte-tools", + "jobserver", + "libc", + "shlex", ] [[package]] -name = "byte-tools" -version = "0.3.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "byteorder" -version = "1.4.3" +name = "cpufeatures" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] [[package]] -name = "cc" -version = "1.0.69" +name = "crc32fast" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "jobserver", + "cfg-if", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] [[package]] name = "digest" -version = "0.8.1" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "generic-array", + "block-buffer", + "crypto-common", ] [[package]] -name = "fake-simd" -version = "0.1.2" +name = "errno" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide", +] [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "generic-array" -version = "0.12.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", + "version_check", ] [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -118,11 +157,11 @@ dependencies = [ [[package]] name = "git2" -version = "0.13.20" +version = "0.13.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9831e983241f8c5591ed53f17d874833e2fa82cac2625f3888c50cbfe136cba" +checksum = "f29229cc1b24c0e6062f6e742aa3e256492a5323365e5ed3413599f8a5eff7d6" dependencies = [ - "bitflags", + "bitflags 1.3.2", "libc", "libgit2-sys", "log", @@ -133,62 +172,61 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.1.1" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259c65b04c7f45d8cb793c29dae7e4ed0022a70779f33bc8957950b33fc700d7" +checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" dependencies = [ "log", "pest", "pest_derive", - "quick-error", "serde", "serde_json", + "thiserror", "walkdir", ] [[package]] name = "idna" -version = "0.2.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "itoa" -version = "0.4.7" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.22" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.98" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libgit2-sys" -version = "0.12.21+1.1.0" +version = "0.12.26+1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86271bacd72b2b9e854c3dcfb82efd538f15f870e4c11af66900effb462f6825" +checksum = "19e1c899248e606fbfe68dcb31d8b0176ebab833b103824af31bddf4b7457494" dependencies = [ "cc", "libc", @@ -200,9 +238,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0186af0d8f171ae6b9c4c90ec51898bad5d08a2d5e470903a50d9ad8959cbee" +checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" dependencies = [ "cc", "libc", @@ -214,9 +252,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.3" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", @@ -225,55 +263,57 @@ dependencies = [ ] [[package]] -name = "log" +name = "linux-raw-sys" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if", -] +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "mailmap" -version = "0.1.0" +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +name = "mailmap" +version = "0.1.0" +dependencies = [ + "unicase", +] [[package]] -name = "matches" -version = "0.1.8" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "memchr" -version = "2.4.0" +name = "miniz_oxide" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] [[package]] -name = "opaque-debug" -version = "0.2.3" +name = "once_cell" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl-probe" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.65" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ - "autocfg", "cc", "libc", "pkg-config", @@ -282,24 +322,26 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.1.3" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ + "memchr", + "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.1.0" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -307,9 +349,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.3" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", @@ -320,131 +362,133 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.1.3" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ - "maplit", + "once_cell", "pest", - "sha-1", + "sha2", ] [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "proc-macro2" -version = "1.0.28" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ - "unicode-xid", + "unicode-ident", ] -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quote" -version = "1.0.9" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] -name = "rand" -version = "0.8.4" +name = "regex" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "regex-automata" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ - "ppv-lite86", - "rand_core", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "rand_core" -version = "0.6.3" +name = "regex-syntax" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] -name = "rand_hc" -version = "0.3.1" +name = "ring" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ - "rand_core", + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] -name = "redox_syscall" -version = "0.2.9" +name = "rustix" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ - "bitflags", + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] -name = "regex" -version = "1.5.5" +name = "rustls" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] -name = "regex-syntax" -version = "0.6.25" +name = "rustls-pki-types" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "rustls-webpki" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "winapi", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -457,24 +501,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.4" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.127" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.127" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", @@ -483,50 +527,67 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.66" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] -name = "sha-1" -version = "0.8.2" +name = "sha2" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "block-buffer", + "cfg-if", + "cpufeatures", "digest", - "fake-simd", - "opaque-debug", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" -version = "1.0.74" +version = "2.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" +checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "tempfile" -version = "3.2.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -541,69 +602,117 @@ dependencies = [ "semver", "serde", "tempfile", + "unicase", + "ureq", "walkdir", ] +[[package]] +name = "thiserror" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tinyvec" -version = "1.3.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "typenum" -version = "1.13.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicase" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" +dependencies = [ + "base64", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "url", + "webpki-roots", +] [[package]] name = "url" -version = "2.2.2" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] @@ -613,50 +722,130 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "walkdir" -version = "2.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", - "winapi", "winapi-util", ] [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "winapi" -version = "0.3.9" +name = "webpki-roots" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "rustls-pki-types", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "winapi-util" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] [[package]] -name = "winapi-util" -version = "0.1.5" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "winapi", + "windows-targets", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zeroize" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index 0f576410..9de95ec2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,8 @@ handlebars = { version = "4.1.1", features = ["dir_source"] } walkdir = "2" regex = "1.5.5" mailmap = { path = "./mailmap" } +ureq = { version = "2.6.2", features = ["json"] } +unicase = "2.6.0" [profile.release] debug = 2 diff --git a/README.md b/README.md index 5c014afd..54cca013 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,27 @@ To run thanks, you'll need stable Rust. There is no need to configure anything; thanks will run everything on its own, simply `cargo run --release` and the site will be placed in `output`. +## Identities (or "help, I'm showing up multiple times") + +Thanks aggregates data from commits and PR reviews. +It bases identities on the email addresses from the commits and GitHub usernames from approvals (which it maps to email addresses via rust-lang/team). +It then uses the `.mailmap` in the rust-lang/rust repository to canonicalize the identities. + +If you show up multiple times, it's likely that you have contributed under multiple email addresses and haven't added them to the mailmap. +To do this, add yourself to the mailmap `.mailmap` like the example here: + +``` +Ferris +Ferris +Ferris +``` + +If you change your GitHub username or someone mistyped your GitHub username in an `r=` comment, you can re-map it by adding an entry in `src/reviewers.rs`. +This is also useful if your GitHub username is not present in rust-lang/team or you encrypted the email there. + +Use the `DEBUG_EMAILS=1` environment variable locally to display the email address in the output, +which is useful for debugging these missing mailmap entries. + ## Refresh time Thanks is configured to run every night to update the latest statistics. diff --git a/mailmap/Cargo.toml b/mailmap/Cargo.toml index 8d2a1a40..8ee1af24 100644 --- a/mailmap/Cargo.toml +++ b/mailmap/Cargo.toml @@ -11,3 +11,4 @@ categories = ["parsing"] license = "MIT OR Apache-2.0" [dependencies] +unicase = "2.6.0" diff --git a/mailmap/src/lib.rs b/mailmap/src/lib.rs index c3984464..3ecebf6e 100644 --- a/mailmap/src/lib.rs +++ b/mailmap/src/lib.rs @@ -1,7 +1,10 @@ use std::fmt; +use std::hash::Hash; use std::pin::Pin; use std::ptr::NonNull; +use unicase::UniCase; + #[cfg(test)] mod test; @@ -74,8 +77,17 @@ impl<'a> MapEntry<'a> { #[derive(Clone, PartialEq, PartialOrd, Ord, Eq, Hash)] pub struct Author { - pub name: String, - pub email: String, + pub name: UniCase, + pub email: UniCase, +} + +impl Author { + pub fn new(name: String, email: String) -> Self { + Self { + name: UniCase::new(name), + email: UniCase::new(email), + } + } } impl fmt::Debug for Author { @@ -105,18 +117,18 @@ impl Mailmap { let entry = unsafe { entry.to_entry(&self.buffer) }; if let Some(email) = entry.current_email { if let Some(name) = entry.current_name { - if author.name == name && author.email == email { - return Author { - name: entry.canonical_name.unwrap_or(&author.name).to_owned(), - email: entry.canonical_email.expect("canonical email").to_owned(), - }; + if author.name == UniCase::new(name) && author.email == UniCase::new(email) { + return Author::new( + entry.canonical_name.unwrap_or(&author.name).to_owned(), + entry.canonical_email.expect("canonical email").to_owned(), + ); } } else { - if author.email == email { - return Author { - name: entry.canonical_name.unwrap_or(&author.name).to_owned(), - email: entry.canonical_email.expect("canonical email").to_owned(), - }; + if author.email == UniCase::new(email) { + return Author::new( + entry.canonical_name.unwrap_or(&author.name).to_owned(), + entry.canonical_email.expect("canonical email").to_owned(), + ); } } } diff --git a/src/main.rs b/src/main.rs index e91a4a30..621a0026 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,10 +30,7 @@ impl ToAuthor for Author { .email() .unwrap_or_else(|| panic!("no email for {}", sig)); - Author { - name: name.to_string(), - email: email.to_string(), - } + Author::new(name.to_string(), email.to_string()) } } @@ -258,10 +255,10 @@ fn commit_coauthors(commit: &Commit) -> Vec { for line in msg.lines().rev() { if line.starts_with("Co-authored-by") { if let Some(caps) = RE.captures(line) { - coauthors.push(Author { - name: caps["name"].to_string(), - email: caps["email"].to_string(), - }); + coauthors.push(Author::new( + caps["name"].to_string(), + caps["email"].to_string(), + )); } } } @@ -589,14 +586,13 @@ fn main() { eprintln!("\tcaused by: {}", cause); cur = cause; } - std::mem::drop(cur); + std::mem::drop(err); std::process::exit(1); } } #[derive(Debug)] struct Submodule { - path: PathBuf, commit: Oid, // url repository: String, @@ -631,7 +627,6 @@ fn get_submodules( }; assert_eq!(entry.kind().unwrap(), git2::ObjectType::Commit); submodules.push(Submodule { - path: path.to_owned(), commit: entry.id(), repository: url.to_owned(), }); diff --git a/src/reviewers.rs b/src/reviewers.rs index 74833296..aa712694 100644 --- a/src/reviewers.rs +++ b/src/reviewers.rs @@ -1,342 +1,203 @@ use mailmap::Author; +use serde::Deserialize; use std::collections::HashMap; +use std::error::Error; use std::fmt; pub struct Reviewers { - reviewers: HashMap<&'static str, Author>, + reviewers: HashMap, } impl Reviewers { #[rustfmt::skip] pub fn new() -> Result> { - let mut map = HashMap::new(); + let mut map: HashMap = HashMap::new(); // FIXME: somehow dynamically generate this list. For now, it's small enough that // maintaining it here is not too much of a hardship. - fn a(name: &str, email: &str) -> Author { - Author { + enum AddKind { + New(Author), + Alias(&'static str), + } + + fn a(name: &str, email: &str) -> AddKind { + AddKind::New(Author { name: name.into(), email: email.into(), + }) + } + + fn alias(name: &'static str) -> AddKind { + AddKind::Alias(name) + } + + let team_people = get_team_people()?; + for (username, person) in team_people.people { + if let Some(email) = person.email { + map.insert(username.to_lowercase(), Author::new(person.name, email)); } } - let alexcrichton = a("Alex Crichton", "alex@alexcrichton.com"); - let amanieu = a("Amanieu d'Antras", "amanieu@gmail.com"); - let arielb1 = a("Ariel Ben-Yehuda", "ariel.byd@gmail.com"); - let brson = a("Brian Anderson", "andersrb@gmail.com"); - let cramertj = a("Taylor Cramer", "cramertj@google.com"); - let ecstaticmorse = a("Dylan MacKenzie", "ecstaticmorse@gmail.com"); - let frewsxcv = a("Corey Farwell", "coreyf@rwell.org"); - let guillaumegomez = a("Guillaume Gomez", "guillaume1.gomez@gmail.com"); - let hanna_kruppe = a("Hanna Kruppe", "hanna.kruppe@gmail.com"); - let huonw = a("Huon Wilson", "wilson.huon@gmail.com"); - let jakub = a("Jakub Kądziołka", "kuba@kadziolka.net"); - let jyn514 = a("Joshua Nelson", "jyn514@gmail.com"); - let llogiq = a("Andre Bogus", "bogusandre@gmail.com"); - let manishearth = a("Manish Goregaokar", "manishsmail@gmail.com"); - let michaelwoerister = a("Michael Woerister", "michaelwoerister@posteo.net"); - let nikomatsakis = a("Niko Matsakis", "niko@alum.mit.edu"); - let nora = a("Noratrieb", "48135649+Noratrieb@users.noreply.github.com"); - let nrc = a("Nick Cameron", "ncameron@mozilla.com"); - let oli_obk = a("Oliver Scherer", "github35764891676564198441@oli-obk.de"); - let pcwalton = a("Patrick Walton", "pcwalton@mimiga.net"); - let petrochenkov = a("Vadim Petrochenkov", "vadim.petrochenkov@gmail.com"); - let quietmisdreavus = a("QuietMisdreavus", "grey@quietmisdreavus.net"); - let simulacrum = a("Mark Rousskov", "mark.simulacrum@gmail.com"); - let sophiajt = a("Sophia June Turner", "jturner@mozilla.com"); - let steveklabnik = a("Steve Klabnik", "steve@steveklabnik.com"); - let withoutboats = a("Without Boats", "boats@mozilla.com"); - let yaahc = a("Jane Lusby", "jlusby42@gmail.com"); + let mut insert = |name: &str, author: AddKind| { + match author { + AddKind::New(author) => if map.insert(name.into(), author).is_some() { + eprintln!("WARNING: Reviewer is already pulled in from rust-lang/team: {name}"); + }, + AddKind::Alias(aliased) => { + if let Some(author) = map.get(aliased).cloned() { + map.insert(name.into(), author); + } else { + eprintln!("WARNING: Trying to alias reviewer that doesn't exist: {aliased}") + } + } + } + }; + + // Additional reviewers which are not present in rust-lang/team + insert("aaronepower", a("Erin Power", "xampprocky@gmail.com")); + insert("abonander", a("Austin Bonander", "austin.bonander@gmail.com")); + insert("aleksator", a("Alex Tokarev", "aleksator@gmail.com")); + insert("alexreg", a("Alexander Regueiro", "alexreg@me.com")); + insert("anasazi", a("Eric Reed", "ecreed@cs.washington.edu")); + insert("apasel422", a("Andrew Paseltiner", "apaseltiner@gmail.com")); + insert("arthurprs", a("arthurprs", "arthurprs@gmail.com")); + insert("bblum", a("Ben Blum", "bblum@andrew.cmu.edu")); + insert("bjz", a("Brendan Zabarauskas", "bjzaba@yahoo.com.au")); + insert("bluss", a("Ulrik Sverdrup", "bluss@users.noreply.github.com")); + insert("brson", a("Brian Anderson", "andersrb@gmail.com")); + insert("bugadani", a("Dániel Buga", "bugadani@gmail.com")); + insert("c410-f3r", a("Caio", "c410.f3r@gmail.com")); + insert("catamorphism", a("Tim Chevalier", "chevalier@alum.wellesley.edu")); + insert("cdirkx", a("Christiaan Dirkx", "christiaan@dirkx.email")); + insert("chris", a("Chris Morgan", "me@chrismorgan.info")); + insert("cldfire", a("Jarek Samic", "cldfire3@gmail.com")); + insert("cmr", a("Corey Richardson", "corey@octayn.net")); + insert("collin5", a("Collins Abitekaniza", "abtcolns@gmail.com")); + insert("csmoe", a("csmoe", "csmoe@msn.com")); + insert("dingelish", a("Yu Ding", "dingelish@gmail.com")); + insert("dns2utf8", a("Stefan Schindler", "dns2utf8@estada.ch")); + insert("durka", a("Alex Durka", "web@alexburka.com")); + insert("eerden", a("Ercan Erden", "ercerden@gmail.com")); + insert("elichai", a("Elichai Turkel", "elichai.turkel@gmail.com")); + insert("euclio", a("Andy Russell", "arussell123@gmail.com")); + insert("flaper87", a("Flavio Percoco", "flaper87@gmail.com")); + insert("gereeter", a("Jonathan S", "gereeter+code@gmail.com")); + insert("gnzlbg", a("gnzlbg", "gonzalobg88@gmail.com")); + insert("graydon", a("Graydon Hoare", "graydon@pobox.com")); + insert("hanna-kruppe", a("Hanna Kruppe", "hanna.kruppe@gmail.com")); + insert("hellow554", a("Marcel Hellwig", "github@cookiesoft.de")); + insert("ilyoan", a("ILYONG CHO", "ilyoan@gmail.com")); + insert("jakub", a("Jakub Kądziołka", "kuba@kadziolka.net")); + insert("jbclements", a("John Clements", "clements@racket-lang.org")); + insert("jdm", a("Josh Matthews", "josh@joshmatthews.net")); + insert("jethrogb", a("Jethro Beekman", "jethro@fortanix.com")); + insert("jonas-schievink", a("Ghost", "ghost")); + insert("jroesch", a("Jared Roesch", "roeschinc@gmail.com")); + insert("jsgf", a("Jeremy Fitzhardinge", "jsgf@fb.com")); + insert("kballard", a("Lily Ballard", "lily@sb.org")); + insert("keeperofdakeys", a("Josh Driver", "keeperofdakeys@gmail.com")); + insert("kmcallister", a("Keegan McAllister", "mcallister.keegan@gmail.com")); + insert("kornelski", a("Kornel", "kornel@geekhood.net")); + insert("lingman", a("LingMan", "LingMan@users.noreply.github.com")); + insert("ljedrz", a("ljedrz", "ljedrz@gmail.com")); + insert("lukaramu", a("lukaramu", "lukaramu@users.noreply.github.com")); + insert("lzutao", a("Lzu Tao", "taolzu@gmail.com")); + insert("malbarbo", a("Marco A L Barbosa", "malbarbo@gmail.com")); + insert("marmeladema", a("marmeladema", "xademax@gmail.com")); + insert("mati865", a("Mateusz Mikuła", "mati865@gmail.com")); + insert("max-heller", a("max-heller", "max.a.heller@gmail.com")); + insert("metajack", a("Jack Moffitt", "jack@metajack.im")); + insert("mikerite", a("Michael Wright", "mikerite@lavabit.com")); + insert("mikeyhew", a("Michael Hewson", "michael@michaelhewson.ca")); + insert("mjbshaw", a("Michael Bradshaw", "mjbshaw@google.com")); + insert("msullivan", a("Michael J. Sullivan", "sully@msully.net")); + insert("pczarn", a("Piotr Czarnecki", "pioczarn@gmail.com")); + insert("petrhosek", a("Petr Hosek", "phosek@gmail.com")); + insert("pickfire", a("Ivan Tham", "pickfire@riseup.net")); + insert("poliorcetics", a("Alexis Bourget", "alexis.bourget@gmail.com")); + insert("raoulstrackx", a("Raoul Strackx", "raoul.strackx@fortanix.com")); + insert("rcvalle", a("Ramon de C Valle", "rcvalle@users.noreply.github.com")); + insert("retep998", a("Peter Atashian", "retep998@gmail.com")); + insert("richkadel", a("Rich Kadel", "richkadel@google.com")); + insert("sanxiyn", a("Seo Sanghyeon", "sanxiyn@gmail.com")); + insert("seanmonstar", a("Sean McArthur", "sean@seanmonstar.com")); + insert("stjepang", a("Stjepan Glavina", "stjepang@gmail.com")); + insert("susurrus", a("Bryant Mairs", "bryant@mai.rs")); + insert("swatinem", a("Arpad Borsos", "swatinem@swatinem.de")); + insert("thestinger", a("Daniel Micay", "danielmicay@gmail.com")); + insert("tlively", a("Thomas Lively", "tlively@google.com")); + insert("tromey", a("Tom Tromey", "tom@tromey.com")); + insert("vadimcn", a("Vadim Chugunov", "vadimcn@gmail.com")); + insert("willcrichton", a("Will Crichton", "wcrichto@cs.stanford.edu")); + insert("xfix", a("Konrad Borowski", "konrad@borowski.pw")); + insert("yichoi", a("Young-il Choi", "duddlf.choi@samsung.com")); + insert("y-nak", a("Yoshitomo Nakanishi", "yurayura.rounin.3@gmail.com")); + insert("yurydelendik", a("Yury Delendik", "ydelendik@mozilla.com")); + insert("z0w0", a("Zack Corr", "zack@z0w0.me")); + insert("zackmdavis", a("Zack M. Davis", "code@zackmdavis.net")); - map.insert("aaron1011", a("Aaron Hill", "aa1ronham@gmail.com")); - map.insert("aaronepower", a("Erin Power", "xampprocky@gmail.com")); - map.insert("aatch", a("James Miller", "james@aatch.net")); - map.insert("abonander", a("Austin Bonander", "austin.bonander@gmail.com")); - map.insert("achrichto", alexcrichton.clone()); - map.insert("acrichto", alexcrichton.clone()); - map.insert("adotinthevoid", a("Alona Enraght-Moony", "code@alona.page")); - map.insert("aidanhs", a("Aidan Hobson Sayers", "aidanhs@cantab.net")); - map.insert("albertlarsan68", a("Albert Larsan", "albert.larsan@gmail.com")); - map.insert("aleksator", a("Alex Tokarev", "aleksator@gmail.com")); - map.insert("alexchrichton", alexcrichton.clone()); - map.insert("alexcirchton", alexcrichton.clone()); - map.insert("alexcrhiton", alexcrichton.clone()); - map.insert("alexcrichto", alexcrichton.clone()); - map.insert("alexcrichton", alexcrichton.clone()); - map.insert("alexcricthon", alexcrichton.clone()); - map.insert("alexcricton", alexcrichton.clone()); - map.insert("alexcritchton", alexcrichton.clone()); - map.insert("alexendoo", a("Alex Macleod", "alex@macleod.io")); - map.insert("alexheretic", a("Alex Butler", "alexheretic@gmail.com")); - map.insert("alexreg", a("Alexander Regueiro", "alexreg@me.com")); - map.insert("amaneiu", amanieu.clone()); - map.insert("amanieu", amanieu.clone()); - map.insert("anasazi", a("Eric Reed", "ecreed@cs.washington.edu")); - map.insert("apasel422", a("Andrew Paseltiner", "apaseltiner@gmail.com")); - map.insert("apiraino", a("apiraino", "apiraino@users.noreply.github.com")); - map.insert("arielb1", arielb1.clone()); - map.insert("arielb", arielb1.clone()); - map.insert("arlosi", a("Arlo Siemsen", "arsiem@microsoft.com")); - map.insert("arthurprs", a("arthurprs", "arthurprs@gmail.com")); - map.insert("aturon", a("Aaron Turon", "aturon@mozilla.com")); - map.insert("b-naber", a("b-naber", "b_naber@gmx.de")); - map.insert("badboy", a("Jan-Erik Rediger", "janerik@fnordig.de")); - map.insert("bblum", a("Ben Blum", "bblum@andrew.cmu.edu")); - map.insert("blyxyas", a("blyxyas", "blyxyas@gmail.com")); - map.insert("bjorn3", a("bjorn3", "bjorn3@users.noreply.github.com")); - map.insert("bjz", a("Brendan Zabarauskas", "bjzaba@yahoo.com.au")); - map.insert("bkoropoff", a("Brian Koropoff", "bkoropoff@gmail.com")); - map.insert("bluss", a("Ulrik Sverdrup", "bluss@users.noreply.github.com")); - map.insert("brson", brson.clone()); - map.insert("bson", brson.clone()); - map.insert("bstrie", a("Ben Striegel", "ben.striegel@gmail.com")); - map.insert("bugadani", a("Dániel Buga", "bugadani@gmail.com")); - map.insert("burntsushi", a("Andrew Gallant", "jamslam@gmail.com")); - map.insert("boxyuwu", a("Boxy", "supbscripter@gmail.com")); - map.insert("c410-f3r", a("Caio", "c410.f3r@gmail.com")); - map.insert("calebcartwright", a("Caleb Cartwright", "caleb.cartwright@outlook.com")); - map.insert("camelid", a("Camelid", "camelidcamel@gmail.com")); - map.insert("camsteffen", a("Cameron Steffen", "cam.steffen94@gmail.com")); - map.insert("carllerche", a("Carl Lerche", "me@carllerche.com")); - map.insert("carols10cents", a("Carol (Nichols || Goulding)", "carol.nichols@gmail.com")); - map.insert("catamorphism", a("Tim Chevalier", "chevalier@alum.wellesley.edu")); - map.insert("cdirkx", a("Christiaan Dirkx", "christiaan@dirkx.email")); - map.insert("centril", a("Mazdak Farrokhzad", "twingoow@gmail.com")); - map.insert("centri3", a("Catherine Flores", "catherine.3.flores@gmail.com")); - map.insert("chris", a("Chris Morgan", "me@chrismorgan.info")); - map.insert("chrisdenton", a("Chris Denton", "christophersdenton@gmail.com")); - map.insert("cjgillot", a("Camille GILLOT", "gillot.camille@gmail.com")); - map.insert("cldfire", a("Jarek Samic", "cldfire3@gmail.com")); - map.insert("cmr", a("Corey Richardson", "corey@octayn.net")); - map.insert("collin5", a("Collins Abitekaniza", "abtcolns@gmail.com")); - map.insert("compiler-errors", a("Michael Goulet", "michael@errs.io")); - map.insert("craftspider", a("Rune Tynan", "runetynan@gmail.com")); - map.insert("cramert", cramertj.clone()); - map.insert("cramertj", cramertj.clone()); - map.insert("csmoe", a("csmoe", "csmoe@msn.com")); - map.insert("cuviper", a("Josh Stone", "jistone@redhat.com")); - map.insert("danielhenrymantilla", a("Daniel Henry-Mantilla", "daniel.henry.mantilla@gmail.com")); - map.insert("davidtwco", a("David Wood", "david@davidtw.co")); - map.insert("dingelish", a("Yu Ding", "dingelish@gmail.com")); - map.insert("djc", a("Dirkjan Ochtman", "dirkjan@ochtman.nl")); - map.insert("djkoloski", a("David Koloski", "djkoloski@gmail.com")); - map.insert("dns2utf8", a("Stefan Schindler", "dns2utf8@estada.ch")); - map.insert("dotdash", a("Björn Steinbrink", "bsteinbr@gmail.com")); - map.insert("dswij", a("dswij", "dswijj@gmail.com")); - map.insert("dtolnay", a("David Tolnay", "dtolnay@gmail.com")); - map.insert("durka", a("Alex Durka", "web@alexburka.com")); - map.insert("dwijnand", a("Dale Wijnand", "dale.wijnand@gmail.com")); - map.insert("dylan-dpc", a("dylan_DPC", "dylan.dpc@gmail.com")); - map.insert("ebroto", a("Eduardo Broto", "ebroto@tutanota.com")); - map.insert("ecstatic-morse", ecstaticmorse.clone()); - map.insert("ecstaticmorse", ecstaticmorse.clone()); - map.insert("eddyb", a("Eduard-Mihai Burtescu", "edy.burt@gmail.com")); - map.insert("edwin0cheng", a("Edwin Cheng", "edwin0cheng@gmail.com")); - map.insert("eerden", a("Ercan Erden", "ercerden@gmail.com")); - map.insert("eh2406", a("Eh2406", "YeomanYaacov@gmail.com")); - map.insert("eholk", a("Eric Holk", "eric@theincredibleholk.org")); - map.insert("ehuss", a("Eric Huss", "eric@huss.org")); - map.insert("elichai", a("Elichai Turkel", "elichai.turkel@gmail.com")); - map.insert("epage", a("Ed Page", "eopage@gmail.com")); - map.insert("erickt", a("Erick Tryzelaar", "erick.tryzelaar@gmail.com")); - map.insert("est31", a("est31", "MTest31@outlook.com")); - map.insert("estebank", a("Esteban Küber", "esteban@kuber.com.ar")); - map.insert("euclio", a("Andy Russell", "arussell123@gmail.com")); - map.insert("fee1-dead", a("Deadbeef", "ent3rm4n@gmail.com")); - map.insert("fitzgen", a("Nick Fitzgerald", "fitzgen@gmail.com")); - map.insert("flaper87", a("Flavio Percoco", "flaper87@gmail.com")); - map.insert("flip1995", a("flip1995", "hello@philkrones.com")); - map.insert("flodiebold", a("Florian Diebold", "flodiebold@gmail.com")); - map.insert("fmease", a("León Orell Valerian Liehr", "me@fmease.dev")); - map.insert("frewsxcv", frewsxcv.clone()); - map.insert("frewsxcvx", frewsxcv.clone()); - map.insert("frewsxcxv", frewsxcv.clone()); - map.insert("gankro", a("Alexis Beingessner", "a.beingessner@gmail.com")); - map.insert("gereeter", a("Jonathan S", "gereeter+code@gmail.com")); - map.insert("giraffate", a("Takayuki Nakata", "f.seasons017@gmail.com")); - map.insert("gnzlbg", a("gnzlbg", "gonzalobg88@gmail.com")); - map.insert("graydon", a("Graydon Hoare", "graydon@pobox.com")); - map.insert("guillaumegomez", guillaumegomez.clone()); - map.insert("guilliamegomez", guillaumegomez.clone()); - map.insert("guilliaumegomez", guillaumegomez.clone()); - map.insert("hanna-kruppe", hanna_kruppe.clone()); - map.insert("hellow554", a("Marcel Hellwig", "github@cookiesoft.de")); - map.insert("hi-rustin", a("hi-rustin", "rustin.liu@gmail.com")); - map.insert("hkalbasi", a("Hamidreza Kalbasi", "hamidrezakalbasi@protonmail.com")); - map.insert("huon", huonw.clone()); - map.insert("huonw", huonw.clone()); - map.insert("ilyoan", a("ILYONG CHO", "ilyoan@gmail.com")); - map.insert("imperio", guillaumegomez.clone()); - map.insert("jackh726", a("jackh726", "jack.huey@umassmed.edu")); - map.insert("jakobdegen", a("Jakob Degen", "jakob.e.degen@gmail.com")); - map.insert("jakub", jakub.clone()); - map.insert("jakub-", jakub.clone()); - map.insert("jamesmunns", a("James Munns", "james@onevariable.com")); - map.insert("japaric", a("Jorge Aparicio", "jorge@japaric.io")); - map.insert("jarcho", a("Jason Newcomb", "jsnewcomb@pm.me")); - map.insert("jbclements", a("John Clements", "clements@racket-lang.org")); - map.insert("jdm", a("Josh Matthews", "josh@joshmatthews.net")); - map.insert("jethrogb", a("Jethro Beekman", "jethro@fortanix.com")); - map.insert("jhpratt", a("Jacob Pratt", "jacob@jhpratt.dev")); - map.insert("jieyouxu", a("Jieyou Xu", "jieyouxu@outlook.com")); - map.insert("johntitor", a("Yuki Okushi", "huyuumi.dev@gmail.com")); - map.insert("jonas-schievink", a("Jonas Schievink", "jonasschievink@gmail.com")); - map.insert("jonathandturner", sophiajt.clone()); - map.insert("joshtriplett", a("Josh Triplett", "josh@joshtriplett.org")); - map.insert("jroesch", a("Jared Roesch", "roeschinc@gmail.com")); - map.insert("jseyfried", a("Jeffrey Seyfried", "jeffrey.seyfried@gmail.com")); - map.insert("jsgf", a("Jeremy Fitzhardinge", "jsgf@fb.com")); - map.insert("jsha", a("Jacob Hoffman-Andrews", "github@hoffman-andrews.com")); - map.insert("jyn", a("Joshua Nelson", "rust@jyn.dev")); - map.insert("jyn514", jyn514.clone()); - map.insert("jyn541", jyn514.clone()); - map.insert("kballard", a("Lily Ballard", "lily@sb.org")); - map.insert("keeperofdakeys", a("Josh Driver", "keeperofdakeys@gmail.com")); - map.insert("kennytm", a("kennytm", "kennytm@gmail.com")); - map.insert("killercup", a("Pascal Hertleif", "killercup@gmail.com")); - map.insert("kimundi", a("Marvin Löbel", "loebel.marvin@gmail.com")); - map.insert("kinnison", a("Daniel Silverstone", "dsilvers@digital-scurf.org")); - map.insert("kmcallister", a("Keegan McAllister", "mcallister.keegan@gmail.com")); - map.insert("kodraus", a("Ashley Mannix", "ashleymannix@live.com.au")); - map.insert("kornelski", a("Kornel", "kornel@geekhood.net")); - map.insert("lcnr", a("Bastian Kauschke", "bastian_kauschke@hotmail.de")); - map.insert("leseulartichaut", a("LeSeulArtichaut", "leseulartichaut@gmail.com")); - map.insert("lingman", a("LingMan", "LingMan@users.noreply.github.com")); - map.insert("ljedrz", a("ljedrz", "ljedrz@gmail.com")); - map.insert("llogiq", llogiq.clone()); - map.insert("llogic", llogiq.clone()); - map.insert("lnicola", a("Laurențiu Nicola", "lnicola@dend.ro")); - map.insert("lokathor", a("Lokathor", "zefria@gmail.com")); - map.insert("lowr", a("Ryo Yoshida", "low.ryoshida@gmail.com")); - map.insert("lqd", a("lqd", "remy.rakic+github@gmail.com")); - map.insert("lukaramu", a("lukaramu", "lukaramu@users.noreply.github.com")); - map.insert("lukaskalbertodt", a("Lukas Kalbertodt", "lukas.kalbertodt@gmail.com")); - map.insert("luqmana", a("Luqman Aden", "laden@csclub.uwaterloo.ca")); - map.insert("lzutao", a("Lzu Tao", "taolzu@gmail.com")); - map.insert("malbarbo", a("Marco A L Barbosa", "malbarbo@gmail.com")); - map.insert("manishearth", manishearth.clone()); - map.insert("manisheart", manishearth.clone()); - map.insert("mark-i-m", a("Mark Mansi", "markm@cs.wisc.edu")); - map.insert("mark-simulacrum", simulacrum.clone()); - map.insert("mark-simulacru", simulacrum.clone()); - map.insert("mark-simulcrum", simulacrum.clone()); - map.insert("marksimulacrum", simulacrum.clone()); - map.insert("marmeladema", a("marmeladema", "xademax@gmail.com")); - map.insert("mati865", a("Mateusz Mikuła", "mati865@gmail.com")); - map.insert("matklad", a("Aleksey Kladov", "aleksey.kladov@gmail.com")); - map.insert("matthewjasper", a("Matthew Jasper", "mjjasper1@gmail.com")); - map.insert("matthiaskrgr", a("Matthias Krüger", "matthias.krueger@famsik.de")); - map.insert("max-heller", a("max-heller", "max.a.heller@gmail.com")); - map.insert("mcarton", a("mcarton", "cartonmartin+git@gmail.com")); - map.insert("metajack", a("Jack Moffitt", "jack@metajack.im")); - map.insert("michaelwoerister", michaelwoerister.clone()); - map.insert("mikerite", a("Michael Wright", "mikerite@lavabit.com")); - map.insert("mikeyhew", a("Michael Hewson", "michael@michaelhewson.ca")); - map.insert("mjbshaw", a("Michael Bradshaw", "mjbshaw@google.com")); - map.insert("m-ou-se", a("Mara Bos", "m-ou.se@m-ou.se")); - map.insert("msullivan", a("Michael J. Sullivan", "sully@msully.net")); - map.insert("muscraft", a("Scott Schafer", "schaferjscott@gmail.com")); - map.insert("mw", michaelwoerister.clone()); - map.insert("nadrieril", a("Nadrieril", "nadrieril+git@gmail.com")); - map.insert("nagisa", a("Simonas Kazlauskas", "git@kazlauskas.me")); - map.insert("nbdd0121", a("Gary Guo", "gary@garyguo.net")); - map.insert("ncr", nrc.clone()); - map.insert("nellshamrell", a("Nell Shamrell-Harrington", "nellshamrell@gmail.com")); - map.insert("nemo157", a("Wim Looman", "git@nemo157.com")); - map.insert("nick29581", nrc.clone()); - map.insert("nikic", a("Nikita Popov", "nikita.ppv@gmail.com")); - map.insert("nikomatsakis", nikomatsakis.clone()); - map.insert("nilstrieb", nora.clone()); - map.insert("nmatsakis", nikomatsakis.clone()); - map.insert("nnethercote", a("Nicholas Nethercote", "nnethercote@mozilla.com")); - map.insert("notriddle", a("Michael Howell", "michael@notriddle.com")); - map.insert("noratrieb", nora.clone()); - map.insert("nrc", nrc.clone()); - map.insert("obi-obk", oli_obk.clone()); - map.insert("oli-obk", oli_obk.clone()); - map.insert("oli", oli_obk.clone()); - map.insert("ollie27", a("Oliver Middleton", "olliemail27@gmail.com")); - map.insert("ozkanonur", a("Onur Özkan", "contact@onurozkan.dev")); - map.insert("pcwalton", pcwalton.clone()); - map.insert("pczarn", a("Piotr Czarnecki", "pioczarn@gmail.com")); - map.insert("peschkaj", a("Jeremiah Peschka", "jeremiah.peschka@gmail.com")); - map.insert("petrhosek", a("Petr Hosek", "phosek@gmail.com")); - map.insert("petrochencov", petrochenkov.clone()); - map.insert("petrochenkov", petrochenkov.clone()); - map.insert("phansch", a("Philipp Hansch", "dev@phansch.net")); - map.insert("pickfire", a("Ivan Tham", "pickfire@riseup.net")); - map.insert("pierwill", a("pierwill", "rust@pierwill.com")); - map.insert("pietroalbini", a("Pietro Albini", "pietro@pietroalbini.org")); - map.insert("pnkfelix", a("Felix S Klock II", "pnkfelix@mozilla.com")); - map.insert("poliorcetics", a("Alexis Bourget", "alexis.bourget@gmail.com")); - map.insert("pwalton", pcwalton.clone()); - map.insert("quietmisdreavus", quietmisdreavus.clone()); - map.insert("quietmisdreqvus", quietmisdreavus.clone()); - map.insert("ralfjung", a("Ralf Jung", "post@ralfj.de")); - map.insert("raoulstrackx", a("Raoul Strackx", "raoul.strackx@fortanix.com")); - map.insert("rbtcollins", a("Robert Collins", "robertc@robertcollins.net")); - map.insert("rcvalle", a("Ramon de C Valle", "als")); - map.insert("retep998", a("Peter Atashian", "retep998@gmail.com")); - map.insert("richkadel", a("Rich Kadel", "richkadel@google.com")); - map.insert("rkruppe", hanna_kruppe.clone()); - map.insert("rylev", a("Ryan Levick", "me@ryanlevick.com")); - map.insert("saethlin", a("Ben Kimock", "kimockb@gmail.com")); - map.insert("sanxiyn", a("Seo Sanghyeon", "sanxiyn@gmail.com")); - map.insert("scalexm", a("scalexm", "alexandre@scalexm.fr")); - map.insert("scottmcm", a("Scott McMurray", "scottmcm@users.noreply.github.com")); - map.insert("seanmonstar", a("Sean McArthur", "sean@seanmonstar.com")); - map.insert("sfackler", a("Steven Fackler", "sfackler@gmail.com")); - map.insert("shepmaster", a("Jake Goulding", "jake.goulding@gmail.com")); - map.insert("simonsapin", a("Simon Sapin", "simon.sapin@exyr.org")); - map.insert("simulacrum", simulacrum.clone()); - map.insert("skade", a("Florian Gilcher", "florian.gilcher@asquera.de")); - map.insert("spastorino", a("Santiago Pastorino", "spastorino@gmail.com")); - map.insert("steveklabnik", steveklabnik.clone()); - map.insert("steveklanik", steveklabnik.clone()); - map.insert("steveklbanik", steveklabnik.clone()); - map.insert("stjepang", a("Stjepan Glavina", "stjepang@gmail.com")); - map.insert("stupremee", a("Justus K", "justus.k@protonmail.com")); - map.insert("sunfishcode", a("Dan Gohman", "sunfish@mozilla.com")); - map.insert("susurrus", a("Bryant Mairs", "bryant@mai.rs")); - map.insert("swatinem", a("Arpad Borsos", "swatinem@swatinem.de")); - map.insert("tako8ki", a("Takayuki Maeda", "takoyaki0316@gmail.com")); - map.insert("tgross35", a("Trevor Gross", "tmgross@umich.edu")); - map.insert("the8472", a("The8472", "git@infinite-source.de")); - map.insert("thestinger", a("Daniel Micay", "danielmicay@gmail.com")); - map.insert("thomasdezeeuw", a("Thomas de Zeeu", "thomasdezeeuw@gmail.com")); - map.insert("thomcc", a("Thom Chiovoloni", "chiovolonit@gmail.com")); - map.insert("timdiekmann", a("Tim Diekmann", "tim.diekmann@3dvision.de")); - map.insert("timnn", a("Tim Neumann", "timnn@google.com")); - map.insert("tlively", a("Thomas Lively", "tlively@google.com")); - map.insert("tmandry", a("Tyler Mandry", "tmandry@gmail.com")); - map.insert("tmiasko", a("Tomasz Miąsko", "tomasz.miasko@gmail.com")); - map.insert("topecongiro", a("topecongiro", "seuchida@gmail.com")); - map.insert("tromey", a("Tom Tromey", "tom@tromey.com")); - map.insert("urgau", a("Urgau", "urgau@numericable.fr")); - map.insert("vadimcn", a("Vadim Chugunov", "vadimcn@gmail.com")); - map.insert("varkor", a("varkor", "github@varkor.com")); - map.insert("veykril", a("Lukas Wirth", "lukastw97@gmail.com")); - map.insert("wafflelapkin", a("Waffle Maybe", "waffle.lapkin@gmail.com")); - map.insert("weihanglo", a("Weihang Lo", "me@weihanglo.tw")); - map.insert("wesleywiser", a("Wesley Wiser", "wwiser@gmail.com")); - map.insert("willcrichton", a("Will Crichton", "wcrichto@cs.stanford.edu")); - map.insert("withouboats", withoutboats.clone()); - map.insert("withoutboats", withoutboats.clone()); - map.insert("wodann", a("Wodann", "wodannson@gmail.com")); - map.insert("workingjubilee", a("Jubilee Young", "workingjubilee@gmail.com")); - map.insert("wycats", a("Yehuda Katz", "wycats@gmail.com")); - map.insert("xampprocky", a("Erin Power", "xampprocky@gmail.com")); - map.insert("xanewok", a("Igor Matuszewski", "Xanewok@gmail.com")); - map.insert("xfix", a("Konrad Borowski", "konrad@borowski.pw")); - map.insert("xfrednet", a("xFrednet", "xFrednet@gmail.com")); - map.insert("yaahallo", yaahc.clone()); - map.insert("yaahc", yaahc.clone()); - map.insert("yichoi", a("Young-il Choi", "duddlf.choi@samsung.com")); - map.insert("y-nak", a("Yoshitomo Nakanishi", "yurayura.rounin.3@gmail.com")); - map.insert("yurydelendik", a("Yury Delendik", "ydelendik@mozilla.com")); - map.insert("z0w0", a("Zack Corr", "zack@z0w0.me")); - map.insert("zackmdavis", a("Zack M. Davis", "code@zackmdavis.net")); - map.insert("zoxc", a("John Kåre Alsaker", "john.kare.alsaker@gmail.com")); + // Aliases of r= reviewers to their current GitHub names. + // Includes misspellings and changed names. + insert("achrichto", alias("alexcrichton")); + insert("acrichto", alias("alexcrichton")); + insert("alexchrichton", alias("alexcrichton")); + insert("alexcirchton", alias("alexcrichton")); + insert("alexcrhiton", alias("alexcrichton")); + insert("alexcrichto", alias("alexcrichton")); + insert("alexcricthon", alias("alexcrichton")); + insert("alexcricton", alias("alexcrichton")); + insert("alexcritchton", alias("alexcrichton")); + insert("amaneiu", alias("amanieu")); + insert("arielb", alias("arielb1")); + insert("bson", alias("brson")); + insert("cgillot", alias("cjgillot")); + insert("compiler=errors", alias("compiler-errors")); + insert("cramert", alias("cramertj")); + insert("cjgillo", alias("cjgillot")); + insert("cupiver", alias("cuviper")); + insert("ecstaticmorse", alias("ecstatic-morse")); + insert("ekuber", alias("estebank")); + insert("frewsxcvx", alias("frewsxcv")); + insert("frewsxcxv", alias("frewsxcv")); + insert("gankro", alias("gankra")); + insert("guilliamegomez", alias("guillaumegomez")); + insert("guilliaumegomez", alias("guillaumegomez")); + insert("guillaumegomezp", alias("guillaumegomez")); + insert("hi-rustin", alias("rustin170506")); + insert("huon", alias("huonw")); + insert("imperio", alias("guillaumegomez")); + insert("icnr", alias("lcnr")); + insert("jackh276", alias("jackh726")); + insert("jakub-", alias("jakub")); + insert("jonathandturner", alias("sophiajt")); + insert("Jubilee", alias("workingjubilee")); + insert("jyn541", alias("jyn514")); + insert("jyn", alias("jyn514")); + insert("llogic", alias("llogiq")); + insert("manisheart", alias("manishearth")); + insert("mark-simulacru", alias("mark-simulacrum")); + insert("mark-simulcrum", alias("mark-simulacrum")); + insert("marksimulacrum", alias("mark-simulacrum")); + insert("mw", alias("michaelwoerister")); + insert("ncr", alias("nrc")); + insert("nick29581", alias("nrc")); + insert("nilstrieb", alias("noratrieb")); + insert("nmatsakis", alias("nikomatsakis")); + insert("obi-obk", alias("oli-obk")); + insert("oli", alias("oli-obk")); + insert("oli-bok", alias("oli-obk")); + insert("oli-obj", alias("oli-obk")); + insert("ozkanonur", alias("onur-ozkan")); + insert("petrochencov", alias("petrochenkov")); + insert("pwalton", alias("pcwalton")); + insert("quietmisdreqvus", alias("quietmisdreavus")); + insert("rkruppe", alias("hanna-kruppe")); + insert("simulacrum", alias("mark-simulacrum")); + insert("steveklanik", alias("steveklabnik")); + insert("steveklbanik", alias("steveklabnik")); + insert("wesleyweiser", alias("wesleywiser")); + insert("withouboats", alias("withoutboats")); + insert("yaahallo", alias("yaahc")); Ok(Reviewers { reviewers: map }) } @@ -376,3 +237,23 @@ impl fmt::Display for UnknownReviewer { write!(f, "unknown reviewer") } } + +#[derive(Debug, Deserialize)] + +pub struct TeamPeople { + pub people: HashMap, +} + +#[derive(Debug, Deserialize)] +pub struct TeamPerson { + pub name: String, + pub email: Option, +} + +pub fn get_team_people() -> Result> { + Ok( + ureq::get("https://team-api.infra.rust-lang.org/v1/people.json") + .call()? + .into_json::()?, + ) +} diff --git a/src/site.rs b/src/site.rs index 47649d34..8262a7bd 100644 --- a/src/site.rs +++ b/src/site.rs @@ -3,6 +3,7 @@ use handlebars::Handlebars; use std::collections::BTreeMap; use std::fs; use std::path::Path; +use unicase::UniCase; pub fn render( by_version: BTreeMap, @@ -142,12 +143,22 @@ struct Entry { } fn author_map_to_scores(map: &AuthorMap) -> Vec { + let debug_emails = std::env::var("DEBUG_EMAILS").is_ok_and(|value| value == "1"); + let mut scores = map .iter() - .map(|(author, commits)| Entry { - rank: 0, - author: author.name.clone(), - commits: commits, + .map(|(author, commits)| { + let name = UniCase::into_inner(author.name.clone()); + + Entry { + rank: 0, + author: if debug_emails { + format!("{name} ({})", UniCase::into_inner(author.email.clone())) + } else { + name + }, + commits, + } }) .collect::>(); scores.sort_by_key(|e| (std::cmp::Reverse(e.commits), e.author.clone()));