diff --git a/.gitignore b/.gitignore index ea8c4bf..3604ccd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,9 @@ /target + +# AOC Sync generated files +/data/ +/output/ +/repos/ +*.db +*.db-journal +__pycache__ diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index e53504c..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,3028 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array", -] - -[[package]] -name = "aead" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.4.3", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" -dependencies = [ - "aead 0.3.2", - "aes 0.6.0", - "cipher 0.2.5", - "ctr 0.6.0", - "ghash 0.3.1", - "subtle", -] - -[[package]] -name = "aes-gcm" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" -dependencies = [ - "aead 0.5.1", - "aes 0.8.2", - "cipher 0.4.3", - "ctr 0.9.2", - "ghash 0.5.0", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" - -[[package]] -name = "aocsync" -version = "0.1.0" -dependencies = [ - "anyhow", - "glog", - "log 0.4.17", - "rocket 0.5.0-rc.2", - "rocket_anyhow", - "rocket_dyn_templates", - "serde", - "thiserror", -] - -[[package]] -name = "async-stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" -dependencies = [ - "async-stream-impl", - "futures-core", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "async-trait" -version = "0.1.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6e93155431f3931513b243d371981bb2770112b370c82745a1d19d2f99364" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "atomic" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -dependencies = [ - "byteorder", - "safemem", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "bimap" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0455254eb5c6964c4545d8bac815e1a1be4f3afe0ae695ea539c12d728d44b" - -[[package]] -name = "binascii" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "memchr", -] - -[[package]] -name = "bumpalo" -version = "3.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" - -[[package]] -name = "cc" -version = "1.0.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-integer", - "num-traits", - "time 0.1.45", - "wasm-bindgen", - "winapi 0.3.9", -] - -[[package]] -name = "chrono-tz" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "const-sha1" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d" - -[[package]] -name = "cookie" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2018768ed1d848cc4d347d551546474025ba820e5db70e4c9aaa349f678bd7" -dependencies = [ - "aes-gcm 0.8.0", - "base64 0.13.1", - "hkdf 0.10.0", - "hmac 0.10.1", - "percent-encoding 2.2.0", - "rand", - "sha2 0.9.9", - "time 0.1.45", -] - -[[package]] -name = "cookie" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "344adc371239ef32293cb1c4fe519592fcf21206c79c02854320afcdf3ab4917" -dependencies = [ - "aes-gcm 0.10.1", - "base64 0.13.1", - "hkdf 0.12.3", - "hmac 0.12.1", - "percent-encoding 2.2.0", - "rand", - "sha2 0.10.6", - "subtle", - "time 0.3.17", - "version_check 0.9.4", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "cpufeatures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" -dependencies = [ - "libc", -] - -[[package]] -name = "cpuid-bool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" - -[[package]] -name = "crossbeam-utils" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher 0.2.5", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher 0.4.3", -] - -[[package]] -name = "cxx" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf07d07d6531bfcdbe9b8b739b104610c6508dcc4d63b410585faf338241daf" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2eb5b96ecdc99f72657332953d4d9c50135af1bac34277801cc3937906ebd39" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2 1.0.47", - "quote 1.0.21", - "scratch", - "syn 1.0.105", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac040a39517fd1674e0f32177648334b0f4074625b5588a64519804ba0553b12" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1362b0ddcfc4eb0a1f57b68bd77dd99f0e826958a96abd0ae9bd092e114ffed6" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "deunicode" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" - -[[package]] -name = "devise" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd716c4a507adc5a2aa7c2a372d06c7497727e0892b243d3036bc7478a13e526" -dependencies = [ - "devise_codegen 0.2.1", - "devise_core 0.2.1", -] - -[[package]] -name = "devise" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" -dependencies = [ - "devise_codegen 0.3.1", - "devise_core 0.3.1", -] - -[[package]] -name = "devise_codegen" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea7b8290d118127c08e3669da20b331bed56b09f20be5945b7da6c116d8fab53" -dependencies = [ - "devise_core 0.2.1", - "quote 0.6.13", -] - -[[package]] -name = "devise_codegen" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" -dependencies = [ - "devise_core 0.3.1", - "quote 1.0.21", -] - -[[package]] -name = "devise_core" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1053e9d5d5aade9bcedb5ab53b78df2b56ff9408a3138ce77eaaef87f932373" -dependencies = [ - "bitflags", - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "devise_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" -dependencies = [ - "bitflags", - "proc-macro2 1.0.47", - "proc-macro2-diagnostics", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer 0.10.3", - "crypto-common", - "subtle", -] - -[[package]] -name = "either" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" - -[[package]] -name = "encoding_rs" -version = "0.8.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "fastrand" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" -dependencies = [ - "instant", -] - -[[package]] -name = "figment" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e56602b469b2201400dec66a66aec5a9b8761ee97cd1b8c96ab2483fcc16cc9" -dependencies = [ - "atomic", - "pear 0.2.3", - "serde", - "toml 0.5.9", - "uncased", - "version_check 0.9.4", -] - -[[package]] -name = "filetime" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "windows-sys", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "fsevent" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" -dependencies = [ - "bitflags", - "fsevent-sys", -] - -[[package]] -name = "fsevent-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" -dependencies = [ - "libc", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - -[[package]] -name = "futures" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" - -[[package]] -name = "futures-io" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" - -[[package]] -name = "futures-sink" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" - -[[package]] -name = "futures-task" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" - -[[package]] -name = "futures-util" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generator" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7" -dependencies = [ - "cc", - "libc", - "log 0.4.17", - "rustversion", - "windows 0.32.0", -] - -[[package]] -name = "generic-array" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" -dependencies = [ - "typenum", - "version_check 0.9.4", -] - -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" -dependencies = [ - "opaque-debug", - "polyval 0.4.5", -] - -[[package]] -name = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug", - "polyval 0.6.0", -] - -[[package]] -name = "gimli" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "globset" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log 0.4.17", - "regex", -] - -[[package]] -name = "globwalk" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags", - "ignore", - "walkdir", -] - -[[package]] -name = "glog" -version = "0.1.0" -source = "git+https://github.com/wathiede/glog-rs#e614c1e7157189701dc21b573ec17d2a29529cfc" -dependencies = [ - "backtrace", - "bimap", - "chrono", - "gethostname", - "if_empty", - "log 0.4.17", - "nix", - "termcolor", - "thread_local", - "whoami", - "windows 0.11.0", -] - -[[package]] -name = "h2" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hkdf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" -dependencies = [ - "digest 0.9.0", - "hmac 0.10.1", -] - -[[package]] -name = "hkdf" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "http" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humansize" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" - -[[package]] -name = "hyper" -version = "0.10.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -dependencies = [ - "base64 0.9.3", - "httparse", - "language-tags", - "log 0.3.9", - "mime 0.2.6", - "num_cpus", - "time 0.1.45", - "traitobject", - "typeable", - "unicase", - "url", -] - -[[package]] -name = "hyper" -version = "0.14.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "winapi 0.3.9", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" -dependencies = [ - "cxx", - "cxx-build", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "if_empty" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "472c8093cbd4f6e9e42238219c630735871563d23b2a830f5eaa5424a0f298ce" - -[[package]] -name = "ignore" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" -dependencies = [ - "crossbeam-utils", - "globset", - "lazy_static", - "log 0.4.17", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", -] - -[[package]] -name = "indexmap" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" -dependencies = [ - "autocfg", - "hashbrown", - "serde", -] - -[[package]] -name = "inlinable_string" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" - -[[package]] -name = "inotify" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" -dependencies = [ - "bitflags", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - -[[package]] -name = "itoa" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" - -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "language-tags" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.138" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" - -[[package]] -name = "link-cplusplus" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" -dependencies = [ - "cc", -] - -[[package]] -name = "lock_api" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -dependencies = [ - "log 0.4.17", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "loom" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if 1.0.0", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -dependencies = [ - "log 0.3.9", -] - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "miniz_oxide" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log 0.4.17", - "miow", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" -dependencies = [ - "libc", - "log 0.4.17", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log 0.4.17", - "mio 0.6.23", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "multer" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed4198ce7a4cbd2a57af78d28c6fbb57d81ac5f1d6ad79ac6c5587419cbdf22" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http", - "httparse", - "log 0.4.17", - "memchr", - "mime 0.3.16", - "spin", - "tokio", - "tokio-util", - "version_check 0.9.4", -] - -[[package]] -name = "net2" -version = "0.2.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "nix" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d9f3521ea8e0641a153b3cddaf008dcbf26acd4ed739a2517295e0760d12c7" -dependencies = [ - "bitflags", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - -[[package]] -name = "normpath" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04aaf5e9cb0fbf883cc0423159eacdf96a9878022084b35c462c428cab73bcaf" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "notify" -version = "4.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" -dependencies = [ - "bitflags", - "filetime", - "fsevent", - "fsevent-sys", - "inotify", - "libc", - "mio 0.6.23", - "mio-extras", - "walkdir", - "winapi 0.3.9", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi 0.3.9", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "smallvec", - "windows-sys", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" -dependencies = [ - "regex", -] - -[[package]] -name = "pear" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32dfa7458144c6af7f9ce6a137ef975466aa68ffa44d4d816ee5934018ba960a" -dependencies = [ - "pear_codegen 0.1.5", -] - -[[package]] -name = "pear" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" -dependencies = [ - "inlinable_string", - "pear_codegen 0.2.3", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0288ba5d581afbc93e2bbd931c1013584c15ecf46b1cdb927edc7abddbc8ca6" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", - "version_check 0.9.4", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" -dependencies = [ - "proc-macro2 1.0.47", - "proc-macro2-diagnostics", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pest" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8bed3549e0f9b0a2a78bf7c0018237a2cdf085eecbbc048e52612438e4e9d0" -dependencies = [ - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc078600d06ff90d4ed238f0119d84ab5d43dbaad278b0e33a8820293b32344" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a1af60b1c4148bb269006a750cff8e2ea36aff34d2d96cf7be0b14d1bed23c" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "pest_meta" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec8605d59fc2ae0c6c1aefc0c7c7a9769732017c0ce07f7a9cfffa7b4404f20" -dependencies = [ - "once_cell", - "pest", - "sha1", -] - -[[package]] -name = "phf" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" -dependencies = [ - "siphasher", - "uncased", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "polyval" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug", - "universal-hash 0.4.1", -] - -[[package]] -name = "polyval" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug", - "universal-hash 0.5.0", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", - "version_check 0.9.4", - "yansi", -] - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" -dependencies = [ - "proc-macro2 1.0.47", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "ref-cast" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b15debb4f9d60d767cd8ca9ef7abb2452922f3214671ff052defc7f3502c44" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfa8511e9e94fd3de6585a3d3cd00e01ed556dc9814829280af0e8dc72a8f36" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "regex" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "rocket" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b9d9dc08c5dcc1d8126a9dd615545e6a358f8c13c883c8dfed8c0376fa355e" -dependencies = [ - "atty", - "base64 0.13.1", - "log 0.4.17", - "memchr", - "num_cpus", - "pear 0.1.5", - "rocket_codegen 0.4.11", - "rocket_http 0.4.11", - "state 0.4.2", - "time 0.1.45", - "toml 0.4.10", - "version_check 0.9.4", - "yansi", -] - -[[package]] -name = "rocket" -version = "0.5.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ead083fce4a405feb349cf09abdf64471c6077f14e0ce59364aa90d4b99317" -dependencies = [ - "async-stream", - "async-trait", - "atomic", - "atty", - "binascii", - "bytes", - "either", - "figment", - "futures", - "indexmap", - "log 0.4.17", - "memchr", - "multer", - "num_cpus", - "parking_lot", - "pin-project-lite", - "rand", - "ref-cast", - "rocket_codegen 0.5.0-rc.2", - "rocket_http 0.5.0-rc.2", - "serde", - "state 0.5.3", - "tempfile", - "time 0.3.17", - "tokio", - "tokio-stream", - "tokio-util", - "ubyte", - "version_check 0.9.4", - "yansi", -] - -[[package]] -name = "rocket_anyhow" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5708a0d5798ec1036e34c7d4cc55269767dca1e77ac346b57d802ba09dde664" -dependencies = [ - "anyhow", - "rocket 0.4.11", -] - -[[package]] -name = "rocket_codegen" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2810037b5820098af97bd4fdd309e76a8101ceb178147de775c835a2537284fe" -dependencies = [ - "devise 0.2.1", - "glob", - "indexmap", - "quote 0.6.13", - "rocket_http 0.4.11", - "version_check 0.9.4", - "yansi", -] - -[[package]] -name = "rocket_codegen" -version = "0.5.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6aeb6bb9c61e9cd2c00d70ea267bf36f76a4cc615e5908b349c2f9d93999b47" -dependencies = [ - "devise 0.3.1", - "glob", - "indexmap", - "proc-macro2 1.0.47", - "quote 1.0.21", - "rocket_http 0.5.0-rc.2", - "syn 1.0.105", - "unicode-xid 0.2.4", -] - -[[package]] -name = "rocket_dyn_templates" -version = "0.1.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab13df598440527c200f46fb944dc55d8d67a1818b617eb5a3981dcd8b63fd2" -dependencies = [ - "glob", - "normpath", - "notify", - "rocket 0.5.0-rc.2", - "tera", -] - -[[package]] -name = "rocket_http" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf9cbd128e1f321a2d0bebd2b7cf0aafd89ca43edf69e49b56a5c46e48eb19f" -dependencies = [ - "cookie 0.11.5", - "hyper 0.10.16", - "indexmap", - "pear 0.1.5", - "percent-encoding 1.0.1", - "smallvec", - "state 0.4.2", - "time 0.1.45", - "unicode-xid 0.1.0", -] - -[[package]] -name = "rocket_http" -version = "0.5.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ded65d127954de3c12471630bf4b81a2792f065984461e65b91d0fdaafc17a2" -dependencies = [ - "cookie 0.16.1", - "either", - "futures", - "http", - "hyper 0.14.23", - "indexmap", - "log 0.4.17", - "memchr", - "pear 0.2.3", - "percent-encoding 2.2.0", - "pin-project-lite", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state 0.5.3", - "time 0.3.17", - "tokio", - "uncased", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustversion" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" - -[[package]] -name = "ryu" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" - -[[package]] -name = "serde" -version = "1.0.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "serde_json" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" -dependencies = [ - "libc", -] - -[[package]] -name = "siphasher" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" - -[[package]] -name = "slab" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slug" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" -dependencies = [ - "deunicode", -] - -[[package]] -name = "smallvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" - -[[package]] -name = "socket2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "spin" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" - -[[package]] -name = "stable-pattern" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] - -[[package]] -name = "state" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3015a7d0a5fd5105c91c3710d42f9ccf0abfb287d62206484dcc67f9569a6483" - -[[package]] -name = "state" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" -dependencies = [ - "loom", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", -] - -[[package]] -name = "tera" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df578c295f9ec044ff1c829daf31bb7581d5b3c2a7a3d87419afe1f2531438c" -dependencies = [ - "chrono", - "chrono-tz", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding 2.2.0", - "pest", - "pest_derive", - "rand", - "regex", - "serde", - "serde_json", - "slug", - "unic-segment", -] - -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "thread_local" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" -dependencies = [ - "once_cell", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - -[[package]] -name = "time" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" -dependencies = [ - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" - -[[package]] -name = "time-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio 0.8.5", - "num_cpus", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "winapi 0.3.9", -] - -[[package]] -name = "tokio-macros" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "tokio-stream" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if 1.0.0", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", -] - -[[package]] -name = "tracing-core" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log 0.4.17", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" - -[[package]] -name = "typenum" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" - -[[package]] -name = "ubyte" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6" -dependencies = [ - "serde", -] - -[[package]] -name = "ucd-trie" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" - -[[package]] -name = "uncased" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" -dependencies = [ - "serde", - "version_check 0.9.4", -] - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -dependencies = [ - "version_check 0.1.5", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" - -[[package]] -name = "unicode-ident" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "universal-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi 0.3.9", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log 0.4.17", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log 0.4.17", - "once_cell", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote 1.0.21", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.105", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[package]] -name = "web-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "whoami" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6631b6a2fd59b1841b622e8f1a7ad241ef0a46f2d580464ce8140ac94cbd571" -dependencies = [ - "bumpalo", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b270ca3fa1282aa091f122551348f8186f07888dffdfe64df17206ad3b56d0" -dependencies = [ - "const-sha1", - "windows_gen", - "windows_macros", -] - -[[package]] -name = "windows" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" -dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" - -[[package]] -name = "windows_gen" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bd40154eb69ba3c80f11752494a2a34d1b448b06b80449238edfbd00ec7eef" - -[[package]] -name = "windows_i686_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" - -[[package]] -name = "windows_i686_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" - -[[package]] -name = "windows_macros" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae6942e04aa5792bbf3b3cf5ded1b7590a7ffd76d53ea179210b87911b6587f" -dependencies = [ - "syn 1.0.105", - "windows_gen", -] - -[[package]] -name = "windows_x86_64_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 6bb4f15..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "aocsync" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -rocket = "0.5.0-rc.2" -glog = {version = "0.1.0", git = "https://github.com/wathiede/glog-rs"} -log = "0.4.17" -serde = { version = "1.0.148", features = ["serde_derive"] } -rocket_anyhow = "0.1.1" -thiserror = "1.0.37" -rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["tera"] } -anyhow = "1.0.66" diff --git a/README.md b/README.md index ed88278..c8cad1b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,155 @@ -# `git-sync` webhook +# AOC Sync -``` -POST /-/reload?repo=akramer HTTP/1.1 -Host: aocperf.z.xinu.tv -X-Real-IP: 172.17.0.7 -X-Forwarded-For: 172.17.0.7 -X-Forwarded-Proto: https -X-Forwarded-Host: aocperf.z.xinu.tv -X-Forwarded-Server: aocperf.z.xinu.tv -Connection: close -Content-Length: 0 -gitsync-hash: 6f498804bf7203ab69fa7aa8e9f441d20d07ac67 -accept-encoding: gzip -user-agent: Go-http-client/2.0 +A Python script that polls multiple git repositories containing Advent of Code implementations written in Rust using `cargo-aoc` format. It automatically updates repositories when changes are detected, runs benchmarks, and generates a beautiful HTML comparison page showing performance metrics across users, years, and days. + +## Features + +- **Automatic Git Polling**: Monitors multiple repositories for changes +- **Flexible Repository Structure**: Supports both single-repo (all years) and multi-repo (one per year) configurations +- **Automatic Benchmarking**: Runs `cargo aoc bench` for all implemented days +- **Performance Parsing**: Extracts timing data from cargo-aoc output +- **Data Storage**: SQLite database for historical performance data +- **HTML Reports**: Beautiful, responsive HTML comparison pages +- **Gap Handling**: Gracefully handles missing years, days, and parts +- **Configurable Comparisons**: Filter by specific years and days + +## Requirements + +- Python 3.7+ +- Git +- Rust and Cargo +- `cargo-aoc` installed (install with `cargo install cargo-aoc`) + +## Installation + +1. Clone this repository: +```bash +git clone +cd aocsync ``` +2. Install Python dependencies: +```bash +pip install -r requirements.txt +``` + +3. Ensure `cargo-aoc` is installed: +```bash +cargo install cargo-aoc +``` + +## Configuration + +Edit `config.yaml` to configure repositories to monitor: + +```yaml +# Poll interval in seconds +poll_interval: 300 + +# Output directory for generated HTML +output_dir: "output" + +# Data storage directory +data_dir: "data" + +# Repositories to monitor +repositories: + # Single repository with all years + - name: "user1" + url: "https://github.com/user1/advent-of-code" + type: "single" + local_path: "repos/user1" + + # Multiple repositories, one per year + - name: "user2" + type: "multi-year" + years: + - year: 2023 + url: "https://github.com/user2/aoc-2023" + local_path: "repos/user2-2023" + - year: 2024 + url: "https://github.com/user2/aoc-2024" + local_path: "repos/user2-2024" + +# Optional: Filter specific years to compare +compare_years: [2023, 2024] + +# Optional: Filter specific days to compare +# compare_days: [1, 2, 3, 4, 5] +``` + +## Usage + +### Run Once + +To sync repositories and generate a report once: + +```bash +python aocsync.py --once +``` + +### Continuous Polling + +To continuously poll repositories (default): + +```bash +python aocsync.py +``` + +Or with a custom config file: + +```bash +python aocsync.py --config myconfig.yaml +``` + +## Output + +- **Database**: Performance data is stored in `data/results.db` (SQLite) +- **HTML Report**: Generated at `output/index.html` (configurable via `output_dir`) + +The HTML report includes: +- Performance comparison tables for each year/day/part +- Visual highlighting of fastest and slowest implementations +- Relative speed comparisons (X times faster/slower) +- Responsive design for viewing on any device + +## How It Works + +1. **Git Polling**: Checks each configured repository for changes by comparing local and remote commits +2. **Repository Update**: Clones new repositories or updates existing ones when changes are detected +3. **Day Detection**: Automatically finds implemented days by scanning for `day*.rs` files and Cargo.toml entries +4. **Benchmarking**: Runs `cargo aoc bench --day X` for each implemented day +5. **Parsing**: Extracts timing data from cargo-aoc output (handles nanoseconds, microseconds, milliseconds) +6. **Storage**: Stores results in SQLite database with timestamps +7. **Report Generation**: Generates HTML comparison page showing latest results + +## Repository Structure Detection + +The script automatically detects: +- **Year**: From repository path, name, or Cargo.toml +- **Days**: From `src/bin/day*.rs`, `src/day*.rs`, or Cargo.toml entries +- **Parts**: From cargo-aoc benchmark output (Part 1, Part 2) + +## Troubleshooting + +### Cargo-aoc not found +Ensure `cargo-aoc` is installed and in your PATH: +```bash +cargo install cargo-aoc +``` + +### Git authentication issues +For private repositories, ensure your git credentials are configured or use SSH URLs. + +### Benchmark timeouts +If benchmarks take too long, the script has a 5-minute timeout per day. Adjust in the code if needed. + +### Missing performance data +If some users/days/parts don't show up: +- Check that `cargo aoc bench` runs successfully in the repository +- Verify the repository structure matches cargo-aoc conventions +- Check logs for parsing errors + +## License + +[Your License Here] diff --git a/Rocket.toml b/Rocket.toml deleted file mode 100644 index 829a0c6..0000000 --- a/Rocket.toml +++ /dev/null @@ -1,14 +0,0 @@ -[release] -address = "0.0.0.0" -port = 9346 - -[debug] -address = "0.0.0.0" -port = 9346 -# Uncomment to make it production like. -#log_level = "critical" - -build_root = "/tmp/aocsync/" -www_root = "/tmp/aocsync-serve/" - -repos = { akramer = { url = "https://github.com/akramer/aoc2022", name = "aoc2022", branch = "main" }, ggriffiniii = { url = "https://github.com/ggriffiniii/aoc2022", name = "aoc2022", branch = "main" }, wathiede = { url = "https://github.com/wathiede/advent", name = "advent/2022", branch = "master", first_commit = "bc3feabb4669b7ad8167398a4d37eefe68ea0565", subdir = "2022" } } diff --git a/aocsync.py b/aocsync.py new file mode 100755 index 0000000..2a98710 --- /dev/null +++ b/aocsync.py @@ -0,0 +1,1007 @@ +#!/usr/bin/env python3 +""" +AOC Sync - Polls git repositories containing Advent of Code implementations +and generates performance comparison reports. +""" + +import os +import sys +import yaml +import json +import sqlite3 +import subprocess +import shutil +import re +import time +import logging +from pathlib import Path +from datetime import datetime +from typing import Dict, List, Optional, Tuple +from dataclasses import dataclass, asdict +from collections import defaultdict + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + + +@dataclass +class PerformanceResult: + """Stores performance data for a single part of a day""" + user: str + year: int + day: int + part: int + time_ns: int # Time in nanoseconds + timestamp: str + + +class Config: + """Configuration manager""" + + def __init__(self, config_path: str = "config.yaml"): + self.config_path = config_path + self.config = self._load_config() + + def _load_config(self) -> dict: + """Load configuration from YAML file""" + if not os.path.exists(self.config_path): + logger.error(f"Config file not found: {self.config_path}") + sys.exit(1) + + with open(self.config_path, 'r') as f: + return yaml.safe_load(f) + + @property + def poll_interval(self) -> int: + return self.config.get('poll_interval', 300) + + @property + def output_dir(self) -> str: + return self.config.get('output_dir', 'output') + + @property + def data_dir(self) -> str: + return self.config.get('data_dir', 'data') + + @property + def repositories(self) -> List[dict]: + return self.config.get('repositories', []) + + @property + def compare_years(self) -> Optional[List[int]]: + return self.config.get('compare_years') + + @property + def compare_days(self) -> Optional[List[int]]: + return self.config.get('compare_days') + + +class Database: + """SQLite database for storing performance results""" + + def __init__(self, db_path: str): + self.db_path = db_path + os.makedirs(os.path.dirname(db_path) if os.path.dirname(db_path) else '.', exist_ok=True) + self._init_db() + + def _init_db(self): + """Initialize database schema""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + CREATE TABLE IF NOT EXISTS results ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user TEXT NOT NULL, + year INTEGER NOT NULL, + day INTEGER NOT NULL, + part INTEGER NOT NULL, + time_ns INTEGER NOT NULL, + timestamp TEXT NOT NULL, + UNIQUE(user, year, day, part, timestamp) + ) + ''') + + cursor.execute(''' + CREATE INDEX IF NOT EXISTS idx_user_year_day_part + ON results(user, year, day, part) + ''') + + conn.commit() + conn.close() + + def insert_result(self, result: PerformanceResult): + """Insert a performance result""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + try: + cursor.execute(''' + INSERT OR REPLACE INTO results + (user, year, day, part, time_ns, timestamp) + VALUES (?, ?, ?, ?, ?, ?) + ''', (result.user, result.year, result.day, result.part, + result.time_ns, result.timestamp)) + conn.commit() + except sqlite3.IntegrityError: + # Already exists, skip + pass + finally: + conn.close() + + def get_latest_results(self, years: Optional[List[int]] = None, + days: Optional[List[int]] = None) -> List[Dict]: + """Get latest performance results for each user/day/part""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + query = ''' + SELECT user, year, day, part, time_ns, timestamp + FROM results r1 + WHERE timestamp = ( + SELECT MAX(timestamp) + FROM results r2 + WHERE r2.user = r1.user + AND r2.year = r1.year + AND r2.day = r1.day + AND r2.part = r1.part + ) + ''' + + conditions = [] + params = [] + + if years: + placeholders = ','.join('?' * len(years)) + conditions.append(f'year IN ({placeholders})') + params.extend(years) + + if days: + placeholders = ','.join('?' * len(days)) + conditions.append(f'day IN ({placeholders})') + params.extend(days) + + if conditions: + query += ' AND ' + ' AND '.join(conditions) + + query += ' ORDER BY year, day, part, user' + + cursor.execute(query, params) + rows = cursor.fetchall() + conn.close() + + return [ + { + 'user': row[0], + 'year': row[1], + 'day': row[2], + 'part': row[3], + 'time_ns': row[4], + 'timestamp': row[5] + } + for row in rows + ] + + def get_all_users(self) -> List[str]: + """Get list of all users""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + cursor.execute('SELECT DISTINCT user FROM results') + users = [row[0] for row in cursor.fetchall()] + conn.close() + return users + + def get_all_years(self) -> List[int]: + """Get list of all years""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + cursor.execute('SELECT DISTINCT year FROM results ORDER BY year') + years = [row[0] for row in cursor.fetchall()] + conn.close() + return years + + +class GitManager: + """Manages git repository operations""" + + @staticmethod + def clone_or_update_repo(url: str, local_path: str) -> bool: + """Clone repository if it doesn't exist, or update if it does""" + local_path = Path(local_path) + + if local_path.exists() and (local_path / '.git').exists(): + # Update existing repository + logger.info(f"Updating repository: {local_path}") + try: + subprocess.run( + ['git', 'fetch', 'origin'], + cwd=local_path, + check=True, + capture_output=True + ) + subprocess.run( + ['git', 'reset', '--hard', 'origin/master'], + cwd=local_path, + check=True, + capture_output=True + ) + # Try main branch if master fails + except subprocess.CalledProcessError: + try: + subprocess.run( + ['git', 'reset', '--hard', 'origin/main'], + cwd=local_path, + check=True, + capture_output=True + ) + except subprocess.CalledProcessError as e: + logger.error(f"Failed to update {local_path}: {e}") + return False + return True + else: + # Clone new repository + logger.info(f"Cloning repository: {url} to {local_path}") + local_path.parent.mkdir(parents=True, exist_ok=True) + try: + subprocess.run( + ['git', 'clone', url, str(local_path)], + check=True, + capture_output=True + ) + return True + except subprocess.CalledProcessError as e: + logger.error(f"Failed to clone {url}: {e}") + return False + + @staticmethod + def has_changes(url: str, local_path: str) -> bool: + """Check if remote repository has changes""" + local_path = Path(local_path) + + if not local_path.exists() or not (local_path / '.git').exists(): + return True # Needs to be cloned + + try: + # Fetch latest changes + subprocess.run( + ['git', 'fetch', 'origin'], + cwd=local_path, + check=True, + capture_output=True + ) + + # Check if local is behind remote + result = subprocess.run( + ['git', 'rev-list', '--count', 'HEAD..origin/master'], + cwd=local_path, + capture_output=True, + text=True + ) + + if result.returncode != 0: + # Try main branch + result = subprocess.run( + ['git', 'rev-list', '--count', 'HEAD..origin/main'], + cwd=local_path, + capture_output=True, + text=True + ) + + if result.returncode == 0: + behind_count = int(result.stdout.strip()) + return behind_count > 0 + + return False + except Exception as e: + logger.error(f"Error checking for changes: {e}") + return True # Assume changes to be safe + + +class CargoAOCRunner: + """Runs cargo-aoc benchmarks and parses results""" + + @staticmethod + def find_implemented_days(repo_path: Path) -> List[int]: + """Find which days are implemented in the repository""" + days = [] + + # Look for common patterns: src/bin/day01.rs, src/day01.rs, etc. + patterns = [ + repo_path / 'src' / 'bin' / 'day*.rs', + repo_path / 'src' / 'day*.rs', + repo_path / 'src' / '**' / 'day*.rs', + ] + + for pattern in patterns: + for day_file in repo_path.glob(str(pattern.relative_to(repo_path))): + match = re.search(r'day(\d+)', day_file.name) + if match: + day_num = int(match.group(1)) + if day_num not in days: + days.append(day_num) + + # Also check for Cargo.toml with day references + cargo_toml = repo_path / 'Cargo.toml' + if cargo_toml.exists(): + with open(cargo_toml, 'r') as f: + content = f.read() + for match in re.finditer(r'day(\d+)', content): + day_num = int(match.group(1)) + if day_num not in days: + days.append(day_num) + + return sorted(days) + + @staticmethod + def extract_years_from_repo(repo_path: Path) -> List[int]: + """Try to extract year(s) from repository path, name, or structure""" + years = [] + repo_path = Path(repo_path) + + # Check path name + path_str = str(repo_path) + for year_match in re.finditer(r'(\d{4})', path_str): + year = int(year_match.group(1)) + if 2015 <= year <= 2030 and year not in years: # Reasonable range + years.append(year) + + # Check for year directories (common pattern: src/2023/, year2023/, etc.) + for item in repo_path.iterdir(): + if item.is_dir(): + year_match = re.search(r'(\d{4})', item.name) + if year_match: + year = int(year_match.group(1)) + if 2015 <= year <= 2030 and year not in years: + years.append(year) + + # Check Cargo.toml + cargo_toml = repo_path / 'Cargo.toml' + if cargo_toml.exists(): + with open(cargo_toml, 'r') as f: + content = f.read() + for year_match in re.finditer(r'(\d{4})', content): + year = int(year_match.group(1)) + if 2015 <= year <= 2030 and year not in years: + years.append(year) + + return sorted(years) if years else [] + + @staticmethod + def run_benchmarks(repo_path: Path, year: Optional[int] = None, + user: str = "unknown") -> List[PerformanceResult]: + """Run cargo aoc benchmarks and parse results""" + results = [] + repo_path = Path(repo_path) + + if not (repo_path / 'Cargo.toml').exists(): + logger.warning(f"No Cargo.toml found in {repo_path}") + return results + + days = CargoAOCRunner.find_implemented_days(repo_path) + logger.info(f"Found {len(days)} implemented days in {repo_path}") + + for day in days: + try: + # Run cargo aoc bench for this day + cmd = ['cargo', 'aoc', 'bench', '--day', str(day)] + if year: + cmd.extend(['--year', str(year)]) + + result = subprocess.run( + cmd, + cwd=repo_path, + capture_output=True, + text=True, + timeout=300 # 5 minute timeout per day + ) + + if result.returncode != 0: + logger.warning(f"cargo aoc bench failed for day {day}: {result.stderr}") + continue + + # Parse output for performance data + # Try to extract year from output if not provided + actual_year = year + if not actual_year: + # Look for year in output + year_match = re.search(r'(\d{4})', result.stdout) + if year_match: + potential_year = int(year_match.group(1)) + if 2015 <= potential_year <= 2030: + actual_year = potential_year + + if not actual_year: + logger.warning(f"Could not determine year for day {day}, skipping") + continue + + day_results = CargoAOCRunner._parse_benchmark_output( + result.stdout, day, actual_year, user + ) + results.extend(day_results) + + except subprocess.TimeoutExpired: + logger.error(f"Timeout running benchmarks for day {day}") + except Exception as e: + logger.error(f"Error running benchmarks for day {day}: {e}") + + return results + + @staticmethod + def _parse_benchmark_output(output: str, day: int, year: int, + user: str) -> List[PerformanceResult]: + """Parse cargo-aoc benchmark output""" + results = [] + timestamp = datetime.now().isoformat() + + # Pattern: "Day X - Part Y: XXX.XXX ns (XXX.XXX ms)" + # or "Day X - Part Y: XXX.XXX ns" + # Also handles formats like "Day 1 Part 1", "day01-part1", etc. + patterns = [ + r'Day\s+(\d+)\s*-\s*Part\s+(\d+)[:\s]+([\d.]+)\s*ns', + r'day\s+(\d+)\s*-\s*part\s+(\d+)[:\s]+([\d.]+)\s*ns', + r'Day\s+(\d+)\s+Part\s+(\d+)[:\s]+([\d.]+)\s*ns', + r'day\s+(\d+)\s+part\s+(\d+)[:\s]+([\d.]+)\s*ns', + r'day(\d+)\s*-\s*part(\d+)[:\s]+([\d.]+)\s*ns', + r'(\d+)\s*-\s*(\d+)[:\s]+([\d.]+)\s*ns', + # Handle microseconds and milliseconds too + r'Day\s+(\d+)\s*-\s*Part\s+(\d+)[:\s]+([\d.]+)\s*(?:ns|μs|us|ms)', + ] + + for pattern in patterns: + for match in re.finditer(pattern, output, re.IGNORECASE): + part_day = int(match.group(1)) + part_num = int(match.group(2)) + time_str = match.group(3) + + # Use the day from the match if available, otherwise use provided day + actual_day = part_day if part_day > 0 else day + + try: + time_ns = int(float(time_str)) + + # Check if the time unit is in the match (for patterns that include it) + # If not, assume nanoseconds (most common) + # Look for unit in the original match context + match_text = match.group(0).lower() + if 'ms' in match_text or 'millisecond' in match_text: + time_ns = int(time_ns * 1_000_000) # Convert ms to ns + elif 'μs' in match_text or 'us' in match_text or 'microsecond' in match_text: + time_ns = int(time_ns * 1_000) # Convert μs to ns + # else: already in nanoseconds + + results.append(PerformanceResult( + user=user, + year=year, + day=actual_day, + part=part_num, + time_ns=time_ns, + timestamp=timestamp + )) + except ValueError: + logger.warning(f"Could not parse time: {time_str}") + + return results + + +class HTMLGenerator: + """Generates HTML comparison pages""" + + def __init__(self, output_dir: str): + self.output_dir = Path(output_dir) + self.output_dir.mkdir(parents=True, exist_ok=True) + + def generate(self, db: Database, config: Config): + """Generate HTML comparison page""" + years = config.compare_years or db.get_all_years() + days = config.compare_days + + results = db.get_latest_results(years=years, days=days) + users = db.get_all_users() + + # Organize data by year -> day -> part -> user + data = defaultdict(lambda: defaultdict(lambda: defaultdict(dict))) + + for result in results: + year = result['year'] + day = result['day'] + part = result['part'] + user = result['user'] + time_ns = result['time_ns'] + + # Only store if time_ns > 0 (valid result) + if time_ns > 0: + data[year][day][part][user] = time_ns + + html = self._generate_html(data, years, users) + + output_file = self.output_dir / 'index.html' + with open(output_file, 'w') as f: + f.write(html) + + logger.info(f"Generated HTML report: {output_file}") + + def _generate_html(self, data: dict, years: List[int], users: List[str]) -> str: + """Generate HTML content""" + html = f""" + + + + + Advent of Code Performance Comparison + + + +
+

🎄 Advent of Code Performance Comparison

+

Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

+ +
+

Comparison Settings

+

Years: {', '.join(map(str, sorted(years)))}

+

Users: {', '.join(sorted(users))}

+
+ +
+

Summary Statistics

+
+""" + + # Calculate summary statistics + total_days = sum(len(data[year]) for year in data) + total_parts = sum(len(parts) for year in data for day in data[year].values() for parts in day.values()) + users_with_data = set() + for year in data.values(): + for day in year.values(): + for part in day.values(): + users_with_data.update(part.keys()) + + html += f""" +
+
Total Years
+
{len(data)}
+
+
+
Total Days
+
{total_days}
+
+
+
Total Parts
+
{total_parts}
+
+
+
Users with Data
+
{len(users_with_data)}
+
+
+
+""" + + # Generate content for each year + for year in sorted(years): + if year not in data: + continue + + html += f""" +
+

Year {year}

+""" + + # Generate content for each day + for day in sorted(data[year].keys()): + html += f""" +
+

Day {day}

+""" + + # Generate content for each part + for part in sorted(data[year][day].keys()): + part_data = data[year][day][part] + + if not part_data: + continue + + # Find fastest and slowest + times = [(user, time_ns) for user, time_ns in part_data.items() if time_ns > 0] + if not times: + continue + + times.sort(key=lambda x: x[1]) + fastest_time = times[0][1] + slowest_time = times[-1][1] + + html += f""" +
+

Part {part}

+ + + + + + + + + +""" + + # Sort users by time (include all users, even if no data) + user_times = [(user, part_data.get(user, 0)) for user in users] + sorted_users = sorted(user_times, key=lambda x: x[1] if x[1] > 0 else float('inf')) + + for user, time_ns in sorted_users: + if time_ns == 0: + html += f""" + + + + + +""" + else: + time_ms = time_ns / 1_000_000 + time_us = time_ns / 1_000 + + # Format time appropriately + if time_ms >= 1: + time_str = f"{time_ms:.2f} ms" + elif time_us >= 1: + time_str = f"{time_us:.2f} μs" + else: + time_str = f"{time_ns} ns" + + # Calculate relative speed + if fastest_time > 0: + relative = time_ns / fastest_time + relative_str = f"{relative:.2f}x" + else: + relative_str = "-" + + # Determine if fastest or slowest + row_class = "" + if time_ns == fastest_time: + row_class = "fastest" + elif time_ns == slowest_time and len(times) > 1: + row_class = "slowest" + + html += f""" + + + + + +""" + + html += """ + +
UserTimeRelative Speed
{user}No data-
{user}{time_str}{relative_str}
+
+""" + + html += """ +
+""" + + html += """ +
+""" + + html += """ +
+ + +""" + + return html + + +class AOCSync: + """Main synchronization orchestrator""" + + def __init__(self, config_path: str = "config.yaml"): + self.config = Config(config_path) + self.db = Database(os.path.join(self.config.data_dir, 'results.db')) + self.html_gen = HTMLGenerator(self.config.output_dir) + self.git_manager = GitManager() + + def process_repository(self, repo_config: dict, user_name: str): + """Process a single repository configuration""" + repo_type = repo_config.get('type', 'single') + + if repo_type == 'single': + # Single repository with all years + url = repo_config['url'] + local_path = repo_config['local_path'] + + if self.git_manager.has_changes(url, local_path): + logger.info(f"Repository {user_name} has changes, updating...") + if self.git_manager.clone_or_update_repo(url, local_path): + repo_path = Path(local_path) + + # Check if years are specified in config + config_years = repo_config.get('years') + + if config_years: + # Use years from config + for year in config_years: + self._run_and_store_benchmarks(repo_path, year, user_name) + else: + # Try to determine year(s) from the repository + years = CargoAOCRunner.extract_years_from_repo(repo_path) + + if years: + # Run benchmarks for each detected year + for year in years: + self._run_and_store_benchmarks(repo_path, year, user_name) + else: + # If no year detected, try running without year specification + # cargo-aoc might infer it, or we'll try common years + logger.info(f"No year detected for {user_name}, trying without year specification") + results = CargoAOCRunner.run_benchmarks(repo_path, year=None, user=user_name) + for result in results: + self.db.insert_result(result) + + # Also try common years as fallback + for try_year in [2023, 2024, 2022, 2021, 2020]: + if self._check_year_in_repo(repo_path, try_year): + self._run_and_store_benchmarks(repo_path, try_year, user_name) + + elif repo_type == 'multi-year': + # Multiple repositories, one per year + years_config = repo_config.get('years', []) + for year_config in years_config: + year = year_config['year'] + url = year_config['url'] + local_path = year_config['local_path'] + + if self.git_manager.has_changes(url, local_path): + logger.info(f"Repository {user_name} year {year} has changes, updating...") + if self.git_manager.clone_or_update_repo(url, local_path): + repo_path = Path(local_path) + self._run_and_store_benchmarks(repo_path, year, user_name) + + def _check_year_in_repo(self, repo_path: Path, year: int) -> bool: + """Check if a repository contains solutions for a specific year""" + # Simple heuristic: check if year appears in path or files + path_str = str(repo_path) + if str(year) in path_str: + return True + + # Check Cargo.toml + cargo_toml = repo_path / 'Cargo.toml' + if cargo_toml.exists(): + with open(cargo_toml, 'r') as f: + if str(year) in f.read(): + return True + + return False + + def _run_and_store_benchmarks(self, repo_path: Path, year: int, user: str): + """Run benchmarks and store results""" + logger.info(f"Running benchmarks for {user} year {year} in {repo_path}") + results = CargoAOCRunner.run_benchmarks(repo_path, year=year, user=user) + + # Store results + for result in results: + self.db.insert_result(result) + + logger.info(f"Stored {len(results)} benchmark results for {user} year {year}") + + def sync_all(self): + """Sync all repositories""" + logger.info("Starting sync of all repositories...") + + for repo_config in self.config.repositories: + user_name = repo_config['name'] + try: + self.process_repository(repo_config, user_name) + except Exception as e: + logger.error(f"Error processing repository {user_name}: {e}") + + # Generate HTML report + logger.info("Generating HTML report...") + self.html_gen.generate(self.db, self.config) + + def run_continuous(self): + """Run continuous polling""" + logger.info(f"Starting continuous polling (interval: {self.config.poll_interval}s)") + + try: + while True: + self.sync_all() + logger.info(f"Sleeping for {self.config.poll_interval} seconds...") + time.sleep(self.config.poll_interval) + except KeyboardInterrupt: + logger.info("Stopped by user") + + +def main(): + """Main entry point""" + import argparse + + parser = argparse.ArgumentParser(description='AOC Sync - Poll and compare AOC implementations') + parser.add_argument('--config', default='config.yaml', help='Path to config file') + parser.add_argument('--once', action='store_true', help='Run once instead of continuously') + + args = parser.parse_args() + + sync = AOCSync(args.config) + + if args.once: + sync.sync_all() + else: + sync.run_continuous() + + +if __name__ == '__main__': + main() diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..db2a44c --- /dev/null +++ b/config.yaml @@ -0,0 +1,36 @@ +# Configuration for AOC Sync +# Poll interval in seconds +poll_interval: 300 + +# Output directory for generated HTML +output_dir: "output" + +# Data storage +data_dir: "data" + +# Repositories to monitor +repositories: + # Example: Single repository with all years + - name: "wathiede" + url: "https://github.com/wathiede/advent" + type: "single" # single repo for all years + local_path: "repos/wathiede" + # Optional: specify years if auto-detection fails + # years: [2023, 2024] + + # Example: Multiple repositories, one per year + - name: "ggriffiniii" + type: "multi-year" # one repo per year + years: + - year: 2025 + url: "https://github.com/ggriffiniii/aoc2025" + local_path: "repos/ggriffiniii-2025" + #- year: 2024 + # url: "https://github.com/user2/aoc-2024" + # local_path: "repos/user2-2024" + +# Years to compare (optional, if not specified, all years found will be used) +compare_years: [2025] + +# Days to compare (optional, if not specified, all days found will be used) +# compare_days: [1, 2, 3, 4, 5] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c1a201d --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +PyYAML>=6.0 diff --git a/src/bin/aocpoller.rs b/src/bin/aocpoller.rs deleted file mode 100644 index 7deeb0b..0000000 --- a/src/bin/aocpoller.rs +++ /dev/null @@ -1,34 +0,0 @@ -use std::process::Command; - -use aocsync::{logging_run, Config}; -use glog::Flags; -use log::info; -fn main() -> anyhow::Result<()> { - glog::new() - .init(Flags { - colorlogtostderr: true, - //alsologtostderr: true, // use logtostderr to only write to stderr and not to files - logtostderr: true, - ..Default::default() - }) - .unwrap(); - let config = rocket::Config::figment() - .extract::() - .expect("Couldn't parse config"); - info!("{:#?}", config); - for (name, repo) in config.repos.iter() { - let ts = logging_run( - Command::new("git") - .arg("ls-remote") - .arg(&repo.url) - .arg("-q") - .arg(&repo.name) - .arg("-h") - .arg(&repo.branch), - )?; - let out = String::from_utf8_lossy(&ts.output.stdout); - let head = &out[..out.find('\t').expect("No tab in output")]; - info!("HEAD: '{}'", head); - } - Ok(()) -} diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index dd28966..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,234 +0,0 @@ -use std::{ - collections::HashMap, - fs, - fs::File, - io, - path::{Path, PathBuf}, - process::{Command, Output}, - time::{Duration, Instant}, -}; - -use log::{error, info}; -use rocket::response::Responder; -use serde::Deserialize; -use thiserror::Error; - -#[derive(Error, Debug, Responder)] -pub enum SyncError { - #[error("IO error")] - IoError(#[from] io::Error), -} - -#[derive(Debug, Deserialize)] -pub struct Config { - pub build_root: PathBuf, - pub www_root: PathBuf, - pub repos: HashMap, -} - -#[derive(Debug, Deserialize)] -pub struct Repo { - pub name: String, - pub url: String, - pub branch: String, - pub first_commit: Option, - pub subdir: Option, -} - -pub fn indent_output(bytes: &[u8]) -> String { - let s = String::from_utf8_lossy(bytes); - let s = if s.is_empty() { "" } else { &s }; - s.split('\n') - .map(|l| format!("\t{l}")) - .collect::>() - .join("\n") -} - -pub fn format_task_status(ts: &TaskStatus) -> String { - format!( - "Status {} ({}) {}s:\nStdout:\n{}\nStderr:\n{}", - ts.command, - ts.output.status, - ts.duration.as_secs_f32(), - indent_output(&ts.output.stdout), - indent_output(&ts.output.stderr) - ) -} - -pub struct TaskStatus { - pub command: String, - pub output: Output, - pub duration: Duration, -} - -pub fn logging_run(cmd: &mut Command) -> Result { - info!( - "{}$ {} {}", - cmd.get_current_dir() - .unwrap_or(Path::new("")) - .display(), - cmd.get_program().to_string_lossy(), - cmd.get_args() - .map(|a| a.to_string_lossy()) - .collect::>() - .join(" "), - ); - let start = Instant::now(); - let o = cmd.output()?; - let ts = TaskStatus { - output: o, - command: format!("{:?}", cmd), - duration: start.elapsed(), - }; - info!("{}", format_task_status(&ts)); - Ok(ts) -} - -pub fn git_checkout(build_path: &Path, rev: &str) -> Result { - logging_run( - Command::new("git") - .current_dir(&build_path) - .arg("checkout") - .arg("-q") - .arg(rev), - ) -} - -// From https://stackoverflow.com/questions/26958489/how-to-copy-a-folder-recursively-in-rust -pub fn copy_dir_all(src: impl AsRef, dst: impl AsRef) -> io::Result<()> { - fs::create_dir_all(&dst)?; - for entry in fs::read_dir(src)? { - let entry = entry?; - let ty = entry.file_type()?; - if ty.is_dir() { - copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?; - } else { - fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?; - } - } - Ok(()) -} - -fn bench_at_commit( - commit: &str, - build_path: &Path, - target_path: &Path, -) -> Result, SyncError> { - let mut output = Vec::new(); - output.push(git_checkout(build_path, commit)?); - // Run `cargo aoc bench` - output.push(logging_run( - Command::new("cargo") - .env("CARGO_TARGET_DIR", target_path) - .current_dir(&build_path) - .arg("aoc") - .arg("bench"), - )?); - output.push(git_checkout(build_path, "HEAD")?); - - Ok(output) -} - -pub fn reload(config: &Config, name: &str) -> Result { - let repo = &config.repos[name]; - info!("Need to reload '{}': {:?}\n{:#?}", name, config, repo); - - let commits_root = config.build_root.join("commits"); - let git_root = config.build_root.join("git").join(name); - let www_root = config.www_root.join(name); - let target_root = config.build_root.join("target"); - - let checkout_path = git_root.join(&repo.name); - let build_path = if let Some(subdir) = &repo.subdir { - git_root.join(&repo.name).join(subdir) - } else { - git_root.join(&repo.name) - }; - let target_path = target_root.join(name); - - dbg!( - &build_path, - &target_path, - &commits_root, - &git_root, - &www_root - ); - - if !commits_root.exists() { - info!("Creating {}", commits_root.display()); - fs::create_dir_all(&commits_root)?; - } - if !git_root.exists() { - info!("Creating {}", git_root.display()); - fs::create_dir_all(&git_root)?; - } - if !target_root.exists() { - info!("Creating {}", target_root.display()); - fs::create_dir_all(&target_root)?; - } - if !www_root.exists() { - info!("Creating {}", www_root.display()); - fs::create_dir_all(&www_root)?; - } - let mut output = vec![logging_run(Command::new("git").arg("version"))?]; - let needs_clone = !checkout_path.exists(); - if needs_clone { - output.push(logging_run( - Command::new("git") - .current_dir(&git_root) - .arg("clone") - .arg(&repo.url) - .arg(&checkout_path), - )?); - } - output.push(logging_run( - Command::new("git") - .current_dir(&checkout_path) - .arg("checkout") - .arg("-f") - .arg(&repo.branch), - )?); - output.push(logging_run( - Command::new("git") - .current_dir(&checkout_path) - .arg("checkout") - .arg("HEAD"), - )?); - dbg!(&checkout_path); - // Make sure buildable clone is up to date - output.push(logging_run( - Command::new("git").current_dir(&checkout_path).arg("pull"), - )?); - let commits = logging_run(Command::new("git").current_dir(&checkout_path).args([ - "log", - "--format=%H", - &repo.branch, - ]))?; - let binding = String::from_utf8_lossy(&commits.output.stdout).into_owned(); - let mut unknown_commits: Vec<_> = binding - .lines() - .filter(|commit| !commits_root.join(commit).exists()) - .collect(); - unknown_commits.reverse(); - output.push(commits); - info!("Need to bench commits: {:?}", unknown_commits); - for commit in unknown_commits { - match bench_at_commit(commit, &build_path, &target_path) { - Ok(outputs) => { - output.extend(outputs); - File::create(commits_root.join(commit))?; - } - Err(err) => error!("Failed to bench {}@{}: {}", name, commit, err), - } - } - // Copy files from `target/` to serving directory - let bench_path = target_path.join("criterion"); - info!("Copying {} -> {}", bench_path.display(), www_root.display()); - copy_dir_all(bench_path, www_root)?; - let response = output - .iter() - .map(|ts| format!("{}", format_task_status(ts))) - .collect::>() - .join("\n"); - Ok(response) -} diff --git a/templates/index.html.tera b/templates/index.html.tera deleted file mode 100644 index 8725c3c..0000000 --- a/templates/index.html.tera +++ /dev/null @@ -1,4 +0,0 @@ -{% for d in dirs %} - -{% endfor %} -
Source in git.