├── .github └── workflows │ ├── cd.yaml │ └── ci.yaml ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── profiles ├── .gitignore ├── profile.sh ├── profile_harness.vim └── run_profile.vim └── src ├── lib.rs └── main.rs /.github/workflows/cd.yaml: -------------------------------------------------------------------------------- 1 | name: CD 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | env: 9 | release_url: release_url 10 | 11 | jobs: 12 | create_release: 13 | name: Create ${{ github.ref }} release 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/create-release@v1 18 | id: create_release 19 | env: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 21 | with: 22 | tag_name: ${{ github.ref }} 23 | release_name: ${{ github.ref }} 24 | draft: true 25 | prerelease: false 26 | 27 | - name: Save release upload URL 28 | run: echo ${{ steps.create_release.outputs.upload_url }} > release_url 29 | 30 | - uses: actions/upload-artifact@v1 31 | with: 32 | name: ${{ env.release_url }} 33 | path: ${{ env.release_url }} 34 | 35 | cd: 36 | strategy: 37 | matrix: 38 | os: [macos-latest, ubuntu-latest] 39 | 40 | name: Release ${{ github.ref }} for ${{ matrix.os }} 41 | runs-on: ${{ matrix.os }} 42 | 43 | env: 44 | bin: target/release/strand 45 | zip: target/release/strand.zip 46 | 47 | steps: 48 | - uses: actions/checkout@v2.0.0 49 | 50 | - uses: actions-rs/toolchain@v1 51 | with: 52 | toolchain: stable 53 | override: true 54 | 55 | - uses: actions-rs/cargo@v1 56 | name: Compile 57 | with: 58 | command: build 59 | args: --release 60 | 61 | - name: Zip ${{ env.bin }} 62 | run: zip --junk-paths ${{ env.zip }} ${{ env.bin }} 63 | 64 | - uses: actions/download-artifact@v1 65 | name: Download release URL 66 | with: 67 | name: ${{ env.release_url }} 68 | 69 | # We redirect output to a field called ‘url’ for capture by the next 70 | # action, and then undo the botched expansion (Bash’s ‘brace expansion’) 71 | # of the URL that occurs every time it is uploaded. 72 | - name: Parse release URL 73 | id: get_release_url 74 | run: | 75 | printf '##[set-output name=url;]%s' $( \ 76 | cat ${{ env.release_url }}/${{ env.release_url }} \ 77 | | awk '{print $1}' \ 78 | | sed 's/?name/{?name,label}/') 79 | 80 | - uses: actions/upload-release-asset@v1.0.1 81 | env: 82 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 83 | with: 84 | upload_url: ${{ steps.get_release_url.outputs.url }} 85 | asset_path: ${{ env.zip }} 86 | asset_name: strand-${{ matrix.os }}.zip 87 | asset_content_type: application/zip 88 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | fmt: 6 | name: fmt ${{ github.sha }} 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v2.0.0 11 | 12 | - uses: actions-rs/toolchain@v1 13 | with: 14 | toolchain: stable 15 | override: true 16 | 17 | - uses: actions-rs/cargo@v1 18 | with: 19 | command: fmt 20 | args: -- --check 21 | 22 | ci: 23 | strategy: 24 | matrix: 25 | os: [macos-latest, ubuntu-latest, windows-latest] 26 | task: [['check', ''], ['test', ''], ['clippy', '-- --deny warnings'], ['build', '--release']] 27 | 28 | name: ${{ matrix.task[0] }} ${{ github.sha }} for ${{ matrix.os }} 29 | runs-on: ${{ matrix.os }} 30 | 31 | steps: 32 | - uses: actions/checkout@v2.0.0 33 | 34 | - uses: actions-rs/toolchain@v1 35 | with: 36 | toolchain: stable 37 | override: true 38 | 39 | - uses: actions-rs/cargo@v1 40 | with: 41 | command: ${{ matrix.task[0] }} 42 | args: ${{ matrix.task[1] }} 43 | 44 | - uses: actions/upload-artifact@v1.0.0 45 | # This action doesn’t work on Windows due to something weird with paths. 46 | if: matrix.task[0] == 'build' && matrix.os != 'windows-latest' 47 | with: 48 | name: ${{ matrix.os }}-${{ github.sha }} 49 | path: target/release/strand 50 | 51 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "adler32" 5 | version = "1.0.4" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | 8 | [[package]] 9 | name = "ansi_term" 10 | version = "0.11.0" 11 | source = "registry+https://github.com/rust-lang/crates.io-index" 12 | dependencies = [ 13 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 14 | ] 15 | 16 | [[package]] 17 | name = "anyhow" 18 | version = "1.0.26" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | 21 | [[package]] 22 | name = "arc-swap" 23 | version = "0.4.4" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | 26 | [[package]] 27 | name = "arrayref" 28 | version = "0.3.6" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | 31 | [[package]] 32 | name = "arrayvec" 33 | version = "0.5.1" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | 36 | [[package]] 37 | name = "async-attributes" 38 | version = "1.1.1" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | dependencies = [ 41 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 42 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 43 | ] 44 | 45 | [[package]] 46 | name = "async-macros" 47 | version = "2.0.0" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | dependencies = [ 50 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 51 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 52 | ] 53 | 54 | [[package]] 55 | name = "async-std" 56 | version = "1.5.0" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | dependencies = [ 59 | "async-attributes 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 60 | "async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 61 | "broadcaster 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 62 | "crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 63 | "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 64 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 65 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 66 | "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 67 | "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 68 | "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 69 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 70 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 72 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 73 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 74 | "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 77 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 78 | ] 79 | 80 | [[package]] 81 | name = "async-task" 82 | version = "1.3.1" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | dependencies = [ 85 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 86 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 87 | ] 88 | 89 | [[package]] 90 | name = "atty" 91 | version = "0.2.14" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | dependencies = [ 94 | "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 95 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 96 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 97 | ] 98 | 99 | [[package]] 100 | name = "autocfg" 101 | version = "0.1.7" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | 104 | [[package]] 105 | name = "autocfg" 106 | version = "1.0.0" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | 109 | [[package]] 110 | name = "base64" 111 | version = "0.11.0" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | 114 | [[package]] 115 | name = "bitflags" 116 | version = "1.2.1" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | 119 | [[package]] 120 | name = "blake2b_simd" 121 | version = "0.5.10" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | dependencies = [ 124 | "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 125 | "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 126 | "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 127 | ] 128 | 129 | [[package]] 130 | name = "broadcaster" 131 | version = "1.0.0" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | dependencies = [ 134 | "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 135 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 136 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 137 | "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 138 | "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 139 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 140 | ] 141 | 142 | [[package]] 143 | name = "bumpalo" 144 | version = "3.2.0" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | 147 | [[package]] 148 | name = "byteorder" 149 | version = "1.3.4" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | 152 | [[package]] 153 | name = "bytes" 154 | version = "0.4.12" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | dependencies = [ 157 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 158 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 159 | ] 160 | 161 | [[package]] 162 | name = "cc" 163 | version = "1.0.50" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | 166 | [[package]] 167 | name = "cfg-if" 168 | version = "0.1.10" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | 171 | [[package]] 172 | name = "clap" 173 | version = "2.33.0" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | dependencies = [ 176 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 177 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 178 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 179 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 180 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 181 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 182 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 183 | ] 184 | 185 | [[package]] 186 | name = "cloudabi" 187 | version = "0.0.3" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | dependencies = [ 190 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 191 | ] 192 | 193 | [[package]] 194 | name = "colored" 195 | version = "1.9.2" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | dependencies = [ 198 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 199 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 200 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 201 | ] 202 | 203 | [[package]] 204 | name = "constant_time_eq" 205 | version = "0.1.5" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | 208 | [[package]] 209 | name = "crc32fast" 210 | version = "1.2.0" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | dependencies = [ 213 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 214 | ] 215 | 216 | [[package]] 217 | name = "crossbeam-channel" 218 | version = "0.3.9" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | dependencies = [ 221 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 222 | ] 223 | 224 | [[package]] 225 | name = "crossbeam-channel" 226 | version = "0.4.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | dependencies = [ 229 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 230 | ] 231 | 232 | [[package]] 233 | name = "crossbeam-deque" 234 | version = "0.7.2" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | dependencies = [ 237 | "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 238 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 239 | ] 240 | 241 | [[package]] 242 | name = "crossbeam-epoch" 243 | version = "0.8.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | dependencies = [ 246 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 247 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 248 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 249 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 250 | "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 251 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 252 | ] 253 | 254 | [[package]] 255 | name = "crossbeam-utils" 256 | version = "0.6.6" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | dependencies = [ 259 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 260 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 261 | ] 262 | 263 | [[package]] 264 | name = "crossbeam-utils" 265 | version = "0.7.0" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | dependencies = [ 268 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 269 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 270 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 271 | ] 272 | 273 | [[package]] 274 | name = "crossterm" 275 | version = "0.14.2" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | dependencies = [ 278 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 279 | "crossterm_winapi 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 280 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 281 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 282 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 283 | "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 284 | "signal-hook 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 285 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 286 | ] 287 | 288 | [[package]] 289 | name = "crossterm_winapi" 290 | version = "0.5.1" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | dependencies = [ 293 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 294 | ] 295 | 296 | [[package]] 297 | name = "curl" 298 | version = "0.4.25" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | dependencies = [ 301 | "curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", 302 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 303 | "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 304 | "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", 305 | "schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 306 | "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 308 | ] 309 | 310 | [[package]] 311 | name = "curl-sys" 312 | version = "0.4.25" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | dependencies = [ 315 | "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", 316 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 317 | "libnghttp2-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 318 | "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", 319 | "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", 320 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 321 | "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 322 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 323 | ] 324 | 325 | [[package]] 326 | name = "dirs" 327 | version = "2.0.2" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | dependencies = [ 330 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 331 | "dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 332 | ] 333 | 334 | [[package]] 335 | name = "dirs-sys" 336 | version = "0.3.4" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | dependencies = [ 339 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 340 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 341 | "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 342 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 343 | ] 344 | 345 | [[package]] 346 | name = "dtoa" 347 | version = "0.4.5" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | 350 | [[package]] 351 | name = "either" 352 | version = "1.5.3" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | 355 | [[package]] 356 | name = "filetime" 357 | version = "0.2.8" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | dependencies = [ 360 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 361 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 362 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 363 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 364 | ] 365 | 366 | [[package]] 367 | name = "flate2" 368 | version = "1.0.13" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | dependencies = [ 371 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 372 | "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 373 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 374 | "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 375 | ] 376 | 377 | [[package]] 378 | name = "fnv" 379 | version = "1.0.6" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | 382 | [[package]] 383 | name = "fuchsia-zircon" 384 | version = "0.3.3" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | dependencies = [ 387 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 388 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 389 | ] 390 | 391 | [[package]] 392 | name = "fuchsia-zircon-sys" 393 | version = "0.3.3" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | 396 | [[package]] 397 | name = "futures" 398 | version = "0.1.29" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | 401 | [[package]] 402 | name = "futures-channel" 403 | version = "0.3.4" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | dependencies = [ 406 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 407 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 408 | ] 409 | 410 | [[package]] 411 | name = "futures-channel-preview" 412 | version = "0.3.0-alpha.19" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | dependencies = [ 415 | "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 416 | "futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 417 | ] 418 | 419 | [[package]] 420 | name = "futures-core" 421 | version = "0.3.4" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | 424 | [[package]] 425 | name = "futures-core-preview" 426 | version = "0.3.0-alpha.19" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | 429 | [[package]] 430 | name = "futures-executor-preview" 431 | version = "0.3.0-alpha.19" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | dependencies = [ 434 | "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 435 | "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 436 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 437 | ] 438 | 439 | [[package]] 440 | name = "futures-io" 441 | version = "0.3.4" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | 444 | [[package]] 445 | name = "futures-io-preview" 446 | version = "0.3.0-alpha.19" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | 449 | [[package]] 450 | name = "futures-macro" 451 | version = "0.3.4" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | dependencies = [ 454 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 455 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 456 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 457 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 458 | ] 459 | 460 | [[package]] 461 | name = "futures-preview" 462 | version = "0.3.0-alpha.19" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | dependencies = [ 465 | "futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 467 | "futures-executor-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 468 | "futures-io-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 469 | "futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 470 | "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 471 | ] 472 | 473 | [[package]] 474 | name = "futures-sink" 475 | version = "0.3.4" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | 478 | [[package]] 479 | name = "futures-sink-preview" 480 | version = "0.3.0-alpha.19" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | 483 | [[package]] 484 | name = "futures-task" 485 | version = "0.3.4" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | 488 | [[package]] 489 | name = "futures-timer" 490 | version = "2.0.2" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | 493 | [[package]] 494 | name = "futures-util" 495 | version = "0.3.4" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | dependencies = [ 498 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 499 | "futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 500 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 501 | "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 502 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 503 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 504 | "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 505 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 506 | ] 507 | 508 | [[package]] 509 | name = "futures-util-preview" 510 | version = "0.3.0-alpha.19" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | dependencies = [ 513 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 514 | "futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 515 | "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 516 | "futures-io-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 517 | "futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 518 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 519 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 520 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 521 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 522 | ] 523 | 524 | [[package]] 525 | name = "getrandom" 526 | version = "0.1.14" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | dependencies = [ 529 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 530 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 531 | "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", 532 | ] 533 | 534 | [[package]] 535 | name = "heck" 536 | version = "0.3.1" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | dependencies = [ 539 | "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 540 | ] 541 | 542 | [[package]] 543 | name = "hermit-abi" 544 | version = "0.1.6" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | dependencies = [ 547 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 548 | ] 549 | 550 | [[package]] 551 | name = "http" 552 | version = "0.1.21" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | dependencies = [ 555 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 556 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 557 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 558 | ] 559 | 560 | [[package]] 561 | name = "idna" 562 | version = "0.2.0" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | dependencies = [ 565 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 566 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 567 | "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 568 | ] 569 | 570 | [[package]] 571 | name = "iovec" 572 | version = "0.1.4" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | dependencies = [ 575 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 576 | ] 577 | 578 | [[package]] 579 | name = "isahc" 580 | version = "0.7.6" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | dependencies = [ 583 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 584 | "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 585 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 586 | "curl 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", 587 | "curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", 588 | "futures-io-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 589 | "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 590 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 591 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 592 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 593 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 594 | "sluice 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 595 | ] 596 | 597 | [[package]] 598 | name = "itertools" 599 | version = "0.8.2" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | dependencies = [ 602 | "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 603 | ] 604 | 605 | [[package]] 606 | name = "itoa" 607 | version = "0.4.5" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | 610 | [[package]] 611 | name = "js-sys" 612 | version = "0.3.35" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | dependencies = [ 615 | "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 616 | ] 617 | 618 | [[package]] 619 | name = "kernel32-sys" 620 | version = "0.2.2" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | dependencies = [ 623 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 624 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 625 | ] 626 | 627 | [[package]] 628 | name = "kv-log-macro" 629 | version = "1.0.4" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | dependencies = [ 632 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 633 | ] 634 | 635 | [[package]] 636 | name = "lazy_static" 637 | version = "1.4.0" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | 640 | [[package]] 641 | name = "libc" 642 | version = "0.2.66" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | 645 | [[package]] 646 | name = "libnghttp2-sys" 647 | version = "0.1.2" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | dependencies = [ 650 | "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", 651 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 652 | ] 653 | 654 | [[package]] 655 | name = "libz-sys" 656 | version = "1.0.25" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | dependencies = [ 659 | "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", 660 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 661 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 662 | "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 663 | ] 664 | 665 | [[package]] 666 | name = "linked-hash-map" 667 | version = "0.5.2" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | 670 | [[package]] 671 | name = "lock_api" 672 | version = "0.3.3" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | dependencies = [ 675 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 676 | ] 677 | 678 | [[package]] 679 | name = "log" 680 | version = "0.4.8" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | dependencies = [ 683 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 684 | ] 685 | 686 | [[package]] 687 | name = "matches" 688 | version = "0.1.8" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | 691 | [[package]] 692 | name = "memchr" 693 | version = "2.3.0" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | 696 | [[package]] 697 | name = "memoffset" 698 | version = "0.5.3" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | dependencies = [ 701 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 702 | ] 703 | 704 | [[package]] 705 | name = "mime" 706 | version = "0.3.16" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | 709 | [[package]] 710 | name = "mime_guess" 711 | version = "2.0.1" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | dependencies = [ 714 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 715 | "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 716 | ] 717 | 718 | [[package]] 719 | name = "miniz_oxide" 720 | version = "0.3.6" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | dependencies = [ 723 | "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 724 | ] 725 | 726 | [[package]] 727 | name = "mio" 728 | version = "0.6.21" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | dependencies = [ 731 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 732 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 733 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 734 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 735 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 736 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 737 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 738 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 739 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 740 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 741 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 742 | ] 743 | 744 | [[package]] 745 | name = "mio-uds" 746 | version = "0.6.7" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | dependencies = [ 749 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 750 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 751 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 752 | ] 753 | 754 | [[package]] 755 | name = "miow" 756 | version = "0.2.1" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | dependencies = [ 759 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 760 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 761 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 762 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 763 | ] 764 | 765 | [[package]] 766 | name = "net2" 767 | version = "0.2.33" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | dependencies = [ 770 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 771 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 772 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 773 | ] 774 | 775 | [[package]] 776 | name = "nom" 777 | version = "4.2.3" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | dependencies = [ 780 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 781 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 782 | ] 783 | 784 | [[package]] 785 | name = "num_cpus" 786 | version = "1.12.0" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | dependencies = [ 789 | "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 790 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 791 | ] 792 | 793 | [[package]] 794 | name = "numtoa" 795 | version = "0.1.0" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | 798 | [[package]] 799 | name = "once_cell" 800 | version = "1.3.1" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | 803 | [[package]] 804 | name = "openssl-probe" 805 | version = "0.1.2" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | 808 | [[package]] 809 | name = "openssl-sys" 810 | version = "0.9.54" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | dependencies = [ 813 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 814 | "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", 815 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 816 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 817 | "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 818 | ] 819 | 820 | [[package]] 821 | name = "parking_lot" 822 | version = "0.10.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | dependencies = [ 825 | "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 826 | "parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 827 | ] 828 | 829 | [[package]] 830 | name = "parking_lot_core" 831 | version = "0.7.0" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | dependencies = [ 834 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 835 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 836 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 837 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 838 | "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 839 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 840 | ] 841 | 842 | [[package]] 843 | name = "pbr" 844 | version = "1.0.2" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | dependencies = [ 847 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 848 | "termion 1.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 849 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 850 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 851 | ] 852 | 853 | [[package]] 854 | name = "percent-encoding" 855 | version = "2.1.0" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | 858 | [[package]] 859 | name = "pin-project-lite" 860 | version = "0.1.4" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | 863 | [[package]] 864 | name = "pin-utils" 865 | version = "0.1.0-alpha.4" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | 868 | [[package]] 869 | name = "pkg-config" 870 | version = "0.3.17" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | 873 | [[package]] 874 | name = "proc-macro-error" 875 | version = "0.4.8" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | dependencies = [ 878 | "proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 879 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 880 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 881 | "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 882 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 883 | ] 884 | 885 | [[package]] 886 | name = "proc-macro-error-attr" 887 | version = "0.4.8" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | dependencies = [ 890 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 891 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 892 | "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 893 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 894 | "syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 895 | ] 896 | 897 | [[package]] 898 | name = "proc-macro-hack" 899 | version = "0.5.11" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | dependencies = [ 902 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 903 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 904 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 905 | ] 906 | 907 | [[package]] 908 | name = "proc-macro-nested" 909 | version = "0.1.3" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | 912 | [[package]] 913 | name = "proc-macro2" 914 | version = "1.0.8" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | dependencies = [ 917 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 918 | ] 919 | 920 | [[package]] 921 | name = "quote" 922 | version = "1.0.2" 923 | source = "registry+https://github.com/rust-lang/crates.io-index" 924 | dependencies = [ 925 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 926 | ] 927 | 928 | [[package]] 929 | name = "redox_syscall" 930 | version = "0.1.56" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | 933 | [[package]] 934 | name = "redox_termios" 935 | version = "0.1.1" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | dependencies = [ 938 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 939 | ] 940 | 941 | [[package]] 942 | name = "redox_users" 943 | version = "0.3.4" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | dependencies = [ 946 | "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 947 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 948 | "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 949 | ] 950 | 951 | [[package]] 952 | name = "rust-argon2" 953 | version = "0.7.0" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | dependencies = [ 956 | "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 957 | "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", 958 | "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 959 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 960 | ] 961 | 962 | [[package]] 963 | name = "rustc_version" 964 | version = "0.2.3" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | dependencies = [ 967 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 968 | ] 969 | 970 | [[package]] 971 | name = "rustversion" 972 | version = "1.0.2" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | dependencies = [ 975 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 976 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 977 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 978 | ] 979 | 980 | [[package]] 981 | name = "ryu" 982 | version = "1.0.2" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | 985 | [[package]] 986 | name = "schannel" 987 | version = "0.1.17" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | dependencies = [ 990 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 991 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 992 | ] 993 | 994 | [[package]] 995 | name = "scopeguard" 996 | version = "1.0.0" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | 999 | [[package]] 1000 | name = "semver" 1001 | version = "0.9.0" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | dependencies = [ 1004 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "semver-parser" 1009 | version = "0.7.0" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | 1012 | [[package]] 1013 | name = "serde" 1014 | version = "1.0.104" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | dependencies = [ 1017 | "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1018 | ] 1019 | 1020 | [[package]] 1021 | name = "serde_derive" 1022 | version = "1.0.104" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | dependencies = [ 1025 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1026 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1027 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "serde_json" 1032 | version = "1.0.47" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | dependencies = [ 1035 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1036 | "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1037 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "serde_urlencoded" 1042 | version = "0.6.1" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | dependencies = [ 1045 | "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1046 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1047 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1048 | "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "serde_yaml" 1053 | version = "0.8.11" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | dependencies = [ 1056 | "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1057 | "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 1058 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1059 | "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "shrinkwraprs" 1064 | version = "0.3.0" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | dependencies = [ 1067 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1068 | "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 1069 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1070 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1071 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "signal-hook" 1076 | version = "0.1.13" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | dependencies = [ 1079 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1080 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1081 | "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "signal-hook-registry" 1086 | version = "1.2.0" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | dependencies = [ 1089 | "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 1090 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "slab" 1095 | version = "0.4.2" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | 1098 | [[package]] 1099 | name = "sluice" 1100 | version = "0.4.2" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | dependencies = [ 1103 | "futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 1104 | "futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 1105 | "futures-io-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "smallvec" 1110 | version = "1.2.0" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | 1113 | [[package]] 1114 | name = "socket2" 1115 | version = "0.3.11" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | dependencies = [ 1118 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1119 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1120 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1121 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "sourcefile" 1126 | version = "0.1.4" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | 1129 | [[package]] 1130 | name = "strand" 1131 | version = "0.3.0" 1132 | dependencies = [ 1133 | "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", 1134 | "async-macros 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1135 | "async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 1136 | "colored 1.9.2 (registry+https://github.com/rust-lang/crates.io-index)", 1137 | "crossterm 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", 1138 | "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1139 | "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 1140 | "pbr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1141 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1142 | "serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", 1143 | "shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1144 | "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1145 | "surf 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1146 | "tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)", 1147 | "thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1148 | "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "strsim" 1153 | version = "0.8.0" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | 1156 | [[package]] 1157 | name = "structopt" 1158 | version = "0.3.9" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | dependencies = [ 1161 | "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", 1162 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1163 | "structopt-derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "structopt-derive" 1168 | version = "0.4.2" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | dependencies = [ 1171 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1172 | "proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1173 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1174 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1175 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "surf" 1180 | version = "1.0.3" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | dependencies = [ 1183 | "futures-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 1184 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 1185 | "isahc 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 1186 | "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 1187 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1188 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 1189 | "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1190 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1191 | "serde_json 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", 1192 | "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 1193 | "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1194 | "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1195 | "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", 1196 | "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "syn" 1201 | version = "1.0.14" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | dependencies = [ 1204 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1205 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1206 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1207 | ] 1208 | 1209 | [[package]] 1210 | name = "syn-mid" 1211 | version = "0.5.0" 1212 | source = "registry+https://github.com/rust-lang/crates.io-index" 1213 | dependencies = [ 1214 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1215 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1216 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "tar" 1221 | version = "0.4.26" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | dependencies = [ 1224 | "filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1225 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1226 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1227 | "xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "termion" 1232 | version = "1.5.5" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | dependencies = [ 1235 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1236 | "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1237 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1238 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "textwrap" 1243 | version = "0.11.0" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | dependencies = [ 1246 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "thiserror" 1251 | version = "1.0.10" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | dependencies = [ 1254 | "thiserror-impl 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "thiserror-impl" 1259 | version = "1.0.10" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | dependencies = [ 1262 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1263 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1264 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "time" 1269 | version = "0.1.42" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | dependencies = [ 1272 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1273 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1274 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "tokio-io" 1279 | version = "0.1.13" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | dependencies = [ 1282 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1283 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1284 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1285 | ] 1286 | 1287 | [[package]] 1288 | name = "unicase" 1289 | version = "2.6.0" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | dependencies = [ 1292 | "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "unicode-bidi" 1297 | version = "0.3.4" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | dependencies = [ 1300 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "unicode-normalization" 1305 | version = "0.1.12" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | dependencies = [ 1308 | "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "unicode-segmentation" 1313 | version = "1.6.0" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | 1316 | [[package]] 1317 | name = "unicode-width" 1318 | version = "0.1.7" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | 1321 | [[package]] 1322 | name = "unicode-xid" 1323 | version = "0.2.0" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | 1326 | [[package]] 1327 | name = "url" 1328 | version = "2.1.1" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | dependencies = [ 1331 | "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1332 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1333 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1334 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "vcpkg" 1339 | version = "0.2.8" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | 1342 | [[package]] 1343 | name = "vec_map" 1344 | version = "0.8.1" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | 1347 | [[package]] 1348 | name = "version_check" 1349 | version = "0.1.5" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | 1352 | [[package]] 1353 | name = "version_check" 1354 | version = "0.9.1" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | 1357 | [[package]] 1358 | name = "wasi" 1359 | version = "0.9.0+wasi-snapshot-preview1" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | 1362 | [[package]] 1363 | name = "wasm-bindgen" 1364 | version = "0.2.58" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | dependencies = [ 1367 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1368 | "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1369 | ] 1370 | 1371 | [[package]] 1372 | name = "wasm-bindgen-backend" 1373 | version = "0.2.58" 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" 1375 | dependencies = [ 1376 | "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1377 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1378 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1379 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1380 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1381 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1382 | "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "wasm-bindgen-futures" 1387 | version = "0.3.27" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | dependencies = [ 1390 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1391 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1392 | "futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 1393 | "futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)", 1394 | "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 1395 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1397 | "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 1398 | ] 1399 | 1400 | [[package]] 1401 | name = "wasm-bindgen-macro" 1402 | version = "0.2.58" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | dependencies = [ 1405 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1406 | "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "wasm-bindgen-macro-support" 1411 | version = "0.2.58" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | dependencies = [ 1414 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1415 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1416 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1417 | "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1418 | "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "wasm-bindgen-shared" 1423 | version = "0.2.58" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | 1426 | [[package]] 1427 | name = "wasm-bindgen-webidl" 1428 | version = "0.2.58" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | dependencies = [ 1431 | "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", 1432 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1433 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1434 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1435 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1436 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1437 | "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1438 | "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "web-sys" 1443 | version = "0.3.35" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | dependencies = [ 1446 | "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", 1447 | "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 1448 | "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1449 | "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1450 | "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "weedle" 1455 | version = "0.10.0" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | dependencies = [ 1458 | "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "winapi" 1463 | version = "0.2.8" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | 1466 | [[package]] 1467 | name = "winapi" 1468 | version = "0.3.8" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | dependencies = [ 1471 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1472 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1473 | ] 1474 | 1475 | [[package]] 1476 | name = "winapi-build" 1477 | version = "0.1.1" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | 1480 | [[package]] 1481 | name = "winapi-i686-pc-windows-gnu" 1482 | version = "0.4.0" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | 1485 | [[package]] 1486 | name = "winapi-x86_64-pc-windows-gnu" 1487 | version = "0.4.0" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | 1490 | [[package]] 1491 | name = "ws2_32-sys" 1492 | version = "0.2.1" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | dependencies = [ 1495 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1496 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "xattr" 1501 | version = "0.2.2" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | dependencies = [ 1504 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "yaml-rust" 1509 | version = "0.4.3" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | dependencies = [ 1512 | "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 1513 | ] 1514 | 1515 | [metadata] 1516 | "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" 1517 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 1518 | "checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" 1519 | "checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" 1520 | "checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 1521 | "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" 1522 | "checksum async-attributes 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "efd3d156917d94862e779f356c5acae312b08fd3121e792c857d7928c8088423" 1523 | "checksum async-macros 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "644a5a8de80f2085a1e7e57cd1544a2a7438f6e003c0790999bd43b92a77cdb2" 1524 | "checksum async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" 1525 | "checksum async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" 1526 | "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 1527 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 1528 | "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" 1529 | "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" 1530 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 1531 | "checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" 1532 | "checksum broadcaster 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c972e21e0d055a36cf73e4daae870941fe7a8abcd5ac3396aab9e4c126bd87" 1533 | "checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" 1534 | "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" 1535 | "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 1536 | "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" 1537 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 1538 | "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" 1539 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1540 | "checksum colored 1.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8815e2ab78f3a59928fc32e141fbeece88320a240e43f47b2fd64ea3a88a5b3d" 1541 | "checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 1542 | "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" 1543 | "checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" 1544 | "checksum crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c" 1545 | "checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" 1546 | "checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" 1547 | "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" 1548 | "checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" 1549 | "checksum crossterm 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5750773d74a7dc612eac2ded3f55e9cdeeaa072210cd17c0192aedb48adb3618" 1550 | "checksum crossterm_winapi 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8777c700901e2d5b50c406f736ed6b8f9e43645c7e104ddb74f8bc42b8ae62f6" 1551 | "checksum curl 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06aa71e9208a54def20792d877bc663d6aae0732b9852e612c4a933177c31283" 1552 | "checksum curl-sys 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)" = "0c38ca47d60b86d0cc9d42caa90a0885669c2abc9791f871c81f58cdf39e979b" 1553 | "checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" 1554 | "checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" 1555 | "checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" 1556 | "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" 1557 | "checksum filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1ff6d4dab0aa0c8e6346d46052e93b13a16cf847b54ed357087c35011048cc7d" 1558 | "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" 1559 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1560 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1561 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1562 | "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" 1563 | "checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" 1564 | "checksum futures-channel-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "d5e5f4df964fa9c1c2f8bddeb5c3611631cacd93baf810fc8bb2fb4b495c263a" 1565 | "checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" 1566 | "checksum futures-core-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" 1567 | "checksum futures-executor-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "75236e88bd9fe88e5e8bfcd175b665d0528fe03ca4c5207fabc028c8f9d93e98" 1568 | "checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" 1569 | "checksum futures-io-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "f4914ae450db1921a56c91bde97a27846287d062087d4a652efc09bb3a01ebda" 1570 | "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" 1571 | "checksum futures-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3b1dce2a0267ada5c6ff75a8ba864b4e679a9e2aa44262af7a3b5516d530d76e" 1572 | "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" 1573 | "checksum futures-sink-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "86f148ef6b69f75bb610d4f9a2336d4fc88c4b5b67129d1a340dd0fd362efeec" 1574 | "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" 1575 | "checksum futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" 1576 | "checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" 1577 | "checksum futures-util-preview 0.3.0-alpha.19 (registry+https://github.com/rust-lang/crates.io-index)" = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" 1578 | "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" 1579 | "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 1580 | "checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" 1581 | "checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" 1582 | "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" 1583 | "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 1584 | "checksum isahc 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "17b77027f12e53ae59a379f7074259d32eb10867e6183388020e922832d9c3fb" 1585 | "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" 1586 | "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" 1587 | "checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" 1588 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1589 | "checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" 1590 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1591 | "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" 1592 | "checksum libnghttp2-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02254d44f4435dd79e695f2c2b83cd06a47919adea30216ceaf0c57ca0a72463" 1593 | "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" 1594 | "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" 1595 | "checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" 1596 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 1597 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1598 | "checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" 1599 | "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" 1600 | "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1601 | "checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" 1602 | "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" 1603 | "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" 1604 | "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" 1605 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1606 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1607 | "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" 1608 | "checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" 1609 | "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" 1610 | "checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" 1611 | "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 1612 | "checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" 1613 | "checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" 1614 | "checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" 1615 | "checksum pbr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4403eb718d70c03ee279e51737782902c68cca01e870a33b6a2f9dfb50b9cd83" 1616 | "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1617 | "checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" 1618 | "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" 1619 | "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" 1620 | "checksum proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "875077759af22fa20b610ad4471d8155b321c89c3f2785526c9839b099be4e0a" 1621 | "checksum proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c5717d9fa2664351a01ed73ba5ef6df09c01a521cb42cb65a061432a826f3c7a" 1622 | "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" 1623 | "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" 1624 | "checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" 1625 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 1626 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 1627 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 1628 | "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" 1629 | "checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" 1630 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1631 | "checksum rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" 1632 | "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" 1633 | "checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" 1634 | "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" 1635 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1636 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1637 | "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" 1638 | "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" 1639 | "checksum serde_json 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "15913895b61e0be854afd32fd4163fcd2a3df34142cf2cb961b310ce694cbf90" 1640 | "checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" 1641 | "checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35" 1642 | "checksum shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" 1643 | "checksum signal-hook 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "10b9f3a1686a29f53cfd91ee5e3db3c12313ec02d33765f02c1a9645a1811e2c" 1644 | "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" 1645 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1646 | "checksum sluice 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7d06dfb3e8743bc19e6de8a302277471d08077d68946b307280496dc5a3531" 1647 | "checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" 1648 | "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" 1649 | "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" 1650 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1651 | "checksum structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "a1bcbed7d48956fcbb5d80c6b95aedb553513de0a1b451ea92679d999c010e98" 1652 | "checksum structopt-derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "095064aa1f5b94d14e635d0a5684cf140c43ae40a0fd990708d38f5d669e5f64" 1653 | "checksum surf 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "741a8008f8a833ef16f47df94a30754478fb2c2bf822b9c2e6f7f09203b97ace" 1654 | "checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" 1655 | "checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" 1656 | "checksum tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)" = "b3196bfbffbba3e57481b6ea32249fbaf590396a52505a2615adbb79d9d826d3" 1657 | "checksum termion 1.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c22cec9d8978d906be5ac94bceb5a010d885c626c4c8855721a4dbd20e3ac905" 1658 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1659 | "checksum thiserror 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "205684fd018ca14432b12cce6ea3d46763311a571c3d294e71ba3f01adcf1aad" 1660 | "checksum thiserror-impl 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "57e4d2e50ca050ed44fb58309bdce3efa79948f84f9993ad1978de5eebdce5a7" 1661 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1662 | "checksum tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" 1663 | "checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1664 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1665 | "checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" 1666 | "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" 1667 | "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" 1668 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 1669 | "checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" 1670 | "checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" 1671 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 1672 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1673 | "checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" 1674 | "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1675 | "checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" 1676 | "checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" 1677 | "checksum wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)" = "83420b37346c311b9ed822af41ec2e82839bfe99867ec6c54e2da43b7538771c" 1678 | "checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" 1679 | "checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" 1680 | "checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" 1681 | "checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" 1682 | "checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" 1683 | "checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" 1684 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1685 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 1686 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1687 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1688 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1689 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1690 | "checksum xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" 1691 | "checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d" 1692 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "strand" 3 | version = "0.4.0" 4 | authors = ["Aramis Razzaghipour "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | anyhow = "1" 11 | async-macros = "2" 12 | async-std = { version = "1", features = ["attributes", "unstable"] } 13 | colored = "1" 14 | crossterm = "0.14" 15 | dirs = "2" 16 | flate2 = "1" 17 | pbr = "1" 18 | serde = { version = "1", features = ["derive"] } 19 | shrinkwraprs = "0.3" 20 | structopt = "0.3" 21 | surf = "1" 22 | tar = "0.4" 23 | thiserror = "1" 24 | url = { version = "2", features = ["serde"] } 25 | yaml = { version = "0.8", package = "serde_yaml" } 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2020, Aramis Razzaghipour 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

vim-strand

2 |

3 | 4 |

5 | 6 |

strand installing thirty-one plugins concurrently.

7 | 8 | [![Actions Status](https://github.com/arzg/vim-strand/workflows/CI/badge.svg)](https://github.com/arzg/vim-strand/actions) 9 | 10 | A barebones plugin manager for Vim in Rust that takes advantage of Vim’s packages feature. Its (very ambitious) goal is to provide the fastest out-of-the-box fresh plugin installation of all Vim plugin managers. 11 | 12 | ## Installation 13 | 14 | ### With Homebrew 15 | 16 | If you’re using [Homebrew](https://brew.sh), installation is as easy as: 17 | 18 | ```bash 19 | $ brew tap arzg/homebrew-vim-strand 20 | $ brew install strand 21 | ``` 22 | 23 | ### From Releases 24 | 25 | This is the recommended method for most users, as it allows you to skip the step of installing Rust and compiling strand yourself. Simply hop over to [the latest Release](https://github.com/arzg/vim-strand/releases/latest) and download the binary appropriate to your machine. (Note that the `ubuntu-latest` binary also supports other Linux distributions). 26 | 27 | ### From source 28 | 29 | If your OS is not catered to in the Releases section, you will have to clone and compile strand yourself. This means you will need Rust installed on your system. If you don’t have it already I recommend using [rustup](https://rustup.rs). Once you have Rust installed, run the following commands from inside your clone of this repo: 30 | 31 | ```bash 32 | > git checkout $(git describe --tags $(git rev-list --tags --max-count 1)) 33 | > RUSTFLAGS='--codegen target-cpu=native' cargo install --force --path . 34 | ``` 35 | 36 | This first checks out the last tag (stable version) of the repository, and then compiles it with optimisations specific to your native CPU architecture, finally installing the generated binary to `~/.cargo/bin/strand` for your personal use. 37 | 38 | ## Usage 39 | 40 | The first thing you need to do to get started with strand is to set up a configuration file – strand uses the YAML format. Put it in the location specified by `strand --config-location`. Here is an example: 41 | 42 | ```yaml 43 | plugin_dir: ~/.vim/pack/strand/start 44 | 45 | plugins: 46 | # GitHub, GitLab and Bitbucket repos are all fully supported 47 | - Git: github@tpope/vim-surround 48 | - Git: gitlab@YaBoiBurner/vim-quantum 49 | - Git: bitbucket@vim-plugins-mirror/vim-surround 50 | 51 | # GitHub is the default Git provider, so ‘github@’ can be elided: 52 | - Git: tpope/vim-endwise 53 | 54 | - Git: gitlab@YaBoiBurner/vim-quantum:new-styles # Specify a branch name, 55 | - Git: tpope/vim-unimpaired:v2.0 # a tag name, 56 | - Git: romainl/vim-qf:4a97465 # or a commit hash. 57 | 58 | # Or just the URL of a tar.gz archive 59 | - Archive: https://codeload.github.com/romainl/vim-qlist/tar.gz/master 60 | ``` 61 | 62 | When you run `strand` in your shell, the specified `plugin_dir` is completely emptied, after which all the plugins in the config file are installed afresh. This property allows you to run `strand` when you want to update your plugins or when you have removed a plugin from your config file and want it gone – all from one command. 63 | 64 | The same syntax for specifying plugins also applies to the `install` subcommand, to which you can provide a list of plugins to temporarily install: 65 | 66 | ```bash 67 | > strand install github@romainl/vim-qf:4a97465 https://codeload.github.com/romainl/vim-qlist/tar.gz/master 68 | ``` 69 | 70 | The next time you run `strand` these plugins will be removed (unless they are in your config file). 71 | 72 | ## Philosophy 73 | 74 | To keep the plugin manager as simple as possible, it only provides one function: re-installing the entire plugin directory each time. This avoids the need for a `clean` command and an `update` command. For maximum speed, strand is written in Rust, using the wonderful [async-std](https://github.com/async-rs/async-std) library for concurrent task support. Additionally, instead of cloning Git repositories by either shelling out to `git` or using a Git binding, strand essentially acts as a parallel `tar.gz` downloader, making use of the automated compressed archive generation of Git hosting providers like GitHub and Bitbucket to avoid downloading extraneous Git info. (This can also be partially achieved with `git clone --depth=1`, but this AFAIK is not compressed like `tar.gz` is.) 75 | 76 | ## Motivation 77 | 78 | Once I realised that I barely utilised the more advanced features of Vim plugin managers like [vim-plug](https://github.com/junegunn/vim-plug), I decided to start developing [a small script](https://gist.github.com/arzg/64fcf8601b97e084ec5681c97f292b1a) to maintain my Vim plugin collection. Conveniently, Vim had just recently gotten support for Pathogen-like `runtimepath` management (`:help packages`), meaning that plugin managers now had only one job – downloading and updating plugins. So far the only plugin manager I’ve seen that takes advantage of packages is [minpac](https://github.com/k-takata/minpac). At one point that duct taped-together script from earlier would download plugins asynchronously using Bash’s job control (`&` and `wait`), leading to very fast install times. To keep things simple, the script just had a hard-coded list of plugins in an array that it would re-download fully each time, instead of keeping track of which plugins still needed to be installed or which plugins needed updating. I decided to rewrite the script in Rust to learn about its async IO capabilities and get better at the language. 79 | 80 | ## Prior art 81 | 82 | - [Pack](https://github.com/maralla/pack) 83 | - [vim-plug](https://github.com/junegunn/vim-plug) 84 | - [minpac](https://github.com/k-takata/minpac) 85 | -------------------------------------------------------------------------------- /profiles/.gitignore: -------------------------------------------------------------------------------- 1 | profile_log 2 | -------------------------------------------------------------------------------- /profiles/profile.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # cd into the directory the script is being run from 4 | cd "$(dirname $0)" 5 | 6 | tmp_dir="$(mktemp -d)" 7 | 8 | # Back up both the Vim config and the strand config into a temporary folder if 9 | # they exist. 10 | strand_config="$(strand --config-location)" 11 | orig_strand_config="$tmp_dir/strand_config" 12 | vim_config="$HOME/.vim" 13 | orig_vim_config="$tmp_dir/vim" 14 | 15 | [ -e "$strand_config" ] && mv "$strand_config" "$orig_strand_config" 16 | [ -e "$vim_config" ] && mv "$vim_config" "$orig_vim_config" 17 | 18 | mkdir "$vim_config" 19 | 20 | # Create a strand config with a random set of plugins, one of which is specified 21 | # for vim-plug in run_profile.vim. 22 | echo ' 23 | --- 24 | plugin_dir: ~/.vim/pack/strand/start 25 | 26 | plugins: 27 | - Git: PeterRincker/vim-searchlight 28 | - Git: cakebaker/scss-syntax.vim 29 | - Git: cespare/vim-toml 30 | - Git: christoomey/vim-tmux-navigator 31 | - Git: cocopon/inspecthi.vim 32 | - Git: hail2u/vim-css3-syntax 33 | - Git: jonathanfilip/vim-lucius 34 | - Git: junegunn/fzf.vim 35 | - Git: junegunn/vim-easy-align 36 | - Git: justinmk/vim-dirvish 37 | - Git: kana/vim-textobj-user 38 | - Git: kh3phr3n/python-syntax 39 | - Git: lifepillar/vim-colortemplate 40 | - Git: lifepillar/vim-mucomplete 41 | - Git: othree/html5.vim 42 | - Git: pangloss/vim-javascript 43 | - Git: reedes/vim-textobj-quote 44 | - Git: romainl/vim-cool 45 | - Git: romainl/vim-qf 46 | - Git: rust-lang/rust.vim 47 | - Git: sgur/vim-editorconfig 48 | - Git: tmsvg/pear-tree 49 | - Git: tmux-plugins/vim-tmux 50 | - Git: tpope/vim-commentary 51 | - Git: tpope/vim-endwise 52 | - Git: tpope/vim-fugitive 53 | - Git: tpope/vim-git 54 | - Git: tpope/vim-markdown 55 | - Git: tpope/vim-repeat 56 | - Git: tpope/vim-surround 57 | - Git: tpope/vim-unimpaired 58 | - Git: wellle/targets.vim 59 | ' > "$strand_config" 60 | 61 | # Install vim-plug before running the profile 62 | curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ 63 | https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 64 | 65 | # Run the profile harness without sourcing the user’s vimrc 66 | vim -Nu NORC '+source profile_harness.vim' 67 | 68 | # Output the log to the user 69 | cat profile_log 70 | 71 | # Restore the original config files 72 | [ -e "$orig_strand_config" ] && mv "$orig_strand_config" "$strand_config" 73 | [ -e "$orig_vim_config" ] && rm -rf "$vim_config" && mv "$orig_vim_config" "$vim_config" 74 | -------------------------------------------------------------------------------- /profiles/profile_harness.vim: -------------------------------------------------------------------------------- 1 | let s:log_file = 'profile_log' 2 | 3 | execute 'profile start ' . s:log_file 4 | profile file run_profile.vim 5 | source run_profile.vim 6 | qall 7 | -------------------------------------------------------------------------------- /profiles/run_profile.vim: -------------------------------------------------------------------------------- 1 | let s:vim_plug_dir = '~/.vim/plugged' 2 | 3 | call plug#begin(s:vim_plug_dir) 4 | Plug 'tpope/vim-surround' 5 | call plug#end() 6 | 7 | let s:iters = 10 8 | 9 | function! TestStrand() abort 10 | echo system('strand &> /dev/null') 11 | endfunction 12 | 13 | function! ClearVimPlugDir() abort 14 | echo system('rm -r ' . s:vim_plug_dir) 15 | endfunction 16 | 17 | function! TestVimPlug() abort 18 | PlugInstall --sync 19 | endfunction 20 | 21 | for i in range(s:iters) 22 | call TestStrand() 23 | call TestVimPlug() 24 | call ClearVimPlugDir() 25 | endfor 26 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{bail, Result}; 2 | use async_std::{sync, task}; 3 | use serde::Deserialize; 4 | use shrinkwraprs::Shrinkwrap; 5 | use std::{ 6 | convert::TryFrom, 7 | fmt, 8 | path::{Path, PathBuf}, 9 | str::FromStr, 10 | time::Duration, 11 | }; 12 | use thiserror::Error; 13 | use url::Url; 14 | 15 | fn get_home_dir() -> PathBuf { 16 | use std::process; 17 | 18 | match dirs::home_dir() { 19 | Some(dir) => dir, 20 | None => { 21 | eprintln!("Error: could not locate home directory -- exiting."); 22 | process::exit(1); 23 | } 24 | } 25 | } 26 | 27 | pub fn get_config_dir() -> PathBuf { 28 | #[cfg(target_os = "macos")] 29 | let dir = match std::env::var_os("XDG_CONFIG_HOME") { 30 | Some(dir) => PathBuf::from(dir), 31 | None => get_home_dir().join(".config"), 32 | }; 33 | 34 | #[cfg(not(target_os = "macos"))] 35 | let dir = match dirs::config_dir() { 36 | Some(dir) => dir, 37 | None => { 38 | eprintln!("Error: could not locate config directory -- exiting."); 39 | std::process::exit(1); 40 | } 41 | }; 42 | 43 | dir.join("strand") 44 | } 45 | 46 | fn expand_path(path: &Path) -> PathBuf { 47 | use std::path::Component; 48 | 49 | if path.starts_with("~") { 50 | let mut components: Vec<_> = path.components().collect(); 51 | let home_dir = get_home_dir().into_os_string(); 52 | 53 | // Remove the tilde and add in its place the home directory. 54 | components.remove(0); 55 | components.insert(0, Component::Normal(&home_dir)); 56 | 57 | // Join the components back into a single unified PathBuf. 58 | let mut path = PathBuf::new(); 59 | components.iter().for_each(|segment| path.push(segment)); 60 | 61 | path 62 | } else { 63 | path.into() 64 | } 65 | } 66 | 67 | #[derive(Deserialize)] 68 | pub enum GitProvider { 69 | GitHub, 70 | GitLab, 71 | Bitbucket, 72 | } 73 | 74 | #[derive(Error, Debug)] 75 | pub enum GitProviderParseError { 76 | #[error("Git provider {0} not recognised -- try ‘github’, ‘gitlab’ or ‘bitbucket’ instead")] 77 | UnknownProvider(String), 78 | } 79 | 80 | impl FromStr for GitProvider { 81 | type Err = GitProviderParseError; 82 | 83 | fn from_str(s: &str) -> Result { 84 | match s { 85 | "github" => Ok(GitProvider::GitHub), 86 | "gitlab" => Ok(GitProvider::GitLab), 87 | "bitbucket" => Ok(GitProvider::Bitbucket), 88 | _ => Err(Self::Err::UnknownProvider(s.into())), 89 | } 90 | } 91 | } 92 | 93 | // git_ref can be a branch name, tag name, or commit hash. 94 | #[derive(Deserialize)] 95 | #[serde(try_from = "String")] 96 | pub struct GitRepo { 97 | provider: GitProvider, 98 | user: String, 99 | repo: String, 100 | git_ref: String, 101 | } 102 | 103 | impl TryFrom<&GitRepo> for Url { 104 | type Error = url::ParseError; 105 | 106 | fn try_from(gr: &GitRepo) -> Result { 107 | Url::parse(&match gr.provider { 108 | GitProvider::GitHub => format!( 109 | "https://codeload.github.com/{}/{}/tar.gz/{}", 110 | gr.user, gr.repo, gr.git_ref 111 | ), 112 | GitProvider::GitLab => format!( 113 | "https://gitlab.com/{0}/{1}/-/archive/{2}/{0}-{2}.tar.gz", 114 | gr.user, gr.repo, gr.git_ref 115 | ), 116 | GitProvider::Bitbucket => format!( 117 | "https://bitbucket.org/{}/{}/get/{}.tar.gz", 118 | gr.user, gr.repo, gr.git_ref 119 | ), 120 | }) 121 | } 122 | } 123 | 124 | impl fmt::Display for GitRepo { 125 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 126 | write!(f, "{}", self.repo) 127 | } 128 | } 129 | 130 | #[derive(Error, Debug)] 131 | pub enum GitRepoParseError { 132 | #[error("no user was found")] 133 | MissingUser, 134 | #[error("failed to parse Git provider")] 135 | ProviderParse(#[from] GitProviderParseError), 136 | } 137 | 138 | fn split_on_pattern<'a>(s: &'a str, pattern: &str, i: &mut usize) -> Option<&'a str> { 139 | s.find(pattern).map(|x| { 140 | *i += x; 141 | let result = &s[..x]; 142 | *i += pattern.len(); // Skip the pattern we matched on. 143 | 144 | result 145 | }) 146 | } 147 | 148 | impl FromStr for GitRepo { 149 | type Err = GitRepoParseError; 150 | 151 | // TODO: Refactor to remove the index and mutate a slice instead. 152 | fn from_str(input: &str) -> Result { 153 | // Index through the input’s characters so that we can ignore the part that has already 154 | // been parsed. 155 | let mut i = 0; 156 | 157 | // Default to GitHub when the provider is elided. 158 | let provider = split_on_pattern(&input, "@", &mut i) 159 | .map_or(Ok(GitProvider::GitHub), GitProvider::from_str)?; 160 | 161 | let user = 162 | split_on_pattern(&input[i..], "/", &mut i).ok_or_else(|| Self::Err::MissingUser)?; 163 | 164 | // When the ‘:’ signifier for a Git reference is found, the part preceding it must be the 165 | // repo name and the part after the Git reference. If it is not found, the rest of ‘input’ 166 | // must be the repo name, in this case using ‘master’ as the default Git reference. 167 | // 168 | // FIXME: Some repos have something different to ‘master’ as their default branch. Handle 169 | // this somehow. 170 | let (repo, git_ref) = match split_on_pattern(&input[i..], ":", &mut i) { 171 | Some(repo) => (repo, &input[i..]), 172 | None => (&input[i..], "master"), 173 | }; 174 | 175 | Ok(Self { 176 | provider, 177 | user: user.into(), 178 | repo: repo.into(), 179 | git_ref: git_ref.into(), 180 | }) 181 | } 182 | } 183 | 184 | impl TryFrom for GitRepo { 185 | type Error = GitRepoParseError; 186 | 187 | fn try_from(s: String) -> Result { 188 | Self::from_str(&s) 189 | } 190 | } 191 | 192 | #[derive(Deserialize, Shrinkwrap)] 193 | pub struct ArchivePlugin(Url); 194 | 195 | impl fmt::Display for ArchivePlugin { 196 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 197 | write!(f, "{}", *self) 198 | } 199 | } 200 | 201 | impl FromStr for ArchivePlugin { 202 | type Err = url::ParseError; 203 | 204 | fn from_str(s: &str) -> Result { 205 | Url::from_str(s).map(ArchivePlugin) 206 | } 207 | } 208 | 209 | enum InstallStateKind { 210 | Downloading, 211 | Extracting, 212 | Installed, 213 | Retry(u32), 214 | Error(anyhow::Error), 215 | } 216 | 217 | impl fmt::Display for InstallStateKind { 218 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 219 | use colored::*; 220 | 221 | match self { 222 | InstallStateKind::Downloading => write!(f, "{}", "Downloading".cyan().bold()), 223 | InstallStateKind::Extracting => write!(f, " {}", "Extracting".blue().bold()), 224 | InstallStateKind::Installed => write!(f, "✓ {}", "Installed".green().bold()), 225 | InstallStateKind::Retry(i) => { 226 | write!(f, " {}: attempt #{} of", "Retry".yellow().bold(), i) 227 | } 228 | InstallStateKind::Error(e) => write!(f, "× {}: {}", "Error".red().bold(), e), 229 | } 230 | } 231 | } 232 | 233 | struct InstallState { 234 | status: InstallStateKind, 235 | name: String, 236 | } 237 | 238 | impl fmt::Display for InstallState { 239 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 240 | write!(f, "{} {}", self.status, self.name) 241 | } 242 | } 243 | 244 | #[derive(Deserialize)] 245 | pub enum Plugin { 246 | Git(GitRepo), 247 | Archive(ArchivePlugin), 248 | } 249 | 250 | impl fmt::Display for Plugin { 251 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 252 | match self { 253 | Plugin::Git(plugin) => write!(f, "{}", plugin), 254 | Plugin::Archive(plugin) => write!(f, "{}", plugin), 255 | } 256 | } 257 | } 258 | 259 | impl TryFrom<&Plugin> for Url { 260 | type Error = url::ParseError; 261 | 262 | fn try_from(p: &Plugin) -> Result { 263 | match p { 264 | Plugin::Git(gr) => Url::try_from(gr), 265 | Plugin::Archive(a) => Ok((*a).clone()), 266 | } 267 | } 268 | } 269 | 270 | #[derive(Error, Debug)] 271 | pub enum PluginParseError { 272 | #[error("failed to parse Git repo: {0}")] 273 | GitParse(#[from] GitRepoParseError), 274 | #[error("failed to parse archive plugin: {0}")] 275 | ArchiveParse(#[from] url::ParseError), 276 | } 277 | 278 | impl FromStr for Plugin { 279 | type Err = PluginParseError; 280 | 281 | fn from_str(s: &str) -> Result { 282 | ArchivePlugin::from_str(s) 283 | .map(Plugin::Archive) 284 | .or_else(|_| GitRepo::from_str(s).map(Plugin::Git).map_err(|e| e.into())) 285 | } 286 | } 287 | 288 | async fn recv_bytes_retry( 289 | url: &str, 290 | s: &sync::Sender, 291 | name: &str, 292 | ) -> Result> { 293 | let mut attempts = 0; 294 | let max_attempts = 5; 295 | 296 | // Try downloading five times before giving up. 297 | loop { 298 | match surf::get(url).recv_bytes().await { 299 | Ok(response) => return Ok(response), 300 | Err(_) if attempts < max_attempts => attempts += 1, 301 | Err(e) => bail!("failed retrieving contents at URL {}: {}", url, e), 302 | } 303 | 304 | s.send(InstallState { 305 | status: InstallStateKind::Retry(attempts), 306 | name: name.into(), 307 | }) 308 | .await; 309 | 310 | task::sleep(Duration::from_secs(2)).await; // Sleep for two seconds between attempts. 311 | } 312 | } 313 | 314 | impl Plugin { 315 | async fn install(&self, path: PathBuf, s: sync::Sender) -> Result<()> { 316 | use anyhow::Context; 317 | 318 | let name = self.to_string(); 319 | 320 | s.send(InstallState { 321 | status: InstallStateKind::Downloading, 322 | name: name.clone(), 323 | }) 324 | .await; 325 | 326 | let recv_bytes = recv_bytes_retry(&Url::try_from(self)?.as_str(), &s, &name) 327 | .await 328 | .with_context(|| "failed downloading plugin")?; 329 | 330 | if b"404: Not Found\n" == recv_bytes.as_slice() { 331 | bail!("plugin does not exist (404)"); 332 | } 333 | 334 | s.send(InstallState { 335 | status: InstallStateKind::Extracting, 336 | name: name.clone(), 337 | }) 338 | .await; 339 | 340 | decompress_tar_gz(&recv_bytes, &path) 341 | .with_context(|| "failed to extract plugin archive")?; 342 | 343 | s.send(InstallState { 344 | status: InstallStateKind::Installed, 345 | name, 346 | }) 347 | .await; 348 | 349 | Ok(()) 350 | } 351 | } 352 | 353 | #[derive(Deserialize)] 354 | pub struct Config { 355 | pub plugin_dir: PathBuf, 356 | pub plugins: Vec, 357 | } 358 | 359 | pub async fn get_config(config_file: &Path) -> Result { 360 | use async_std::fs; 361 | 362 | let config = fs::read_to_string(config_file).await?; 363 | let mut config: Config = yaml::from_str(&config)?; 364 | config.plugin_dir = expand_path(&config.plugin_dir); 365 | 366 | Ok(config) 367 | } 368 | 369 | fn decompress_tar_gz(bytes: &[u8], path: &Path) -> Result<()> { 370 | use flate2::read::GzDecoder; 371 | use tar::Archive; 372 | 373 | let tar = GzDecoder::new(bytes); 374 | let mut archive = Archive::new(tar); 375 | archive.unpack(path)?; 376 | 377 | Ok(()) 378 | } 379 | 380 | pub async fn install_plugins(plugins: Vec, dir: PathBuf) -> Result<()> { 381 | use pbr::MultiBar; 382 | 383 | let mut tasks = Vec::with_capacity(plugins.len()); 384 | let mut multi = MultiBar::new(); // Holds the spinners of all plugins 385 | 386 | plugins.into_iter().for_each(|p| { 387 | // We have to make a fresh clone of ‘dir’ for each plugin so that the task’s future stays 388 | // 'static. 389 | let dir = dir.clone(); 390 | 391 | // Create a new spinner connected to the MultiBar that shows only the spinner itself and the 392 | // message we set. 393 | let mut spinner = multi.create_bar(0); 394 | spinner.show_bar = false; 395 | spinner.show_counter = false; 396 | spinner.show_percent = false; 397 | spinner.show_speed = false; 398 | spinner.show_time_left = false; 399 | spinner.tick_format("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"); // Nice spinner characters. 400 | 401 | // Channel to communicate between the ticker task and the plugin installation task. 402 | let (s, r): (_, sync::Receiver) = sync::channel(1); 403 | 404 | tasks.push(task::spawn(async move { 405 | let ticker = task::spawn(async move { 406 | // Tick the spinner every fifty milliseconds until the plugin has finished 407 | // installing or an error occurs. 408 | loop { 409 | if r.is_full() { 410 | let install_state = r.recv().await.unwrap(); 411 | let msg = format!("{} ", install_state); 412 | 413 | if let InstallStateKind::Installed | InstallStateKind::Error(_) = 414 | install_state.status 415 | { 416 | spinner.finish_print(&msg); 417 | break; 418 | } else { 419 | spinner.message(&msg); 420 | } 421 | } 422 | 423 | spinner.tick(); 424 | task::sleep(Duration::from_millis(50)).await; 425 | } 426 | }); 427 | 428 | // If the plugin install fails we send the error that occurred to the spinner for 429 | // display to the user. 430 | let install = task::spawn(async move { 431 | if let Err(e) = p.install(dir, s.clone()).await { 432 | s.send(InstallState { 433 | status: InstallStateKind::Error(e), 434 | name: p.to_string(), 435 | }) 436 | .await; 437 | } 438 | }); 439 | 440 | ticker.await; 441 | install.await; 442 | })); 443 | }); 444 | 445 | // Start listening for spinner activity just before the plugins’ installation is commenced. 446 | multi.listen(); 447 | 448 | for task in tasks { 449 | task.await; 450 | } 451 | 452 | Ok(()) 453 | } 454 | 455 | #[cfg(test)] 456 | mod tests { 457 | use super::*; 458 | 459 | #[test] 460 | fn test_expand_path() { 461 | let home_dir = get_home_dir(); 462 | 463 | assert_eq!( 464 | expand_path(Path::new("~/foo.txt")), 465 | home_dir.join("foo.txt") 466 | ); 467 | 468 | assert_eq!( 469 | expand_path(Path::new("/home/person/foo.txt")), 470 | PathBuf::from("/home/person/foo.txt") 471 | ); 472 | 473 | assert_eq!( 474 | expand_path(Path::new("~/bar/baz/quux/foo.txt")), 475 | home_dir.join("bar/baz/quux/foo.txt") 476 | ); 477 | } 478 | } 479 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use async_std::fs; 3 | use std::path::Path; 4 | use strand::Plugin; 5 | use structopt::StructOpt; 6 | 7 | #[derive(StructOpt)] 8 | struct Opts { 9 | /// Prints out the config file location 10 | #[structopt(long)] 11 | config_location: bool, 12 | 13 | #[structopt(subcommand)] 14 | subcommand: Option, 15 | } 16 | 17 | #[derive(StructOpt)] 18 | enum Subcommand { 19 | /// Install a specific plugin without adding it to the config file 20 | #[structopt(name = "install")] 21 | Install { 22 | /// A list of plugins to install and add to the config file 23 | // require at least one Plugin in the Vec 24 | #[structopt(name = "PLUGINS", required = true)] 25 | plugins: Vec, 26 | }, 27 | } 28 | 29 | #[async_std::main] 30 | async fn main() -> Result<()> { 31 | use crossterm::{cursor, ExecutableCommand}; 32 | 33 | let mut stdout = std::io::stdout(); 34 | stdout.execute(cursor::Hide)?; 35 | 36 | let opts = Opts::from_args(); 37 | 38 | let config_dir = strand::get_config_dir(); 39 | let config_path = config_dir.join("config.yaml"); 40 | 41 | // We do this before loading the config file because loading it is not actually needed to 42 | // display the config file’s location. 43 | if opts.config_location { 44 | println!("{}", config_path.display()); 45 | return Ok(()); 46 | } 47 | 48 | let config = strand::get_config(&config_path).await?; 49 | 50 | // Install all plugins specified by the install subcommand. 51 | if let Some(Subcommand::Install { plugins }) = opts.subcommand { 52 | strand::install_plugins(plugins, config.plugin_dir).await?; 53 | return Ok(()); // Early return since we don’t need to install plugins from the config file. 54 | } 55 | 56 | // Clean out the plugin directory before installing. 57 | ensure_empty_dir(&config.plugin_dir).await?; 58 | strand::install_plugins(config.plugins, config.plugin_dir).await?; 59 | 60 | stdout.execute(cursor::Show)?; 61 | 62 | Ok(()) 63 | } 64 | 65 | async fn remove_path(path: &Path) -> Result<()> { 66 | if fs::metadata(path).await?.is_dir() { 67 | fs::remove_dir_all(path).await?; 68 | } else { 69 | fs::remove_file(path).await?; 70 | } 71 | 72 | Ok(()) 73 | } 74 | 75 | async fn ensure_empty_dir(path: &Path) -> Result<()> { 76 | if path.exists() { 77 | remove_path(path).await?; 78 | } 79 | 80 | fs::create_dir_all(path).await?; 81 | 82 | Ok(()) 83 | } 84 | --------------------------------------------------------------------------------