@@ -22,16 +22,16 @@ dependencies = [ | |||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-resolver 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
@@ -48,15 +48,15 @@ dependencies = [ | |||
"net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-resolver 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -98,12 +98,12 @@ dependencies = [ | |||
"slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"v_htmlescape 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -382,6 +382,21 @@ dependencies = [ | |||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "crossbeam" | |||
version = "0.6.0" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-channel 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-epoch 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "crossbeam-channel" | |||
version = "0.3.6" | |||
@@ -712,6 +727,11 @@ dependencies = [ | |||
"libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "fuchsia-cprng" | |||
version = "0.1.0" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
[[package]] | |||
name = "fuchsia-zircon" | |||
version = "0.3.3" | |||
@@ -891,13 +911,13 @@ dependencies = [ | |||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
@@ -937,7 +957,7 @@ dependencies = [ | |||
"same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -1372,10 +1392,9 @@ dependencies = [ | |||
[[package]] | |||
name = "num-derive" | |||
version = "0.2.3" | |||
version = "0.2.4" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -1642,10 +1661,10 @@ dependencies = [ | |||
[[package]] | |||
name = "rand" | |||
version = "0.4.5" | |||
version = "0.4.6" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"fuchsia-cprng 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"libc 0.2.48 (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)", | |||
@@ -1654,13 +1673,13 @@ dependencies = [ | |||
[[package]] | |||
name = "rand" | |||
version = "0.5.5" | |||
version = "0.5.6" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"fuchsia-cprng 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
@@ -1690,14 +1709,6 @@ dependencies = [ | |||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "rand_core" | |||
version = "0.2.2" | |||
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]] | |||
name = "rand_core" | |||
version = "0.3.1" | |||
@@ -1818,14 +1829,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "regex-syntax" | |||
version = "0.6.4" | |||
version = "0.6.5" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -1881,11 +1892,11 @@ dependencies = [ | |||
"serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"serde_json 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
@@ -1941,7 +1952,7 @@ name = "same-file" | |||
version = "1.0.4" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -2248,7 +2259,7 @@ dependencies = [ | |||
"lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"onig 4.3.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"plist 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"serde_json 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2360,7 +2371,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"num-derive 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
@@ -2376,7 +2387,7 @@ dependencies = [ | |||
[[package]] | |||
name = "tokio" | |||
version = "0.1.14" | |||
version = "0.1.15" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2389,9 +2400,10 @@ dependencies = [ | |||
"tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-sync 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
@@ -2431,7 +2443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -2477,6 +2489,14 @@ dependencies = [ | |||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "tokio-sync" | |||
version = "0.1.0" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "tokio-tcp" | |||
version = "0.1.3" | |||
@@ -2492,9 +2512,10 @@ dependencies = [ | |||
[[package]] | |||
name = "tokio-threadpool" | |||
version = "0.1.10" | |||
version = "0.1.11" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-channel 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2502,12 +2523,13 @@ dependencies = [ | |||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "tokio-timer" | |||
version = "0.2.8" | |||
version = "0.2.9" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2574,21 +2596,21 @@ dependencies = [ | |||
"idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "trust-dns-proto" | |||
version = "0.6.2" | |||
version = "0.6.3" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2597,21 +2619,21 @@ dependencies = [ | |||
"idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
name = "trust-dns-resolver" | |||
version = "0.10.2" | |||
version = "0.10.3" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2623,8 +2645,8 @@ dependencies = [ | |||
"lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-proto 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -2785,7 +2807,7 @@ name = "uuid" | |||
version = "0.7.1" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -2875,7 +2897,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -2919,7 +2941,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
[[package]] | |||
name = "winapi-util" | |||
version = "0.1.1" | |||
version = "0.1.2" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -2936,7 +2958,7 @@ version = "1.0.1" | |||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||
dependencies = [ | |||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
] | |||
[[package]] | |||
@@ -2966,7 +2988,7 @@ dependencies = [ | |||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", | |||
@@ -3057,6 +3079,7 @@ dependencies = [ | |||
"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" | |||
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" | |||
"checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192" | |||
"checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" | |||
"checksum crossbeam-channel 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "137bc235f622ffaa0428e3854e24acb53291fc0b3ff6fb2cb75a8be6fb02f06b" | |||
"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" | |||
"checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" | |||
@@ -3093,6 +3116,7 @@ dependencies = [ | |||
"checksum fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" | |||
"checksum fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c4bbbf71584aeed076100b5665ac14e3d85eeb31fdbb45fbd41ef9a682b5ec05" | |||
"checksum fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a772d36c338d07a032d5375a36f15f9a7043bf0cb8ce7cee658e037c6032874" | |||
"checksum fuchsia-cprng 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81f7f8eb465745ea9b02e2704612a9946a59fa40572086c6fd49d6ddcf30bf31" | |||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" | |||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" | |||
"checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" | |||
@@ -3159,7 +3183,7 @@ dependencies = [ | |||
"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" | |||
"checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a" | |||
"checksum notify 4.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c968cf37cf949114b00d51b0b23536d1c3a4a3963767cf4c969c65a6af78dc7d" | |||
"checksum num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8af1847c907c2f04d7bfd572fb25bbb4385c637fe5be163cf2f8c5d778fe1e7d" | |||
"checksum num-derive 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d9fe8fcafd1b86a37ce8a1cfa15ae504817e0c8c2e7ad42767371461ac1d316d" | |||
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" | |||
"checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124" | |||
"checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10" | |||
@@ -3190,11 +3214,10 @@ dependencies = [ | |||
"checksum pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eef52fac62d0ea7b9b4dc7da092aa64ea7ec3d90af6679422d3d7e0e14b6ee15" | |||
"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" | |||
"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" | |||
"checksum rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dee497e66d8d76bf08ce20c8d36e16f93749ab0bf89975b4f8ae5cee660c2da2" | |||
"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" | |||
"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" | |||
"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" | |||
"checksum rand 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3906503e80ac6cbcacb2c2973fa8e473f24d7e2747c8c92bb230c2441cad96b5" | |||
"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" | |||
"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" | |||
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" | |||
"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" | |||
"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" | |||
@@ -3208,7 +3231,7 @@ dependencies = [ | |||
"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" | |||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" | |||
"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" | |||
"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" | |||
"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" | |||
"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" | |||
"checksum reqwest 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)" = "09d6e187a58d923ee132fcda141c94e716bcfe301c2ea2bef5c81536e0085376" | |||
"checksum resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b263b4aa1b5de9ffc0054a2386f96992058bb6870aab516f8cdeb8a667d56dcb" | |||
@@ -3261,7 +3284,7 @@ dependencies = [ | |||
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" | |||
"checksum tiff 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a2cc6c4fd13cb1cfd20abdb196e794ceccb29371855b7e7f575945f920a5b3c2" | |||
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" | |||
"checksum tokio 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4790d0be6f4ba6ae4f48190efa2ed7780c9e3567796abdb285003cf39840d9c5" | |||
"checksum tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "e0500b88064f08bebddd0c0bed39e19f5c567a5f30975bee52b0c0d3e2eeb38c" | |||
"checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" | |||
"checksum tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "331c8acc267855ec06eb0c94618dcbbfea45bed2d20b77252940095273fb58f6" | |||
"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" | |||
@@ -3269,16 +3292,17 @@ dependencies = [ | |||
"checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" | |||
"checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" | |||
"checksum tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296" | |||
"checksum tokio-sync 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d65a58e2215c13179e6eeb2cf00511e0aee455cad40a9bfaef15a2fd8aab1c7" | |||
"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" | |||
"checksum tokio-threadpool 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "17465013014410310f9f61fa10bf4724803c149ea1d51efece131c38efca93aa" | |||
"checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" | |||
"checksum tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c3fd86cb15547d02daa2b21aadaf4e37dee3368df38a526178a5afa3c034d2fb" | |||
"checksum tokio-timer 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "21c04a314a1f69f73c0227beba6250e06cdc1e9a62e7eff912bf54a59b6d1b94" | |||
"checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" | |||
"checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" | |||
"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" | |||
"checksum tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b32f72af77f1bfe3d3d4da8516a238ebe7039b51dd8637a09841ac7f16d2c987" | |||
"checksum trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0838272e89f1c693b4df38dc353412e389cf548ceed6f9fd1af5a8d6e0e7cf74" | |||
"checksum trust-dns-proto 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30dde452f5d142d5e316a3b32386da95280c98b7e266639f8f3bc6fdf507d279" | |||
"checksum trust-dns-resolver 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "de630f95a192f793436ffae5137e88253cc4142a97d9a8e73c8d804fa85ddf0a" | |||
"checksum trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "09144f0992b0870fa8d2972cc069cbf1e3c0fda64d1f3d45c4d68d0e0b52ad4e" | |||
"checksum trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8a9f877f7a1ad821ab350505e1f1b146a4960402991787191d6d8cab2ce2de2c" | |||
"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" | |||
"checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" | |||
"checksum ucd-trie 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "71a9c5b1fe77426cf144cc30e49e955270f5086e31a6441dfa8b32efc09b9d77" | |||
@@ -3318,7 +3342,7 @@ dependencies = [ | |||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" | |||
"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-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" | |||
"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 wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" | |||
"checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" | |||
@@ -98,22 +98,21 @@ fn find_page_front_matter_changes( | |||
/// Handles a path deletion: could be a page, a section, a folder | |||
fn delete_element(site: &mut Site, path: &Path, is_section: bool) -> Result<()> { | |||
// Ignore the event if this path was not known | |||
if !site.library.contains_section(&path.to_path_buf()) | |||
&& !site.library.contains_page(&path.to_path_buf()) | |||
{ | |||
return Ok(()); | |||
} | |||
if is_section { | |||
if let Some(s) = site.library.remove_section(&path.to_path_buf()) { | |||
site.permalinks.remove(&s.file.relative); | |||
let mut library = site.library.write().unwrap(); | |||
// Ignore the event if this path was not known | |||
if !library.contains_section(&path.to_path_buf()) | |||
&& !library.contains_page(&path.to_path_buf()) | |||
{ | |||
return Ok(()); | |||
} | |||
} else if let Some(p) = site.library.remove_page(&path.to_path_buf()) { | |||
site.permalinks.remove(&p.file.relative); | |||
if !p.meta.taxonomies.is_empty() { | |||
site.populate_taxonomies()?; | |||
if is_section { | |||
if let Some(s) = library.remove_section(&path.to_path_buf()) { | |||
site.permalinks.remove(&s.file.relative); | |||
} | |||
} else if let Some(p) = library.remove_page(&path.to_path_buf()) { | |||
site.permalinks.remove(&p.file.relative); | |||
} | |||
} | |||
@@ -135,28 +134,32 @@ fn handle_section_editing(site: &mut Site, path: &Path) -> Result<()> { | |||
// Updating a section | |||
Some(prev) => { | |||
site.populate_sections(); | |||
{ | |||
let library = site.library.read().unwrap(); | |||
if site.library.get_section(&pathbuf).unwrap().meta == prev.meta { | |||
// Front matter didn't change, only content did | |||
// so we render only the section page, not its pages | |||
return site.render_section(&site.library.get_section(&pathbuf).unwrap(), false); | |||
if library.get_section(&pathbuf).unwrap().meta == prev.meta { | |||
// Front matter didn't change, only content did | |||
// so we render only the section page, not its pages | |||
return site.render_section(&library.get_section(&pathbuf).unwrap(), false); | |||
} | |||
} | |||
// Front matter changed | |||
for changes in find_section_front_matter_changes( | |||
&site.library.get_section(&pathbuf).unwrap().meta, | |||
let changes = find_section_front_matter_changes( | |||
&site.library.read().unwrap().get_section(&pathbuf).unwrap().meta, | |||
&prev.meta, | |||
) { | |||
); | |||
for change in changes { | |||
// Sort always comes first if present so the rendering will be fine | |||
match changes { | |||
match change { | |||
SectionChangesNeeded::Sort => { | |||
site.register_tera_global_fns(); | |||
} | |||
SectionChangesNeeded::Render => { | |||
site.render_section(&site.library.get_section(&pathbuf).unwrap(), false)? | |||
site.render_section(&site.library.read().unwrap().get_section(&pathbuf).unwrap(), false)? | |||
} | |||
SectionChangesNeeded::RenderWithPages => { | |||
site.render_section(&site.library.get_section(&pathbuf).unwrap(), true)? | |||
site.render_section(&site.library.read().unwrap().get_section(&pathbuf).unwrap(), true)? | |||
} | |||
// not a common enough operation to make it worth optimizing | |||
SectionChangesNeeded::Delete | SectionChangesNeeded::Transparent => { | |||
@@ -170,14 +173,14 @@ fn handle_section_editing(site: &mut Site, path: &Path) -> Result<()> { | |||
None => { | |||
site.populate_sections(); | |||
site.register_tera_global_fns(); | |||
site.render_section(&site.library.get_section(&pathbuf).unwrap(), true) | |||
site.render_section(&site.library.read().unwrap().get_section(&pathbuf).unwrap(), true) | |||
} | |||
} | |||
} | |||
macro_rules! render_parent_section { | |||
($site: expr, $path: expr) => { | |||
if let Some(s) = $site.library.find_parent_section($path) { | |||
if let Some(s) = $site.library.read().unwrap().find_parent_section($path) { | |||
$site.render_section(s, false)?; | |||
}; | |||
}; | |||
@@ -192,27 +195,31 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { | |||
Some(prev) => { | |||
site.populate_sections(); | |||
site.populate_taxonomies()?; | |||
site.register_tera_global_fns(); | |||
{ | |||
let library = site.library.read().unwrap(); | |||
// Front matter didn't change, only content did | |||
if site.library.get_page(&pathbuf).unwrap().meta == prev.meta { | |||
// Other than the page itself, the summary might be seen | |||
// on a paginated list for a blog for example | |||
if site.library.get_page(&pathbuf).unwrap().summary.is_some() { | |||
render_parent_section!(site, path); | |||
// Front matter didn't change, only content did | |||
if library.get_page(&pathbuf).unwrap().meta == prev.meta { | |||
// Other than the page itself, the summary might be seen | |||
// on a paginated list for a blog for example | |||
if library.get_page(&pathbuf).unwrap().summary.is_some() { | |||
render_parent_section!(site, path); | |||
} | |||
return site.render_page(&library.get_page(&pathbuf).unwrap()); | |||
} | |||
site.register_tera_global_fns(); | |||
return site.render_page(&site.library.get_page(&pathbuf).unwrap()); | |||
} | |||
// Front matter changed | |||
for changes in find_page_front_matter_changes( | |||
&site.library.get_page(&pathbuf).unwrap().meta, | |||
let changes = find_page_front_matter_changes( | |||
&site.library.read().unwrap().get_page(&pathbuf).unwrap().meta, | |||
&prev.meta, | |||
) { | |||
); | |||
for change in changes { | |||
site.register_tera_global_fns(); | |||
// Sort always comes first if present so the rendering will be fine | |||
match changes { | |||
match change { | |||
PageChangesNeeded::Taxonomies => { | |||
site.populate_taxonomies()?; | |||
site.render_taxonomies()?; | |||
@@ -222,7 +229,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { | |||
} | |||
PageChangesNeeded::Render => { | |||
render_parent_section!(site, path); | |||
site.render_page(&site.library.get_page(&path.to_path_buf()).unwrap())?; | |||
site.render_page(&site.library.read().unwrap().get_page(&path.to_path_buf()).unwrap())?; | |||
} | |||
}; | |||
} | |||
@@ -275,8 +282,11 @@ pub fn after_content_rename(site: &mut Site, old: &Path, new: &Path) -> Result<( | |||
if new_path.file_name().unwrap() == "_index.md" { | |||
// We aren't entirely sure where the original thing was so just try to delete whatever was | |||
// at the old path | |||
site.library.remove_page(&old.to_path_buf()); | |||
site.library.remove_section(&old.to_path_buf()); | |||
{ | |||
let mut library = site.library.write().unwrap(); | |||
library.remove_page(&old.to_path_buf()); | |||
library.remove_section(&old.to_path_buf()); | |||
} | |||
return handle_section_editing(site, &new_path); | |||
} | |||
@@ -287,7 +297,7 @@ pub fn after_content_rename(site: &mut Site, old: &Path, new: &Path) -> Result<( | |||
} else { | |||
old.to_path_buf() | |||
}; | |||
site.library.remove_page(&old_path); | |||
site.library.write().unwrap().remove_page(&old_path); | |||
handle_page_editing(site, &new_path) | |||
} | |||
@@ -350,7 +360,7 @@ pub fn after_template_change(site: &mut Site, path: &Path) -> Result<()> { | |||
match filename { | |||
"sitemap.xml" => site.render_sitemap(), | |||
"rss.xml" => site.render_rss_feed(site.library.pages_values(), None), | |||
"rss.xml" => site.render_rss_feed(site.library.read().unwrap().pages_values(), None), | |||
"robots.txt" => site.render_robots(), | |||
"single.html" | "list.html" => site.render_taxonomies(), | |||
"page.html" => { | |||
@@ -22,7 +22,7 @@ extern crate tempfile; | |||
use std::collections::HashMap; | |||
use std::fs::{copy, create_dir_all, remove_dir_all}; | |||
use std::path::{Path, PathBuf}; | |||
use std::sync::{Arc, Mutex}; | |||
use std::sync::{Arc, Mutex, RwLock}; | |||
use glob::glob; | |||
use rayon::prelude::*; | |||
@@ -72,7 +72,7 @@ pub struct Site { | |||
/// We need that if there are relative links in the content that need to be resolved | |||
pub permalinks: HashMap<String, String>, | |||
/// Contains all pages and sections of the site | |||
pub library: Library, | |||
pub library: Arc<RwLock<Library>>, | |||
} | |||
impl Site { | |||
@@ -141,7 +141,7 @@ impl Site { | |||
taxonomies: Vec::new(), | |||
permalinks: HashMap::new(), | |||
// We will allocate it properly later on | |||
library: Library::new(0, 0, false), | |||
library: Arc::new(RwLock::new(Library::new(0, 0, false))), | |||
}; | |||
Ok(site) | |||
@@ -167,9 +167,9 @@ impl Site { | |||
self.live_reload = get_available_port(port_to_avoid); | |||
} | |||
/// Get all the orphan (== without section) pages in the site | |||
pub fn get_all_orphan_pages(&self) -> Vec<&Page> { | |||
self.library.get_all_orphan_pages() | |||
/// Get the number of orphan (== without section) pages in the site | |||
pub fn get_number_orphan_pages(&self) -> usize { | |||
self.library.read().unwrap().get_all_orphan_pages().len() | |||
} | |||
pub fn set_base_url(&mut self, base_url: String) { | |||
@@ -197,7 +197,7 @@ impl Site { | |||
}); | |||
self.library = | |||
Library::new(page_entries.len(), section_entries.len(), self.config.is_multilingual()); | |||
Arc::new(RwLock::new(Library::new(page_entries.len(), section_entries.len(), self.config.is_multilingual()))); | |||
let sections = { | |||
let config = &self.config; | |||
@@ -233,7 +233,7 @@ impl Site { | |||
// Insert a default index section for each language if necessary so we don't need to create | |||
// a _index.md to render the index page at the root of the site | |||
for (index_path, lang) in self.index_section_paths() { | |||
if let Some(ref index_section) = self.library.get_section(&index_path) { | |||
if let Some(ref index_section) = self.library.read().unwrap().get_section(&index_path) { | |||
if self.config.build_search_index && !index_section.meta.in_search_index { | |||
bail!( | |||
"You have enabled search in the config but disabled it in the index section: \ | |||
@@ -242,8 +242,9 @@ impl Site { | |||
) | |||
} | |||
} | |||
let mut library = self.library.write().expect("Get lock for load"); | |||
// Not in else because of borrow checker | |||
if !self.library.contains_section(&index_path) { | |||
if !library.contains_section(&index_path) { | |||
let mut index_section = Section::default(); | |||
index_section.file.parent = self.content_path.clone(); | |||
index_section.file.filename = | |||
@@ -261,7 +262,7 @@ impl Site { | |||
index_section.file.path = self.content_path.join("_index.md"); | |||
index_section.file.relative = "_index.md".to_string(); | |||
} | |||
self.library.insert_section(index_section); | |||
library.insert_section(index_section); | |||
} | |||
} | |||
@@ -295,14 +296,15 @@ impl Site { | |||
// This is needed in the first place because of silly borrow checker | |||
let mut pages_insert_anchors = HashMap::new(); | |||
for (_, p) in self.library.pages() { | |||
for (_, p) in self.library.read().unwrap().pages() { | |||
pages_insert_anchors.insert( | |||
p.file.path.clone(), | |||
self.find_parent_section_insert_anchor(&p.file.parent.clone(), &p.lang), | |||
); | |||
} | |||
self.library | |||
let mut library = self.library.write().expect("Get lock for render_markdown"); | |||
library | |||
.pages_mut() | |||
.values_mut() | |||
.collect::<Vec<_>>() | |||
@@ -313,7 +315,7 @@ impl Site { | |||
}) | |||
.collect::<Result<()>>()?; | |||
self.library | |||
library | |||
.sections_mut() | |||
.values_mut() | |||
.collect::<Vec<_>>() | |||
@@ -347,11 +349,11 @@ impl Site { | |||
} | |||
pub fn register_tera_global_fns(&mut self) { | |||
self.tera.register_function("get_page", global_fns::GetPage::new(&self.library)); | |||
self.tera.register_function("get_section", global_fns::GetSection::new(&self.library)); | |||
self.tera.register_function("get_page", global_fns::GetPage::new(self.base_path.clone(), self.library.clone())); | |||
self.tera.register_function("get_section", global_fns::GetSection::new(self.base_path.clone(), self.library.clone())); | |||
self.tera.register_function( | |||
"get_taxonomy", | |||
global_fns::GetTaxonomy::new(&self.taxonomies, &self.library), | |||
global_fns::GetTaxonomy::new(self.taxonomies.clone(), self.library.clone()), | |||
); | |||
} | |||
@@ -366,8 +368,9 @@ impl Site { | |||
self.find_parent_section_insert_anchor(&page.file.parent, &page.lang); | |||
page.render_markdown(&self.permalinks, &self.tera, &self.config, insert_anchor)?; | |||
} | |||
let prev = self.library.remove_page(&page.file.path); | |||
self.library.insert_page(page); | |||
let mut library = self.library.write().expect("Get lock for add_page"); | |||
let prev = library.remove_page(&page.file.path); | |||
library.insert_page(page); | |||
Ok(prev) | |||
} | |||
@@ -381,8 +384,9 @@ impl Site { | |||
if render { | |||
section.render_markdown(&self.permalinks, &self.tera, &self.config)?; | |||
} | |||
let prev = self.library.remove_section(§ion.file.path); | |||
self.library.insert_section(section); | |||
let mut library = self.library.write().expect("Get lock for add_section"); | |||
let prev = library.remove_section(§ion.file.path); | |||
library.insert_section(section); | |||
Ok(prev) | |||
} | |||
@@ -399,7 +403,7 @@ impl Site { | |||
} else { | |||
parent_path.join("_index.md") | |||
}; | |||
match self.library.get_section(&parent) { | |||
match self.library.read().unwrap().get_section(&parent) { | |||
Some(s) => s.meta.insert_anchor_links, | |||
None => InsertAnchor::None, | |||
} | |||
@@ -408,7 +412,8 @@ impl Site { | |||
/// Find out the direct subsections of each subsection if there are some | |||
/// as well as the pages for each section | |||
pub fn populate_sections(&mut self) { | |||
self.library.populate_sections(); | |||
let mut library = self.library.write().expect("Get lock for populate_sections"); | |||
library.populate_sections(); | |||
} | |||
/// Find all the tags and categories if it's asked in the config | |||
@@ -417,7 +422,7 @@ impl Site { | |||
return Ok(()); | |||
} | |||
self.taxonomies = find_taxonomies(&self.config, &self.library)?; | |||
self.taxonomies = find_taxonomies(&self.config, &self.library.read().unwrap())?; | |||
Ok(()) | |||
} | |||
@@ -495,7 +500,7 @@ impl Site { | |||
create_directory(¤t_path)?; | |||
// Finally, create a index.html file there with the page rendered | |||
let output = page.render_html(&self.tera, &self.config, &self.library)?; | |||
let output = page.render_html(&self.tera, &self.config, &self.library.read().unwrap())?; | |||
create_file(¤t_path.join("index.html"), &self.inject_livereload(output))?; | |||
// Copy any asset we found previously into the same directory as the index.html | |||
@@ -520,16 +525,17 @@ impl Site { | |||
self.render_orphan_pages()?; | |||
self.render_sitemap()?; | |||
let library = self.library.read().unwrap(); | |||
if self.config.generate_rss { | |||
let pages = if self.config.is_multilingual() { | |||
self.library | |||
library | |||
.pages_values() | |||
.iter() | |||
.filter(|p| p.lang.is_none()) | |||
.map(|p| *p) | |||
.collect() | |||
} else { | |||
self.library.pages_values() | |||
library.pages_values() | |||
}; | |||
self.render_rss_feed(pages, None)?; | |||
} | |||
@@ -538,8 +544,7 @@ impl Site { | |||
if !lang.rss { | |||
continue; | |||
} | |||
let pages = self | |||
.library | |||
let pages = library | |||
.pages_values() | |||
.iter() | |||
.filter(|p| if let Some(ref l) = p.lang { l == &lang.code } else { false }) | |||
@@ -579,7 +584,7 @@ impl Site { | |||
&self.output_path.join(&format!("search_index.{}.js", self.config.default_language)), | |||
&format!( | |||
"window.searchIndex = {};", | |||
search::build_index(&self.config.default_language, &self.library)? | |||
search::build_index(&self.config.default_language, &self.library.read().unwrap())? | |||
), | |||
)?; | |||
@@ -656,7 +661,7 @@ impl Site { | |||
pub fn render_aliases(&self) -> Result<()> { | |||
ensure_directory_exists(&self.output_path)?; | |||
for (_, page) in self.library.pages() { | |||
for (_, page) in self.library.read().unwrap().pages() { | |||
for alias in &page.meta.aliases { | |||
let mut output_path = self.output_path.to_path_buf(); | |||
let mut split = alias.split('/').collect::<Vec<_>>(); | |||
@@ -730,10 +735,10 @@ impl Site { | |||
} else { | |||
self.output_path.join(&taxonomy.kind.name) | |||
}; | |||
let list_output = taxonomy.render_all_terms(&self.tera, &self.config, &self.library)?; | |||
let list_output = taxonomy.render_all_terms(&self.tera, &self.config, &self.library.read().unwrap())?; | |||
create_directory(&output_path)?; | |||
create_file(&output_path.join("index.html"), &self.inject_livereload(list_output))?; | |||
let library = self.library.read().unwrap(); | |||
taxonomy | |||
.items | |||
.par_iter() | |||
@@ -742,18 +747,18 @@ impl Site { | |||
if taxonomy.kind.is_paginated() { | |||
self.render_paginated( | |||
&path, | |||
&Paginator::from_taxonomy(&taxonomy, item, &self.library), | |||
&Paginator::from_taxonomy(&taxonomy, item, &library), | |||
)?; | |||
} else { | |||
let single_output = | |||
taxonomy.render_term(item, &self.tera, &self.config, &self.library)?; | |||
taxonomy.render_term(item, &self.tera, &self.config, &library)?; | |||
create_directory(&path)?; | |||
create_file(&path.join("index.html"), &self.inject_livereload(single_output))?; | |||
} | |||
if taxonomy.kind.rss { | |||
self.render_rss_feed( | |||
item.pages.iter().map(|p| self.library.get_page_by_key(*p)).collect(), | |||
item.pages.iter().map(|p| library.get_page_by_key(*p)).collect(), | |||
Some(&PathBuf::from(format!("{}/{}", taxonomy.kind.name, item.slug))), | |||
) | |||
} else { | |||
@@ -771,6 +776,8 @@ impl Site { | |||
let mut pages = self | |||
.library | |||
.read() | |||
.unwrap() | |||
.pages_values() | |||
.iter() | |||
.filter(|p| !p.is_draft()) | |||
@@ -787,12 +794,13 @@ impl Site { | |||
let mut sections = self | |||
.library | |||
.read().unwrap() | |||
.sections_values() | |||
.iter() | |||
.map(|s| SitemapEntry::new(s.permalink.clone(), None)) | |||
.collect::<Vec<_>>(); | |||
for section in | |||
self.library.sections_values().iter().filter(|s| s.meta.paginate_by.is_some()) | |||
self.library.read().unwrap().sections_values().iter().filter(|s| s.meta.paginate_by.is_some()) | |||
{ | |||
let number_pagers = (section.pages.len() as f64 | |||
/ section.meta.paginate_by.unwrap() as f64) | |||
@@ -872,12 +880,13 @@ impl Site { | |||
pages.par_sort_unstable_by(sort_actual_pages_by_date); | |||
context.insert("last_build_date", &pages[0].meta.date.clone()); | |||
let library = self.library.read().unwrap(); | |||
// limit to the last n elements if the limit is set; otherwise use all. | |||
let num_entries = self.config.rss_limit.unwrap_or_else(|| pages.len()); | |||
let p = pages | |||
.iter() | |||
.take(num_entries) | |||
.map(|x| x.to_serialized_basic(&self.library)) | |||
.map(|x| x.to_serialized_basic(&library)) | |||
.collect::<Vec<_>>(); | |||
context.insert("pages", &p); | |||
@@ -943,7 +952,7 @@ impl Site { | |||
section | |||
.pages | |||
.par_iter() | |||
.map(|k| self.render_page(self.library.get_page_by_key(*k))) | |||
.map(|k| self.render_page(self.library.read().unwrap().get_page_by_key(*k))) | |||
.collect::<Result<()>>()?; | |||
} | |||
@@ -961,9 +970,9 @@ impl Site { | |||
} | |||
if section.meta.is_paginated() { | |||
self.render_paginated(&output_path, &Paginator::from_section(§ion, &self.library))?; | |||
self.render_paginated(&output_path, &Paginator::from_section(§ion, &self.library.read().unwrap()))?; | |||
} else { | |||
let output = section.render_html(&self.tera, &self.config, &self.library)?; | |||
let output = section.render_html(&self.tera, &self.config, &self.library.read().unwrap())?; | |||
create_file(&output_path.join("index.html"), &self.inject_livereload(output))?; | |||
} | |||
@@ -975,6 +984,7 @@ impl Site { | |||
self.render_section( | |||
&self | |||
.library | |||
.read().unwrap() | |||
.get_section(&self.content_path.join("_index.md")) | |||
.expect("Failed to get index section"), | |||
false, | |||
@@ -984,6 +994,7 @@ impl Site { | |||
/// Renders all sections | |||
pub fn render_sections(&self) -> Result<()> { | |||
self.library | |||
.read().unwrap() | |||
.sections_values() | |||
.into_par_iter() | |||
.map(|s| self.render_section(s, true)) | |||
@@ -993,8 +1004,8 @@ impl Site { | |||
/// Renders all pages that do not belong to any sections | |||
pub fn render_orphan_pages(&self) -> Result<()> { | |||
ensure_directory_exists(&self.output_path)?; | |||
for page in self.get_all_orphan_pages() { | |||
let library = self.library.read().unwrap(); | |||
for page in library.get_all_orphan_pages() { | |||
self.render_page(page)?; | |||
} | |||
@@ -1015,7 +1026,7 @@ impl Site { | |||
let page_path = folder_path.join(&format!("{}", pager.index)); | |||
create_directory(&page_path)?; | |||
let output = | |||
paginator.render_pager(pager, &self.config, &self.tera, &self.library)?; | |||
paginator.render_pager(pager, &self.config, &self.tera, &self.library.read().unwrap())?; | |||
if pager.index > 1 { | |||
create_file(&page_path.join("index.html"), &self.inject_livereload(output))?; | |||
} else { | |||
@@ -16,59 +16,59 @@ fn can_parse_site() { | |||
path.push("test_site"); | |||
let mut site = Site::new(&path, "config.toml").unwrap(); | |||
site.load().unwrap(); | |||
let library = site.library.read().unwrap(); | |||
// Correct number of pages (sections do not count as pages) | |||
assert_eq!(site.library.pages().len(), 22); | |||
assert_eq!(library.pages().len(), 22); | |||
let posts_path = path.join("content").join("posts"); | |||
// Make sure the page with a url doesn't have any sections | |||
let url_post = site.library.get_page(&posts_path.join("fixed-url.md")).unwrap(); | |||
let url_post = library.get_page(&posts_path.join("fixed-url.md")).unwrap(); | |||
assert_eq!(url_post.path, "a-fixed-url/"); | |||
// Make sure the article in a folder with only asset doesn't get counted as a section | |||
let asset_folder_post = | |||
site.library.get_page(&posts_path.join("with-assets").join("index.md")).unwrap(); | |||
library.get_page(&posts_path.join("with-assets").join("index.md")).unwrap(); | |||
assert_eq!(asset_folder_post.file.components, vec!["posts".to_string()]); | |||
// That we have the right number of sections | |||
assert_eq!(site.library.sections().len(), 11); | |||
assert_eq!(library.sections().len(), 11); | |||
// And that the sections are correct | |||
let index_section = site.library.get_section(&path.join("content").join("_index.md")).unwrap(); | |||
let index_section = library.get_section(&path.join("content").join("_index.md")).unwrap(); | |||
assert_eq!(index_section.subsections.len(), 4); | |||
assert_eq!(index_section.pages.len(), 1); | |||
assert!(index_section.ancestors.is_empty()); | |||
let posts_section = site.library.get_section(&posts_path.join("_index.md")).unwrap(); | |||
let posts_section = library.get_section(&posts_path.join("_index.md")).unwrap(); | |||
assert_eq!(posts_section.subsections.len(), 2); | |||
assert_eq!(posts_section.pages.len(), 10); | |||
assert_eq!( | |||
posts_section.ancestors, | |||
vec![*site.library.get_section_key(&index_section.file.path).unwrap()] | |||
vec![*library.get_section_key(&index_section.file.path).unwrap()] | |||
); | |||
// Make sure we remove all the pwd + content from the sections | |||
let basic = site.library.get_page(&posts_path.join("simple.md")).unwrap(); | |||
let basic = library.get_page(&posts_path.join("simple.md")).unwrap(); | |||
assert_eq!(basic.file.components, vec!["posts".to_string()]); | |||
assert_eq!( | |||
basic.ancestors, | |||
vec![ | |||
*site.library.get_section_key(&index_section.file.path).unwrap(), | |||
*site.library.get_section_key(&posts_section.file.path).unwrap(), | |||
*library.get_section_key(&index_section.file.path).unwrap(), | |||
*library.get_section_key(&posts_section.file.path).unwrap(), | |||
] | |||
); | |||
let tutorials_section = | |||
site.library.get_section(&posts_path.join("tutorials").join("_index.md")).unwrap(); | |||
library.get_section(&posts_path.join("tutorials").join("_index.md")).unwrap(); | |||
assert_eq!(tutorials_section.subsections.len(), 2); | |||
let sub1 = site.library.get_section_by_key(tutorials_section.subsections[0]); | |||
let sub2 = site.library.get_section_by_key(tutorials_section.subsections[1]); | |||
let sub1 = library.get_section_by_key(tutorials_section.subsections[0]); | |||
let sub2 = library.get_section_by_key(tutorials_section.subsections[1]); | |||
assert_eq!(sub1.clone().meta.title.unwrap(), "Programming"); | |||
assert_eq!(sub2.clone().meta.title.unwrap(), "DevOps"); | |||
assert_eq!(tutorials_section.pages.len(), 0); | |||
let devops_section = site | |||
.library | |||
let devops_section = library | |||
.get_section(&posts_path.join("tutorials").join("devops").join("_index.md")) | |||
.unwrap(); | |||
assert_eq!(devops_section.subsections.len(), 0); | |||
@@ -76,14 +76,13 @@ fn can_parse_site() { | |||
assert_eq!( | |||
devops_section.ancestors, | |||
vec![ | |||
*site.library.get_section_key(&index_section.file.path).unwrap(), | |||
*site.library.get_section_key(&posts_section.file.path).unwrap(), | |||
*site.library.get_section_key(&tutorials_section.file.path).unwrap(), | |||
*library.get_section_key(&index_section.file.path).unwrap(), | |||
*library.get_section_key(&posts_section.file.path).unwrap(), | |||
*library.get_section_key(&tutorials_section.file.path).unwrap(), | |||
] | |||
); | |||
let prog_section = site | |||
.library | |||
let prog_section = library | |||
.get_section(&posts_path.join("tutorials").join("programming").join("_index.md")) | |||
.unwrap(); | |||
assert_eq!(prog_section.subsections.len(), 0); | |||
@@ -234,15 +233,18 @@ fn can_build_site_with_live_reload() { | |||
fn can_build_site_with_taxonomies() { | |||
let (site, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| { | |||
site.load().unwrap(); | |||
for (i, (_, page)) in site.library.pages_mut().iter_mut().enumerate() { | |||
page.meta.taxonomies = { | |||
let mut taxonomies = HashMap::new(); | |||
taxonomies.insert( | |||
"categories".to_string(), | |||
vec![if i % 2 == 0 { "A" } else { "B" }.to_string()], | |||
); | |||
taxonomies | |||
}; | |||
{ | |||
let mut library = site.library.write().unwrap(); | |||
for (i, (_, page)) in library.pages_mut().iter_mut().enumerate() { | |||
page.meta.taxonomies = { | |||
let mut taxonomies = HashMap::new(); | |||
taxonomies.insert( | |||
"categories".to_string(), | |||
vec![if i % 2 == 0 { "A" } else { "B" }.to_string()], | |||
); | |||
taxonomies | |||
}; | |||
} | |||
} | |||
site.populate_taxonomies().unwrap(); | |||
(site, false) | |||
@@ -311,12 +313,15 @@ fn can_build_site_and_insert_anchor_links() { | |||
fn can_build_site_with_pagination_for_section() { | |||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| { | |||
site.load().unwrap(); | |||
for (_, section) in site.library.sections_mut() { | |||
if section.is_index() { | |||
continue; | |||
{ | |||
let mut library = site.library.write().unwrap(); | |||
for (_, section) in library.sections_mut() { | |||
if section.is_index() { | |||
continue; | |||
} | |||
section.meta.paginate_by = Some(2); | |||
section.meta.template = Some("section_paginated.html".to_string()); | |||
} | |||
section.meta.paginate_by = Some(2); | |||
section.meta.template = Some("section_paginated.html".to_string()); | |||
} | |||
(site, false) | |||
}); | |||
@@ -425,12 +430,14 @@ fn can_build_site_with_pagination_for_index() { | |||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| { | |||
site.load().unwrap(); | |||
{ | |||
let index = site | |||
.library | |||
.get_section_mut(&site.base_path.join("content").join("_index.md")) | |||
.unwrap(); | |||
index.meta.paginate_by = Some(2); | |||
index.meta.template = Some("index_paginated.html".to_string()); | |||
let mut library = site.library.write().unwrap(); | |||
{ | |||
let index = library | |||
.get_section_mut(&site.base_path.join("content").join("_index.md")) | |||
.unwrap(); | |||
index.meta.paginate_by = Some(2); | |||
index.meta.template = Some("index_paginated.html".to_string()); | |||
} | |||
} | |||
(site, false) | |||
}); | |||
@@ -482,16 +489,19 @@ fn can_build_site_with_pagination_for_taxonomy() { | |||
lang: None, | |||
}); | |||
site.load().unwrap(); | |||
for (i, (_, page)) in site.library.pages_mut().iter_mut().enumerate() { | |||
page.meta.taxonomies = { | |||
let mut taxonomies = HashMap::new(); | |||
taxonomies.insert( | |||
"tags".to_string(), | |||
vec![if i % 2 == 0 { "A" } else { "B" }.to_string()], | |||
); | |||
taxonomies | |||
}; | |||
{ | |||
let mut library = site.library.write().unwrap(); | |||
for (i, (_, page)) in library.pages_mut().iter_mut().enumerate() { | |||
page.meta.taxonomies = { | |||
let mut taxonomies = HashMap::new(); | |||
taxonomies.insert( | |||
"tags".to_string(), | |||
vec![if i % 2 == 0 { "A" } else { "B" }.to_string()], | |||
); | |||
taxonomies | |||
}; | |||
} | |||
} | |||
site.populate_taxonomies().unwrap(); | |||
(site, false) | |||
@@ -594,38 +604,38 @@ fn can_apply_page_templates() { | |||
site.load().unwrap(); | |||
let template_path = path.join("content").join("applying_page_template"); | |||
let library = site.library.read().unwrap(); | |||
let template_section = site.library.get_section(&template_path.join("_index.md")).unwrap(); | |||
let template_section = library.get_section(&template_path.join("_index.md")).unwrap(); | |||
assert_eq!(template_section.subsections.len(), 2); | |||
assert_eq!(template_section.pages.len(), 2); | |||
let from_section_config = site.library.get_page_by_key(template_section.pages[0]); | |||
let from_section_config = library.get_page_by_key(template_section.pages[0]); | |||
assert_eq!(from_section_config.meta.template, Some("page_template.html".into())); | |||
assert_eq!(from_section_config.meta.title, Some("From section config".into())); | |||
let override_page_template = site.library.get_page_by_key(template_section.pages[1]); | |||
let override_page_template = library.get_page_by_key(template_section.pages[1]); | |||
assert_eq!(override_page_template.meta.template, Some("page_template_override.html".into())); | |||
assert_eq!(override_page_template.meta.title, Some("Override".into())); | |||
// It should have applied recursively as well | |||
let another_section = | |||
site.library.get_section(&template_path.join("another_section").join("_index.md")).unwrap(); | |||
library.get_section(&template_path.join("another_section").join("_index.md")).unwrap(); | |||
assert_eq!(another_section.subsections.len(), 0); | |||
assert_eq!(another_section.pages.len(), 1); | |||
let changed_recursively = site.library.get_page_by_key(another_section.pages[0]); | |||
let changed_recursively = library.get_page_by_key(another_section.pages[0]); | |||
assert_eq!(changed_recursively.meta.template, Some("page_template.html".into())); | |||
assert_eq!(changed_recursively.meta.title, Some("Changed recursively".into())); | |||
// But it should not have override a children page_template | |||
let yet_another_section = site | |||
.library | |||
let yet_another_section = library | |||
.get_section(&template_path.join("yet_another_section").join("_index.md")) | |||
.unwrap(); | |||
assert_eq!(yet_another_section.subsections.len(), 0); | |||
assert_eq!(yet_another_section.pages.len(), 1); | |||
let child = site.library.get_page_by_key(yet_another_section.pages[0]); | |||
let child = library.get_page_by_key(yet_another_section.pages[0]); | |||
assert_eq!(child.meta.template, Some("page_template_child.html".into())); | |||
assert_eq!(child.meta.title, Some("Local section override".into())); | |||
} | |||
@@ -13,44 +13,45 @@ fn can_parse_multilingual_site() { | |||
let mut site = Site::new(&path, "config.toml").unwrap(); | |||
site.load().unwrap(); | |||
assert_eq!(site.library.pages().len(), 10); | |||
assert_eq!(site.library.sections().len(), 6); | |||
let library = site.library.read().unwrap(); | |||
assert_eq!(library.pages().len(), 10); | |||
assert_eq!(library.sections().len(), 6); | |||
// default index sections | |||
let default_index_section = | |||
site.library.get_section(&path.join("content").join("_index.md")).unwrap(); | |||
library.get_section(&path.join("content").join("_index.md")).unwrap(); | |||
assert_eq!(default_index_section.pages.len(), 1); | |||
assert!(default_index_section.ancestors.is_empty()); | |||
let fr_index_section = | |||
site.library.get_section(&path.join("content").join("_index.fr.md")).unwrap(); | |||
library.get_section(&path.join("content").join("_index.fr.md")).unwrap(); | |||
assert_eq!(fr_index_section.pages.len(), 1); | |||
assert!(fr_index_section.ancestors.is_empty()); | |||
// blog sections get only their own language pages | |||
let blog_path = path.join("content").join("blog"); | |||
let default_blog = site.library.get_section(&blog_path.join("_index.md")).unwrap(); | |||
let default_blog = library.get_section(&blog_path.join("_index.md")).unwrap(); | |||
assert_eq!(default_blog.subsections.len(), 0); | |||
assert_eq!(default_blog.pages.len(), 4); | |||
assert_eq!( | |||
default_blog.ancestors, | |||
vec![*site.library.get_section_key(&default_index_section.file.path).unwrap()] | |||
vec![*library.get_section_key(&default_index_section.file.path).unwrap()] | |||
); | |||
for key in &default_blog.pages { | |||
let page = site.library.get_page_by_key(*key); | |||
let page = library.get_page_by_key(*key); | |||
assert_eq!(page.lang, None); | |||
} | |||
let fr_blog = site.library.get_section(&blog_path.join("_index.fr.md")).unwrap(); | |||
let fr_blog = library.get_section(&blog_path.join("_index.fr.md")).unwrap(); | |||
assert_eq!(fr_blog.subsections.len(), 0); | |||
assert_eq!(fr_blog.pages.len(), 3); | |||
assert_eq!( | |||
fr_blog.ancestors, | |||
vec![*site.library.get_section_key(&fr_index_section.file.path).unwrap()] | |||
vec![*library.get_section_key(&fr_index_section.file.path).unwrap()] | |||
); | |||
for key in &fr_blog.pages { | |||
let page = site.library.get_page_by_key(*key); | |||
let page = library.get_page_by_key(*key); | |||
assert_eq!(page.lang, Some("fr".to_string())); | |||
} | |||
} | |||
@@ -1,5 +1,6 @@ | |||
use std::collections::HashMap; | |||
use std::sync::{Arc, Mutex}; | |||
use std::path::PathBuf; | |||
use std::sync::{Arc, Mutex, RwLock}; | |||
use tera::{from_value, to_value, Function as TeraFn, Result, Value}; | |||
@@ -190,18 +191,12 @@ impl TeraFn for GetTaxonomyUrl { | |||
#[derive(Debug)] | |||
pub struct GetPage { | |||
pages: HashMap<String, Value>, | |||
base_path: PathBuf, | |||
library: Arc<RwLock<Library>>, | |||
} | |||
impl GetPage { | |||
pub fn new(library: &Library) -> Self { | |||
let mut pages = HashMap::new(); | |||
for page in library.pages_values() { | |||
pages.insert( | |||
page.file.relative.clone(), | |||
to_value(library.get_page(&page.file.path).unwrap().to_serialized(library)).unwrap(), | |||
); | |||
} | |||
Self {pages} | |||
pub fn new(base_path: PathBuf, library: Arc<RwLock<Library>>) -> Self { | |||
Self {base_path: base_path.join("content"), library} | |||
} | |||
} | |||
impl TeraFn for GetPage { | |||
@@ -211,8 +206,12 @@ impl TeraFn for GetPage { | |||
args.get("path"), | |||
"`get_page` requires a `path` argument with a string value" | |||
); | |||
match self.pages.get(&path) { | |||
Some(p) => Ok(p.clone()), | |||
let full_path = self.base_path.join(&path); | |||
let library = self.library.read().unwrap(); | |||
match library.get_page(&full_path) { | |||
Some(p) => { | |||
Ok(to_value(p.to_serialized(&library)).unwrap()) | |||
}, | |||
None => Err(format!("Page `{}` not found.", path).into()), | |||
} | |||
} | |||
@@ -220,27 +219,12 @@ impl TeraFn for GetPage { | |||
#[derive(Debug)] | |||
pub struct GetSection { | |||
sections: HashMap<String, Value>, | |||
sections_basic: HashMap<String, Value>, | |||
base_path: PathBuf, | |||
library: Arc<RwLock<Library>>, | |||
} | |||
impl GetSection { | |||
pub fn new(library: &Library) -> Self { | |||
let mut sections = HashMap::new(); | |||
let mut sections_basic = HashMap::new(); | |||
for section in library.sections_values() { | |||
sections.insert( | |||
section.file.relative.clone(), | |||
to_value(library.get_section(§ion.file.path).unwrap().to_serialized(library)) | |||
.unwrap(), | |||
); | |||
sections_basic.insert( | |||
section.file.relative.clone(), | |||
to_value(library.get_section(§ion.file.path).unwrap().to_serialized_basic(library)) | |||
.unwrap(), | |||
); | |||
} | |||
Self {sections, sections_basic} | |||
pub fn new(base_path: PathBuf, library: Arc<RwLock<Library>>) -> Self { | |||
Self {base_path: base_path.join("content"), library} | |||
} | |||
} | |||
impl TeraFn for GetSection { | |||
@@ -255,10 +239,17 @@ impl TeraFn for GetSection { | |||
.get("metadata_only") | |||
.map_or(false, |c| from_value::<bool>(c.clone()).unwrap_or(false)); | |||
let container = if metadata_only { &self.sections_basic } else { &self.sections }; | |||
let full_path = self.base_path.join(&path); | |||
let library = self.library.read().unwrap(); | |||
match container.get(&path) { | |||
Some(p) => Ok(p.clone()), | |||
match library.get_section(&full_path) { | |||
Some(s) => { | |||
if metadata_only { | |||
Ok(to_value(s.to_serialized_basic(&library)).unwrap()) | |||
} else { | |||
Ok(to_value(s.to_serialized(&library)).unwrap()) | |||
} | |||
}, | |||
None => Err(format!("Section `{}` not found.", path).into()), | |||
} | |||
} | |||
@@ -267,16 +258,16 @@ impl TeraFn for GetSection { | |||
#[derive(Debug)] | |||
pub struct GetTaxonomy { | |||
taxonomies: HashMap<String, Value>, | |||
library: Arc<RwLock<Library>>, | |||
taxonomies: HashMap<String, Taxonomy>, | |||
} | |||
impl GetTaxonomy { | |||
pub fn new(all_taxonomies: &[Taxonomy], library: &Library) -> Self { | |||
pub fn new(all_taxonomies: Vec<Taxonomy>, library: Arc<RwLock<Library>>) -> Self { | |||
let mut taxonomies = HashMap::new(); | |||
for taxonomy in all_taxonomies { | |||
taxonomies | |||
.insert(taxonomy.kind.name.clone(), to_value(taxonomy.to_serialized(library)).unwrap()); | |||
for taxo in all_taxonomies { | |||
taxonomies.insert(taxo.kind.name.clone(), taxo); | |||
} | |||
Self {taxonomies} | |||
Self {taxonomies, library} | |||
} | |||
} | |||
impl TeraFn for GetTaxonomy { | |||
@@ -286,18 +277,19 @@ impl TeraFn for GetTaxonomy { | |||
args.get("kind"), | |||
"`get_taxonomy` requires a `kind` argument with a string value" | |||
); | |||
let container = match self.taxonomies.get(&kind) { | |||
Some(c) => c, | |||
match self.taxonomies.get(&kind) { | |||
Some(t) => { | |||
Ok(to_value(t.to_serialized(&self.library.read().unwrap())).unwrap()) | |||
}, | |||
None => { | |||
return Err(format!( | |||
Err(format!( | |||
"`get_taxonomy` received an unknown taxonomy as kind: {}", | |||
kind | |||
) | |||
.into()); | |||
.into()) | |||
} | |||
}; | |||
Ok(to_value(container).unwrap()) | |||
} | |||
} | |||
} | |||
@@ -306,6 +298,7 @@ mod tests { | |||
use super::{GetTaxonomy, GetTaxonomyUrl, GetUrl, Trans}; | |||
use std::collections::HashMap; | |||
use std::sync::{RwLock, Arc}; | |||
use tera::{to_value, Value, Function}; | |||
@@ -355,12 +348,12 @@ mod tests { | |||
#[test] | |||
fn can_get_taxonomy() { | |||
let taxo_config = TaxonomyConfig { name: "tags".to_string(), ..TaxonomyConfig::default() }; | |||
let library = Library::new(0, 0, false); | |||
let tag = TaxonomyItem::new("Programming", &taxo_config, &Config::default(), vec![], &library); | |||
let library = Arc::new(RwLock::new(Library::new(0, 0, false))); | |||
let tag = TaxonomyItem::new("Programming", &taxo_config, &Config::default(), vec![], &library.read().unwrap()); | |||
let tags = Taxonomy { kind: taxo_config, items: vec![tag] }; | |||
let taxonomies = vec![tags.clone()]; | |||
let static_fn = GetTaxonomy::new(&taxonomies, &library); | |||
let static_fn = GetTaxonomy::new(taxonomies.clone(), library.clone()); | |||
// can find it correctly | |||
let mut args = HashMap::new(); | |||
args.insert("kind".to_string(), to_value("tags").unwrap()); | |||
@@ -47,23 +47,24 @@ fn colorize(message: &str, color: &ColorSpec) { | |||
/// Display in the console the number of pages/sections in the site | |||
pub fn notify_site_size(site: &Site) { | |||
let library = site.library.read().unwrap(); | |||
println!( | |||
"-> Creating {} pages ({} orphan), {} sections, and processing {} images", | |||
site.library.pages().len(), | |||
site.get_all_orphan_pages().len(), | |||
site.library.sections().len() - 1, // -1 since we do not the index as a section | |||
library.pages().len(), | |||
site.get_number_orphan_pages(), | |||
library.sections().len() - 1, // -1 since we do not the index as a section | |||
site.num_img_ops(), | |||
); | |||
} | |||
/// Display a warning in the console if there are ignored pages in the site | |||
pub fn warn_about_ignored_pages(site: &Site) { | |||
let ignored_pages: Vec<_> = site | |||
.library | |||
let library = site.library.read().unwrap(); | |||
let ignored_pages: Vec<_> = library | |||
.sections_values() | |||
.iter() | |||
.flat_map(|s| { | |||
s.ignored_pages.iter().map(|k| site.library.get_page_by_key(*k).file.path.clone()) | |||
s.ignored_pages.iter().map(|k| library.get_page_by_key(*k).file.path.clone()) | |||
}) | |||
.collect(); | |||