mirror of
https://github.com/bootandy/dust.git
synced 2026-06-08 11:29:05 +03:00
Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ab46d8471 | |||
| c727eb2d11 | |||
| 0effaa7fd7 | |||
| 25c50f88c4 | |||
| 0c19a66432 | |||
| 4cffc4370b | |||
| db6c8a019d | |||
| e03094a4fa | |||
| 1d9a56e025 | |||
| ec2d9e19d4 | |||
| 9fbfcb275a | |||
| 1c60d1e2ac | |||
| fd35734a94 | |||
| c6f4ace2b6 | |||
| d46b63fad8 | |||
| 872a49bb7d | |||
| 04c6c204c3 | |||
| 7ac01e8166 | |||
| 2f7a88e8dc | |||
| 2ca2cebdad | |||
| 80338f4731 | |||
| d327bd2e68 | |||
| 7db6cf2f32 | |||
| 76d0762c97 | |||
| 6e03dd77e6 | |||
| 4906e9efda | |||
| 876609f2cb | |||
| 12775db94b | |||
| bfaf5ee173 | |||
| fd68330815 | |||
| 0bf4ebf554 | |||
| cab24f58d5 | |||
| b1b933d851 | |||
| 6a86e8befd | |||
| 3fb91a6c29 | |||
| 51561994c5 | |||
| ce0e14bf00 | |||
| dd75ec4aa7 | |||
| 65cd42736a | |||
| 4792e97177 | |||
| 3e9f09e339 | |||
| dba465a094 | |||
| 25d1ee7b43 | |||
| 2556885622 | |||
| 8c088a7026 | |||
| 39db8b86fd | |||
| c5830c5d00 | |||
| b68c450710 | |||
| 6e2e5761d8 | |||
| 6842526d2c | |||
| 4ac85d7dc9 | |||
| 8170a07886 | |||
| 0f1f823736 | |||
| e6c777fb8b | |||
| 0bded9698a | |||
| c7f0ea59f0 | |||
| 6d62cfb9ae | |||
| 803934d84b | |||
| 24c97ef92f | |||
| 270edf0a76 |
@@ -5,3 +5,5 @@
|
|||||||
# These are backup files generated by rustfmt
|
# These are backup files generated by rustfmt
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
*.swp
|
*.swp
|
||||||
|
.vscode/*
|
||||||
|
*.idea/*
|
||||||
Generated
+320
-210
@@ -1,112 +1,137 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ansi_term"
|
name = "ansi_term"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "approx"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "assert_cli"
|
name = "assert_cli"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"colored 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"colored 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"environment 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"environment 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"skeptic 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"skeptic 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atty"
|
name = "atty"
|
||||||
version = "0.2.8"
|
version = "0.2.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace"
|
name = "backtrace"
|
||||||
version = "0.3.5"
|
version = "0.3.38"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-demangle 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace-sys"
|
name = "backtrace-sys"
|
||||||
version = "0.1.16"
|
version = "0.1.31"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "0.9.1"
|
version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitflags"
|
|
||||||
version = "1.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytecount"
|
name = "bytecount"
|
||||||
version = "0.2.0"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo_metadata"
|
name = "c2-chacha"
|
||||||
version = "0.3.3"
|
version = "0.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"semver 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
]
|
||||||
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"serde_json 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
[[package]]
|
||||||
|
name = "cargo_metadata"
|
||||||
|
version = "0.6.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.9"
|
version = "1.0.45"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "0.1.2"
|
version = "0.1.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cgmath"
|
||||||
|
version = "0.16.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"approx 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "2.31.1"
|
version = "2.33.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colored"
|
name = "colored"
|
||||||
version = "1.6.0"
|
version = "1.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winconsole 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -114,19 +139,15 @@ name = "difference"
|
|||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "dtoa"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "du-dust"
|
name = "du-dust"
|
||||||
version = "0.2.4"
|
version = "0.4.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"assert_cli 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"assert_cli 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clap 2.31.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tempfile 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -139,23 +160,33 @@ name = "error-chain"
|
|||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fuchsia-zircon"
|
name = "error-chain"
|
||||||
version = "0.3.3"
|
version = "0.12.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fuchsia-zircon-sys"
|
name = "fuchsia-cprng"
|
||||||
version = "0.3.3"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getrandom"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glob"
|
name = "glob"
|
||||||
version = "0.2.11"
|
version = "0.2.11"
|
||||||
@@ -163,109 +194,177 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "0.4.1"
|
version = "0.4.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "kernel32-sys"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "0.2.11"
|
version = "1.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.39"
|
version = "0.2.62"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-traits"
|
name = "num-traits"
|
||||||
version = "0.2.2"
|
version = "0.1.43"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-traits"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ppv-lite86"
|
||||||
|
version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "0.3.2"
|
version = "1.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pulldown-cmark"
|
name = "pulldown-cmark"
|
||||||
version = "0.1.2"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "0.5.1"
|
version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.4.2"
|
version = "0.4.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_hc"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rdrand"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.1.37"
|
version = "0.1.56"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "redox_termios"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "remove_dir_all"
|
name = "remove_dir_all"
|
||||||
version = "0.5.0"
|
version = "0.5.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rgb"
|
||||||
|
version = "0.8.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-demangle"
|
name = "rustc-demangle"
|
||||||
version = "0.1.7"
|
version = "0.1.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "same-file"
|
name = "same-file"
|
||||||
version = "0.1.3"
|
version = "1.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "semver"
|
name = "semver"
|
||||||
version = "0.8.0"
|
version = "0.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -275,68 +374,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.37"
|
version = "1.0.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.37"
|
version = "1.0.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive_internals 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde_derive_internals"
|
|
||||||
version = "0.23.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.13"
|
version = "1.0.41"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "skeptic"
|
name = "skeptic"
|
||||||
version = "0.13.2"
|
version = "0.13.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytecount 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytecount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cargo_metadata 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.7.0"
|
version = "0.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "0.13.1"
|
version = "1.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -344,148 +432,170 @@ name = "tempdir"
|
|||||||
version = "0.3.7"
|
version = "0.3.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"remove_dir_all 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.0.0"
|
version = "3.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"remove_dir_all 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "termion"
|
|
||||||
version = "1.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "textwrap"
|
name = "textwrap"
|
||||||
version = "0.9.0"
|
version = "0.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-width"
|
name = "unicode-width"
|
||||||
version = "0.1.4"
|
version = "0.1.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-xid"
|
name = "unicode-xid"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vec_map"
|
name = "vec_map"
|
||||||
version = "0.8.0"
|
version = "0.8.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "version_check"
|
||||||
|
version = "0.1.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "walkdir"
|
name = "walkdir"
|
||||||
version = "1.0.7"
|
version = "2.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"same-file 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "wasi"
|
||||||
version = "0.2.8"
|
version = "0.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.3.4"
|
version = "0.3.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-build"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-i686-pc-windows-gnu"
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-util"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winconsole"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cgmath 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rgb 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||||
|
"checksum approx 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08abcc3b4e9339e33a3d0a5ed15d84a687350c05689d825e0f6655eef9e76a94"
|
||||||
"checksum assert_cli 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "72342c21057a3cb5f7c2d849bf7999a83795434dd36d74fa8c24680581bd1930"
|
"checksum assert_cli 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "72342c21057a3cb5f7c2d849bf7999a83795434dd36d74fa8c24680581bd1930"
|
||||||
"checksum atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "af80143d6f7608d746df1520709e5d141c96f240b0e62b0aa41bdfb53374d9d4"
|
"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
|
||||||
"checksum backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbbf59b1c43eefa8c3ede390fcc36820b4999f7914104015be25025e0d62af2"
|
"checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"
|
||||||
"checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661"
|
"checksum backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)" = "690a62be8920ccf773ee00ef0968649b0e724cda8bd5b12286302b4ae955fdf5"
|
||||||
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b"
|
||||||
"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
|
"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2"
|
||||||
"checksum bytecount 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af27422163679dea46a1a7239dffff64d3dcdc3ba5fe9c49c789fbfe0eb949de"
|
"checksum bytecount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b92204551573580e078dc80017f36a213eb77a0450e4ddd8cfa0f3f2d1f0178f"
|
||||||
"checksum cargo_metadata 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1f56ec3e469bca7c276f2eea015aa05c5e381356febdbb0683c2580189604537"
|
"checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101"
|
||||||
"checksum cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "2b4911e4bdcb4100c7680e7e854ff38e23f1b34d4d9e079efae3da2801341ffc"
|
"checksum cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1b4d380e1bab994591a24c2bdd1b054f64b60bef483a8c598c7c345bc3bbe"
|
||||||
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
|
||||||
"checksum clap 2.31.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dc18f6f4005132120d9711636b32c46a233fad94df6217fa1d81c5e97a9f200"
|
"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||||
"checksum colored 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b0aa3473e85a3161b59845d6096b289bb577874cafeaf75ea1b1beaa6572c7fc"
|
"checksum cgmath 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "64a4b57c8f4e3a2e9ac07e0f6abc9c24b6fc9e1b54c3478cfb598f3d0023e51c"
|
||||||
|
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
|
||||||
|
"checksum colored 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6cdb90b60f2927f8d76139c72dbde7e10c3a2bc47c8594c9c7a66529f2687c03"
|
||||||
"checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8"
|
"checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8"
|
||||||
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
|
|
||||||
"checksum environment 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4b14e20978669064c33b4c1e0fb4083412e40fe56cbea2eae80fd7591503ee"
|
"checksum environment 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4b14e20978669064c33b4c1e0fb4083412e40fe56cbea2eae80fd7591503ee"
|
||||||
"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
|
"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
|
||||||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
|
"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9"
|
||||||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||||
|
"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571"
|
||||||
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
|
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
|
||||||
"checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
|
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
|
||||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
|
"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
|
||||||
"checksum libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)" = "f54263ad99207254cf58b5f701ecb432c717445ea2ee8af387334bdd1a03fdff"
|
"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
|
||||||
"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364"
|
"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
|
||||||
"checksum proc-macro2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "681c2c8e039ff358cb926dbc5151d561cbd0249089986ace39dfe8e405bb7511"
|
"checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b"
|
||||||
"checksum pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fdf85cda6cadfae5428a54661d431330b312bc767ddbc57adbedc24da66e32"
|
"checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"
|
||||||
"checksum quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0ff51282f28dc1b53fd154298feaa2e77c5ea0dba68e1fd8b03b72fbe13d2a"
|
"checksum pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eef52fac62d0ea7b9b4dc7da092aa64ea7ec3d90af6679422d3d7e0e14b6ee15"
|
||||||
"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5"
|
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
||||||
"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd"
|
"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
|
||||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
|
||||||
"checksum remove_dir_all 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfc5b3ce5d5ea144bb04ebd093a9e14e9765bcfec866aecda9b6dec43b3d1e24"
|
"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
|
||||||
"checksum rustc-demangle 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11fb43a206a04116ffd7cfcf9bcb941f8eb6cc7ff667272246b0a1c74259a3cb"
|
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
||||||
"checksum same-file 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d931a44fdaa43b8637009e7632a02adc4f2b2e0733c08caa4cf00e8da4a117a7"
|
"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
||||||
"checksum semver 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bee2bc909ab2d8d60dab26e8cad85b25d795b14603a0dcb627b78b9d30b6454b"
|
"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
|
||||||
|
"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
|
||||||
|
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
||||||
|
"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
|
||||||
|
"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
|
||||||
|
"checksum rgb 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2089e4031214d129e201f8c3c8c2fe97cd7322478a0d1cdf78e7029b0042efdb"
|
||||||
|
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||||
|
"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
|
||||||
|
"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
|
||||||
|
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
|
||||||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||||
"checksum serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "d3bcee660dcde8f52c3765dd9ca5ee36b4bf35470a738eb0bd5a8752b0389645"
|
"checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
|
||||||
"checksum serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "f1711ab8b208541fa8de00425f6a577d90f27bb60724d2bb5fd911314af9668f"
|
"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
|
||||||
"checksum serde_derive_internals 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89b340a48245bc03ddba31d0ff1709c118df90edc6adabaca4aac77aea181cce"
|
"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2"
|
||||||
"checksum serde_json 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5c508584d9913df116b91505eec55610a2f5b16e9ed793c46e4d0152872b3e74"
|
"checksum skeptic 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fb8ed853fdc19ce09752d63f3a2e5b5158aeb261520cd75eb618bd60305165"
|
||||||
"checksum skeptic 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c8431f8fca168e2db4be547bd8329eac70d095dff1444fee4b0fa0fabc7df75a"
|
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||||
"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
|
"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
|
||||||
"checksum syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "91b52877572087400e83d24b9178488541e3d535259e04ff17a63df1e5ceff59"
|
|
||||||
"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
|
"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
|
||||||
"checksum tempfile 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "439d9a7c00f98b1b5ee730039bf5b1f9203d508690e3c76b509e7ad59f8f7c99"
|
"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
|
||||||
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||||
"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
|
"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
|
||||||
"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
|
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
||||||
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
||||||
"checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
|
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||||
"checksum walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bb08f9e670fab86099470b97cd2b252d6527f0b3cc1401acdb595ffc9dd288ff"
|
"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
|
||||||
"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3"
|
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
|
||||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
|
||||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
|
||||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
"checksum winconsole 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ef84b96d10db72dd980056666d7f1e7663ce93d82fa33b63e71c966f4cf5032"
|
||||||
|
|||||||
+6
-5
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "du-dust"
|
name = "du-dust"
|
||||||
description = "A more intuitive version of du"
|
description = "A more intuitive version of du"
|
||||||
version = "0.2.4"
|
version = "0.4.0"
|
||||||
authors = ["bootandy <bootandy@gmail.com>", "nebkor <code@ardent.nebcorp.com>"]
|
authors = ["bootandy <bootandy@gmail.com>", "nebkor <code@ardent.nebcorp.com>"]
|
||||||
|
|
||||||
documentation = "https://github.com/bootandy/dust"
|
documentation = "https://github.com/bootandy/dust"
|
||||||
@@ -20,8 +20,9 @@ name = "dust"
|
|||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ansi_term = "0.11"
|
ansi_term = "=0.11"
|
||||||
clap = "2.31"
|
clap = "=2.33"
|
||||||
assert_cli = "0.5"
|
assert_cli = "=0.5"
|
||||||
tempfile = "3"
|
tempfile = "=3"
|
||||||
|
walkdir = "=2"
|
||||||
|
|
||||||
|
|||||||
@@ -1,58 +1,73 @@
|
|||||||
|
|
||||||
[](https://travis-ci.org/bootandy/dust)
|
[](https://travis-ci.org/bootandy/dust)
|
||||||
|
|
||||||
|
|
||||||
# Dust
|
# Dust
|
||||||
|
|
||||||
du + rust = dust. Like du but more intuitive
|
du + rust = dust. Like du but more intuitive
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
* Download linux / mac binary from [Releases](https://github.com/bootandy/dust/releases)
|
#### Cargo Install
|
||||||
* unzip file: tar -xvf _downloaded_file.tar.gz_
|
|
||||||
* move file to executable path: sudo mv dust /usr/local/bin/
|
* cargo install du-dust
|
||||||
|
|
||||||
|
#### Download Install
|
||||||
|
|
||||||
|
* Download linux / mac binary from [Releases](https://github.com/bootandy/dust/releases)
|
||||||
|
* unzip file: tar -xvf _downloaded_file.tar.gz_
|
||||||
|
* move file to executable path: sudo mv dust /usr/local/bin/
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
Dust is meant to give you an instant overview of which directories are using disk space without requiring sort or head. Dust will print a maximum of 1 'Did not have permissions message'.
|
Dust is meant to give you an instant overview of which directories are using disk space without requiring sort or head. Dust will print a maximum of 1 'Did not have permissions message'.
|
||||||
|
|
||||||
Dust will list the 15 biggest sub directories or files and will smartly recurse down the tree to find the larger ones. There is no need for a '-d' flag or a '-h' flag. The largest sub directory will have its size shown in *red*
|
Dust will list the 20 biggest sub directories or files and will smartly recurse down the tree to find the larger ones. There is no need for a '-d' flag or a '-h' flag. The largest sub directory will have its size shown in *red*
|
||||||
|
|
||||||
## Why?
|
## Why?
|
||||||
du has a number of ways of showing you what it finds, in terms of disk consumption, but really, there are only one or two ways you invoke it: with -h for “human readable” units, like 100G or 89k, or with -b for “bytes”. The former is generally used for a quick survey of a directory with a small number of things in it, and the latter for when you have a bunch and need to sort the output numerically, and you’re obligated to either further pass it into something like awk to turn bytes into the appropriate human-friendly unit like mega or gigabytes, or you just do some rough math in your head and use the ordering to sanity check. Then once you have the top offenders, you recurse down into the largest one and repeat the process until you’ve found your cruft or gems and can move on.
|
|
||||||
|
du has a number of ways of showing you what it finds, in terms of disk consumption, but really, there are only one or two ways you invoke it: with -h for “human readable” units, like 100G or 89k, or with -b for “bytes”. The former is generally used for a quick survey of a directory with a small number of things in it, and the latter for when you have a bunch and need to sort the output numerically, and you’re obligated to either further pass it into something like awk to turn bytes into the appropriate human-friendly unit like mega or gigabytes, or pipe thru sort and head while remembering the '-h' flag. Then once you have the top offenders, you recurse down into the largest one and repeat the process until you’ve found your cruft or gems and can move on.
|
||||||
|
|
||||||
Dust assumes that’s what you wanted to do in the first place, and takes care of tracking the largest offenders in terms of actual size, and showing them to you with human-friendly units and in-context within the filetree.
|
Dust assumes that’s what you wanted to do in the first place, and takes care of tracking the largest offenders in terms of actual size, and showing them to you with human-friendly units and in-context within the filetree.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```
|
```
|
||||||
Usage: dust <dir>
|
Usage: dust <dir>
|
||||||
Usage: dust <dir> <another_dir> <and_more>
|
Usage: dust <dir> <another_dir> <and_more>
|
||||||
|
Usage: dust -p <dir> (full-path - does not shorten the path of the subdirectories)
|
||||||
Usage: dust -s <dir> (apparent-size - shows the length of the file as opposed to the amount of disk space it uses)
|
Usage: dust -s <dir> (apparent-size - shows the length of the file as opposed to the amount of disk space it uses)
|
||||||
Usage: dust -n 30 <dir> (Shows 30 directories not 15)
|
Usage: dust -n 30 <dir> (Shows 30 directories not 20)
|
||||||
|
Usage: dust -d 3 <dir> (Shows 3 levels of subdirectories)
|
||||||
|
Usage: dust -r <dir> (Reverse order of output, with root at the lowest)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
djin:git/dust> dust
|
djin:git/dust> dust
|
||||||
65M .
|
1.2G target
|
||||||
65M └─┬ ./target
|
622M ├─┬ debug
|
||||||
49M ├─┬ ./target/debug
|
445M │ ├── deps
|
||||||
26M │ ├─┬ ./target/debug/deps
|
70M │ ├── incremental
|
||||||
21M │ │ └── ./target/debug/deps/libclap-9e6625ac8ff074ad.rlib
|
56M │ └── build
|
||||||
13M │ ├── ./target/debug/dust
|
262M ├─┬ rls
|
||||||
8.9M │ └─┬ ./target/debug/incremental
|
262M │ └─┬ debug
|
||||||
6.7M │ ├─┬ ./target/debug/incremental/dust-2748eiei2tcnp
|
203M │ ├── deps
|
||||||
6.7M │ │ └─┬ ./target/debug/incremental/dust-2748eiei2tcnp/s-ezd6jnik5u-163pyem-1aab9ncf5glum
|
56M │ └── build
|
||||||
3.0M │ │ └── ./target/debug/incremental/dust-2748eiei2tcnp/s-ezd6jnik5u-163pyem-1aab9ncf5glum/dep-graph.bin
|
165M ├─┬ package
|
||||||
2.2M │ └─┬ ./target/debug/incremental/dust-1dlon65p8m3vl
|
165M │ └─┬ du-dust-0.2.4
|
||||||
2.2M │ └── ./target/debug/incremental/dust-1dlon65p8m3vl/s-ezd6jncecv-1xsnfd0-4dw9l1r2th2t
|
165M │ └─┬ target
|
||||||
15M └─┬ ./target/release
|
165M │ └─┬ debug
|
||||||
9.2M ├─┬ ./target/release/deps
|
131M │ └── deps
|
||||||
6.7M │ └── ./target/release/deps/libclap-87bc2534ea57f044.rlib
|
165M └─┬ release
|
||||||
5.9M └── ./target/release/dust
|
124M └── deps
|
||||||
```
|
```
|
||||||
|
|
||||||
## Performance
|
## Performance
|
||||||
dust is currently about 4 times slower than du.
|
|
||||||
|
Dust is currently about 4 times slower than du.
|
||||||
|
|
||||||
## Alternatives
|
## Alternatives
|
||||||
* [NCDU](https://dev.yorhel.nl/ncdu)
|
|
||||||
* du -d 1 -h | sort -h
|
* [NCDU](https://dev.yorhel.nl/ncdu)
|
||||||
|
* du -d 1 -h | sort -h
|
||||||
|
|
||||||
Note: Apparent-size is calculated slightly differently in dust to gdu. In dust each hard link is counted as using file_length space. In gdu only the first entry is counted.
|
Note: Apparent-size is calculated slightly differently in dust to gdu. In dust each hard link is counted as using file_length space. In gdu only the first entry is counted.
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
# This script takes care of building your crate and packaging it for release
|
# This script takes care of building your crate and packaging it for release
|
||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
# This script takes care of testing your crate
|
# This script takes care of testing your crate
|
||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|||||||
+123
-58
@@ -1,100 +1,165 @@
|
|||||||
extern crate ansi_term;
|
extern crate ansi_term;
|
||||||
|
|
||||||
use self::ansi_term::Colour::Fixed;
|
use self::ansi_term::Colour::Fixed;
|
||||||
|
use self::ansi_term::Style;
|
||||||
use lib::Node;
|
use utils::Node;
|
||||||
|
|
||||||
static UNITS: [char; 4] = ['T', 'G', 'M', 'K'];
|
static UNITS: [char; 4] = ['T', 'G', 'M', 'K'];
|
||||||
|
|
||||||
pub fn draw_it(permissions: bool, heads: &Vec<Node>, to_display: &Vec<&Node>) -> () {
|
pub struct DisplayData {
|
||||||
if !permissions {
|
pub short_paths: bool,
|
||||||
eprintln!("Did not have permissions for all directories");
|
pub is_reversed: bool,
|
||||||
}
|
|
||||||
|
|
||||||
for d in to_display {
|
|
||||||
if heads.contains(d) {
|
|
||||||
display_node(d, &to_display, true, "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn display_node<S: Into<String>>(
|
impl DisplayData {
|
||||||
node_to_print: &Node,
|
fn get_first_chars(&self) -> &str {
|
||||||
to_display: &Vec<&Node>,
|
if self.is_reversed {
|
||||||
is_first: bool,
|
"─┴"
|
||||||
indentation_str: S,
|
|
||||||
) {
|
|
||||||
let mut is = indentation_str.into();
|
|
||||||
print_this_node(node_to_print, is_first, is.as_ref());
|
|
||||||
|
|
||||||
is = is.replace("└─┬", " ");
|
|
||||||
is = is.replace("└──", " ");
|
|
||||||
is = is.replace("├──", "│ ");
|
|
||||||
is = is.replace("├─┬", "│ ");
|
|
||||||
|
|
||||||
let printable_node_slashes = node_to_print.name().matches('/').count();
|
|
||||||
|
|
||||||
let mut num_siblings = to_display.iter().fold(0, |a, b| {
|
|
||||||
if node_to_print.children().contains(b)
|
|
||||||
&& b.name().matches('/').count() == printable_node_slashes + 1
|
|
||||||
{
|
|
||||||
a + 1
|
|
||||||
} else {
|
} else {
|
||||||
a
|
"─┬"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
let mut is_biggest = true;
|
fn get_tree_chars(
|
||||||
for node in to_display {
|
&self,
|
||||||
if node_to_print.children().contains(node) {
|
num_siblings: u64,
|
||||||
let has_display_children = node.children()
|
max_siblings: u64,
|
||||||
.iter()
|
has_children: bool,
|
||||||
.fold(false, |has_kids, n| has_kids || to_display.contains(&n));
|
) -> &'static str {
|
||||||
|
if self.is_reversed {
|
||||||
let has_children = node.children().len() > 0 && has_display_children;
|
if num_siblings == max_siblings - 1 {
|
||||||
if node.name().matches('/').count() == printable_node_slashes + 1 {
|
if has_children {
|
||||||
num_siblings -= 1;
|
"┌─┴"
|
||||||
|
} else {
|
||||||
let tree_chars = {
|
"┌──"
|
||||||
|
}
|
||||||
|
} else if has_children {
|
||||||
|
"├─┴"
|
||||||
|
} else {
|
||||||
|
"├──"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if num_siblings == 0 {
|
if num_siblings == 0 {
|
||||||
if has_children {
|
if has_children {
|
||||||
"└─┬"
|
"└─┬"
|
||||||
} else {
|
} else {
|
||||||
"└──"
|
"└──"
|
||||||
}
|
}
|
||||||
} else {
|
} else if has_children {
|
||||||
if has_children {
|
|
||||||
"├─┬"
|
"├─┬"
|
||||||
} else {
|
} else {
|
||||||
"├──"
|
"├──"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
display_node(&node, to_display, is_biggest, is.to_string() + tree_chars);
|
|
||||||
is_biggest = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_biggest(&self, num_siblings: u64, max_siblings: u64) -> bool {
|
||||||
|
if self.is_reversed {
|
||||||
|
num_siblings == 0
|
||||||
|
} else {
|
||||||
|
num_siblings == max_siblings - 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_children_from_node(&self, node: Node) -> impl Iterator<Item = Box<Node>> {
|
||||||
|
if self.is_reversed {
|
||||||
|
let n: Vec<Box<Node>> = node.children.into_iter().rev().map(|a| a).collect();
|
||||||
|
return n.into_iter();
|
||||||
|
} else {
|
||||||
|
return node.children.into_iter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_this_node(node: &Node, is_biggest: bool, indentation: &str) {
|
pub fn draw_it(permissions: bool, use_full_path: bool, is_reversed: bool, root_node: Node) {
|
||||||
let pretty_size = format!("{:>5}", human_readable_number(node.size()),);
|
if !permissions {
|
||||||
|
eprintln!("Did not have permissions for all directories");
|
||||||
|
}
|
||||||
|
let display_data = DisplayData {
|
||||||
|
short_paths: !use_full_path,
|
||||||
|
is_reversed,
|
||||||
|
};
|
||||||
|
|
||||||
|
for c in display_data.get_children_from_node(root_node) {
|
||||||
|
let first_tree_chars = display_data.get_first_chars();
|
||||||
|
display_node(*c, true, first_tree_chars, &display_data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn display_node(node: Node, is_biggest: bool, indent: &str, display_data: &DisplayData) {
|
||||||
|
let short = display_data.short_paths;
|
||||||
|
|
||||||
|
let mut num_siblings = node.children.len() as u64;
|
||||||
|
let max_sibling = num_siblings;
|
||||||
|
let new_indent = clean_indentation_string(indent);
|
||||||
|
let name = node.name.clone();
|
||||||
|
let size = node.size;
|
||||||
|
|
||||||
|
if !display_data.is_reversed {
|
||||||
|
print_this_node(&*name, size, is_biggest, short, indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
for c in display_data.get_children_from_node(node) {
|
||||||
|
num_siblings -= 1;
|
||||||
|
let chars = display_data.get_tree_chars(num_siblings, max_sibling, c.children.len() > 0);
|
||||||
|
let is_biggest = display_data.is_biggest(num_siblings, max_sibling);
|
||||||
|
let full_indent = new_indent.clone() + chars;
|
||||||
|
display_node(*c, is_biggest, &*full_indent, display_data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if display_data.is_reversed {
|
||||||
|
print_this_node(&*name, size, is_biggest, short, indent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clean_indentation_string(s: &str) -> String {
|
||||||
|
let mut is: String = s.into();
|
||||||
|
// For reversed:
|
||||||
|
is = is.replace("┌─┴", " ");
|
||||||
|
is = is.replace("┌──", " ");
|
||||||
|
is = is.replace("├─┴", "│ ");
|
||||||
|
is = is.replace("─┴", " ");
|
||||||
|
// For normal
|
||||||
|
is = is.replace("└─┬", " ");
|
||||||
|
is = is.replace("└──", " ");
|
||||||
|
is = is.replace("├─┬", "│ ");
|
||||||
|
is = is.replace("─┬", " ");
|
||||||
|
// For both
|
||||||
|
is = is.replace("├──", "│ ");
|
||||||
|
is
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_this_node(name: &str, size: u64, is_biggest: bool, short_paths: bool, indentation: &str) {
|
||||||
|
let pretty_size = format!("{:>5}", human_readable_number(size),);
|
||||||
println!(
|
println!(
|
||||||
"{}",
|
"{}",
|
||||||
format_string(node.name(), is_biggest, pretty_size.as_ref(), indentation)
|
format_string(name, is_biggest, short_paths, &*pretty_size, indentation)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn format_string(dir_name: &str, is_biggest: bool, size: &str, indentation: &str) -> String {
|
pub fn format_string(
|
||||||
|
dir_name: &str,
|
||||||
|
is_biggest: bool,
|
||||||
|
short_paths: bool,
|
||||||
|
size: &str,
|
||||||
|
indentation: &str,
|
||||||
|
) -> String {
|
||||||
|
let printable_name = {
|
||||||
|
if short_paths {
|
||||||
|
dir_name.split('/').last().unwrap_or(dir_name)
|
||||||
|
} else {
|
||||||
|
dir_name
|
||||||
|
}
|
||||||
|
};
|
||||||
format!(
|
format!(
|
||||||
"{} {} {}",
|
"{} {} {}",
|
||||||
if is_biggest {
|
if is_biggest {
|
||||||
Fixed(196).paint(size)
|
Fixed(196).paint(size)
|
||||||
} else {
|
} else {
|
||||||
Fixed(7).paint(size)
|
Style::new().paint(size)
|
||||||
},
|
},
|
||||||
indentation,
|
indentation,
|
||||||
dir_name,
|
printable_name,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-68
@@ -1,68 +0,0 @@
|
|||||||
use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct Node {
|
|
||||||
name: String,
|
|
||||||
size: u64,
|
|
||||||
children: Vec<Node>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Node {
|
|
||||||
pub fn new<S: Into<String>>(name: S, size: u64, children: Vec<Node>) -> Self {
|
|
||||||
Node {
|
|
||||||
children: children,
|
|
||||||
name: name.into(),
|
|
||||||
size: size,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn children(&self) -> &Vec<Node> {
|
|
||||||
&self.children
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn name(&self) -> &String {
|
|
||||||
&self.name
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn size(&self) -> u64 {
|
|
||||||
self.size
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Ord for Node {
|
|
||||||
fn cmp(&self, other: &Self) -> Ordering {
|
|
||||||
if self.size > other.size {
|
|
||||||
Ordering::Less
|
|
||||||
} else if self.size < other.size {
|
|
||||||
Ordering::Greater
|
|
||||||
} else {
|
|
||||||
let my_slashes = self.name.matches('/').count();
|
|
||||||
let other_slashes = other.name.matches('/').count();
|
|
||||||
|
|
||||||
if my_slashes > other_slashes {
|
|
||||||
Ordering::Greater
|
|
||||||
} else if my_slashes < other_slashes {
|
|
||||||
Ordering::Less
|
|
||||||
} else {
|
|
||||||
if self.name < other.name {
|
|
||||||
Ordering::Less
|
|
||||||
} else if self.name > other.name {
|
|
||||||
Ordering::Greater
|
|
||||||
} else {
|
|
||||||
Ordering::Equal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl PartialOrd for Node {
|
|
||||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
||||||
Some(self.cmp(other))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl PartialEq for Node {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
(&self.name, self.size) == (&other.name, other.size)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Eq for Node {}
|
|
||||||
+113
-16
@@ -1,48 +1,145 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
extern crate assert_cli;
|
extern crate assert_cli;
|
||||||
|
extern crate walkdir;
|
||||||
|
|
||||||
use self::display::draw_it;
|
use self::display::draw_it;
|
||||||
use clap::{App, AppSettings, Arg};
|
use clap::{App, AppSettings, Arg};
|
||||||
use utils::{find_big_ones, get_dir_tree};
|
use utils::{find_big_ones, get_dir_tree, simplify_dir_names, sort, trim_deep_ones, Node};
|
||||||
|
|
||||||
|
|
||||||
mod display;
|
mod display;
|
||||||
mod utils;
|
mod utils;
|
||||||
mod lib;
|
|
||||||
|
|
||||||
static DEFAULT_NUMBER_OF_LINES: &'static str = "15";
|
static DEFAULT_NUMBER_OF_LINES: usize = 20;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
let def_num_str = DEFAULT_NUMBER_OF_LINES.to_string();
|
||||||
let options = App::new("Dust")
|
let options = App::new("Dust")
|
||||||
.setting(AppSettings::TrailingVarArg)
|
.setting(AppSettings::TrailingVarArg)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("number_of_lines")
|
Arg::with_name("depth")
|
||||||
.short("n")
|
.short("d")
|
||||||
.help("Number of lines of output to show")
|
.long("depth")
|
||||||
.takes_value(true)
|
.help("Depth to show")
|
||||||
.default_value(DEFAULT_NUMBER_OF_LINES),
|
.takes_value(true),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("use_apparent_size")
|
Arg::with_name("number_of_lines")
|
||||||
|
.short("n")
|
||||||
|
.long("number-of-lines")
|
||||||
|
.help("Number of lines of output to show")
|
||||||
|
.takes_value(true)
|
||||||
|
.default_value(def_num_str.as_ref()),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("display_full_paths")
|
||||||
|
.short("p")
|
||||||
|
.long("full-paths")
|
||||||
|
.help("If set sub directories will not have their path shortened"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("display_apparent_size")
|
||||||
.short("s")
|
.short("s")
|
||||||
|
.long("apparent-size")
|
||||||
.help("If set will use file length. Otherwise we use blocks"),
|
.help("If set will use file length. Otherwise we use blocks"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("reverse")
|
||||||
|
.short("r")
|
||||||
|
.long("reverse")
|
||||||
|
.help("If applied tree will be printed upside down (biggest lowest)"),
|
||||||
|
)
|
||||||
.arg(Arg::with_name("inputs").multiple(true))
|
.arg(Arg::with_name("inputs").multiple(true))
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let filenames = {
|
let target_dirs = {
|
||||||
match options.values_of("inputs") {
|
match options.values_of("inputs") {
|
||||||
None => vec!["."],
|
None => vec!["."],
|
||||||
Some(r) => r.collect(),
|
Some(r) => r.collect(),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let number_of_lines = value_t!(options.value_of("number_of_lines"), usize).unwrap();
|
|
||||||
let use_apparent_size = options.is_present("use_apparent_size");
|
|
||||||
|
|
||||||
let (permissions, node_per_top_level_dir) = get_dir_tree(&filenames, use_apparent_size);
|
let number_of_lines = match value_t!(options.value_of("number_of_lines"), usize) {
|
||||||
let slice_it = find_big_ones(&node_per_top_level_dir, number_of_lines);
|
Ok(v) => v,
|
||||||
draw_it(permissions, &node_per_top_level_dir, &slice_it);
|
Err(_) => {
|
||||||
|
eprintln!("Ignoring bad value for number_of_lines");
|
||||||
|
DEFAULT_NUMBER_OF_LINES
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let depth = {
|
||||||
|
if options.is_present("depth") {
|
||||||
|
match value_t!(options.value_of("depth"), u64) {
|
||||||
|
Ok(v) => Some(v + 1),
|
||||||
|
Err(_) => {
|
||||||
|
eprintln!("Ignoring bad value for depth");
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if options.is_present("depth") && number_of_lines != DEFAULT_NUMBER_OF_LINES {
|
||||||
|
eprintln!("Use either -n or -d. Not both");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let use_apparent_size = options.is_present("display_apparent_size");
|
||||||
|
let use_full_path = options.is_present("display_full_paths");
|
||||||
|
|
||||||
|
let simplified_dirs = simplify_dir_names(target_dirs);
|
||||||
|
let (permissions, nodes) = get_dir_tree(&simplified_dirs, use_apparent_size);
|
||||||
|
let sorted_data = sort(nodes);
|
||||||
|
let biggest_ones = {
|
||||||
|
match depth {
|
||||||
|
None => find_big_ones(sorted_data, number_of_lines + simplified_dirs.len()),
|
||||||
|
Some(d) => trim_deep_ones(sorted_data, d, &simplified_dirs),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let tree = build_tree(biggest_ones, depth);
|
||||||
|
//println!("{:?}", tree);
|
||||||
|
|
||||||
|
draw_it(
|
||||||
|
permissions,
|
||||||
|
use_full_path,
|
||||||
|
options.is_present("reverse"),
|
||||||
|
tree,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_tree(biggest_ones: Vec<(String, u64)>, depth: Option<u64>) -> Node {
|
||||||
|
let mut top_parent = Node {
|
||||||
|
name: "".to_string(),
|
||||||
|
size: 0,
|
||||||
|
children: vec![],
|
||||||
|
};
|
||||||
|
|
||||||
|
// assume sorted order
|
||||||
|
for b in biggest_ones {
|
||||||
|
let n = Node {
|
||||||
|
name: b.0,
|
||||||
|
size: b.1,
|
||||||
|
children: vec![],
|
||||||
|
};
|
||||||
|
recursively_build_tree(&mut top_parent, n, depth)
|
||||||
|
}
|
||||||
|
top_parent
|
||||||
|
}
|
||||||
|
|
||||||
|
fn recursively_build_tree(parent_node: &mut Node, new_node: Node, depth: Option<u64>) {
|
||||||
|
let new_depth = match depth {
|
||||||
|
None => None,
|
||||||
|
Some(0) => return,
|
||||||
|
Some(d) => Some(d - 1),
|
||||||
|
};
|
||||||
|
for c in parent_node.children.iter_mut() {
|
||||||
|
if new_node.name.starts_with(&c.name) {
|
||||||
|
return recursively_build_tree(&mut *c, new_node, new_depth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let temp = Box::<Node>::new(new_node);
|
||||||
|
parent_node.children.push(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
+144
-46
@@ -15,52 +15,91 @@ pub fn test_main() {
|
|||||||
assert_cli::Assert::main_binary()
|
assert_cli::Assert::main_binary()
|
||||||
.with_args(&["src/test_dir"])
|
.with_args(&["src/test_dir"])
|
||||||
.stdout()
|
.stdout()
|
||||||
.is(main_output())
|
.is(main_output(true))
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn test_main_long_paths() {
|
||||||
|
assert_cli::Assert::main_binary()
|
||||||
|
.with_args(&["-p", "src/test_dir"])
|
||||||
|
.stdout()
|
||||||
|
.is(main_output(false))
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn test_main_multi_arg() {
|
||||||
|
assert_cli::Assert::main_binary()
|
||||||
|
.with_args(&["src/test_dir/many/", "src/test_dir/", "src/test_dir"])
|
||||||
|
.stdout()
|
||||||
|
.is(main_output(true))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
fn main_output() -> String {
|
fn main_output(short_paths: bool) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{}
|
"{}
|
||||||
{}
|
{}
|
||||||
{}
|
{}
|
||||||
{}",
|
{}",
|
||||||
format_string("src/test_dir", true, " 4.0K", ""),
|
format_string("src/test_dir", true, short_paths, " 4.0K", "─┬"),
|
||||||
format_string("src/test_dir/many", true, " 4.0K", "└─┬",),
|
format_string("src/test_dir/many", true, short_paths, " 4.0K", " └─┬",),
|
||||||
format_string("src/test_dir/many/hello_file", true, " 4.0K", " ├──",),
|
format_string(
|
||||||
format_string("src/test_dir/many/a_file", false, " 0B", " └──",),
|
"src/test_dir/many/hello_file",
|
||||||
|
true,
|
||||||
|
short_paths,
|
||||||
|
" 4.0K",
|
||||||
|
" ├──",
|
||||||
|
),
|
||||||
|
format_string(
|
||||||
|
"src/test_dir/many/a_file",
|
||||||
|
false,
|
||||||
|
short_paths,
|
||||||
|
" 0B",
|
||||||
|
" └──",
|
||||||
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
fn main_output() -> String {
|
fn main_output(short_paths: bool) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{}
|
"{}
|
||||||
{}
|
{}
|
||||||
{}
|
{}
|
||||||
{}",
|
{}",
|
||||||
format_string("src/test_dir", true, " 8.0K", ""),
|
format_string("src/test_dir", true, short_paths, " 12K", "─┬"),
|
||||||
format_string("src/test_dir/many", true, " 4.0K", "└─┬",),
|
format_string("src/test_dir/many", true, short_paths, " 8.0K", " └─┬",),
|
||||||
format_string("src/test_dir/many/hello_file", true, " 4.0K", " ├──",),
|
format_string(
|
||||||
format_string("src/test_dir/many/a_file", false, " 0B", " └──",),
|
"src/test_dir/many/hello_file",
|
||||||
|
true,
|
||||||
|
short_paths,
|
||||||
|
" 4.0K",
|
||||||
|
" ├──",
|
||||||
|
),
|
||||||
|
format_string(
|
||||||
|
"src/test_dir/many/a_file",
|
||||||
|
false,
|
||||||
|
short_paths,
|
||||||
|
" 0B",
|
||||||
|
" └──",
|
||||||
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_main_extra_slash() {
|
|
||||||
assert_cli::Assert::main_binary()
|
|
||||||
.with_args(&["src/test_dir/"])
|
|
||||||
.stdout()
|
|
||||||
.is(main_output())
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_apparent_size() {
|
pub fn test_apparent_size() {
|
||||||
let r = format!(
|
let r = format!(
|
||||||
"{}",
|
"{}",
|
||||||
format_string("src/test_dir/many/hello_file", true, " 6B", " ├──",),
|
format_string(
|
||||||
|
"src/test_dir/many/hello_file",
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
" 6B",
|
||||||
|
" ├──",
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_cli::Assert::main_binary()
|
assert_cli::Assert::main_binary()
|
||||||
@@ -70,6 +109,37 @@ pub fn test_apparent_size() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn test_reverse_flag() {
|
||||||
|
// variable names the same length make the output easier to read
|
||||||
|
let a = " ┌── a_file";
|
||||||
|
let b = " ├── hello_file";
|
||||||
|
let c = " ┌─┴ many";
|
||||||
|
let d = " ─┴ test_dir";
|
||||||
|
|
||||||
|
assert_cli::Assert::main_binary()
|
||||||
|
.with_args(&["-r", "src/test_dir"])
|
||||||
|
.stdout()
|
||||||
|
.contains(a)
|
||||||
|
.stdout()
|
||||||
|
.contains(b)
|
||||||
|
.stdout()
|
||||||
|
.contains(c)
|
||||||
|
.stdout()
|
||||||
|
.contains(d)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn test_d_flag_works() {
|
||||||
|
// We should see the top level directory but not the sub dirs / files:
|
||||||
|
assert_cli::Assert::main_binary()
|
||||||
|
.with_args(&["-d", "1", "-s", "src/test_dir"])
|
||||||
|
.stdout()
|
||||||
|
.doesnt_contain("hello_file")
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
fn build_temp_file(dir: &TempDir) -> (PathBuf) {
|
fn build_temp_file(dir: &TempDir) -> (PathBuf) {
|
||||||
let file_path = dir.path().join("notes.txt");
|
let file_path = dir.path().join("notes.txt");
|
||||||
let mut file = File::create(&file_path).unwrap();
|
let mut file = File::create(&file_path).unwrap();
|
||||||
@@ -93,10 +163,14 @@ pub fn test_soft_sym_link() {
|
|||||||
.output();
|
.output();
|
||||||
assert!(c.is_ok());
|
assert!(c.is_ok());
|
||||||
|
|
||||||
|
let r = soft_sym_link_output(dir_s, file_path_s, link_name_s);
|
||||||
|
|
||||||
|
// We cannot guarantee which version will appear first.
|
||||||
|
// TODO: Consider adding predictable itteration order (sort file entries by name?)
|
||||||
assert_cli::Assert::main_binary()
|
assert_cli::Assert::main_binary()
|
||||||
.with_args(&[dir_s])
|
.with_args(&[dir_s])
|
||||||
.stdout()
|
.stdout()
|
||||||
.contains(soft_sym_link_output(dir_s, file_path_s, link_name_s))
|
.contains(r)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,20 +180,21 @@ fn soft_sym_link_output(dir: &str, file_path: &str, link_name: &str) -> String {
|
|||||||
"{}
|
"{}
|
||||||
{}
|
{}
|
||||||
{}",
|
{}",
|
||||||
format_string(dir, true, " 8.0K", ""),
|
format_string(dir, true, true, " 8.0K", "─┬"),
|
||||||
format_string(file_path, true, " 4.0K", "├──",),
|
format_string(file_path, true, true, " 4.0K", " ├──",),
|
||||||
format_string(link_name, false, " 4.0K", "└──",),
|
format_string(link_name, false, true, " 4.0K", " └──",),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
fn soft_sym_link_output(dir: &str, file_path: &str, link_name: &str) -> String {
|
fn soft_sym_link_output(dir: &str, file_path: &str, link_name: &str) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{}
|
"{}
|
||||||
{}
|
{}
|
||||||
{}",
|
{}",
|
||||||
format_string(dir, true, " 4.0K", ""),
|
format_string(dir, true, true, " 8.0K", "─┬"),
|
||||||
format_string(file_path, true, " 4.0K", "├──",),
|
format_string(file_path, true, true, " 4.0K", " ├──",),
|
||||||
format_string(link_name, false, " 0B", "└──",),
|
format_string(link_name, false, true, " 0B", " └──",),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,22 +214,11 @@ pub fn test_hard_sym_link() {
|
|||||||
.output();
|
.output();
|
||||||
assert!(c.is_ok());
|
assert!(c.is_ok());
|
||||||
|
|
||||||
let r = format!(
|
let (r, r2) = hard_link_output(dir_s, file_path_s, link_name_s);
|
||||||
"{}
|
|
||||||
{}",
|
|
||||||
format_string(dir_s, true, " 4.0K", ""),
|
|
||||||
format_string(file_path_s, true, " 4.0K", "└──")
|
|
||||||
);
|
|
||||||
let r2 = format!(
|
|
||||||
"{}
|
|
||||||
{}",
|
|
||||||
format_string(dir_s, true, " 4.0K", ""),
|
|
||||||
format_string(link_name_s, true, " 4.0K", "└──")
|
|
||||||
);
|
|
||||||
|
|
||||||
// Because this is a hard link the file and hard link look identicle. Therefore
|
// Because this is a hard link the file and hard link look identical. Therefore
|
||||||
// we cannot guarantee which version will appear first.
|
// we cannot guarantee which version will appear first.
|
||||||
// TODO: Consider adding predictable itteration order (sort file entries by name?)
|
// TODO: Consider adding predictable iteration order (sort file entries by name?)
|
||||||
let result = panic::catch_unwind(|| {
|
let result = panic::catch_unwind(|| {
|
||||||
assert_cli::Assert::main_binary()
|
assert_cli::Assert::main_binary()
|
||||||
.with_args(&[dir_s])
|
.with_args(&[dir_s])
|
||||||
@@ -171,6 +235,40 @@ pub fn test_hard_sym_link() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
fn hard_link_output(dir_s: &str, file_path_s: &str, link_name_s: &str) -> (String, String) {
|
||||||
|
let r = format!(
|
||||||
|
"{}
|
||||||
|
{}",
|
||||||
|
format_string(dir_s, true, true, " 4.0K", "─┬"),
|
||||||
|
format_string(file_path_s, true, true, " 4.0K", " └──")
|
||||||
|
);
|
||||||
|
let r2 = format!(
|
||||||
|
"{}
|
||||||
|
{}",
|
||||||
|
format_string(dir_s, true, true, " 4.0K", "─┬"),
|
||||||
|
format_string(link_name_s, true, true, " 4.0K", " └──")
|
||||||
|
);
|
||||||
|
(r, r2)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
fn hard_link_output(dir_s: &str, file_path_s: &str, link_name_s: &str) -> (String, String) {
|
||||||
|
let r = format!(
|
||||||
|
"{}
|
||||||
|
{}",
|
||||||
|
format_string(dir_s, true, true, " 8.0K", "─┬"),
|
||||||
|
format_string(file_path_s, true, true, " 4.0K", " └──")
|
||||||
|
);
|
||||||
|
let r2 = format!(
|
||||||
|
"{}
|
||||||
|
{}",
|
||||||
|
format_string(dir_s, true, true, " 8.0K", "─┬"),
|
||||||
|
format_string(link_name_s, true, true, " 4.0K", " └──")
|
||||||
|
);
|
||||||
|
(r, r2)
|
||||||
|
}
|
||||||
|
|
||||||
//Check we don't recurse down an infinite symlink tree
|
//Check we don't recurse down an infinite symlink tree
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_recursive_sym_link() {
|
pub fn test_recursive_sym_link() {
|
||||||
@@ -199,8 +297,8 @@ fn recursive_sym_link_output(dir: &str, link_name: &str) -> String {
|
|||||||
format!(
|
format!(
|
||||||
"{}
|
"{}
|
||||||
{}",
|
{}",
|
||||||
format_string(dir, true, " 4.0K", ""),
|
format_string(dir, true, true, " 4.0K", "─┬"),
|
||||||
format_string(link_name, true, " 4.0K", "└──",),
|
format_string(link_name, true, true, " 4.0K", " └──",),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
@@ -208,7 +306,7 @@ fn recursive_sym_link_output(dir: &str, link_name: &str) -> String {
|
|||||||
format!(
|
format!(
|
||||||
"{}
|
"{}
|
||||||
{}",
|
{}",
|
||||||
format_string(dir, true, " 0B", ""),
|
format_string(dir, true, true, " 4.0K", "─┬"),
|
||||||
format_string(link_name, true, " 0B", "└──",),
|
format_string(link_name, true, true, " 0B", " └──",),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+160
-82
@@ -1,56 +1,89 @@
|
|||||||
|
use std::cmp::Ordering;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use std::fs;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
use std::path::Path;
|
|
||||||
|
|
||||||
use lib::Node;
|
|
||||||
mod platform;
|
mod platform;
|
||||||
use self::platform::*;
|
use self::platform::*;
|
||||||
|
|
||||||
pub fn get_dir_tree(filenames: &Vec<&str>, apparent_size: bool) -> (bool, Vec<Node>) {
|
#[derive(Debug)]
|
||||||
let mut permissions = true;
|
pub struct Node {
|
||||||
let mut inodes: HashSet<(u64, u64)> = HashSet::new();
|
pub name: String,
|
||||||
let mut results = vec![];
|
pub size: u64,
|
||||||
for &b in filenames {
|
pub children: Vec<Box<Node>>,
|
||||||
let filename = strip_end_slashes(b);
|
|
||||||
let (hp, data) = examine_dir(&Path::new(&filename), apparent_size, &mut inodes);
|
|
||||||
permissions = permissions && hp;
|
|
||||||
match data {
|
|
||||||
Some(d) => results.push(d),
|
|
||||||
None => permissions = false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(permissions, results)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn strip_end_slashes(s: &str) -> String {
|
pub fn simplify_dir_names(filenames: Vec<&str>) -> HashSet<String> {
|
||||||
|
let mut top_level_names: HashSet<String> = HashSet::new();
|
||||||
|
|
||||||
|
for t in filenames {
|
||||||
|
let top_level_name = ensure_end_slash(t);
|
||||||
|
let mut can_add = true;
|
||||||
|
let mut to_remove: Vec<String> = Vec::new();
|
||||||
|
|
||||||
|
for tt in top_level_names.iter() {
|
||||||
|
let temp = tt.to_string();
|
||||||
|
if top_level_name.starts_with(&temp) {
|
||||||
|
can_add = false;
|
||||||
|
} else if tt.starts_with(&top_level_name) {
|
||||||
|
to_remove.push(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for tr in to_remove {
|
||||||
|
top_level_names.remove(&tr);
|
||||||
|
}
|
||||||
|
if can_add {
|
||||||
|
top_level_names.insert(strip_end_slash(t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
top_level_names
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_dir_tree(
|
||||||
|
top_level_names: &HashSet<String>,
|
||||||
|
apparent_size: bool,
|
||||||
|
) -> (bool, HashMap<String, u64>) {
|
||||||
|
let mut permissions = 0;
|
||||||
|
let mut inodes: HashSet<(u64, u64)> = HashSet::new();
|
||||||
|
let mut data: HashMap<String, u64> = HashMap::new();
|
||||||
|
|
||||||
|
for b in top_level_names.iter() {
|
||||||
|
examine_dir(&b, apparent_size, &mut inodes, &mut data, &mut permissions);
|
||||||
|
}
|
||||||
|
(permissions == 0, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn ensure_end_slash(s: &str) -> String {
|
||||||
let mut new_name = String::from(s);
|
let mut new_name = String::from(s);
|
||||||
while new_name.chars().last() == Some('/') && new_name.len() != 1 {
|
while new_name.ends_with('/') || new_name.ends_with("/.") {
|
||||||
|
new_name.pop();
|
||||||
|
}
|
||||||
|
new_name + "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn strip_end_slash(s: &str) -> String {
|
||||||
|
let mut new_name = String::from(s);
|
||||||
|
while (new_name.ends_with('/') || new_name.ends_with("/.")) && new_name.len() > 1 {
|
||||||
new_name.pop();
|
new_name.pop();
|
||||||
}
|
}
|
||||||
new_name
|
new_name
|
||||||
}
|
}
|
||||||
|
|
||||||
fn examine_dir(
|
fn examine_dir(
|
||||||
sdir: &Path,
|
top_dir: &str,
|
||||||
apparent_size: bool,
|
apparent_size: bool,
|
||||||
inodes: &mut HashSet<(u64, u64)>,
|
inodes: &mut HashSet<(u64, u64)>,
|
||||||
) -> (bool, Option<Node>) {
|
data: &mut HashMap<String, u64>,
|
||||||
match fs::read_dir(sdir) {
|
file_count_no_permission: &mut u64,
|
||||||
Ok(file_iter) => {
|
) {
|
||||||
let mut result = vec![];
|
for entry in WalkDir::new(top_dir) {
|
||||||
let mut have_permission = true;
|
if let Ok(e) = entry {
|
||||||
let mut total_size = 0;
|
let maybe_size_and_inode = get_metadata(&e, apparent_size);
|
||||||
|
|
||||||
for single_path in file_iter {
|
match maybe_size_and_inode {
|
||||||
match single_path {
|
Some((size, maybe_inode)) => {
|
||||||
Ok(d) => {
|
|
||||||
let file_type = d.file_type().ok();
|
|
||||||
let maybe_size_and_inode = get_metadata(&d, apparent_size);
|
|
||||||
|
|
||||||
match (file_type, maybe_size_and_inode) {
|
|
||||||
(Some(file_type), Some((size, maybe_inode))) => {
|
|
||||||
if !apparent_size {
|
if !apparent_size {
|
||||||
if let Some(inode_dev_pair) = maybe_inode {
|
if let Some(inode_dev_pair) = maybe_inode {
|
||||||
if inodes.contains(&inode_dev_pair) {
|
if inodes.contains(&inode_dev_pair) {
|
||||||
@@ -59,63 +92,108 @@ fn examine_dir(
|
|||||||
inodes.insert(inode_dev_pair);
|
inodes.insert(inode_dev_pair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
total_size += size;
|
// This path and all its parent paths have their counter incremented
|
||||||
|
let mut e_path = e.path().to_path_buf();
|
||||||
if d.path().is_dir() && !file_type.is_symlink() {
|
loop {
|
||||||
let (hp, child) = examine_dir(&d.path(), apparent_size, inodes);
|
let path_name = e_path.to_string_lossy().to_string();
|
||||||
have_permission = have_permission && hp;
|
let s = data.entry(path_name.clone()).or_insert(0);
|
||||||
|
*s += size;
|
||||||
match child {
|
if path_name == *top_dir {
|
||||||
Some(c) => {
|
break;
|
||||||
total_size += c.size();
|
|
||||||
result.push(c);
|
|
||||||
}
|
}
|
||||||
None => (),
|
assert!(path_name != "");
|
||||||
|
e_path.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => *file_count_no_permission += 1,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let path_name = d.path().to_string_lossy().to_string();
|
*file_count_no_permission += 1
|
||||||
result.push(Node::new(path_name, size, vec![]))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(_, None) => have_permission = false,
|
|
||||||
(_, _) => (),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(_) => (),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let n = Node::new(sdir.to_string_lossy().to_string(), total_size, result);
|
|
||||||
(have_permission, Some(n))
|
|
||||||
}
|
|
||||||
Err(_) => (false, None),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We start with a list of root directories - these must be the biggest folders
|
pub fn sort_by_size_first_name_second(a: &(String, u64), b: &(String, u64)) -> Ordering {
|
||||||
// We then repeadedly merge in the children of the biggest directory - Each iteration
|
let result = b.1.cmp(&a.1);
|
||||||
// the next biggest directory's children are merged in.
|
if result == Ordering::Equal {
|
||||||
pub fn find_big_ones<'a>(l: &'a Vec<Node>, max_to_show: usize) -> Vec<&Node> {
|
a.0.cmp(&b.0)
|
||||||
let mut new_l: Vec<&Node> = l.iter().map(|a| a).collect();
|
} else {
|
||||||
new_l.sort();
|
result
|
||||||
|
|
||||||
for processed_pointer in 0..max_to_show {
|
|
||||||
if new_l.len() == processed_pointer {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Must be a list of pointers into new_l otherwise b_list will go out of scope
|
|
||||||
// when it is deallocated
|
|
||||||
let mut b_list: Vec<&Node> = new_l[processed_pointer]
|
|
||||||
.children()
|
|
||||||
.iter()
|
|
||||||
.map(|a| a)
|
|
||||||
.collect();
|
|
||||||
new_l.extend(b_list);
|
|
||||||
new_l.sort();
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if new_l.len() > max_to_show {
|
pub fn sort(data: HashMap<String, u64>) -> Vec<(String, u64)> {
|
||||||
new_l[0..max_to_show + 1].to_vec()
|
let mut new_l: Vec<(String, u64)> = data.iter().map(|(a, b)| (a.clone(), *b)).collect();
|
||||||
|
new_l.sort_by(|a, b| sort_by_size_first_name_second(&a, &b));
|
||||||
|
new_l
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_big_ones(new_l: Vec<(String, u64)>, max_to_show: usize) -> Vec<(String, u64)> {
|
||||||
|
if max_to_show > 0 && new_l.len() > max_to_show {
|
||||||
|
new_l[0..max_to_show].to_vec()
|
||||||
} else {
|
} else {
|
||||||
new_l
|
new_l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn trim_deep_ones(
|
||||||
|
input: Vec<(String, u64)>,
|
||||||
|
max_depth: u64,
|
||||||
|
top_level_names: &HashSet<String>,
|
||||||
|
) -> Vec<(String, u64)> {
|
||||||
|
let mut result: Vec<(String, u64)> = vec![];
|
||||||
|
|
||||||
|
for name in top_level_names {
|
||||||
|
let my_max_depth = name.matches('/').count() + max_depth as usize;
|
||||||
|
let name_ref: &str = name.as_ref();
|
||||||
|
|
||||||
|
for &(ref k, ref v) in input.iter() {
|
||||||
|
if k.starts_with(name_ref) && k.matches('/').count() <= my_max_depth {
|
||||||
|
result.push((k.clone(), *v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_simplify_dir() {
|
||||||
|
let mut correct = HashSet::new();
|
||||||
|
correct.insert("a".to_string());
|
||||||
|
assert_eq!(simplify_dir_names(vec!["a"]), correct);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_simplify_dir_rm_subdir() {
|
||||||
|
let mut correct = HashSet::new();
|
||||||
|
correct.insert("a/b".to_string());
|
||||||
|
assert_eq!(simplify_dir_names(vec!["a/b", "a/b/c", "a/b/d/f"]), correct);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_simplify_dir_duplicates() {
|
||||||
|
let mut correct = HashSet::new();
|
||||||
|
correct.insert("a/b".to_string());
|
||||||
|
correct.insert("c".to_string());
|
||||||
|
assert_eq!(simplify_dir_names(vec!["a/b", "a/b//", "c", "c/"]), correct);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_simplify_dir_rm_subdir_and_not_substrings() {
|
||||||
|
let mut correct = HashSet::new();
|
||||||
|
correct.insert("b".to_string());
|
||||||
|
correct.insert("c/a/b".to_string());
|
||||||
|
correct.insert("a/b".to_string());
|
||||||
|
assert_eq!(simplify_dir_names(vec!["a/b", "c/a/b/", "b"]), correct);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_simplify_dir_dots() {
|
||||||
|
let mut correct = HashSet::new();
|
||||||
|
correct.insert("src".to_string());
|
||||||
|
assert_eq!(simplify_dir_names(vec!["src/."]), correct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-55
@@ -1,4 +1,4 @@
|
|||||||
use std;
|
use walkdir::DirEntry;
|
||||||
|
|
||||||
fn get_block_size() -> u64 {
|
fn get_block_size() -> u64 {
|
||||||
// All os specific implementations of MetatdataExt seem to define a block as 512 bytes
|
// All os specific implementations of MetatdataExt seem to define a block as 512 bytes
|
||||||
@@ -6,67 +6,20 @@ fn get_block_size() -> u64 {
|
|||||||
512
|
512
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_family = "unix")]
|
||||||
pub fn get_metadata(
|
pub fn get_metadata(d: &DirEntry, use_apparent_size: bool) -> Option<(u64, Option<(u64, u64)>)> {
|
||||||
d: &std::fs::DirEntry,
|
|
||||||
use_apparent_size: bool,
|
|
||||||
) -> Option<(u64, Option<(u64, u64)>)> {
|
|
||||||
use std::os::linux::fs::MetadataExt;
|
|
||||||
match d.metadata().ok() {
|
|
||||||
Some(md) => {
|
|
||||||
let inode = Some((md.st_ino(), md.st_dev()));
|
|
||||||
if use_apparent_size {
|
|
||||||
Some((md.len(), inode))
|
|
||||||
} else {
|
|
||||||
Some((md.st_blocks() * get_block_size(), inode))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_os = "unix")]
|
|
||||||
pub fn get_metadata(
|
|
||||||
d: &std::fs::DirEntry,
|
|
||||||
use_apparent_size: bool,
|
|
||||||
) -> Option<(u64, Option<(u64, u64)>)> {
|
|
||||||
use std::os::unix::fs::MetadataExt;
|
use std::os::unix::fs::MetadataExt;
|
||||||
match d.metadata().ok() {
|
d.metadata().ok().and_then(|md| {
|
||||||
Some(md) => {
|
|
||||||
let inode = Some((md.ino(), md.dev()));
|
let inode = Some((md.ino(), md.dev()));
|
||||||
if use_apparent_size {
|
if use_apparent_size {
|
||||||
Some((md.len(), inode))
|
Some((md.len(), inode))
|
||||||
} else {
|
} else {
|
||||||
Some((md.blocks() * get_block_size(), inode))
|
Some((md.blocks() * get_block_size(), inode))
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
None => None,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(not(target_family = "unix"))]
|
||||||
pub fn get_metadata(
|
pub fn get_metadata(d: &DirEntry, _apparent: bool) -> Option<(u64, Option<(u64, u64)>)> {
|
||||||
d: &std::fs::DirEntry,
|
d.metadata().ok().map_or(None, |md| Some((md.len(), None)))
|
||||||
use_apparent_size: bool,
|
|
||||||
) -> Option<(u64, Option<(u64, u64)>)> {
|
|
||||||
use std::os::macos::fs::MetadataExt;
|
|
||||||
match d.metadata().ok() {
|
|
||||||
Some(md) => {
|
|
||||||
let inode = Some((md.st_ino(), md.st_dev()));
|
|
||||||
if use_apparent_size {
|
|
||||||
Some((md.len(), inode))
|
|
||||||
} else {
|
|
||||||
Some((md.st_blocks() * get_block_size(), inode))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "linux", target_os = "unix", target_os = "macos")))]
|
|
||||||
pub fn get_metadata(d: &std::fs::DirEntry, _apparent: bool) -> Option<(u64, Option<(u64, u64)>)> {
|
|
||||||
match d.metadata().ok() {
|
|
||||||
Some(md) => Some((md.len(), None)),
|
|
||||||
None => None,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user