diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 536a7d9d7..ffe614eaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,8 @@ jobs: steps: - uses: actions/checkout@v1 + with: + submodules: true - name: Setup Rust toolchain run: rustup default ${{ matrix.rust_version }} diff --git a/Cargo.lock b/Cargo.lock index fbcc2b878..3926256a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,9 +8,9 @@ checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" [[package]] name = "aho-corasick" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5e63fd144e18ba274ae7095c0197a870a7b9468abc801dd62f190d80817d2ec" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" dependencies = [ "memchr", ] @@ -30,6 +30,18 @@ version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "013a6e0a2cbe3d20f9c60b65458f7a7f7a5e636c5d0f45a5a6aee5d4b1f01785" +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" + [[package]] name = "atty" version = "0.2.14" @@ -55,9 +67,9 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" -version = "0.3.45" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad235dabf00f36301792cfe82499880ba54c6486be094d1047b02bacb67c14e8" +checksum = "b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e" dependencies = [ "backtrace-sys", "cfg-if", @@ -67,9 +79,9 @@ dependencies = [ [[package]] name = "backtrace-sys" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17b52e737c40a7d75abca20b29a19a0eb7ba9fc72c5a72dd282a0a3c2c0dc35" +checksum = "7de8aba10a69c8e8d7622c5710229485ec32e9d55fdad160ea559c086fdcd118" dependencies = [ "cc", "libc", @@ -90,12 +102,33 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" +[[package]] +name = "bincode" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +dependencies = [ + "byteorder", + "serde", +] + [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "blake2b_simd" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.7.3" @@ -119,9 +152,9 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502ae1441a0a5adb8fbd38a5955a6416b9493e92b465de5e4a9bde6a539c2c48" +checksum = "2889e6d50f394968c8bf4240dc3f2a7eb4680844d27308f798229ac9d4725f41" dependencies = [ "lazy_static", "memchr", @@ -131,9 +164,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" +checksum = "12ae9db68ad7fac5fe51304d20f016c911539251075a214f8e663babefa35187" [[package]] name = "byte-tools" @@ -164,15 +197,6 @@ dependencies = [ "iovec", ] -[[package]] -name = "c2-chacha" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" -dependencies = [ - "ppv-lite86", -] - [[package]] name = "cargo_metadata" version = "0.6.4" @@ -265,6 +289,12 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "cookie" version = "0.12.0" @@ -457,11 +487,33 @@ dependencies = [ "generic-array", ] +[[package]] +name = "dirs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +dependencies = [ + "cfg-if", + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" +dependencies = [ + "cfg-if", + "libc", + "redox_users", + "winapi 0.3.8", +] + [[package]] name = "doc-comment" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dtoa" @@ -555,9 +607,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" +checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" dependencies = [ "cfg-if", "crc32fast", @@ -677,9 +729,9 @@ checksum = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" [[package]] name = "globset" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" +checksum = "7ad1da430bd7281dde2576f44c84cc3f0f7b475e7202cd503042dff01a8c8120" dependencies = [ "aho-corasick", "bstr", @@ -904,15 +956,15 @@ checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" [[package]] name = "jod-thread" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f52a11f73b88fab829a0e4d9e13ea5982c7ac457c72eb3541d82a4afdfce4ff" +checksum = "4022656272c3e564a7cdebcaaba6518d844b0d0c1836597196efb5bfeb98bb49" [[package]] name = "js-sys" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cb931d43e71f560c81badb0191596562bafad2be06a3f9025b845c847c60df5" +checksum = "6a27d435371a2fa5b6d2b028a74bbdb1234f308da363226a2854ca3ff8ba7055" dependencies = [ "wasm-bindgen", ] @@ -941,9 +993,9 @@ checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" [[package]] name = "libc" -version = "0.2.67" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" +checksum = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0" [[package]] name = "linked-hash-map" @@ -1022,11 +1074,11 @@ checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" [[package]] name = "memoffset" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" dependencies = [ - "rustc_version", + "autocfg 1.0.0", ] [[package]] @@ -1036,6 +1088,7 @@ dependencies = [ "crossbeam-channel", "fs-err", "notify", + "serde", ] [[package]] @@ -1274,9 +1327,9 @@ dependencies = [ [[package]] name = "paste" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e1afe738d71b1ebab5f1207c055054015427dbfc7bbe9ee1266894156ec046" +checksum = "092d791bf7847f70bbd49085489fba25fc2c193571752bff9e36e74e72403932" dependencies = [ "paste-impl", "proc-macro-hack", @@ -1284,9 +1337,9 @@ dependencies = [ [[package]] name = "paste-impl" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d4dc4a7f6f743211c5aab239640a65091535d97d43d92a52bca435a640892bb" +checksum = "406c23fb4c45cc6f68a9bbabb8ec7bd6f8cfcbd17e9e8f72c2460282f8325729" dependencies = [ "proc-macro-hack", "proc-macro2 1.0.9", @@ -1327,9 +1380,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e5277315f6b4f27e0e6744feb5d5ba1891e7164871033d3c8344c6783b349a" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" dependencies = [ "pest", "pest_meta", @@ -1387,9 +1440,9 @@ dependencies = [ [[package]] name = "proc-macro-error" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7959c6467d962050d639361f7703b2051c43036d03493c36f01d440fdd3138a" +checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" dependencies = [ "proc-macro-error-attr", "proc-macro2 1.0.9", @@ -1400,9 +1453,9 @@ dependencies = [ [[package]] name = "proc-macro-error-attr" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4002d9f55991d5e019fb940a90e1a95eb80c24e77cb2462dd4dc869604d543a" +checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" dependencies = [ "proc-macro2 1.0.9", "quote 1.0.3", @@ -1413,20 +1466,15 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.11" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" -dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", - "syn", -] +checksum = "fcfdefadc3d57ca21cf17990a28ef4c0f7c61383a28cb7604cf4a18e6ede1420" [[package]] name = "proc-macro-nested" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" +checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" [[package]] name = "proc-macro2" @@ -1532,7 +1580,7 @@ checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom", "libc", - "rand_chacha 0.2.1", + "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc 0.2.0", ] @@ -1549,11 +1597,11 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "c2-chacha", + "ppv-lite86", "rand_core 0.5.1", ] @@ -1745,11 +1793,22 @@ version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +[[package]] +name = "redox_users" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + [[package]] name = "regex" -version = "1.3.4" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" +checksum = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3" dependencies = [ "aho-corasick", "memchr", @@ -1759,18 +1818,18 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" dependencies = [ "byteorder", ] [[package]] name = "regex-syntax" -version = "0.6.16" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1132f845907680735a84409c3bebc64d1364a5683ffbce899550cd09d5eaefc1" +checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" [[package]] name = "remove_dir_all" @@ -1852,12 +1911,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "roblox_install" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f80edbbbcd67bce7ddaf754d94276b30ae0a72eedfdf034c0c987f4a535e4a54" +dependencies = [ + "dirs", + "winreg", +] + [[package]] name = "rojo" version = "0.6.0-alpha.3" dependencies = [ "anyhow", "backtrace", + "bincode", "criterion", "crossbeam-channel", "csv", @@ -1885,6 +1955,7 @@ dependencies = [ "reqwest", "ritz", "rlua", + "roblox_install", "rojo-insta-ext", "serde", "serde_json", @@ -1926,6 +1997,18 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rust-argon2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" +dependencies = [ + "base64 0.11.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + [[package]] name = "rustc-demangle" version = "0.1.16" @@ -1943,9 +2026,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" +checksum = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" [[package]] name = "same-file" @@ -1958,9 +2041,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" +checksum = "039c25b130bd8c1321ee2d7de7fde2659fa9c2744e4bb29711cfc852ea53cd19" dependencies = [ "lazy_static", "winapi 0.3.8", @@ -2012,18 +2095,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +checksum = "e707fbbf255b8fc8c3b99abb91e7257a622caeb20a9818cbadbeeede4e0932ff" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +checksum = "ac5d00fc561ba2724df6758a17de23df5914f20e41cb00f94d5b7ae42fffaff8" dependencies = [ "proc-macro2 1.0.9", "quote 1.0.3", @@ -2032,9 +2115,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.48" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" +checksum = "78a7a12c167809363ec3bd7329fc0a3369056996de43c4b37ef3cd54a6ce4867" dependencies = [ "itoa", "ryu", @@ -2127,9 +2210,9 @@ checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" [[package]] name = "snafu" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "546db9181bce2aa22ed883c33d65603b76335b4c2533a98289f54265043de7a1" +checksum = "48492e4f51c6e679217e80c11290edfdedf3133e358f4f432a6296f4c820f95b" dependencies = [ "doc-comment", "snafu-derive", @@ -2137,9 +2220,9 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc75da2e0323f297402fd9c8fdba709bb04e4c627cbe31d19a2c91fc8d9f0e2" +checksum = "b5d1c41856cbfa99befda5034c72539dd9d7dd6f3e61058bdb804ac40715bc2a" dependencies = [ "proc-macro2 1.0.9", "quote 1.0.3", @@ -2172,9 +2255,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe43617218c0805c6eb37160119dc3c548110a67786da7218d1c6555212f073" +checksum = "c8faa2719539bbe9d77869bfb15d4ee769f99525e707931452c97b693b3f159d" dependencies = [ "clap", "lazy_static", @@ -2183,9 +2266,9 @@ dependencies = [ [[package]] name = "structopt-derive" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e79c80e0f4efd86ca960218d4e056249be189ff1c42824dcd9a7f51a56f0bd" +checksum = "3f88b8e18c69496aad6f9ddf4630dd7d585bcaf765786cb415b9aec2fe5a0430" dependencies = [ "heck", "proc-macro-error", @@ -2196,9 +2279,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" +checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" dependencies = [ "proc-macro2 1.0.9", "quote 1.0.3", @@ -2281,18 +2364,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee14bf8e6767ab4c687c9e8bc003879e042a96fd67a3ba5934eadb6536bef4db" +checksum = "f0570dc61221295909abdb95c739f2e74325e14293b2026b0a7e195091ec54ae" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7b51e1fbc44b5a0840be594fbc0f960be09050f2617e61e6aa43bef97cd3ef4" +checksum = "227362df41d566be41a28f64401e07a043157c21c14b9785a0d8e256f940a8fd" dependencies = [ "proc-macro2 1.0.9", "quote 1.0.3", @@ -2545,9 +2628,9 @@ checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" [[package]] name = "ucd-trie" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "unicase" @@ -2689,9 +2772,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3557c397ab5a8e347d434782bcd31fc1483d927a6826804cec05cc792ee2519d" +checksum = "2cc57ce05287f8376e998cbddfb4c8cb43b84a7ec55cf4551d7c00eef317a47f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2699,9 +2782,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0da9c9a19850d3af6df1cb9574970b566d617ecfaf36eb0b706b6f3ef9bd2f8" +checksum = "d967d37bf6c16cca2973ca3af071d0a2523392e4a594548155d89a678f4237cd" dependencies = [ "bumpalo", "lazy_static", @@ -2714,9 +2797,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f6fde1d36e75a714b5fe0cffbb78978f222ea6baebb726af13c78869fdb4205" +checksum = "8bd151b63e1ea881bb742cd20e1d6127cef28399558f3b5d415289bc41eee3a4" dependencies = [ "quote 1.0.3", "wasm-bindgen-macro-support", @@ -2724,9 +2807,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bda4168030a6412ea8a047e27238cadf56f0e53516e1e83fec0a8b7c786f6d" +checksum = "d68a5b36eef1be7868f668632863292e37739656a80fc4b9acec7b0bd35a4931" dependencies = [ "proc-macro2 1.0.9", "quote 1.0.3", @@ -2737,15 +2820,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc9f36ad51f25b0219a3d4d13b90eb44cd075dff8b6280cca015775d7acaddd8" +checksum = "daf76fe7d25ac79748a37538b7daeed1c7a6867c92d3245c12c6222e4a20d639" [[package]] name = "web-sys" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721c6263e2c66fd44501cc5efbfa2b7dfa775d13e4ea38c46299646ed1f9c70a" +checksum = "2d6f51648d8c56c366144378a33290049eafdd784071077f6fe37dae64c1c4cb" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index b7d734d41..875663bf1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,7 @@ memofs = { version = "0.1.1", path = "memofs" } anyhow = "1.0.27" backtrace = "0.3" +bincode = "1.2.1" crossbeam-channel = "0.4.0" csv = "1.1.1" env_logger = "0.7.1" @@ -84,6 +85,7 @@ regex = "1.3.1" reqwest = "0.9.20" ritz = "0.1.0" rlua = "0.17.0" +roblox_install = "0.2.2" serde = { version = "1.0", features = ["derive", "rc"] } serde_json = "1.0" structopt = "0.3.5" @@ -95,6 +97,13 @@ uuid = { version = "0.8.1", features = ["v4", "serde"] } [target.'cfg(windows)'.dependencies] winreg = "0.6.2" +[build-dependencies] +memofs = { version = "0.1.0", path = "memofs" } + +anyhow = "1.0.27" +bincode = "1.2.1" +maplit = "1.0.1" + [dev-dependencies] rojo-insta-ext = { path = "rojo-insta-ext" } diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..71f8d1fd9 --- /dev/null +++ b/build.rs @@ -0,0 +1,78 @@ +use std::{ + env, + fs::{self, File}, + io, + path::{Path, PathBuf}, +}; + +use maplit::hashmap; +use memofs::VfsSnapshot; + +fn snapshot_from_fs_path(path: &Path) -> io::Result { + println!("cargo:rerun-if-changed={}", path.display()); + + if path.is_dir() { + let mut children = Vec::new(); + + for entry in fs::read_dir(path)? { + let entry = entry?; + + let file_name = entry.file_name().to_str().unwrap().to_owned(); + + // We can skip any TestEZ test files since they aren't necessary for + // the plugin to run. + if file_name.ends_with(".spec.lua") { + continue; + } + + let child_snapshot = snapshot_from_fs_path(&entry.path())?; + children.push((file_name, child_snapshot)); + } + + Ok(VfsSnapshot::dir(children)) + } else { + let content = fs::read_to_string(path)?; + + Ok(VfsSnapshot::file(content)) + } +} + +fn main() -> Result<(), anyhow::Error> { + let out_dir = env::var_os("OUT_DIR").unwrap(); + + let root_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap(); + let plugin_root = PathBuf::from(root_dir).join("plugin"); + + let plugin_modules = plugin_root.join("modules"); + + let snapshot = VfsSnapshot::dir(hashmap! { + "default.project.json" => snapshot_from_fs_path(&plugin_root.join("default.project.json"))?, + "fmt" => snapshot_from_fs_path(&plugin_root.join("fmt"))?, + "http" => snapshot_from_fs_path(&plugin_root.join("http"))?, + "log" => snapshot_from_fs_path(&plugin_root.join("log"))?, + "src" => snapshot_from_fs_path(&plugin_root.join("src"))?, + "modules" => VfsSnapshot::dir(hashmap! { + "roact" => VfsSnapshot::dir(hashmap! { + "src" => snapshot_from_fs_path(&plugin_modules.join("roact").join("src"))? + }), + "promise" => VfsSnapshot::dir(hashmap! { + "lib" => snapshot_from_fs_path(&plugin_modules.join("promise").join("lib"))? + }), + "t" => VfsSnapshot::dir(hashmap! { + "lib" => snapshot_from_fs_path(&plugin_modules.join("t").join("lib"))? + }), + "rbx-dom" => VfsSnapshot::dir(hashmap! { + "rbx_dom_lua" => VfsSnapshot::dir(hashmap! { + "src" => snapshot_from_fs_path(&plugin_modules.join("rbx-dom").join("rbx_dom_lua").join("src"))? + }) + }), + }), + }); + + let out_path = Path::new(&out_dir).join("plugin.bincode"); + let out_file = File::create(&out_path)?; + + bincode::serialize_into(out_file, &snapshot)?; + + Ok(()) +} diff --git a/memofs/Cargo.toml b/memofs/Cargo.toml index 3843606a3..0d0d4a397 100644 --- a/memofs/Cargo.toml +++ b/memofs/Cargo.toml @@ -14,3 +14,4 @@ homepage = "https://github.com/rojo-rbx/rojo/tree/master/memofs" crossbeam-channel = "0.4.0" fs-err = "2.3.0" notify = "4.0.15" +serde = { version = "1.0", features = ["derive"] } diff --git a/memofs/src/snapshot.rs b/memofs/src/snapshot.rs index e6596bb27..0df3d4734 100644 --- a/memofs/src/snapshot.rs +++ b/memofs/src/snapshot.rs @@ -1,8 +1,9 @@ +use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; /// A slice of a tree of files. Can be loaded into an /// [`InMemoryFs`](struct.InMemoryFs.html). -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] #[non_exhaustive] pub enum VfsSnapshot { File { diff --git a/plugin/modules/rbx-dom b/plugin/modules/rbx-dom index 94116dcc1..5bca08fec 160000 --- a/plugin/modules/rbx-dom +++ b/plugin/modules/rbx-dom @@ -1 +1 @@ -Subproject commit 94116dcc11a1728e49dad1c779077cff526c2808 +Subproject commit 5bca08fec3f5708a29811dceb11957b92eafe81f diff --git a/src/bin.rs b/src/bin.rs index 403823c63..aa8c647b6 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -12,6 +12,7 @@ fn run(global: GlobalOptions, subcommand: Subcommand) -> Result<(), Box cli::build(build_options)?, Subcommand::Upload(upload_options) => cli::upload(upload_options)?, Subcommand::Doc => cli::doc()?, + Subcommand::Plugin(plugin_options) => cli::plugin(plugin_options)?, } Ok(()) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 1339527cc..5bd69a1db 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -3,6 +3,7 @@ mod build; mod doc; mod init; +mod plugin; mod serve; mod upload; @@ -21,6 +22,7 @@ use thiserror::Error; pub use self::build::*; pub use self::doc::*; pub use self::init::*; +pub use self::plugin::*; pub use self::serve::*; pub use self::upload::*; @@ -111,6 +113,9 @@ pub enum Subcommand { /// Open Rojo's documentation in your browser. Doc, + + /// Manages Rojo's Roblox Studio plugin. + Plugin(PluginCommand), } /// Initializes a new Rojo project. @@ -287,3 +292,21 @@ fn resolve_path(path: &Path) -> Cow<'_, Path> { Cow::Owned(env::current_dir().unwrap().join(path)) } } + +#[derive(Debug, StructOpt)] +pub enum PluginSubcommand { + /// Install the plugin in Roblox Studio's plugins folder. If the plugin is + /// already installed, installing it again will overwrite the current plugin + /// file. + Install, + + /// Removes the plugin if it is installed. + Uninstall, +} + +/// Install Rojo's plugin. +#[derive(Debug, StructOpt)] +pub struct PluginCommand { + #[structopt(subcommand)] + subcommand: PluginSubcommand, +} diff --git a/src/cli/plugin.rs b/src/cli/plugin.rs new file mode 100644 index 000000000..8ddca54da --- /dev/null +++ b/src/cli/plugin.rs @@ -0,0 +1,70 @@ +use std::{ + fs::{self, File}, + io::BufWriter, +}; + +use anyhow::Result; +use memofs::{InMemoryFs, Vfs, VfsSnapshot}; +use roblox_install::RobloxStudio; + +use crate::{ + cli::{PluginCommand, PluginSubcommand}, + serve_session::ServeSession, +}; + +static PLUGIN_BINCODE: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/plugin.bincode")); +static PLUGIN_FILE_NAME: &str = "RojoManagedPlugin.rbxm"; + +pub fn plugin(options: PluginCommand) -> Result<()> { + match options.subcommand { + PluginSubcommand::Install => install_plugin(), + PluginSubcommand::Uninstall => uninstall_plugin(), + } +} + +pub fn install_plugin() -> Result<()> { + let plugin_snapshot: VfsSnapshot = bincode::deserialize(PLUGIN_BINCODE) + .expect("Rojo's plugin was not properly packed into Rojo's binary"); + + let studio = RobloxStudio::locate()?; + + let plugins_folder_path = studio.plugins_path(); + + if !plugins_folder_path.exists() { + log::debug!("Creating Roblox Studio plugins folder"); + fs::create_dir(plugins_folder_path)?; + } + + let mut in_memory_fs = InMemoryFs::new(); + in_memory_fs.load_snapshot("plugin", plugin_snapshot)?; + + let vfs = Vfs::new(in_memory_fs); + let session = ServeSession::new(vfs, "plugin")?; + + let plugin_path = plugins_folder_path.join(PLUGIN_FILE_NAME); + log::debug!("Writing plugin to {}", plugin_path.display()); + + let mut file = BufWriter::new(File::create(plugin_path)?); + + let tree = session.tree(); + let root_id = tree.get_root_id(); + + rbx_binary::encode(tree.inner(), &[root_id], &mut file)?; + + Ok(()) +} + +fn uninstall_plugin() -> Result<()> { + let studio = RobloxStudio::locate()?; + + let plugin_path = studio.plugins_path().join(PLUGIN_FILE_NAME); + + if plugin_path.exists() { + log::debug!("Removing existing plugin from {}", plugin_path.display()); + fs::remove_file(plugin_path)?; + } else { + log::debug!("Plugin not installed at {}", plugin_path.display()); + } + + Ok(()) +}