From cc6e9caf25414d6d46f54f2a09b46b3ae813e4f9 Mon Sep 17 00:00:00 2001 From: Marcel Hellwig Date: Mon, 30 May 2022 16:11:12 +0200 Subject: [PATCH 01/32] fix markdown links (again) --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 93830bbca..22c1afc39 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -309,6 +309,7 @@ //! [systemd-journal-logger]: https://docs.rs/systemd-journal-logger/*/systemd_journal_logger/ //! [android_log]: https://docs.rs/android_log/*/android_log/ //! [win_dbg_logger]: https://docs.rs/win_dbg_logger/*/win_dbg_logger/ +//! [db_logger]: https://docs.rs/db_logger/*/db_logger/ //! [console_log]: https://docs.rs/console_log/*/console_log/ #![doc( From 0521b3f7c47b0a109fb3e161ed796f53005ba726 Mon Sep 17 00:00:00 2001 From: Marcel Hellwig Date: Tue, 31 May 2022 14:05:56 +0200 Subject: [PATCH 02/32] add clippy toml with msrv = 1.31 --- clippy.toml | 1 + 1 file changed, 1 insertion(+) create mode 100644 clippy.toml diff --git a/clippy.toml b/clippy.toml new file mode 100644 index 000000000..3d30690f1 --- /dev/null +++ b/clippy.toml @@ -0,0 +1 @@ +msrv = "1.31.0" From 4b52024d747f0aa1c2bcc97ba6fc550f5d64847c Mon Sep 17 00:00:00 2001 From: Marcel Hellwig Date: Tue, 31 May 2022 14:06:04 +0200 Subject: [PATCH 03/32] apply clippy lints --- build.rs | 4 +- src/kv/key.rs | 41 +----------- src/lib.rs | 162 ++++++----------------------------------------- tests/filters.rs | 10 +-- tests/macros.rs | 8 +-- 5 files changed, 29 insertions(+), 196 deletions(-) diff --git a/build.rs b/build.rs index dd8d4e0f7..11c26a333 100644 --- a/build.rs +++ b/build.rs @@ -22,7 +22,7 @@ fn main() { } fn target_has_atomic_cas(target: &str) -> bool { - match &target[..] { + match target { "thumbv6m-none-eabi" | "msp430-none-elf" | "riscv32i-unknown-none-elf" @@ -32,7 +32,7 @@ fn target_has_atomic_cas(target: &str) -> bool { } fn target_has_atomics(target: &str) -> bool { - match &target[..] { + match target { "thumbv4t-none-eabi" | "msp430-none-elf" | "riscv32i-unknown-none-elf" diff --git a/src/kv/key.rs b/src/kv/key.rs index 762e08dcb..eda5288a3 100644 --- a/src/kv/key.rs +++ b/src/kv/key.rs @@ -1,9 +1,7 @@ //! Structured keys. use std::borrow::Borrow; -use std::cmp; use std::fmt; -use std::hash; /// A type that can be converted into a [`Key`](struct.Key.html). pub trait ToKey { @@ -33,7 +31,7 @@ impl ToKey for str { } /// A key in a structured key-value pair. -#[derive(Clone)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Key<'k> { key: &'k str, } @@ -41,7 +39,7 @@ pub struct Key<'k> { impl<'k> Key<'k> { /// Get a key from a borrowed string. pub fn from_str(key: &'k str) -> Self { - Key { key: key } + Key { key } } /// Get a borrowed string from this key. @@ -50,47 +48,12 @@ impl<'k> Key<'k> { } } -impl<'k> fmt::Debug for Key<'k> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.key.fmt(f) - } -} - impl<'k> fmt::Display for Key<'k> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.key.fmt(f) } } -impl<'k> hash::Hash for Key<'k> { - fn hash(&self, state: &mut H) - where - H: hash::Hasher, - { - self.as_str().hash(state) - } -} - -impl<'k, 'ko> PartialEq> for Key<'k> { - fn eq(&self, other: &Key<'ko>) -> bool { - self.as_str().eq(other.as_str()) - } -} - -impl<'k> Eq for Key<'k> {} - -impl<'k, 'ko> PartialOrd> for Key<'k> { - fn partial_cmp(&self, other: &Key<'ko>) -> Option { - self.as_str().partial_cmp(other.as_str()) - } -} - -impl<'k> Ord for Key<'k> { - fn cmp(&self, other: &Self) -> cmp::Ordering { - self.as_str().cmp(other.as_str()) - } -} - impl<'k> AsRef for Key<'k> { fn as_ref(&self) -> &str { self.as_str() diff --git a/src/lib.rs b/src/lib.rs index 7043a6f12..2127f4805 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -421,7 +421,7 @@ static LEVEL_PARSE_ERROR: &str = /// [`log!`](macro.log.html), and comparing a `Level` directly to a /// [`LevelFilter`](enum.LevelFilter.html). #[repr(usize)] -#[derive(Copy, Eq, Debug, Hash)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] pub enum Level { /// The "error" level. /// @@ -448,20 +448,6 @@ pub enum Level { Trace, } -impl Clone for Level { - #[inline] - fn clone(&self) -> Level { - *self - } -} - -impl PartialEq for Level { - #[inline] - fn eq(&self, other: &Level) -> bool { - *self as usize == *other as usize - } -} - impl PartialEq for Level { #[inline] fn eq(&self, other: &LevelFilter) -> bool { @@ -469,65 +455,11 @@ impl PartialEq for Level { } } -impl PartialOrd for Level { - #[inline] - fn partial_cmp(&self, other: &Level) -> Option { - Some(self.cmp(other)) - } - - #[inline] - fn lt(&self, other: &Level) -> bool { - (*self as usize) < *other as usize - } - - #[inline] - fn le(&self, other: &Level) -> bool { - *self as usize <= *other as usize - } - - #[inline] - fn gt(&self, other: &Level) -> bool { - *self as usize > *other as usize - } - - #[inline] - fn ge(&self, other: &Level) -> bool { - *self as usize >= *other as usize - } -} - impl PartialOrd for Level { #[inline] fn partial_cmp(&self, other: &LevelFilter) -> Option { Some((*self as usize).cmp(&(*other as usize))) } - - #[inline] - fn lt(&self, other: &LevelFilter) -> bool { - (*self as usize) < *other as usize - } - - #[inline] - fn le(&self, other: &LevelFilter) -> bool { - *self as usize <= *other as usize - } - - #[inline] - fn gt(&self, other: &LevelFilter) -> bool { - *self as usize > *other as usize - } - - #[inline] - fn ge(&self, other: &LevelFilter) -> bool { - *self as usize >= *other as usize - } -} - -impl Ord for Level { - #[inline] - fn cmp(&self, other: &Level) -> cmp::Ordering { - (*self as usize).cmp(&(*other as usize)) - } } fn ok_or(t: Option, e: E) -> Result { @@ -637,7 +569,7 @@ impl Level { /// [`max_level()`]: fn.max_level.html /// [`set_max_level`]: fn.set_max_level.html #[repr(usize)] -#[derive(Copy, Eq, Debug, Hash)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] pub enum LevelFilter { /// A level lower than all log levels. Off, @@ -653,22 +585,6 @@ pub enum LevelFilter { Trace, } -// Deriving generates terrible impls of these traits - -impl Clone for LevelFilter { - #[inline] - fn clone(&self) -> LevelFilter { - *self - } -} - -impl PartialEq for LevelFilter { - #[inline] - fn eq(&self, other: &LevelFilter) -> bool { - *self as usize == *other as usize - } -} - impl PartialEq for LevelFilter { #[inline] fn eq(&self, other: &Level) -> bool { @@ -676,65 +592,11 @@ impl PartialEq for LevelFilter { } } -impl PartialOrd for LevelFilter { - #[inline] - fn partial_cmp(&self, other: &LevelFilter) -> Option { - Some(self.cmp(other)) - } - - #[inline] - fn lt(&self, other: &LevelFilter) -> bool { - (*self as usize) < *other as usize - } - - #[inline] - fn le(&self, other: &LevelFilter) -> bool { - *self as usize <= *other as usize - } - - #[inline] - fn gt(&self, other: &LevelFilter) -> bool { - *self as usize > *other as usize - } - - #[inline] - fn ge(&self, other: &LevelFilter) -> bool { - *self as usize >= *other as usize - } -} - impl PartialOrd for LevelFilter { #[inline] fn partial_cmp(&self, other: &Level) -> Option { Some((*self as usize).cmp(&(*other as usize))) } - - #[inline] - fn lt(&self, other: &Level) -> bool { - (*self as usize) < *other as usize - } - - #[inline] - fn le(&self, other: &Level) -> bool { - *self as usize <= *other as usize - } - - #[inline] - fn gt(&self, other: &Level) -> bool { - *self as usize > *other as usize - } - - #[inline] - fn ge(&self, other: &Level) -> bool { - *self as usize >= *other as usize - } -} - -impl Ord for LevelFilter { - #[inline] - fn cmp(&self, other: &LevelFilter) -> cmp::Ordering { - (*self as usize).cmp(&(*other as usize)) - } } impl FromStr for LevelFilter { @@ -1142,6 +1004,12 @@ impl<'a> RecordBuilder<'a> { } } +impl<'a> Default for RecordBuilder<'a> { + fn default() -> Self { + Self::new() + } +} + /// Metadata about a log message. /// /// # Use @@ -1265,6 +1133,12 @@ impl<'a> MetadataBuilder<'a> { } } +impl<'a> Default for MetadataBuilder<'a> { + fn default() -> Self { + Self::new() + } +} + /// A trait encapsulating the operations required of a logger. pub trait Log: Sync + Send { /// Determines if a log message with the specified metadata would be @@ -1307,10 +1181,10 @@ where } fn log(&self, record: &Record) { - (**self).log(record) + (**self).log(record); } fn flush(&self) { - (**self).flush() + (**self).flush(); } } @@ -1355,7 +1229,7 @@ where /// Note that `Trace` is the maximum level, because it provides the maximum amount of detail in the emitted logs. #[inline] pub fn set_max_level(level: LevelFilter) { - MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed) + MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed); } /// Returns the current maximum log level. @@ -1546,7 +1420,7 @@ impl error::Error for SetLoggerError {} /// /// [`from_str`]: https://doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str #[allow(missing_copy_implementations)] -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub struct ParseLevelError(()); impl fmt::Display for ParseLevelError { diff --git a/tests/filters.rs b/tests/filters.rs index 66d6f8cd0..fbbc435d8 100644 --- a/tests/filters.rs +++ b/tests/filters.rs @@ -69,15 +69,15 @@ fn main() { fn test(a: &State, filter: LevelFilter) { log::set_max_level(filter); error!(""); - last(&a, t(Level::Error, filter)); + last(a, t(Level::Error, filter)); warn!(""); - last(&a, t(Level::Warn, filter)); + last(a, t(Level::Warn, filter)); info!(""); - last(&a, t(Level::Info, filter)); + last(a, t(Level::Info, filter)); debug!(""); - last(&a, t(Level::Debug, filter)); + last(a, t(Level::Debug, filter)); trace!(""); - last(&a, t(Level::Trace, filter)); + last(a, t(Level::Trace, filter)); fn t(lvl: Level, filter: LevelFilter) -> Option { if lvl <= filter { diff --git a/tests/macros.rs b/tests/macros.rs index 22b7306fd..c48b16d26 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -75,18 +75,14 @@ fn named_args() { #[test] fn enabled() { for lvl in log::Level::iter() { - let _enabled = if log_enabled!(target: "my_target", lvl) { - true - } else { - false - }; + let _enabled = log_enabled!(target: "my_target", lvl); } } #[test] fn expr() { for lvl in log::Level::iter() { - let _ = log!(lvl, "hello"); + log!(lvl, "hello"); } } From b4a064c49f7b7ed6b0501347cada87c447db9964 Mon Sep 17 00:00:00 2001 From: Marcel Hellwig Date: Tue, 31 May 2022 14:12:46 +0200 Subject: [PATCH 04/32] add clippy to github workflow --- .github/workflows/main.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 860e9dfe9..2f6eeebe0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -60,6 +60,18 @@ jobs: rustup component add rustfmt - run: cargo fmt -- --check + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Rust + run: | + rustup update stable --no-self-update + rustup default stable + rustup component add clippy + - run: cargo clippy --verbose + features: name: Feature check runs-on: ubuntu-latest From e0e4fd7bcba8be4304b913bd9424899b0b4f39ef Mon Sep 17 00:00:00 2001 From: Marcel Hellwig Date: Tue, 31 May 2022 13:12:18 +0200 Subject: [PATCH 05/32] add cargo doc to workflow --- .github/workflows/main.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 860e9dfe9..30b366767 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: rust: stable-x86_64-gnu steps: - uses: actions/checkout@master - - name: Install Rust (rustup) + - name: Install Rust run: | rustup update ${{ matrix.rust }} --no-self-update rustup default ${{ matrix.rust }} @@ -60,6 +60,19 @@ jobs: rustup component add rustfmt - run: cargo fmt -- --check + doc: + name: Check Documentation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Rust + run: | + rustup update stable --no-self-update + rustup default stable + rustup component add rust-docs + - name: Run rustdoc + run: RUSTDOCFLAGS="-D warnings" cargo doc --verbose --all-features + features: name: Feature check runs-on: ubuntu-latest From e68fa19bc15af13b0d5f6522fe80d9a6c6c0771c Mon Sep 17 00:00:00 2001 From: Marcel Hellwig Date: Wed, 1 Jun 2022 07:44:33 +0200 Subject: [PATCH 06/32] clarify comment about derive impls Co-authored-by: Ashley Mannix --- src/kv/key.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/kv/key.rs b/src/kv/key.rs index eda5288a3..a35338dcc 100644 --- a/src/kv/key.rs +++ b/src/kv/key.rs @@ -31,6 +31,8 @@ impl ToKey for str { } /// A key in a structured key-value pair. +// These impls must only be based on the as_str() representation of the key +// If a new field (such as an optional index) is added to the key they must not affect comparison #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Key<'k> { key: &'k str, From 975d38a75a39b32149ac84d6b540e074b110d9ae Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Thu, 9 Jun 2022 08:50:25 +0900 Subject: [PATCH 07/32] Replace ad-hoc eq_ignore_ascii_case with slice::eq_ignore_ascii_case The latter has been available since rust 1.23.0. --- src/lib.rs | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 22c1afc39..fa334fe54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -538,32 +538,13 @@ fn ok_or(t: Option, e: E) -> Result { } } -// Reimplemented here because std::ascii is not available in libcore -fn eq_ignore_ascii_case(a: &str, b: &str) -> bool { - fn to_ascii_uppercase(c: u8) -> u8 { - if c >= b'a' && c <= b'z' { - c - b'a' + b'A' - } else { - c - } - } - - if a.len() == b.len() { - a.bytes() - .zip(b.bytes()) - .all(|(a, b)| to_ascii_uppercase(a) == to_ascii_uppercase(b)) - } else { - false - } -} - impl FromStr for Level { type Err = ParseLevelError; fn from_str(level: &str) -> Result { ok_or( LOG_LEVEL_NAMES .iter() - .position(|&name| eq_ignore_ascii_case(name, level)) + .position(|&name| name.eq_ignore_ascii_case(level)) .into_iter() .filter(|&idx| idx != 0) .map(|idx| Level::from_usize(idx).unwrap()) @@ -744,7 +725,7 @@ impl FromStr for LevelFilter { ok_or( LOG_LEVEL_NAMES .iter() - .position(|&name| eq_ignore_ascii_case(name, level)) + .position(|&name| name.eq_ignore_ascii_case(level)) .map(|p| LevelFilter::from_usize(p).unwrap()), ParseLevelError(()), ) From 7e2dde2c0f195eb998449e411bf48ca5dfa1fdfe Mon Sep 17 00:00:00 2001 From: Ashley Mannix Date: Wed, 31 Aug 2022 20:34:34 +1000 Subject: [PATCH 08/32] fix up windows targets --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9e7e651cd..47b2b2f5e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,13 +23,13 @@ jobs: rust: stable - build: win32 os: windows-latest - rust: stable-i686 + rust: stable-i686-pc-windows-msvc - build: win64 os: windows-latest - rust: stable-x86_64 + rust: stable-x86_64-pc-windows-msvc - build: mingw os: windows-latest - rust: stable-x86_64-gnu + rust: stable-x86_64-pc-windows-gnu steps: - uses: actions/checkout@master - name: Install Rust From 25683a8face1cd2c619a1989f83826d130181319 Mon Sep 17 00:00:00 2001 From: jiangying Date: Wed, 14 Sep 2022 09:45:38 +0800 Subject: [PATCH 09/32] typo fix --- src/macros.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/macros.rs b/src/macros.rs index a1d71d9ca..614961ff7 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -119,7 +119,7 @@ macro_rules! warn { /// let conn_info = Connection { port: 40, speed: 3.20 }; /// /// info!("Connected to port {} at {} Mb/s", conn_info.port, conn_info.speed); -/// info!(target: "connection_events", "Successfull connection, port: {}, speed: {}", +/// info!(target: "connection_events", "Successful connection, port: {}, speed: {}", /// conn_info.port, conn_info.speed); /// # } /// ``` From 2cf735473aec3970031f44c8578f1ba750ed0ace Mon Sep 17 00:00:00 2001 From: ErikWDev Date: Sat, 26 Nov 2022 16:57:36 +0100 Subject: [PATCH 10/32] Remove dependency on cfg_if --- Cargo.toml | 1 - src/lib.rs | 54 ++++++++++++++++++++++++++---------------------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cf54ce142..909b29c0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,6 @@ kv_unstable_std = ["std", "kv_unstable", "value-bag/error"] kv_unstable_serde = ["kv_unstable_std", "value-bag/serde", "serde"] [dependencies] -cfg-if = "1.0" serde = { version = "1.0", optional = true, default-features = false } sval = { version = "=1.0.0-alpha.5", optional = true, default-features = false } value-bag = { version = "=1.0.0-alpha.9", optional = true, default-features = false } diff --git a/src/lib.rs b/src/lib.rs index 42a3d77d2..4738fb965 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -328,9 +328,6 @@ #[cfg(all(not(feature = "std"), not(test)))] extern crate core as std; -#[macro_use] -extern crate cfg_if; - use std::cmp; #[cfg(feature = "std")] use std::error; @@ -1507,33 +1504,34 @@ pub mod __private_api { /// [`logger`]: fn.logger.html pub const STATIC_MAX_LEVEL: LevelFilter = MAX_LEVEL_INNER; -cfg_if! { - if #[cfg(all(not(debug_assertions), feature = "release_max_level_off"))] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Off; - } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_error"))] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Error; - } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_warn"))] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Warn; - } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_info"))] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Info; - } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_debug"))] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Debug; - } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_trace"))] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Trace; - } else if #[cfg(feature = "max_level_off")] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Off; - } else if #[cfg(feature = "max_level_error")] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Error; - } else if #[cfg(feature = "max_level_warn")] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Warn; - } else if #[cfg(feature = "max_level_info")] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Info; - } else if #[cfg(feature = "max_level_debug")] { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Debug; +#[rustfmt::skip] +const MAX_LEVEL_INNER: LevelFilter = { + if cfg!(all(not(debug_assertions), feature = "release_max_level_off")) { + LevelFilter::Off + } else if cfg!(all(not(debug_assertions), feature = "release_max_level_error")) { + LevelFilter::Error + } else if cfg!(all(not(debug_assertions), feature = "release_max_level_warn")) { + LevelFilter::Warn + } else if cfg!(all(not(debug_assertions), feature = "release_max_level_info")) { + LevelFilter::Info + } else if cfg!(all(not(debug_assertions), feature = "release_max_level_debug")) { + LevelFilter::Debug + } else if cfg!(all(not(debug_assertions), feature = "release_max_level_trace")) { + LevelFilter::Trace + } else if cfg!(feature = "max_level_off") { + LevelFilter::Off + } else if cfg!(feature = "max_level_error") { + LevelFilter::Error + } else if cfg!(feature = "max_level_warn") { + LevelFilter::Warn + } else if cfg!(feature = "max_level_info") { + LevelFilter::Info + } else if cfg!(feature = "max_level_debug") { + LevelFilter::Debug } else { - const MAX_LEVEL_INNER: LevelFilter = LevelFilter::Trace; + LevelFilter::Trace } -} +}; #[cfg(test)] mod tests { From 969281ea142007570742838402b8dff765f31148 Mon Sep 17 00:00:00 2001 From: ErikWDev Date: Sat, 26 Nov 2022 18:04:01 +0100 Subject: [PATCH 11/32] Ensure removal of cfg_if is compatible with MSRV --- src/lib.rs | 77 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4738fb965..732637801 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1504,34 +1504,59 @@ pub mod __private_api { /// [`logger`]: fn.logger.html pub const STATIC_MAX_LEVEL: LevelFilter = MAX_LEVEL_INNER; -#[rustfmt::skip] -const MAX_LEVEL_INNER: LevelFilter = { - if cfg!(all(not(debug_assertions), feature = "release_max_level_off")) { - LevelFilter::Off - } else if cfg!(all(not(debug_assertions), feature = "release_max_level_error")) { - LevelFilter::Error - } else if cfg!(all(not(debug_assertions), feature = "release_max_level_warn")) { - LevelFilter::Warn - } else if cfg!(all(not(debug_assertions), feature = "release_max_level_info")) { - LevelFilter::Info - } else if cfg!(all(not(debug_assertions), feature = "release_max_level_debug")) { - LevelFilter::Debug - } else if cfg!(all(not(debug_assertions), feature = "release_max_level_trace")) { - LevelFilter::Trace - } else if cfg!(feature = "max_level_off") { - LevelFilter::Off - } else if cfg!(feature = "max_level_error") { - LevelFilter::Error - } else if cfg!(feature = "max_level_warn") { - LevelFilter::Warn - } else if cfg!(feature = "max_level_info") { - LevelFilter::Info - } else if cfg!(feature = "max_level_debug") { - LevelFilter::Debug - } else { +const MAX_LEVEL_INNER: LevelFilter = get_max_level_inner(); + +const fn get_max_level_inner() -> LevelFilter { + #[allow(unreachable_code)] + { + #[cfg(all(not(debug_assertions), feature = "release_max_level_off"))] + { + return LevelFilter::Off; + } + #[cfg(all(not(debug_assertions), feature = "release_max_level_error"))] + { + return LevelFilter::Error; + } + #[cfg(all(not(debug_assertions), feature = "release_max_level_warn"))] + { + return LevelFilter::Warn; + } + #[cfg(all(not(debug_assertions), feature = "release_max_level_info"))] + { + return LevelFilter::Info; + } + #[cfg(all(not(debug_assertions), feature = "release_max_level_debug"))] + { + return LevelFilter::Debug; + } + #[cfg(all(not(debug_assertions), feature = "release_max_level_trace"))] + { + return LevelFilter::Trace; + } + #[cfg(feature = "max_level_off")] + { + return LevelFilter::Off; + } + #[cfg(feature = "max_level_error")] + { + return LevelFilter::Error; + } + #[cfg(feature = "max_level_warn")] + { + return LevelFilter::Warn; + } + #[cfg(feature = "max_level_info")] + { + return LevelFilter::Info; + } + #[cfg(feature = "max_level_debug")] + { + return LevelFilter::Debug; + } + LevelFilter::Trace } -}; +} #[cfg(test)] mod tests { From 609dc67da96a5d317ca7776845f6174f404c7c74 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 8 Dec 2022 19:39:36 +0200 Subject: [PATCH 12/32] build: harden main.yml permissions Signed-off-by: Alex --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 47b2b2f5e..783b5052d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,9 @@ name: CI on: [push, pull_request] +permissions: + contents: read # to fetch code (actions/checkout) + jobs: test: name: Test From f78217de018ceabba039693fb419effa3746a914 Mon Sep 17 00:00:00 2001 From: Alex Touchet Date: Fri, 16 Dec 2022 16:51:11 -0800 Subject: [PATCH 13/32] Fix build status badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f16da73f3..5adff6bd7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ log A Rust library providing a lightweight logging *facade*. -[![Build status](https://img.shields.io/github/workflow/status/rust-lang/log/CI/master)](https://github.com/rust-lang/log/actions) +[![Build status](https://img.shields.io/github/actions/workflow/status/rust-lang/log/main.yml?branch=master)](https://github.com/rust-lang/log/actions) [![Latest version](https://img.shields.io/crates/v/log.svg)](https://crates.io/crates/log) [![Documentation](https://docs.rs/log/badge.svg)](https://docs.rs/log) ![License](https://img.shields.io/crates/l/log.svg) From 7f09d72e5fd5387c672b9803ead6548b45920f55 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 6 Jan 2023 16:28:51 +0100 Subject: [PATCH 14/32] Remove build.rs file --- Cargo.toml | 1 - build.rs | 46 ---------------------------------------------- src/lib.rs | 20 ++++++++++---------- 3 files changed, 10 insertions(+), 57 deletions(-) delete mode 100644 build.rs diff --git a/Cargo.toml b/Cargo.toml index 909b29c0c..f4e944942 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,6 @@ A lightweight logging facade for Rust categories = ["development-tools::debugging"] keywords = ["logging"] exclude = ["rfcs/**/*"] -build = "build.rs" [package.metadata.docs.rs] features = ["std", "serde", "kv_unstable_std", "kv_unstable_sval", "kv_unstable_serde"] diff --git a/build.rs b/build.rs deleted file mode 100644 index 11c26a333..000000000 --- a/build.rs +++ /dev/null @@ -1,46 +0,0 @@ -//! This build script detects target platforms that lack proper support for -//! atomics and sets `cfg` flags accordingly. - -use std::env; -use std::str; - -fn main() { - let target = match rustc_target() { - Some(target) => target, - None => return, - }; - - if target_has_atomic_cas(&target) { - println!("cargo:rustc-cfg=atomic_cas"); - } - - if target_has_atomics(&target) { - println!("cargo:rustc-cfg=has_atomics"); - } - - println!("cargo:rerun-if-changed=build.rs"); -} - -fn target_has_atomic_cas(target: &str) -> bool { - match target { - "thumbv6m-none-eabi" - | "msp430-none-elf" - | "riscv32i-unknown-none-elf" - | "riscv32imc-unknown-none-elf" => false, - _ => true, - } -} - -fn target_has_atomics(target: &str) -> bool { - match target { - "thumbv4t-none-eabi" - | "msp430-none-elf" - | "riscv32i-unknown-none-elf" - | "riscv32imc-unknown-none-elf" => false, - _ => true, - } -} - -fn rustc_target() -> Option { - env::var("TARGET").ok() -} diff --git a/src/lib.rs b/src/lib.rs index 732637801..0a710c77b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -342,20 +342,20 @@ mod serde; #[cfg(feature = "kv_unstable")] pub mod kv; -#[cfg(has_atomics)] +#[cfg(target_has_atomic = "ptr")] use std::sync::atomic::{AtomicUsize, Ordering}; -#[cfg(not(has_atomics))] +#[cfg(not(target_has_atomic = "ptr"))] use std::cell::Cell; -#[cfg(not(has_atomics))] +#[cfg(not(target_has_atomic = "ptr"))] use std::sync::atomic::Ordering; -#[cfg(not(has_atomics))] +#[cfg(not(target_has_atomic = "ptr"))] struct AtomicUsize { v: Cell, } -#[cfg(not(has_atomics))] +#[cfg(not(target_has_atomic = "ptr"))] impl AtomicUsize { const fn new(v: usize) -> AtomicUsize { AtomicUsize { v: Cell::new(v) } @@ -369,7 +369,7 @@ impl AtomicUsize { self.v.set(val) } - #[cfg(atomic_cas)] + #[cfg(target_has_atomic = "ptr")] fn compare_exchange( &self, current: usize, @@ -387,7 +387,7 @@ impl AtomicUsize { // Any platform without atomics is unlikely to have multiple cores, so // writing via Cell will not be a race condition. -#[cfg(not(has_atomics))] +#[cfg(not(target_has_atomic = "ptr"))] unsafe impl Sync for AtomicUsize {} // The LOGGER static holds a pointer to the global logger. It is protected by @@ -1256,7 +1256,7 @@ pub fn max_level() -> LevelFilter { /// An error is returned if a logger has already been set. /// /// [`set_logger`]: fn.set_logger.html -#[cfg(all(feature = "std", atomic_cas))] +#[cfg(all(feature = "std", target_has_atomic = "ptr"))] pub fn set_boxed_logger(logger: Box) -> Result<(), SetLoggerError> { set_logger_inner(|| Box::leak(logger)) } @@ -1314,12 +1314,12 @@ pub fn set_boxed_logger(logger: Box) -> Result<(), SetLoggerError> { /// ``` /// /// [`set_logger_racy`]: fn.set_logger_racy.html -#[cfg(atomic_cas)] +#[cfg(target_has_atomic = "ptr")] pub fn set_logger(logger: &'static dyn Log) -> Result<(), SetLoggerError> { set_logger_inner(|| logger) } -#[cfg(atomic_cas)] +#[cfg(target_has_atomic = "ptr")] fn set_logger_inner(make_logger: F) -> Result<(), SetLoggerError> where F: FnOnce() -> &'static dyn Log, From 0fe18a48a5a87f4beb835052f3445bb30e5a3e0a Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 6 Jan 2023 16:32:14 +0100 Subject: [PATCH 15/32] Update minimum supported Rust version to 1.60.0 --- .github/workflows/main.yml | 4 ++-- README.md | 2 +- clippy.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 783b5052d..fb038d280 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -127,8 +127,8 @@ jobs: - uses: actions/checkout@master - name: Install Rust run: | - rustup update 1.31.0 --no-self-update - rustup default 1.31.0 + rustup update 1.60.0 --no-self-update + rustup default 1.60.0 - run: cargo build --verbose - run: cargo build --verbose --features serde - run: cargo build --verbose --features std diff --git a/README.md b/README.md index 5adff6bd7..41a1cb648 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ implementation that is most suitable for its use case. ## Minimum supported `rustc` -`1.31.0+` +`1.60.0+` This version is explicitly tested in CI and may be bumped in any release as needed. Maintaining compatibility with older compilers is a priority though, so the bar for bumping the minimum supported version is set very high. Any changes to the supported minimum version will be called out in the release notes. diff --git a/clippy.toml b/clippy.toml index 3d30690f1..16caf02ee 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1 +1 @@ -msrv = "1.31.0" +msrv = "1.60.0" From e5f1ae9703eed70ae60e552dac1e3e8ab8371a22 Mon Sep 17 00:00:00 2001 From: David Koloski Date: Fri, 6 Jan 2023 11:08:26 -0500 Subject: [PATCH 16/32] Add `set_max_level_racy` and gate `set_max_level` Calling `set_max_level` can result in a race condition on platforms that don't have an atomic compare and swap implementation. This gates `set_max_level` behind `#[cfg(atomic_cas)]` and adds a racy alternative that can be called in these situations. This mirrors the approach for `set_logger`. --- src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 732637801..f79d3116b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1215,10 +1215,38 @@ where /// /// Note that `Trace` is the maximum level, because it provides the maximum amount of detail in the emitted logs. #[inline] +#[cfg(atomic_cas)] pub fn set_max_level(level: LevelFilter) { MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed); } +/// A thread-unsafe version of [`set_max_level`]. +/// +/// This function is available on all platforms, even those that do not have +/// support for atomics that is needed by [`set_max_level`]. +/// +/// In almost all cases, [`set_max_level`] should be preferred. +/// +/// # Safety +/// +/// This function is only safe to call when no other level setting function is +/// called while this function still executes. +/// +/// This can be upheld by (for example) making sure that **there are no other +/// threads**, and (on embedded) that **interrupts are disabled**. +/// +/// Is is safe to use all other logging functions while this function runs +/// (including all logging macros). +/// +/// [`set_max_level`]: fn.set_max_level.html +#[inline] +pub unsafe fn set_max_level_racy(level: LevelFilter) { + // `MAX_LOG_LEVEL_FILTER` uses a `Cell` as the underlying primitive when a + // platform doesn't support `atomic_cas`, so even though this looks the same + // as `set_max_level` it may have different safety properties. + MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed); +} + /// Returns the current maximum log level. /// /// The [`log!`], [`error!`], [`warn!`], [`info!`], [`debug!`], and [`trace!`] macros check From 2045d335c77489931774b0be2127f7efa73f8842 Mon Sep 17 00:00:00 2001 From: a1ecbr0wn Date: Tue, 7 Mar 2023 10:13:41 +0000 Subject: [PATCH 17/32] Add call_logger to the documentation --- README.md | 1 + src/lib.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/README.md b/README.md index 5adff6bd7..0d6041c3d 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ There are many available implementations to choose from, here are some of the mo * [`pretty_env_logger`](https://docs.rs/pretty_env_logger/*/pretty_env_logger/) * [`stderrlog`](https://docs.rs/stderrlog/*/stderrlog/) * [`flexi_logger`](https://docs.rs/flexi_logger/*/flexi_logger/) + * [`call_logger`](https://docs.rs/call_logger/*/call_logger/) * Complex configurable frameworks: * [`log4rs`](https://docs.rs/log4rs/*/log4rs/) * [`fern`](https://docs.rs/fern/*/fern/) diff --git a/src/lib.rs b/src/lib.rs index 732637801..0006c4131 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -136,6 +136,7 @@ //! * [pretty_env_logger] //! * [stderrlog] //! * [flexi_logger] +//! * [call_logger] //! * Complex configurable frameworks: //! * [log4rs] //! * [fern] @@ -302,6 +303,7 @@ //! [pretty_env_logger]: https://docs.rs/pretty_env_logger/*/pretty_env_logger/ //! [stderrlog]: https://docs.rs/stderrlog/*/stderrlog/ //! [flexi_logger]: https://docs.rs/flexi_logger/*/flexi_logger/ +//! [call_logger]: https://docs.rs/call_logger/*/call_logger/ //! [syslog]: https://docs.rs/syslog/*/syslog/ //! [slog-stdlog]: https://docs.rs/slog-stdlog/*/slog_stdlog/ //! [log4rs]: https://docs.rs/log4rs/*/log4rs/ From c644e6fb8256d369b882719380ac3773d0f4f6a6 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Sun, 9 Apr 2023 16:53:19 +1000 Subject: [PATCH 18/32] port to stable versions of value-bag and sval --- Cargo.toml | 9 +++---- src/kv/key.rs | 10 ++++++-- src/kv/source.rs | 61 +++++++++++++++++++++++++++--------------------- src/kv/value.rs | 53 +++++++++++++++++------------------------ 4 files changed, 70 insertions(+), 63 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 909b29c0c..31164d5e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,12 +54,13 @@ kv_unstable_serde = ["kv_unstable_std", "value-bag/serde", "serde"] [dependencies] serde = { version = "1.0", optional = true, default-features = false } -sval = { version = "=1.0.0-alpha.5", optional = true, default-features = false } -value-bag = { version = "=1.0.0-alpha.9", optional = true, default-features = false } +sval = { version = "2.0", optional = true, default-features = false } +value-bag = { version = "1.0", optional = true, default-features = false } [dev-dependencies] rustversion = "1.0" serde = { version = "1.0", features = ["derive"] } serde_test = "1.0" -sval = { version = "=1.0.0-alpha.5", features = ["derive"] } -value-bag = { version = "=1.0.0-alpha.9", features = ["test"] } +sval = { version = "2.0" } +sval_derive = { version = "2.0" } +value-bag = { version = "1.0", features = ["test"] } diff --git a/src/kv/key.rs b/src/kv/key.rs index a35338dcc..d5258383c 100644 --- a/src/kv/key.rs +++ b/src/kv/key.rs @@ -48,6 +48,12 @@ impl<'k> Key<'k> { pub fn as_str(&self) -> &str { self.key } + + /// Try get a string borrowed for the `'k` lifetime from this key. + pub fn to_borrowed_str(&self) -> Option<&'k str> { + // NOTE: This API leaves room for keys to be owned + Some(self.key) + } } impl<'k> fmt::Display for Key<'k> { @@ -99,10 +105,10 @@ mod sval_support { extern crate sval; - use self::sval::value::{self, Value}; + use self::sval::Value; impl<'a> Value for Key<'a> { - fn stream(&self, stream: &mut value::Stream) -> value::Result { + fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> sval::Result { self.key.stream(stream) } } diff --git a/src/kv/source.rs b/src/kv/source.rs index 8762c621e..5ea41c159 100644 --- a/src/kv/source.rs +++ b/src/kv/source.rs @@ -460,74 +460,83 @@ where mod sval_support { use super::*; - use self::sval::value; - - impl value::Value for AsMap + impl self::sval::Value for AsMap where S: Source, { - fn stream(&self, stream: &mut value::Stream) -> value::Result { - struct StreamVisitor<'a, 'b>(&'a mut value::Stream<'b>); + fn stream<'sval, SV: self::sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut SV) -> self::sval::Result { + struct StreamVisitor<'a, V: ?Sized>(&'a mut V); - impl<'a, 'b, 'kvs> Visitor<'kvs> for StreamVisitor<'a, 'b> { + impl<'a, 'kvs, V: self::sval::Stream<'kvs> + ?Sized> Visitor<'kvs> for StreamVisitor<'a, V> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), Error> { - self.0 - .map_key(key) - .map_err(|_| Error::msg("failed to stream map key"))?; - self.0 - .map_value(value) - .map_err(|_| Error::msg("failed to stream map value"))?; + self.0.map_key_begin().map_err(|_| Error::msg("failed to stream map key"))?; + if let Some(key) = key.to_borrowed_str() { + self.0.value(key).map_err(|_| Error::msg("failed to stream map key"))?; + } else { + self.0.value_computed(key.as_str()).map_err(|_| Error::msg("failed to stream map key"))?; + } + self.0.map_key_end().map_err(|_| Error::msg("failed to stream map key"))?; + + // TODO: Need to borrow this here + self.0.map_value_begin().map_err(|_| Error::msg("failed to stream map value"))?; + self.0.value_computed(&value).map_err(|_| Error::msg("failed to stream map value"))?; + self.0.map_value_end().map_err(|_| Error::msg("failed to stream map value"))?; + Ok(()) } } stream .map_begin(Some(self.count())) - .map_err(|_| self::sval::Error::msg("failed to begin map"))?; + .map_err(|_| self::sval::Error::new())?; self.visit(&mut StreamVisitor(stream)) - .map_err(|_| self::sval::Error::msg("failed to visit key-values"))?; + .map_err(|_| self::sval::Error::new())?; stream .map_end() - .map_err(|_| self::sval::Error::msg("failed to end map")) + .map_err(|_| self::sval::Error::new()) } } - impl value::Value for AsList + impl self::sval::Value for AsList where S: Source, { - fn stream(&self, stream: &mut value::Stream) -> value::Result { - struct StreamVisitor<'a, 'b>(&'a mut value::Stream<'b>); + fn stream<'sval, SV: self::sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut SV) -> self::sval::Result { + struct StreamVisitor<'a, V: ?Sized>(&'a mut V); - impl<'a, 'b, 'kvs> Visitor<'kvs> for StreamVisitor<'a, 'b> { + impl<'a, 'kvs, V: self::sval::Stream<'kvs> + ?Sized> Visitor<'kvs> for StreamVisitor<'a, V> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), Error> { - self.0 - .seq_elem((key, value)) - .map_err(|_| Error::msg("failed to stream seq entry"))?; + // TODO: Need to borrow this here + self.0.seq_value_begin().map_err(|_| Error::msg("failed to stream seq value"))?; + self.0.value_computed(&(key, value)).map_err(|_| Error::msg("failed to stream seq value"))?; + self.0.seq_value_end().map_err(|_| Error::msg("failed to stream seq value"))?; + Ok(()) } } stream .seq_begin(Some(self.count())) - .map_err(|_| self::sval::Error::msg("failed to begin seq"))?; + .map_err(|_| self::sval::Error::new())?; self.visit(&mut StreamVisitor(stream)) - .map_err(|_| self::sval::Error::msg("failed to visit key-values"))?; + .map_err(|_| self::sval::Error::new())?; stream .seq_end() - .map_err(|_| self::sval::Error::msg("failed to end seq")) + .map_err(|_| self::sval::Error::new()) } } #[cfg(test)] mod tests { + extern crate sval_derive; + use super::*; - use self::sval::Value; + use self::sval_derive::Value; use crate::kv::source; diff --git a/src/kv/value.rs b/src/kv/value.rs index 607bc09a5..e0dcb9da2 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -71,7 +71,7 @@ macro_rules! as_serde { }; } -/// Get a value from a type implementing `sval::value::Value`. +/// Get a value from a type implementing `self::sval::value::Value`. #[cfg(feature = "kv_unstable_sval")] #[macro_export] macro_rules! as_sval { @@ -197,21 +197,21 @@ impl<'v> Value<'v> { /// Get a value from a type implementing `serde::Serialize`. pub fn capture_serde(value: &'v T) -> Self where - T: self::serde::Serialize + 'static, + T: serde::Serialize + 'static, { Value { inner: ValueBag::capture_serde1(value), } } - /// Get a value from a type implementing `sval::value::Value`. + /// Get a value from a type implementing `self::sval::value::Value`. #[cfg(feature = "kv_unstable_sval")] pub fn capture_sval(value: &'v T) -> Self where - T: self::sval::value::Value + 'static, + T: self::sval::Value + 'static, { Value { - inner: ValueBag::capture_sval1(value), + inner: ValueBag::capture_sval2(value), } } @@ -239,7 +239,7 @@ impl<'v> Value<'v> { #[cfg(feature = "kv_unstable_serde")] pub fn from_serde(value: &'v T) -> Self where - T: self::serde::Serialize, + T: serde::Serialize, { Value { inner: ValueBag::from_serde1(value), @@ -250,10 +250,10 @@ impl<'v> Value<'v> { #[cfg(feature = "kv_unstable_sval")] pub fn from_sval(value: &'v T) -> Self where - T: self::sval::value::Value, + T: self::sval::Value, { Value { - inner: ValueBag::from_sval1(value), + inner: ValueBag::from_sval2(value), } } @@ -279,14 +279,6 @@ impl<'v> Value<'v> { } } - /// Get a value from a type implementing `sval::value::Value`. - #[cfg(feature = "kv_unstable_sval")] - pub fn from_dyn_sval(value: &'v dyn self::sval::value::Value) -> Self { - Value { - inner: ValueBag::from_dyn_sval1(value), - } - } - /// Get a value from an internal primitive. fn from_value_bag(value: T) -> Self where @@ -412,26 +404,19 @@ impl ToValue for dyn std::error::Error + 'static { } #[cfg(feature = "kv_unstable_serde")] -impl<'v> self::serde::Serialize for Value<'v> { +impl<'v> serde::Serialize for Value<'v> { fn serialize(&self, s: S) -> Result where - S: self::serde::Serializer, + S: serde::Serializer, { self.inner.serialize(s) } } #[cfg(feature = "kv_unstable_sval")] -impl<'v> self::sval::value::Value for Value<'v> { - fn stream(&self, stream: &mut self::sval::value::Stream) -> self::sval::value::Result { - self::sval::value::Value::stream(&self.inner, stream) - } -} - -#[cfg(feature = "kv_unstable_sval")] -impl ToValue for dyn self::sval::value::Value { - fn to_value(&self) -> Value { - Value::from_dyn_sval(self) +impl<'v> self::sval::Value for Value<'v> { + fn stream<'sval, S: self::sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> self::sval::Result { + self::sval::Value::stream(&self.inner, stream) } } @@ -465,6 +450,12 @@ impl ToValue for std::num::NonZeroI128 { } } +impl<'v> From> for Value<'v> { + fn from(value: ValueBag<'v>) -> Self { + Value::from_value_bag(value) + } +} + impl<'v> From<&'v str> for Value<'v> { fn from(value: &'v str) -> Self { Value::from_value_bag(value) @@ -650,7 +641,7 @@ pub trait Visit<'v> { /// This is the only required method on `Visit` and acts as a fallback for any /// more specific methods that aren't overridden. /// The `Value` may be formatted using its `fmt::Debug` or `fmt::Display` implementation, - /// or serialized using its `sval::Value` or `serde::Serialize` implementation. + /// or serialized using its `self::sval::Value` or `serde::Serialize` implementation. fn visit_any(&mut self, value: Value) -> Result<(), Error>; /// Visit an unsigned integer. @@ -777,11 +768,11 @@ where pub(crate) mod tests { use super::*; - pub(crate) use super::value_bag::test::Token; + pub(crate) use super::value_bag::test::TestToken as Token; impl<'v> Value<'v> { pub(crate) fn to_token(&self) -> Token { - self.inner.to_token() + self.inner.to_test_token() } } From 9c125f239a26946623e2369c6383dc59782f4e02 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Mon, 10 Apr 2023 17:56:03 +1000 Subject: [PATCH 19/32] borrow for 'kv from Key<'kv> and Value<'kv> --- Cargo.toml | 13 +++++++------ src/kv/key.rs | 8 ++++++++ src/kv/source.rs | 14 +++++--------- src/kv/value.rs | 15 +++++++++------ 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 31164d5e3..c9fddf999 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,19 +48,20 @@ std = [] # requires the latest stable # this will have a tighter MSRV before stabilization kv_unstable = ["value-bag"] -kv_unstable_sval = ["kv_unstable", "value-bag/sval", "sval"] +kv_unstable_sval = ["kv_unstable", "value-bag/sval", "sval", "sval_ref"] kv_unstable_std = ["std", "kv_unstable", "value-bag/error"] kv_unstable_serde = ["kv_unstable_std", "value-bag/serde", "serde"] [dependencies] serde = { version = "1.0", optional = true, default-features = false } -sval = { version = "2.0", optional = true, default-features = false } -value-bag = { version = "1.0", optional = true, default-features = false } +sval = { version = "2.1", optional = true, default-features = false } +sval_ref = { version = "2.1", optional = true, default-features = false } +value-bag = { version = "1.1", optional = true, default-features = false } [dev-dependencies] rustversion = "1.0" serde = { version = "1.0", features = ["derive"] } serde_test = "1.0" -sval = { version = "2.0" } -sval_derive = { version = "2.0" } -value-bag = { version = "1.0", features = ["test"] } +sval = { version = "2.1" } +sval_derive = { version = "2.1" } +value-bag = { version = "1.1", features = ["test"] } diff --git a/src/kv/key.rs b/src/kv/key.rs index d5258383c..b857d336c 100644 --- a/src/kv/key.rs +++ b/src/kv/key.rs @@ -104,14 +104,22 @@ mod sval_support { use super::*; extern crate sval; + extern crate sval_ref; use self::sval::Value; + use self::sval_ref::ValueRef; impl<'a> Value for Key<'a> { fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> sval::Result { self.key.stream(stream) } } + + impl<'a> ValueRef<'a> for Key<'a> { + fn stream_ref + ?Sized>(&self, stream: &mut S) -> self::sval::Result { + self.key.stream(stream) + } + } } #[cfg(feature = "kv_unstable_serde")] diff --git a/src/kv/source.rs b/src/kv/source.rs index 5ea41c159..7812d09fb 100644 --- a/src/kv/source.rs +++ b/src/kv/source.rs @@ -2,6 +2,8 @@ #[cfg(feature = "kv_unstable_sval")] extern crate sval; +#[cfg(feature = "kv_unstable_sval")] +extern crate sval_ref; #[cfg(feature = "kv_unstable_serde")] extern crate serde; @@ -470,16 +472,11 @@ mod sval_support { impl<'a, 'kvs, V: self::sval::Stream<'kvs> + ?Sized> Visitor<'kvs> for StreamVisitor<'a, V> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), Error> { self.0.map_key_begin().map_err(|_| Error::msg("failed to stream map key"))?; - if let Some(key) = key.to_borrowed_str() { - self.0.value(key).map_err(|_| Error::msg("failed to stream map key"))?; - } else { - self.0.value_computed(key.as_str()).map_err(|_| Error::msg("failed to stream map key"))?; - } + sval_ref::stream_ref(self.0, key).map_err(|_| Error::msg("failed to stream map key"))?; self.0.map_key_end().map_err(|_| Error::msg("failed to stream map key"))?; - // TODO: Need to borrow this here self.0.map_value_begin().map_err(|_| Error::msg("failed to stream map value"))?; - self.0.value_computed(&value).map_err(|_| Error::msg("failed to stream map value"))?; + sval_ref::stream_ref(self.0, value).map_err(|_| Error::msg("failed to stream map value"))?; self.0.map_value_end().map_err(|_| Error::msg("failed to stream map value"))?; Ok(()) @@ -508,9 +505,8 @@ mod sval_support { impl<'a, 'kvs, V: self::sval::Stream<'kvs> + ?Sized> Visitor<'kvs> for StreamVisitor<'a, V> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), Error> { - // TODO: Need to borrow this here self.0.seq_value_begin().map_err(|_| Error::msg("failed to stream seq value"))?; - self.0.value_computed(&(key, value)).map_err(|_| Error::msg("failed to stream seq value"))?; + self::sval_ref::stream_ref(self.0, (key, value)).map_err(|_| Error::msg("failed to stream seq value"))?; self.0.seq_value_end().map_err(|_| Error::msg("failed to stream seq value"))?; Ok(()) diff --git a/src/kv/value.rs b/src/kv/value.rs index e0dcb9da2..d4b3bf39f 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -6,6 +6,8 @@ extern crate value_bag; #[cfg(feature = "kv_unstable_sval")] extern crate sval; +#[cfg(feature = "kv_unstable_sval")] +extern crate sval_ref; #[cfg(feature = "kv_unstable_serde")] extern crate serde; @@ -420,6 +422,13 @@ impl<'v> self::sval::Value for Value<'v> { } } +#[cfg(feature = "kv_unstable_sval")] +impl<'v> self::sval_ref::ValueRef<'v> for Value<'v> { + fn stream_ref + ?Sized>(&self, stream: &mut S) -> self::sval::Result { + self::sval_ref::ValueRef::stream_ref(&self.inner, stream) + } +} + impl ToValue for str { fn to_value(&self) -> Value { Value::from(self) @@ -450,12 +459,6 @@ impl ToValue for std::num::NonZeroI128 { } } -impl<'v> From> for Value<'v> { - fn from(value: ValueBag<'v>) -> Self { - Value::from_value_bag(value) - } -} - impl<'v> From<&'v str> for Value<'v> { fn from(value: &'v str) -> Self { Value::from_value_bag(value) From 955d352ccc73dbec1f4c3346e1f35823c62e0fde Mon Sep 17 00:00:00 2001 From: KodrAus Date: Mon, 10 Apr 2023 18:04:58 +1000 Subject: [PATCH 20/32] qualify path to serde --- src/kv/value.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/kv/value.rs b/src/kv/value.rs index d4b3bf39f..818743709 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -199,7 +199,7 @@ impl<'v> Value<'v> { /// Get a value from a type implementing `serde::Serialize`. pub fn capture_serde(value: &'v T) -> Self where - T: serde::Serialize + 'static, + T: self::serde::Serialize + 'static, { Value { inner: ValueBag::capture_serde1(value), @@ -241,7 +241,7 @@ impl<'v> Value<'v> { #[cfg(feature = "kv_unstable_serde")] pub fn from_serde(value: &'v T) -> Self where - T: serde::Serialize, + T: self::serde::Serialize, { Value { inner: ValueBag::from_serde1(value), @@ -406,10 +406,10 @@ impl ToValue for dyn std::error::Error + 'static { } #[cfg(feature = "kv_unstable_serde")] -impl<'v> serde::Serialize for Value<'v> { +impl<'v> self::serde::Serialize for Value<'v> { fn serialize(&self, s: S) -> Result where - S: serde::Serializer, + S: self::serde::Serializer, { self.inner.serialize(s) } From b71d3b1feb98fc67886fbed5d074c55777f15780 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Mon, 10 Apr 2023 18:05:46 +1000 Subject: [PATCH 21/32] fix up path in doc comments --- src/kv/value.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/kv/value.rs b/src/kv/value.rs index 818743709..893afa74e 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -73,7 +73,7 @@ macro_rules! as_serde { }; } -/// Get a value from a type implementing `self::sval::value::Value`. +/// Get a value from a type implementing `sval::Value`. #[cfg(feature = "kv_unstable_sval")] #[macro_export] macro_rules! as_sval { @@ -206,7 +206,7 @@ impl<'v> Value<'v> { } } - /// Get a value from a type implementing `self::sval::value::Value`. + /// Get a value from a type implementing `sval::Value`. #[cfg(feature = "kv_unstable_sval")] pub fn capture_sval(value: &'v T) -> Self where @@ -248,7 +248,7 @@ impl<'v> Value<'v> { } } - /// Get a value from a type implementing `sval::value::Value`. + /// Get a value from a type implementing `sval::Value`. #[cfg(feature = "kv_unstable_sval")] pub fn from_sval(value: &'v T) -> Self where @@ -644,7 +644,7 @@ pub trait Visit<'v> { /// This is the only required method on `Visit` and acts as a fallback for any /// more specific methods that aren't overridden. /// The `Value` may be formatted using its `fmt::Debug` or `fmt::Display` implementation, - /// or serialized using its `self::sval::Value` or `serde::Serialize` implementation. + /// or serialized using its `sval::Value` or `serde::Serialize` implementation. fn visit_any(&mut self, value: Value) -> Result<(), Error>; /// Visit an unsigned integer. From ab829c616ab52c9161197701f0662e925406f9a9 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Mon, 10 Apr 2023 18:08:12 +1000 Subject: [PATCH 22/32] run fmt --- src/kv/key.rs | 10 ++++++++-- src/kv/source.rs | 51 ++++++++++++++++++++++++++++++++---------------- src/kv/value.rs | 5 ++++- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/kv/key.rs b/src/kv/key.rs index b857d336c..4f9a506ec 100644 --- a/src/kv/key.rs +++ b/src/kv/key.rs @@ -110,13 +110,19 @@ mod sval_support { use self::sval_ref::ValueRef; impl<'a> Value for Key<'a> { - fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> sval::Result { + fn stream<'sval, S: sval::Stream<'sval> + ?Sized>( + &'sval self, + stream: &mut S, + ) -> sval::Result { self.key.stream(stream) } } impl<'a> ValueRef<'a> for Key<'a> { - fn stream_ref + ?Sized>(&self, stream: &mut S) -> self::sval::Result { + fn stream_ref + ?Sized>( + &self, + stream: &mut S, + ) -> self::sval::Result { self.key.stream(stream) } } diff --git a/src/kv/source.rs b/src/kv/source.rs index 7812d09fb..45fc6dce4 100644 --- a/src/kv/source.rs +++ b/src/kv/source.rs @@ -466,18 +466,31 @@ mod sval_support { where S: Source, { - fn stream<'sval, SV: self::sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut SV) -> self::sval::Result { + fn stream<'sval, SV: self::sval::Stream<'sval> + ?Sized>( + &'sval self, + stream: &mut SV, + ) -> self::sval::Result { struct StreamVisitor<'a, V: ?Sized>(&'a mut V); impl<'a, 'kvs, V: self::sval::Stream<'kvs> + ?Sized> Visitor<'kvs> for StreamVisitor<'a, V> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), Error> { - self.0.map_key_begin().map_err(|_| Error::msg("failed to stream map key"))?; - sval_ref::stream_ref(self.0, key).map_err(|_| Error::msg("failed to stream map key"))?; - self.0.map_key_end().map_err(|_| Error::msg("failed to stream map key"))?; + self.0 + .map_key_begin() + .map_err(|_| Error::msg("failed to stream map key"))?; + sval_ref::stream_ref(self.0, key) + .map_err(|_| Error::msg("failed to stream map key"))?; + self.0 + .map_key_end() + .map_err(|_| Error::msg("failed to stream map key"))?; - self.0.map_value_begin().map_err(|_| Error::msg("failed to stream map value"))?; - sval_ref::stream_ref(self.0, value).map_err(|_| Error::msg("failed to stream map value"))?; - self.0.map_value_end().map_err(|_| Error::msg("failed to stream map value"))?; + self.0 + .map_value_begin() + .map_err(|_| Error::msg("failed to stream map value"))?; + sval_ref::stream_ref(self.0, value) + .map_err(|_| Error::msg("failed to stream map value"))?; + self.0 + .map_value_end() + .map_err(|_| Error::msg("failed to stream map value"))?; Ok(()) } @@ -490,9 +503,7 @@ mod sval_support { self.visit(&mut StreamVisitor(stream)) .map_err(|_| self::sval::Error::new())?; - stream - .map_end() - .map_err(|_| self::sval::Error::new()) + stream.map_end().map_err(|_| self::sval::Error::new()) } } @@ -500,14 +511,22 @@ mod sval_support { where S: Source, { - fn stream<'sval, SV: self::sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut SV) -> self::sval::Result { + fn stream<'sval, SV: self::sval::Stream<'sval> + ?Sized>( + &'sval self, + stream: &mut SV, + ) -> self::sval::Result { struct StreamVisitor<'a, V: ?Sized>(&'a mut V); impl<'a, 'kvs, V: self::sval::Stream<'kvs> + ?Sized> Visitor<'kvs> for StreamVisitor<'a, V> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), Error> { - self.0.seq_value_begin().map_err(|_| Error::msg("failed to stream seq value"))?; - self::sval_ref::stream_ref(self.0, (key, value)).map_err(|_| Error::msg("failed to stream seq value"))?; - self.0.seq_value_end().map_err(|_| Error::msg("failed to stream seq value"))?; + self.0 + .seq_value_begin() + .map_err(|_| Error::msg("failed to stream seq value"))?; + self::sval_ref::stream_ref(self.0, (key, value)) + .map_err(|_| Error::msg("failed to stream seq value"))?; + self.0 + .seq_value_end() + .map_err(|_| Error::msg("failed to stream seq value"))?; Ok(()) } @@ -520,9 +539,7 @@ mod sval_support { self.visit(&mut StreamVisitor(stream)) .map_err(|_| self::sval::Error::new())?; - stream - .seq_end() - .map_err(|_| self::sval::Error::new()) + stream.seq_end().map_err(|_| self::sval::Error::new()) } } diff --git a/src/kv/value.rs b/src/kv/value.rs index 893afa74e..9485d485b 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -417,7 +417,10 @@ impl<'v> self::serde::Serialize for Value<'v> { #[cfg(feature = "kv_unstable_sval")] impl<'v> self::sval::Value for Value<'v> { - fn stream<'sval, S: self::sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> self::sval::Result { + fn stream<'sval, S: self::sval::Stream<'sval> + ?Sized>( + &'sval self, + stream: &mut S, + ) -> self::sval::Result { self::sval::Value::stream(&self.inner, stream) } } From 83117275c37be00d1d7294ccb8a5124c73bbfe18 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Mon, 10 Apr 2023 21:11:21 +1000 Subject: [PATCH 23/32] only run tests on MSRV --- .github/workflows/main.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 783b5052d..f38d3b33e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -129,9 +129,6 @@ jobs: run: | rustup update 1.31.0 --no-self-update rustup default 1.31.0 - - run: cargo build --verbose - - run: cargo build --verbose --features serde - - run: cargo build --verbose --features std - run: cargo test --verbose --manifest-path tests/Cargo.toml embedded: From 0951cee26ff76eaefd6b1ff40dd689020c9c39d4 Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Tue, 11 Apr 2023 11:36:44 +0200 Subject: [PATCH 24/32] Change wording of list of implementations --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7295bf716..3f6599a0c 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ pub fn shave_the_yak(yak: &mut Yak) { ### In executables In order to produce log output, executables have to use a logger implementation compatible with the facade. -There are many available implementations to choose from, here are some of the most popular ones: +There are many available implementations to choose from, here are some options: * Simple minimal loggers: * [`env_logger`](https://docs.rs/env_logger/*/env_logger/) @@ -81,7 +81,7 @@ There are many available implementations to choose from, here are some of the mo * For WebAssembly binaries: * [`console_log`](https://docs.rs/console_log/*/console_log/) * For dynamic libraries: - * You may need to construct [an FFI-safe wrapper over `log`](https://github.com/rust-lang/log/issues/421) to initialize in your libraries. + * You may need to construct [an FFI-safe wrapper over `log`](https://github.com/rust-lang/log/issues/421) to initialize in your libraries. * Utilities: * [`log_err`](https://docs.rs/log_err/*/log_err/) From a872bf8919a6ee6b83d4c2f732d825ed3fa9d452 Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Tue, 11 Apr 2023 11:38:11 +0200 Subject: [PATCH 25/32] Add std-logger to list of implementations --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7295bf716..ddbebdf24 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ There are many available implementations to choose from, here are some of the mo * [`stderrlog`](https://docs.rs/stderrlog/*/stderrlog/) * [`flexi_logger`](https://docs.rs/flexi_logger/*/flexi_logger/) * [`call_logger`](https://docs.rs/call_logger/*/call_logger/) + * [`std-logger`](https://docs.rs/std-logger/*/std-logger/) * Complex configurable frameworks: * [`log4rs`](https://docs.rs/log4rs/*/log4rs/) * [`fern`](https://docs.rs/fern/*/fern/) From 025815880a7dbe814ffe57bb52cfce0041ec194e Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Tue, 11 Apr 2023 12:57:25 +0200 Subject: [PATCH 26/32] Fix std-logger link Co-authored-by: Ashley Mannix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddbebdf24..e780b617a 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ There are many available implementations to choose from, here are some of the mo * [`stderrlog`](https://docs.rs/stderrlog/*/stderrlog/) * [`flexi_logger`](https://docs.rs/flexi_logger/*/flexi_logger/) * [`call_logger`](https://docs.rs/call_logger/*/call_logger/) - * [`std-logger`](https://docs.rs/std-logger/*/std-logger/) + * [`std-logger`](https://docs.rs/std-logger/*/std_logger/) * Complex configurable frameworks: * [`log4rs`](https://docs.rs/log4rs/*/log4rs/) * [`fern`](https://docs.rs/fern/*/fern/) From ce9f217d584376646bac53dd9a2f9b9de7ab4be1 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Thu, 13 Apr 2023 17:08:08 +1000 Subject: [PATCH 27/32] use target_has_atomic instead of the old atomic_cas cfg --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c4eccdaaa..63401f040 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1217,7 +1217,7 @@ where /// /// Note that `Trace` is the maximum level, because it provides the maximum amount of detail in the emitted logs. #[inline] -#[cfg(atomic_cas)] +#[cfg(target_has_atomic = "ptr")] pub fn set_max_level(level: LevelFilter) { MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed); } @@ -1244,7 +1244,7 @@ pub fn set_max_level(level: LevelFilter) { #[inline] pub unsafe fn set_max_level_racy(level: LevelFilter) { // `MAX_LOG_LEVEL_FILTER` uses a `Cell` as the underlying primitive when a - // platform doesn't support `atomic_cas`, so even though this looks the same + // platform doesn't support `target_has_atomic = "ptr"`, so even though this looks the same // as `set_max_level` it may have different safety properties. MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed); } From 79c330cb74c2b4b57bcc8838e0ea4bdd3adb7690 Mon Sep 17 00:00:00 2001 From: est31 Date: Sat, 15 Apr 2023 08:57:02 +0200 Subject: [PATCH 28/32] Put MSRV into Cargo.toml Also remove it from clippy.toml as clippy reads it from Cargo.toml since 1.64. CI only runs clippy from latest stable and not from the MSRV so this shouldn't be a problem. --- Cargo.toml | 1 + clippy.toml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 clippy.toml diff --git a/Cargo.toml b/Cargo.toml index 598b2be6c..2f4e3e36f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ A lightweight logging facade for Rust categories = ["development-tools::debugging"] keywords = ["logging"] exclude = ["rfcs/**/*"] +rust-version = "1.60.0" [package.metadata.docs.rs] features = ["std", "serde", "kv_unstable_std", "kv_unstable_sval", "kv_unstable_serde"] diff --git a/clippy.toml b/clippy.toml deleted file mode 100644 index 16caf02ee..000000000 --- a/clippy.toml +++ /dev/null @@ -1 +0,0 @@ -msrv = "1.60.0" From 1acf2f355bdf3e2b165b9c459dc256d2497dba27 Mon Sep 17 00:00:00 2001 From: OccupyMars2025 <31559413+OccupyMars2025@users.noreply.github.com> Date: Fri, 26 May 2023 17:02:20 +0800 Subject: [PATCH 29/32] src/lib.rs : prefix an unused variable with an underscore unused variable: `metadata`, according to rustc, if this is intentional, prefix it with an underscore: `_metadata` --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 63401f040..c809db36c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -690,7 +690,7 @@ impl<'a> MaybeStaticStr<'a> { /// struct SimpleLogger; /// /// impl log::Log for SimpleLogger { -/// fn enabled(&self, metadata: &log::Metadata) -> bool { +/// fn enabled(&self, _metadata: &log::Metadata) -> bool { /// true /// } /// From 7c4f808df833536927f582ca52b9eaefaf9108a4 Mon Sep 17 00:00:00 2001 From: OccupyMars2025 <31559413+OccupyMars2025@users.noreply.github.com> Date: Sat, 27 May 2023 10:48:17 +0800 Subject: [PATCH 30/32] [doc] src/macros.rs : correct grammar errors of an example in lib documentation change semicolons to commas --- src/macros.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/macros.rs b/src/macros.rs index 614961ff7..84143dd37 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -29,7 +29,7 @@ /// ``` #[macro_export(local_inner_macros)] macro_rules! log { - // log!(target: "my_target", Level::Info; key1 = 42, key2 = true; "a {} event", "log"); + // log!(target: "my_target", Level::Info, key1 = 42, key2 = true; "a {} event", "log"); (target: $target:expr, $lvl:expr, $($key:tt = $value:expr),+; $($arg:tt)+) => ({ let lvl = $lvl; if lvl <= $crate::STATIC_MAX_LEVEL && lvl <= $crate::max_level() { @@ -42,7 +42,7 @@ macro_rules! log { } }); - // log!(target: "my_target", Level::Info; "a {} event", "log"); + // log!(target: "my_target", Level::Info, "a {} event", "log"); (target: $target:expr, $lvl:expr, $($arg:tt)+) => ({ let lvl = $lvl; if lvl <= $crate::STATIC_MAX_LEVEL && lvl <= $crate::max_level() { From 4e689bbb8f7dc7c465e6367b7022f347a0fe09e9 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Sun, 28 May 2023 13:42:24 +1000 Subject: [PATCH 31/32] Revert "Remove build.rs file" This reverts commit 7f09d72e5fd5387c672b9803ead6548b45920f55. --- .github/workflows/main.yml | 7 ++---- Cargo.toml | 6 ++--- build.rs | 46 ++++++++++++++++++++++++++++++++++++++ src/lib.rs | 21 +++++++++-------- 4 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 build.rs diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb038d280..f38d3b33e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -127,11 +127,8 @@ jobs: - uses: actions/checkout@master - name: Install Rust run: | - rustup update 1.60.0 --no-self-update - rustup default 1.60.0 - - run: cargo build --verbose - - run: cargo build --verbose --features serde - - run: cargo build --verbose --features std + rustup update 1.31.0 --no-self-update + rustup default 1.31.0 - run: cargo test --verbose --manifest-path tests/Cargo.toml embedded: diff --git a/Cargo.toml b/Cargo.toml index 2f4e3e36f..786f74dae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ A lightweight logging facade for Rust categories = ["development-tools::debugging"] keywords = ["logging"] exclude = ["rfcs/**/*"] -rust-version = "1.60.0" +build = "build.rs" [package.metadata.docs.rs] features = ["std", "serde", "kv_unstable_std", "kv_unstable_sval", "kv_unstable_serde"] @@ -56,7 +56,7 @@ kv_unstable_serde = ["kv_unstable_std", "value-bag/serde", "serde"] serde = { version = "1.0", optional = true, default-features = false } sval = { version = "2.1", optional = true, default-features = false } sval_ref = { version = "2.1", optional = true, default-features = false } -value-bag = { version = "1.1", optional = true, default-features = false } +value-bag = { version = "1.4", optional = true, default-features = false } [dev-dependencies] rustversion = "1.0" @@ -64,4 +64,4 @@ serde = { version = "1.0", features = ["derive"] } serde_test = "1.0" sval = { version = "2.1" } sval_derive = { version = "2.1" } -value-bag = { version = "1.1", features = ["test"] } +value-bag = { version = "1.4", features = ["test"] } diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..11c26a333 --- /dev/null +++ b/build.rs @@ -0,0 +1,46 @@ +//! This build script detects target platforms that lack proper support for +//! atomics and sets `cfg` flags accordingly. + +use std::env; +use std::str; + +fn main() { + let target = match rustc_target() { + Some(target) => target, + None => return, + }; + + if target_has_atomic_cas(&target) { + println!("cargo:rustc-cfg=atomic_cas"); + } + + if target_has_atomics(&target) { + println!("cargo:rustc-cfg=has_atomics"); + } + + println!("cargo:rerun-if-changed=build.rs"); +} + +fn target_has_atomic_cas(target: &str) -> bool { + match target { + "thumbv6m-none-eabi" + | "msp430-none-elf" + | "riscv32i-unknown-none-elf" + | "riscv32imc-unknown-none-elf" => false, + _ => true, + } +} + +fn target_has_atomics(target: &str) -> bool { + match target { + "thumbv4t-none-eabi" + | "msp430-none-elf" + | "riscv32i-unknown-none-elf" + | "riscv32imc-unknown-none-elf" => false, + _ => true, + } +} + +fn rustc_target() -> Option { + env::var("TARGET").ok() +} diff --git a/src/lib.rs b/src/lib.rs index c809db36c..82c648a4d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -344,20 +344,20 @@ mod serde; #[cfg(feature = "kv_unstable")] pub mod kv; -#[cfg(target_has_atomic = "ptr")] +#[cfg(has_atomics)] use std::sync::atomic::{AtomicUsize, Ordering}; -#[cfg(not(target_has_atomic = "ptr"))] +#[cfg(not(has_atomics))] use std::cell::Cell; -#[cfg(not(target_has_atomic = "ptr"))] +#[cfg(not(has_atomics))] use std::sync::atomic::Ordering; -#[cfg(not(target_has_atomic = "ptr"))] +#[cfg(not(has_atomics))] struct AtomicUsize { v: Cell, } -#[cfg(not(target_has_atomic = "ptr"))] +#[cfg(not(has_atomics))] impl AtomicUsize { const fn new(v: usize) -> AtomicUsize { AtomicUsize { v: Cell::new(v) } @@ -371,7 +371,7 @@ impl AtomicUsize { self.v.set(val) } - #[cfg(target_has_atomic = "ptr")] + #[cfg(atomic_cas)] fn compare_exchange( &self, current: usize, @@ -389,7 +389,7 @@ impl AtomicUsize { // Any platform without atomics is unlikely to have multiple cores, so // writing via Cell will not be a race condition. -#[cfg(not(target_has_atomic = "ptr"))] +#[cfg(not(has_atomics))] unsafe impl Sync for AtomicUsize {} // The LOGGER static holds a pointer to the global logger. It is protected by @@ -1217,7 +1217,6 @@ where /// /// Note that `Trace` is the maximum level, because it provides the maximum amount of detail in the emitted logs. #[inline] -#[cfg(target_has_atomic = "ptr")] pub fn set_max_level(level: LevelFilter) { MAX_LOG_LEVEL_FILTER.store(level as usize, Ordering::Relaxed); } @@ -1286,7 +1285,7 @@ pub fn max_level() -> LevelFilter { /// An error is returned if a logger has already been set. /// /// [`set_logger`]: fn.set_logger.html -#[cfg(all(feature = "std", target_has_atomic = "ptr"))] +#[cfg(all(feature = "std", atomic_cas))] pub fn set_boxed_logger(logger: Box) -> Result<(), SetLoggerError> { set_logger_inner(|| Box::leak(logger)) } @@ -1344,12 +1343,12 @@ pub fn set_boxed_logger(logger: Box) -> Result<(), SetLoggerError> { /// ``` /// /// [`set_logger_racy`]: fn.set_logger_racy.html -#[cfg(target_has_atomic = "ptr")] +#[cfg(atomic_cas)] pub fn set_logger(logger: &'static dyn Log) -> Result<(), SetLoggerError> { set_logger_inner(|| logger) } -#[cfg(target_has_atomic = "ptr")] +#[cfg(atomic_cas)] fn set_logger_inner(make_logger: F) -> Result<(), SetLoggerError> where F: FnOnce() -> &'static dyn Log, From d062c83c4cb8d62e8a8dbe05d7559b075e32ae06 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Sun, 28 May 2023 14:01:27 +1000 Subject: [PATCH 32/32] prepare for 0.4.18 release --- CHANGELOG.md | 20 ++++++++++++++++++++ Cargo.toml | 2 +- src/lib.rs | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c697fa93..a6f251b3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,26 @@ ## [Unreleased] +## [0.4.18] - 2023-05-28 + +* fix markdown links (again) by @hellow554 in https://github.com/rust-lang/log/pull/513 +* add cargo doc to workflow by @hellow554 in https://github.com/rust-lang/log/pull/515 +* Apply Clippy lints by @hellow554 in https://github.com/rust-lang/log/pull/516 +* Replace ad-hoc eq_ignore_ascii_case with slice::eq_ignore_ascii_case by @glandium in https://github.com/rust-lang/log/pull/519 +* fix up windows targets by @KodrAus in https://github.com/rust-lang/log/pull/528 +* typo fix by @jiangying000 in https://github.com/rust-lang/log/pull/529 +* Remove dependency on cfg_if by @EriKWDev in https://github.com/rust-lang/log/pull/536 +* GitHub Workflows security hardening by @sashashura in https://github.com/rust-lang/log/pull/538 +* Fix build status badge by @atouchet in https://github.com/rust-lang/log/pull/539 +* Add call_logger to the documentation by @a1ecbr0wn in https://github.com/rust-lang/log/pull/547 +* Remove build.rs file by @GuillaumeGomez in https://github.com/rust-lang/log/pull/543 +* Use stable internals for key-value API by @KodrAus in https://github.com/rust-lang/log/pull/550 +* Change wording of list of implementations by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/553 +* Add std-logger to list of implementations by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/554 +* Add `set_max_level_racy` and gate `set_max_level` by @djkoloski in https://github.com/rust-lang/log/pull/544 +* [doc] src/lib.rs : prefix an unused variable with an underscore by @OccupyMars2025 in https://github.com/rust-lang/log/pull/561 +* [doc] src/macros.rs : correct grammar errors of an example in lib documentation by @OccupyMars2025 in https://github.com/rust-lang/log/pull/562 + ## [0.4.17] - 2022-04-29 * Update `kv_unstable` internal dependencies. diff --git a/Cargo.toml b/Cargo.toml index 786f74dae..5004b08fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "log" -version = "0.4.17" # remember to update html_root_url +version = "0.4.18" # remember to update html_root_url authors = ["The Rust Project Developers"] license = "MIT OR Apache-2.0" readme = "README.md" diff --git a/src/lib.rs b/src/lib.rs index 82c648a4d..4297344e0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -317,7 +317,7 @@ #![doc( html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", html_favicon_url = "https://www.rust-lang.org/favicon.ico", - html_root_url = "https://docs.rs/log/0.4.17" + html_root_url = "https://docs.rs/log/0.4.18" )] #![warn(missing_docs)] #![deny(missing_debug_implementations, unconditional_recursion)]