From 559376db5e7eaed335293987953ac02c6ffce479 Mon Sep 17 00:00:00 2001 From: Marco Tolk <995838+mtolk@users.noreply.github.com> Date: Wed, 24 Nov 2021 11:50:12 +0100 Subject: [PATCH 1/6] initial version of zola with configurable png optimization using oxipng --- Cargo.lock | 189 +++++++++++++++++- components/config/src/config/mod.rs | 6 + components/site/src/lib.rs | 17 +- components/utils/Cargo.toml | 1 + components/utils/src/fs.rs | 105 +++++++--- .../getting-started/configuration.md | 9 + src/cmd/serve.rs | 2 +- 7 files changed, 292 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ec1dc355f1..76de121d39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -122,6 +122,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -170,6 +176,12 @@ dependencies = [ "serde", ] +[[package]] +name = "build_const" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" + [[package]] name = "bumpalo" version = "3.8.0" @@ -303,6 +315,24 @@ dependencies = [ "vec_map", ] +[[package]] +name = "cloudflare-zlib" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfcefb5df07f146eb15756342a135eb7d76b8bb609eff9c111f7539d060f94d" +dependencies = [ + "cloudflare-zlib-sys", +] + +[[package]] +name = "cloudflare-zlib-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2040b6d1edfee6d75f172d81e2d2a7807534f3f294ce18184c70e7bb0105cd6f" +dependencies = [ + "cc", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -361,6 +391,30 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +dependencies = [ + "build_const", +] + +[[package]] +name = "crc" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc32fast" version = "1.2.1" @@ -1118,6 +1172,7 @@ checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown 0.11.2", + "rayon", ] [[package]] @@ -1164,6 +1219,15 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1267,6 +1331,24 @@ version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2f96d100e1cf1929e7719b7edb3b90ab5298072638fccd77be9ce942ecdfce" +[[package]] +name = "libdeflate-sys" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c81cf7b5510a30d8a1149dcca5fe85715475a05092c786e660edc72dbf24e4" +dependencies = [ + "cc", +] + +[[package]] +name = "libdeflater" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11c0c8321257b64709e8ee6811d0b4a2ce030806e7ce1f36094bfa2c1de1540" +dependencies = [ + "libdeflate-sys", +] + [[package]] name = "library" version = "0.1.0" @@ -1537,6 +1619,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "miniz_oxide" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.6.23" @@ -1912,6 +2003,33 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "oxipng" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc96b13363b50f7c3f1e105fb7fe3e231a41ad1434fa1b055ed94b09b97ac786" +dependencies = [ + "bit-vec", + "byteorder", + "clap", + "cloudflare-zlib", + "crc 2.1.0", + "crossbeam-channel", + "filetime", + "image", + "indexmap", + "itertools", + "libdeflater", + "log", + "miniz_oxide 0.5.1", + "rayon", + "rgb", + "rustc_version", + "stderrlog", + "wild", + "zopfli", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -2416,6 +2534,15 @@ dependencies = [ "winreg", ] +[[package]] +name = "rgb" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27fa03bb1e3e2941f52d4a555a395a72bf79b0a85fbbaab79447050c97d978c" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.16.20" @@ -2450,6 +2577,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustls" version = "0.19.1" @@ -2573,6 +2709,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + [[package]] name = "serde" version = "1.0.130" @@ -2740,6 +2882,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "stderrlog" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a53e2eff3e94a019afa6265e8ee04cb05b9d33fe9f5078b14e4e391d155a38" +dependencies = [ + "atty", + "chrono", + "log", + "termcolor", + "thread_local", +] + [[package]] name = "string_cache" version = "0.8.2" @@ -2942,11 +3097,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "once_cell", + "lazy_static", ] [[package]] @@ -3083,6 +3238,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "typed-arena" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" + [[package]] name = "typenum" version = "1.14.0" @@ -3251,6 +3412,7 @@ dependencies = [ "errors", "filetime", "minify-html", + "oxipng", "percent-encoding", "serde", "slug", @@ -3423,6 +3585,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" +[[package]] +name = "wild" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "035793abb854745033f01a07647a79831eba29ec0be377205f2a25b0aa830020" +dependencies = [ + "glob", +] + [[package]] name = "winapi" version = "0.2.8" @@ -3565,3 +3736,15 @@ dependencies = [ "utils", "ws", ] + +[[package]] +name = "zopfli" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4079b79464426ade2a1b0177fb0ce8396ba6b4084267407e333573c666073964" +dependencies = [ + "adler32", + "byteorder", + "crc 1.8.1", + "typed-arena", +] diff --git a/components/config/src/config/mod.rs b/components/config/src/config/mod.rs index e68c4ac9b0..f7207ac211 100644 --- a/components/config/src/config/mod.rs +++ b/components/config/src/config/mod.rs @@ -62,6 +62,10 @@ pub struct Config { pub compile_sass: bool, /// Whether to minify the html output pub minify_html: bool, + /// Whether to optimize png files + pub optimize_png: bool, + /// level to optimize png files if applicable + pub optimize_png_level: u8, /// Whether to build the search index for the content pub build_search_index: bool, /// A list of file glob patterns to ignore when processing the content folder. Defaults to none. @@ -346,6 +350,8 @@ impl Default for Config { taxonomies: Vec::new(), compile_sass: false, minify_html: false, + optimize_png: false, + optimize_png_level: 3, mode: Mode::Build, build_search_index: false, ignored_content: Vec::new(), diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 0b93803531..43ed715423 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -505,11 +505,12 @@ impl Site { &self.base_path.join("themes").join(theme).join("static"), &self.output_path, false, + self.get_png_optimizationconfig() )?; } // We're fine with missing static folders if self.static_path.exists() { - copy_directory(&self.static_path, &self.output_path, self.config.hard_link_static)?; + copy_directory(&self.static_path, &self.output_path, self.config.hard_link_static,self.get_png_optimizationconfig())?; } Ok(()) @@ -591,7 +592,7 @@ impl Site { } fn copy_asset(&self, src: &Path, dest: &Path) -> Result<()> { - copy_file_if_needed(src, dest, self.config.hard_link_static) + copy_file_if_needed(src, dest, self.config.hard_link_static,self.get_png_optimizationconfig()) } /// Renders a single content page @@ -1114,6 +1115,18 @@ impl Site { }) .collect::>() } + + /* + when running serve we do not want png optimizations, because that's too slow. + when running build it depends upon the configuration + */ + fn get_png_optimizationconfig(&self) -> Option { + if self.config.optimize_png && self.build_mode == BuildMode::Disk { + Some(self.config.optimize_png_level) + } else { + None + } + } } fn log_time(start: Instant, message: &str) -> Instant { diff --git a/components/utils/Cargo.toml b/components/utils/Cargo.toml index 17ee05ae31..decc3be0dc 100644 --- a/components/utils/Cargo.toml +++ b/components/utils/Cargo.toml @@ -15,6 +15,7 @@ slug = "0.1" percent-encoding = "2" filetime = "0.2.12" minify-html = "0.6" +oxipng = "5" errors = { path = "../errors" } diff --git a/components/utils/src/fs.rs b/components/utils/src/fs.rs index 7b2a3aeb6d..c6cb3509d0 100644 --- a/components/utils/src/fs.rs +++ b/components/utils/src/fs.rs @@ -1,9 +1,12 @@ +extern crate oxipng; + use filetime::{set_file_mtime, FileTime}; use std::fs::{copy, create_dir_all, metadata, File}; use std::io::prelude::*; use std::path::Path; use std::time::SystemTime; use walkdir::WalkDir; +use oxipng::{InFile,OutFile,Options,optimize,AlphaOptim,Headers}; use errors::{Error, Result}; @@ -62,7 +65,7 @@ pub fn read_file(path: &Path) -> Result { /// Copy a file but takes into account where to start the copy as /// there might be folders we need to create on the way. -pub fn copy_file(src: &Path, dest: &Path, base_path: &Path, hard_link: bool) -> Result<()> { +pub fn copy_file(src: &Path, dest: &Path, base_path: &Path, hard_link: bool, configoptimize: Option) -> Result<()> { let relative_path = src.strip_prefix(base_path).unwrap(); let target_path = dest.join(relative_path); @@ -72,14 +75,40 @@ pub fn copy_file(src: &Path, dest: &Path, base_path: &Path, hard_link: bool) -> })?; } - copy_file_if_needed(src, &target_path, hard_link) + copy_file_if_needed(src, &target_path, hard_link,configoptimize) +} + +fn get_png_optimzation_options(configoptimize: Option) -> Options { + let mut oxipngoptions = match configoptimize { + Some(level) => { + let mut opts = Options::from_preset(level); + if level > 4 { + opts.alphas.insert(AlphaOptim::NoOp); + opts.alphas.insert(AlphaOptim::Black); + opts.alphas.insert(AlphaOptim::White); + opts.alphas.insert(AlphaOptim::Up); + opts.alphas.insert(AlphaOptim::Right); + opts.alphas.insert(AlphaOptim::Down); + opts.alphas.insert(AlphaOptim::Left); + } + opts + } + _ => {Options::from_preset(2)} + }; + oxipngoptions.preserve_attrs = true; + oxipngoptions.force = true; + oxipngoptions.strip = Headers::Safe; + oxipngoptions } /// No copy occurs if all of the following conditions are satisfied: /// 1. A file with the same name already exists in the dest path. /// 2. Its modification timestamp is identical to that of the src file. /// 3. Its filesize is identical to that of the src file. -pub fn copy_file_if_needed(src: &Path, dest: &Path, hard_link: bool) -> Result<()> { +/// Note in case of optimized png's the filesize may differ. But this does not matter because png's are only optimized in build mode, never in serve mode. +pub fn copy_file_if_needed(src: &Path, dest: &Path, hard_link: bool, configoptimize: Option) -> Result<()> { + let oxipngoptions = get_png_optimzation_options(configoptimize); + if let Some(parent_directory) = dest.parent() { create_dir_all(parent_directory).map_err(|e| { Error::chain(format!("Was not able to create folder {}", parent_directory.display()), e) @@ -94,33 +123,47 @@ pub fn copy_file_if_needed(src: &Path, dest: &Path, hard_link: bool) -> Result<( if Path::new(&dest).is_file() { let target_metadata = metadata(&dest)?; let target_mtime = FileTime::from_last_modification_time(&target_metadata); - if !(src_mtime == target_mtime && src_metadata.len() == target_metadata.len()) { - copy(src, &dest).map_err(|e| { - Error::chain( - format!( - "Was not able to copy file {} to {}", - src.display(), - dest.display() - ), - e, - ) - })?; - set_file_mtime(&dest, src_mtime)?; + if !(src_mtime == target_mtime && src_metadata.len() == target_metadata.len()) { + match src.extension() { + Some(ext) if configoptimize.is_some() && ext.to_str().unwrap().to_lowercase() == "png" => { + optimize( &InFile::Path( (&src).to_path_buf()), &OutFile::Path( Some((&dest).to_path_buf())) , &oxipngoptions).map_err(|e| { + Error::chain( + format!("Was not able to copy file {} to {}", src.display(), dest.display()), + e, + )})? ; + } + _ => {copy(src, &dest).map_err(|e| { + Error::chain( + format!("Was not able to copy file {} to {}", src.display(), dest.display()), + e, + )})?; + } + } + set_file_mtime(&dest, src_mtime)?; } } else { - copy(src, &dest).map_err(|e| { - Error::chain( - format!("Was not able to copy file {} to {}", src.display(), dest.display()), - e, - ) - })?; - set_file_mtime(&dest, src_mtime)?; - } - } + match src.extension() { + Some(ext) if configoptimize.is_some() && ext.to_str().unwrap().to_lowercase() == "png" => { + optimize( &InFile::Path( (&src).to_path_buf()), &OutFile::Path( Some((&dest).to_path_buf())) , &oxipngoptions).map_err(|e| { + Error::chain( + format!("Was not able to copy file {} to {}", src.display(), dest.display()), + e, + )})? ; + } + _ => {copy(src, &dest).map_err(|e| { + Error::chain( + format!("Was not able to copy file {} to {}", src.display(), dest.display()), + e, + )})?; + } + } + set_file_mtime(&dest, src_mtime)?; + } + } Ok(()) } -pub fn copy_directory(src: &Path, dest: &Path, hard_link: bool) -> Result<()> { +pub fn copy_directory(src: &Path, dest: &Path, hard_link: bool,configoptimize:Option) -> Result<()> { for entry in WalkDir::new(src).into_iter().filter_map(std::result::Result::ok) { let relative_path = entry.path().strip_prefix(src).unwrap(); let target_path = dest.join(relative_path); @@ -130,7 +173,7 @@ pub fn copy_directory(src: &Path, dest: &Path, hard_link: bool) -> Result<()> { create_directory(&target_path)?; } } else { - copy_file(entry.path(), dest, src, hard_link).map_err(|e| { + copy_file(entry.path(), dest, src, hard_link,configoptimize).map_err(|e| { Error::chain( format!( "Was not able to copy file {} to {}", @@ -197,7 +240,7 @@ mod tests { let src_file_path = src_dir.path().join("test.txt"); let dest_file_path = dest_dir.path().join(src_file_path.strip_prefix(&base_path).unwrap()); File::create(&src_file_path).unwrap(); - copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false).unwrap(); + copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false, None).unwrap(); assert_eq!( metadata(&src_file_path).and_then(|m| m.modified()).unwrap(), @@ -218,7 +261,7 @@ mod tests { let mut src_file = File::create(&src_file_path).unwrap(); src_file.write_all(b"file1").unwrap(); } - copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false).unwrap(); + copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false, None).unwrap(); { let mut dest_file = File::create(&dest_file_path).unwrap(); dest_file.write_all(b"file2").unwrap(); @@ -228,14 +271,14 @@ mod tests { filetime::set_file_mtime(&src_file_path, filetime::FileTime::from_unix_time(0, 0)).unwrap(); filetime::set_file_mtime(&dest_file_path, filetime::FileTime::from_unix_time(0, 0)) .unwrap(); - copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false).unwrap(); + copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false, None).unwrap(); assert_eq!(read_to_string(&src_file_path).unwrap(), "file1"); assert_eq!(read_to_string(&dest_file_path).unwrap(), "file2"); // Copy occurs if the timestamps are different while the filesizes are same. filetime::set_file_mtime(&dest_file_path, filetime::FileTime::from_unix_time(42, 42)) .unwrap(); - copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false).unwrap(); + copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false, None).unwrap(); assert_eq!(read_to_string(&src_file_path).unwrap(), "file1"); assert_eq!(read_to_string(&dest_file_path).unwrap(), "file1"); @@ -246,7 +289,7 @@ mod tests { } filetime::set_file_mtime(&dest_file_path, filetime::FileTime::from_unix_time(0, 0)) .unwrap(); - copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false).unwrap(); + copy_file(&src_file_path, &dest_dir.path().to_path_buf(), &base_path, false, None).unwrap(); assert_eq!(read_to_string(&src_file_path).unwrap(), "file1"); assert_eq!(read_to_string(&dest_file_path).unwrap(), "file1"); } diff --git a/docs/content/documentation/getting-started/configuration.md b/docs/content/documentation/getting-started/configuration.md index ff5cf75380..fc1e023841 100644 --- a/docs/content/documentation/getting-started/configuration.md +++ b/docs/content/documentation/getting-started/configuration.md @@ -48,6 +48,15 @@ compile_sass = false # When set to "true", the generated HTML files are minified. minify_html = false +# When set to "true", all png files in static and content are optimized. +# Note: when set png files are only optimized during zola build, never using zola serve, because it is too slow. +optimize_png = false + +# When optimize_png is set to true this value defined the level of optimization of png files. Allowed values 1-6. +# 1 is the mode with the least amount of optimization, but faster. +# 6 is the mode with the most optimization but very slow. +optimize_png_level = 3 + # A list of glob patterns specifying asset files to ignore when the content # directory is processed. Defaults to none, which means that all asset files are # copied over to the `public` directory. diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index f08f57fead..0ec8db7570 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -468,7 +468,7 @@ pub fn serve( } else { rebuild_done_handling( &broadcaster, - copy_file(path, &site.output_path, &site.static_path, site.config.hard_link_static), + copy_file(path, &site.output_path, &site.static_path, site.config.hard_link_static, None), &partial_path.to_string_lossy(), ); } From 9eaabb9333cb924ec005b55d17d01e027530e314 Mon Sep 17 00:00:00 2001 From: Marco Tolk <995838+mtolk@users.noreply.github.com> Date: Thu, 25 Nov 2021 09:10:17 +0100 Subject: [PATCH 2/6] added unittest for png optimization --- components/utils/src/fs.rs | 17 +++++++++++++---- .../utils/test-files/zola-first-serve.png | Bin 0 -> 18478 bytes 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 components/utils/test-files/zola-first-serve.png diff --git a/components/utils/src/fs.rs b/components/utils/src/fs.rs index c6cb3509d0..95e9259106 100644 --- a/components/utils/src/fs.rs +++ b/components/utils/src/fs.rs @@ -225,10 +225,19 @@ mod tests { use std::io::Write; use std::path::PathBuf; use std::str::FromStr; - - use tempfile::tempdir_in; - - use super::copy_file; + use tempfile::{tempdir_in,TempDir}; + + use super::{copy_file,copy_file_if_needed}; + + #[test] + fn test_copy_file_png_optimization() { + let base_path = PathBuf::from_str(env!("CARGO_MANIFEST_DIR")).unwrap(); + let png_path_src = base_path.join("test-files").join("zola-first-serve.png"); + let tmp_dir = TempDir::new(); + let png_path_dest = tmp_dir.unwrap().path().join("zola-first-serve.png"); + copy_file_if_needed(&png_path_src, &png_path_dest, false, Some(2)); + assert!(metadata(png_path_src).unwrap().len() > metadata(png_path_dest).unwrap().len(), "png was not optimized."); + } #[test] fn test_copy_file_timestamp_preserved() { diff --git a/components/utils/test-files/zola-first-serve.png b/components/utils/test-files/zola-first-serve.png new file mode 100644 index 0000000000000000000000000000000000000000..7c43e67f064c27cd95b52b4b9f9eb85e3269e2c2 GIT binary patch literal 18478 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 literal 0 HcmV?d00001 From fbb49b2669e3944ecffd8eaad5e4764e7747d4b8 Mon Sep 17 00:00:00 2001 From: Marco Tolk <995838+mtolk@users.noreply.github.com> Date: Thu, 25 Nov 2021 09:52:15 +0100 Subject: [PATCH 3/6] added integration test for png optimization --- components/site/tests/site.rs | 28 ++++++++++++++++++ .../posts/Jamstack_Logo_DarkBG_Solid.png | Bin 0 -> 17405 bytes test_site/static/zola-first-serve.png | Bin 0 -> 18478 bytes 3 files changed, 28 insertions(+) create mode 100644 test_site/content/posts/Jamstack_Logo_DarkBG_Solid.png create mode 100644 test_site/static/zola-first-serve.png diff --git a/components/site/tests/site.rs b/components/site/tests/site.rs index 461a767b6a..de54e66517 100644 --- a/components/site/tests/site.rs +++ b/components/site/tests/site.rs @@ -2,6 +2,7 @@ mod common; use std::collections::HashMap; use std::env; +use std::fs::metadata; use std::path::Path; use common::{build_site, build_site_with_setup}; @@ -265,6 +266,33 @@ fn can_build_site_with_live_reload_and_drafts() { assert!(file_exists!(public, "secret_section/secret_sub_section/hello/index.html")); } +#[test] +fn can_build_site_with_pngoptimizations() { + let (site, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| { + site.load().unwrap(); + { + site.config.optimize_png = true; + } + site.populate_taxonomies().unwrap(); + (site, false) + }); + let mut png_path_src = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf(); + let mut png_path_src_posts = png_path_src.clone(); + png_path_src.push("test_site"); + png_path_src.push("static"); + png_path_src.push("zola-first-serve.png"); + let png_path_dest = public.join("zola-first-serve.png"); + + png_path_src_posts.push("test_site"); + png_path_src_posts.push("content"); + png_path_src_posts.push("posts"); + png_path_src_posts.push("Jamstack_Logo_DarkBG_Solid.png"); + let png_path_dest_posts = public.join("posts").join("Jamstack_Logo_DarkBG_Solid.png"); + assert!(&public.exists()); + assert!(metadata(&png_path_src).unwrap().len() > metadata(png_path_dest).unwrap().len(), "png from static was not optimized."); + assert!(metadata(&png_path_src).unwrap().len() > metadata(png_path_dest_posts).unwrap().len(), "png from static was not optimized."); +} + #[test] fn can_build_site_with_taxonomies() { let (site, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| { diff --git a/test_site/content/posts/Jamstack_Logo_DarkBG_Solid.png b/test_site/content/posts/Jamstack_Logo_DarkBG_Solid.png new file mode 100644 index 0000000000000000000000000000000000000000..08085e166c7096b5d1aa8f70dc49feb72f3995d8 GIT binary patch literal 17405 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 literal 0 HcmV?d00001 diff --git a/test_site/static/zola-first-serve.png b/test_site/static/zola-first-serve.png new file mode 100644 index 0000000000000000000000000000000000000000..7c43e67f064c27cd95b52b4b9f9eb85e3269e2c2 GIT binary patch literal 18478 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 literal 0 HcmV?d00001 From 486529daf3655fa63208d894333c13ec2876f1f3 Mon Sep 17 00:00:00 2001 From: Marco Tolk <995838+mtolk@users.noreply.github.com> Date: Thu, 25 Nov 2021 10:09:35 +0100 Subject: [PATCH 4/6] added warning text for the slowness of png optimization fixed an accidental deletion part of syntaxhighlighting link --- docs/content/documentation/getting-started/configuration.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/content/documentation/getting-started/configuration.md b/docs/content/documentation/getting-started/configuration.md index fc1e023841..03674ad01c 100644 --- a/docs/content/documentation/getting-started/configuration.md +++ b/docs/content/documentation/getting-started/configuration.md @@ -50,6 +50,7 @@ minify_html = false # When set to "true", all png files in static and content are optimized. # Note: when set png files are only optimized during zola build, never using zola serve, because it is too slow. +# Warning enabling this option can slow down the build process. optimize_png = false # When optimize_png is set to true this value defined the level of optimization of png files. Allowed values 1-6. @@ -246,7 +247,7 @@ Zola uses the Sublime Text themes, making it very easy to add more. If you want a theme not listed above, please open an issue or a pull request on the [Zola repo](https://github.com/getzola/zola). Alternatively you can use the `extra_syntaxes_and_themes` configuration option to load your own custom themes from a .tmTheme file. -See [Syntax Highlighting](@/syntax-highlighting.md) for more details. +See [Syntax Highlighting](@/documentation/content/syntax-highlighting.md) for more details. ## Slugification strategies From a7936ad116200bb14d9ca07b3943256c808c5f66 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 6 Dec 2021 08:58:05 +0100 Subject: [PATCH 5/6] Update macos ci image --- CHANGELOG.md | 2 ++ azure-pipelines.yml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfbb17fb91..07bd01eb13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.16.0 (unreleased) + ## 0.15.0 (2021-12-05) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6763de5e18..717f256e00 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,7 +14,7 @@ stages: imageName: 'vs2017-win2016' rustup_toolchain: stable mac-stable: - imageName: 'macos-10.15' + imageName: 'macos-11' rustup_toolchain: stable linux-stable: imageName: 'ubuntu-20.04' From e0b9e02724aeef378b47daacf84c2f03bf9b7fac Mon Sep 17 00:00:00 2001 From: Marco Tolk <995838+mtolk@users.noreply.github.com> Date: Tue, 7 Dec 2021 11:36:42 +0100 Subject: [PATCH 6/6] merged cargo.lock after pull of next --- Cargo.lock | 354 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 257 insertions(+), 97 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3f910af7f..4810750c49 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,12 +14,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" -[[package]] -name = "ahash" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" - [[package]] name = "aho-corasick" version = "0.7.18" @@ -46,9 +40,9 @@ dependencies = [ [[package]] name = "ansi_term" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ "winapi 0.3.9", ] @@ -113,12 +107,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "beef" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed554bd50246729a1ec158d08aa3235d1b69d94ad120ebe187e28894787e736" - [[package]] name = "bincode" version = "1.3.3" @@ -280,7 +268,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time 0.1.43", + "time", "winapi 0.3.9", ] @@ -791,9 +779,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.18" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", ] @@ -854,6 +842,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.12.4" @@ -964,16 +961,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "hashbrown" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25" -dependencies = [ - "ahash", - "autocfg", -] - [[package]] name = "hashbrown" version = "0.11.2" @@ -1226,6 +1213,15 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1234,15 +1230,16 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "jieba-rs" -version = "0.5.1" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca2de723e93727460917d9542f7ae35a74d03d93923f03380a0238d860d137c" +checksum = "8c7e12f50325401dde50c29ca32cff44bae20873135b39f4e19ecf305226dd80" dependencies = [ "cedarwood", - "hashbrown 0.8.2", + "fxhash", + "hashbrown", "lazy_static", - "phf 0.8.0", - "phf_codegen 0.8.0", + "phf 0.10.0", + "phf_codegen 0.10.0", "regex", ] @@ -1295,12 +1292,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "levenshtein_automata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a004f877f468548d8d0ac4977456a249d8fabbdb8416c36db163dfc8f2e8ca" - [[package]] name = "lexical-core" version = "0.7.6" @@ -1329,6 +1320,24 @@ version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2f96d100e1cf1929e7719b7edb3b90ab5298072638fccd77be9ce942ecdfce" +[[package]] +name = "libdeflate-sys" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c81cf7b5510a30d8a1149dcca5fe85715475a05092c786e660edc72dbf24e4" +dependencies = [ + "cc", +] + +[[package]] +name = "libdeflater" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11c0c8321257b64709e8ee6811d0b4a2ce030806e7ce1f36094bfa2c1de1540" +dependencies = [ + "libdeflate-sys", +] + [[package]] name = "library" version = "0.1.0" @@ -1364,66 +1373,81 @@ dependencies = [ [[package]] name = "lindera" -version = "0.3.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b867cd68f5fc19a6d8b8361a6aba55ed2485f243044b70da14b6ba5a128c00" +checksum = "4e067b79992ab4ee575f5113ca7ccc1b011f67378f7627169e9bf95d48a8d481" dependencies = [ + "anyhow", "bincode", "byteorder", "encoding", "lindera-core", "lindera-dictionary", - "lindera-fst", "lindera-ipadic", + "lindera-ipadic-builder", "serde", "serde_json", ] [[package]] name = "lindera-core" -version = "0.3.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b7f132a5d361c1236b28434c632097fb8867ebdf4e4c9ab4f793525bb681ff" +checksum = "09d34134111feb8c9424de5743a9ead4c22cb1c5a48cb90322ebbe21a2bc27c1" dependencies = [ + "anyhow", "bincode", "byteorder", "encoding", - "lindera-fst", "serde", + "thiserror", + "yada", ] [[package]] name = "lindera-dictionary" -version = "0.3.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a61a066057d24faab043586633274fa3468c5c54cb8191895659811218a8ec" +checksum = "68ac4ac60f3ca650e4ab1280a5b6d57f73267902477ab9c9fd3b6609a7fb5888" dependencies = [ + "anyhow", "bincode", "byteorder", "lindera-core", ] [[package]] -name = "lindera-fst" -version = "0.1.1" +name = "lindera-ipadic" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6098a7ca6679296cd2d227efa232f990552c5278394c845bec8a70ab0284ae0" +checksum = "266fda136179e607d6ebcf2ef326fbdb2a133f9bdea9a68e6ac4fa8627e47ced" dependencies = [ + "bincode", "byteorder", - "levenshtein_automata", - "regex-syntax 0.4.2", - "utf8-ranges", + "encoding", + "flate2", + "lindera-core", + "lindera-ipadic-builder", + "reqwest", + "tar", + "tokio", ] [[package]] -name = "lindera-ipadic" -version = "0.3.3" +name = "lindera-ipadic-builder" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f12f44c385a6f4c1ff0863a2f0a91ce5f1ff6c2e0e44c69b37051b56fece112" +checksum = "7ede56e474b8fda9d4df2b9dc7683018111d3298260e1f594655e34287f26c64" dependencies = [ + "anyhow", "bincode", "byteorder", + "clap", + "encoding", + "glob", "lindera-core", + "serde", + "yada", ] [[package]] @@ -1470,30 +1494,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "logos" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427e2abca5be13136da9afdbf874e6b34ad9001dd70f2b103b083a85daa7b345" -dependencies = [ - "logos-derive", -] - -[[package]] -name = "logos-derive" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56a7d287fd2ac3f75b11f19a1c8a874a7d55744bd91f7a1b3e7cf87d4343c36d" -dependencies = [ - "beef", - "fnv", - "proc-macro2", - "quote", - "regex-syntax 0.6.25", - "syn", - "utf8-ranges", -] - [[package]] name = "mac" version = "0.1.1" @@ -1599,6 +1599,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "miniz_oxide" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.6.23" @@ -1974,6 +1983,33 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "oxipng" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc96b13363b50f7c3f1e105fb7fe3e231a41ad1434fa1b055ed94b09b97ac786" +dependencies = [ + "bit-vec", + "byteorder", + "clap", + "cloudflare-zlib", + "crc 2.1.0", + "crossbeam-channel", + "filetime", + "image", + "indexmap", + "itertools", + "libdeflater", + "log", + "miniz_oxide 0.5.1", + "rayon", + "rgb", + "rustc_version", + "stderrlog", + "wild", + "zopfli", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -2382,7 +2418,7 @@ checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.6.25", + "regex-syntax", ] [[package]] @@ -2391,12 +2427,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -[[package]] -name = "regex-syntax" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" - [[package]] name = "regex-syntax" version = "0.6.25" @@ -2428,7 +2458,8 @@ dependencies = [ "gh-emoji", "lazy_static", "link_checker", - "logos", + "pest", + "pest_derive", "pulldown-cmark", "regex", "serde", @@ -2478,6 +2509,15 @@ dependencies = [ "winreg", ] +[[package]] +name = "rgb" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27fa03bb1e3e2941f52d4a555a395a72bf79b0a85fbbaab79447050c97d978c" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.16.20" @@ -2512,6 +2552,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustls" version = "0.19.1" @@ -2635,6 +2684,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + [[package]] name = "serde" version = "1.0.130" @@ -2716,6 +2771,15 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + [[package]] name = "siphasher" version = "0.3.7" @@ -2802,6 +2866,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "stderrlog" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a53e2eff3e94a019afa6265e8ee04cb05b9d33fe9f5078b14e4e391d155a38" +dependencies = [ + "atty", + "chrono", + "log", + "termcolor", + "thread_local", +] + [[package]] name = "string_cache" version = "0.8.2" @@ -2889,7 +2966,7 @@ dependencies = [ "lazycell", "onig", "plist", - "regex-syntax 0.6.25", + "regex-syntax", "serde", "serde_derive", "serde_json", @@ -2897,6 +2974,17 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "tar" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "tempfile" version = "3.2.0" @@ -3002,13 +3090,33 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" -version = "1.1.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "once_cell", + "lazy_static", ] [[package]] @@ -3065,10 +3173,25 @@ dependencies = [ "memchr", "mio 0.7.14", "num_cpus", + "once_cell", + "parking_lot", "pin-project-lite", + "signal-hook-registry", + "tokio-macros", "winapi 0.3.9", ] +[[package]] +name = "tokio-macros" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio-native-tls" version = "0.3.0" @@ -3145,6 +3268,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "typed-arena" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" + [[package]] name = "typenum" version = "1.14.0" @@ -3300,12 +3429,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf8-ranges" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba" - [[package]] name = "utils" version = "0.1.0" @@ -3313,6 +3436,7 @@ dependencies = [ "errors", "filetime", "minify-html", + "oxipng", "percent-encoding", "serde", "slug", @@ -3485,6 +3609,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" +[[package]] +name = "wild" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "035793abb854745033f01a07647a79831eba29ec0be377205f2a25b0aa830020" +dependencies = [ + "glob", +] + [[package]] name = "winapi" version = "0.2.8" @@ -3565,6 +3698,15 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + [[package]] name = "xml-rs" version = "0.8.4" @@ -3589,6 +3731,12 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" +[[package]] +name = "yada" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d12cb7a57bbf2ab670ed9545bae3648048547f9039279a89ce000208e585c1" + [[package]] name = "yaml-rust" version = "0.4.5" @@ -3627,3 +3775,15 @@ dependencies = [ "utils", "ws", ] + +[[package]] +name = "zopfli" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4079b79464426ade2a1b0177fb0ce8396ba6b4084267407e333573c666073964" +dependencies = [ + "adler32", + "byteorder", + "crc 1.8.1", + "typed-arena", +]