Mercurial > hg
changeset 46499:eace48b4a786
rust: Use the DisplayBytes trait in config printing
This is similar to `std::fmt::Display`, but for arbitrary bytes instead
of Unicode. Writing to an abstract output stream helps avoid allocating
intermediate `Vec<u8>` buffers.
Differential Revision: https://phab.mercurial-scm.org/D9966
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 08 Feb 2021 11:13:56 +0100 |
parents | 3caa3698335e |
children | 184e46550dc8 |
files | rust/Cargo.lock rust/hg-core/Cargo.toml rust/hg-core/src/config/config.rs rust/hg-core/src/config/layer.rs rust/rhg/Cargo.toml rust/rhg/src/error.rs |
diffstat | 6 files changed, 47 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/Cargo.lock Thu Feb 04 13:32:11 2021 -0800 +++ b/rust/Cargo.lock Mon Feb 08 11:13:56 2021 +0100 @@ -244,16 +244,16 @@ [[package]] name = "format-bytes" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "format-bytes-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "format-bytes-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.5.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "format-bytes-macros" -version = "0.1.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.19 (registry+https://github.com/rust-lang/crates.io-index)", @@ -305,7 +305,7 @@ "crossbeam-channel 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", - "format-bytes 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "format-bytes 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "home 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "im-rc 15.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -718,7 +718,7 @@ "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "format-bytes 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "format-bytes 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "hg-core 0.1.0", "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "micro-timer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -965,8 +965,8 @@ "checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" "checksum flate2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)" = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129" -"checksum format-bytes 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1a7374eb574cd29ae45878554298091c554c3286a17b3afa440a3e2710ae0790" -"checksum format-bytes-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4edcc04201cea17a0e6b937adebd46b93fba09924c7e6ed8c515a35ce8432cbc" +"checksum format-bytes 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc35f5e45d6b31053cea13078ffc6fa52fa8617aa54b7ac2011720d9c009e04f" +"checksum format-bytes-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b05089e341a0460449e2210c3bf7b61597860b07f0deae58da38dbed0a4c6b6d" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
--- a/rust/hg-core/Cargo.toml Thu Feb 04 13:32:11 2021 -0800 +++ b/rust/hg-core/Cargo.toml Mon Feb 08 11:13:56 2021 +0100 @@ -29,7 +29,7 @@ memmap = "0.7.0" zstd = "0.5.3" rust-crypto = "0.2.36" -format-bytes = "0.1.2" +format-bytes = "0.2.0" # We don't use the `miniz-oxide` backend to not change rhg benchmarks and until # we have a clearer view of which backend is the fastest.
--- a/rust/hg-core/src/config/config.rs Thu Feb 04 13:32:11 2021 -0800 +++ b/rust/hg-core/src/config/config.rs Mon Feb 08 11:13:56 2021 +0100 @@ -12,6 +12,7 @@ ConfigError, ConfigLayer, ConfigParseError, ConfigValue, }; use crate::utils::files::get_bytes_from_path; +use format_bytes::{write_bytes, DisplayBytes}; use std::env; use std::path::{Path, PathBuf}; @@ -23,13 +24,22 @@ layers: Vec<layer::ConfigLayer>, } -impl std::fmt::Debug for Config { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl DisplayBytes for Config { + fn display_bytes( + &self, + out: &mut dyn std::io::Write, + ) -> std::io::Result<()> { for (index, layer) in self.layers.iter().rev().enumerate() { - write!( - f, - "==== Layer {} (trusted: {}) ====\n{:?}", - index, layer.trusted, layer + write_bytes!( + out, + b"==== Layer {} (trusted: {}) ====\n{}", + index, + if layer.trusted { + &b"yes"[..] + } else { + &b"no"[..] + }, + layer )?; } Ok(())
--- a/rust/hg-core/src/config/layer.rs Thu Feb 04 13:32:11 2021 -0800 +++ b/rust/hg-core/src/config/layer.rs Mon Feb 08 11:13:56 2021 +0100 @@ -9,7 +9,7 @@ use crate::errors::{HgError, IoResultExt}; use crate::utils::files::{get_bytes_from_path, get_path_from_bytes}; -use format_bytes::format_bytes; +use format_bytes::{write_bytes, DisplayBytes}; use lazy_static::lazy_static; use regex::bytes::Regex; use std::collections::HashMap; @@ -165,8 +165,11 @@ } } -impl std::fmt::Debug for ConfigLayer { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl DisplayBytes for ConfigLayer { + fn display_bytes( + &self, + out: &mut dyn std::io::Write, + ) -> std::io::Result<()> { let mut sections: Vec<_> = self.sections.iter().collect(); sections.sort_by(|e0, e1| e0.0.cmp(e1.0)); @@ -175,16 +178,13 @@ items.sort_by(|e0, e1| e0.0.cmp(e1.0)); for (item, config_entry) in items { - writeln!( - f, - "{}", - String::from_utf8_lossy(&format_bytes!( - b"{}.{}={} # {}", - section, - item, - &config_entry.bytes, - &self.origin.to_bytes(), - )) + write_bytes!( + out, + b"{}.{}={} # {}\n", + section, + item, + &config_entry.bytes, + &self.origin, )? } } @@ -224,13 +224,15 @@ * Others? */ } -impl ConfigOrigin { - /// TODO use some kind of dedicated trait? - pub fn to_bytes(&self) -> Vec<u8> { +impl DisplayBytes for ConfigOrigin { + fn display_bytes( + &self, + out: &mut dyn std::io::Write, + ) -> std::io::Result<()> { match self { - ConfigOrigin::File(p) => get_bytes_from_path(p), - ConfigOrigin::CommandLine => b"--config".to_vec(), - ConfigOrigin::Environment(e) => format_bytes!(b"${}", e), + ConfigOrigin::File(p) => out.write_all(&get_bytes_from_path(p)), + ConfigOrigin::CommandLine => out.write_all(b"--config"), + ConfigOrigin::Environment(e) => write_bytes!(out, b"${}", e), } } }