diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 04:45:05 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 04:45:05 +0000 |
commit | a686f41744d648078258b227ba809e2f7f44d545 (patch) | |
tree | e848831525022c0ea31ef18d73022ac4e76ac8ff | |
parent | b12f4dfe10bbb5d224dd23453e05ab945d95c26a (diff) | |
parent | 80b3d364d7236ae6061d1d299d46657e4efffa7a (diff) | |
download | termcolor-android14-mainline-art-release.tar.gz |
Snap for 10453563 from 80b3d364d7236ae6061d1d299d46657e4efffa7a to mainline-art-releaseaml_art_341711000aml_art_341615020aml_art_341514450aml_art_341514410aml_art_341411300aml_art_341311100aml_art_341110110aml_art_341110060aml_art_341010050aml_art_340915060android14-mainline-art-release
Change-Id: I65f7a3b36337be8798ccfbef696c8922218794c9
-rw-r--r-- | .cargo_vcs_info.json | 7 | ||||
-rw-r--r-- | Android.bp | 10 | ||||
-rw-r--r-- | Cargo.toml | 25 | ||||
-rw-r--r-- | Cargo.toml.orig | 3 | ||||
-rw-r--r-- | METADATA | 14 | ||||
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | TEST_MAPPING | 26 | ||||
-rw-r--r-- | src/lib.rs | 160 |
8 files changed, 180 insertions, 69 deletions
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json index c0bf7bd..f84bcf3 100644 --- a/.cargo_vcs_info.json +++ b/.cargo_vcs_info.json @@ -1,5 +1,6 @@ { "git": { - "sha1": "949875368995c00bef275dc8c554f5b34bc35a05" - } -} + "sha1": "a4c5d5102122cf3442775fc464d6d5f976c95256" + }, + "path_in_vcs": "" +}
\ No newline at end of file @@ -43,9 +43,15 @@ rust_library { host_supported: true, crate_name: "termcolor", cargo_env_compat: true, - cargo_pkg_version: "1.1.2", + cargo_pkg_version: "1.2.0", srcs: ["src/lib.rs"], edition: "2018", + apex_available: [ + "//apex_available:platform", + "//apex_available:anyapex", + ], + product_available: true, + vendor_available: true, } rust_test { @@ -53,7 +59,7 @@ rust_test { host_supported: true, crate_name: "termcolor", cargo_env_compat: true, - cargo_pkg_version: "1.1.2", + cargo_pkg_version: "1.2.0", srcs: ["src/lib.rs"], test_suites: ["general-tests"], auto_gen_config: true, @@ -3,24 +3,30 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies +# to registry (e.g., crates.io) dependencies. # -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. [package] edition = "2018" name = "termcolor" -version = "1.1.2" +version = "1.2.0" authors = ["Andrew Gallant <jamslam@gmail.com>"] -exclude = ["/.travis.yml", "/appveyor.yml", "/ci/**"] -description = "A simple cross platform library for writing colored text to a terminal.\n" +description = """ +A simple cross platform library for writing colored text to a terminal. +""" homepage = "https://github.com/BurntSushi/termcolor" documentation = "https://docs.rs/termcolor" readme = "README.md" -keywords = ["windows", "win", "color", "ansi", "console"] +keywords = [ + "windows", + "win", + "color", + "ansi", + "console", +] license = "Unlicense OR MIT" repository = "https://github.com/BurntSushi/termcolor" @@ -29,5 +35,6 @@ name = "termcolor" bench = false [dev-dependencies] + [target."cfg(windows)".dependencies.winapi-util] version = "0.1.3" diff --git a/Cargo.toml.orig b/Cargo.toml.orig index 1e9f5d3..ef7f1c1 100644 --- a/Cargo.toml.orig +++ b/Cargo.toml.orig @@ -1,6 +1,6 @@ [package] name = "termcolor" -version = "1.1.2" #:version +version = "1.2.0" #:version authors = ["Andrew Gallant <jamslam@gmail.com>"] description = """ A simple cross platform library for writing colored text to a terminal. @@ -11,7 +11,6 @@ repository = "https://github.com/BurntSushi/termcolor" readme = "README.md" keywords = ["windows", "win", "color", "ansi", "console"] license = "Unlicense OR MIT" -exclude = ["/.travis.yml", "/appveyor.yml", "/ci/**"] edition = "2018" [lib] @@ -1,3 +1,7 @@ +# This project was upgraded with external_updater. +# Usage: tools/external_updater/updater.sh update rust/crates/termcolor +# For more info, check https://cs.android.com/android/platform/superproject/+/master:tools/external_updater/README.md + name: "termcolor" description: "A simple cross platform library for writing colored text to a terminal." third_party { @@ -7,13 +11,13 @@ third_party { } url { type: ARCHIVE - value: "https://static.crates.io/crates/termcolor/termcolor-1.1.2.crate" + value: "https://static.crates.io/crates/termcolor/termcolor-1.2.0.crate" } - version: "1.1.2" + version: "1.2.0" license_type: NOTICE last_upgrade_date { - year: 2020 - month: 11 - day: 19 + year: 2023 + month: 2 + day: 6 } } @@ -9,7 +9,7 @@ applications. [![Build status](https://github.com/BurntSushi/termcolor/workflows/ci/badge.svg)](https://github.com/BurntSushi/termcolor/actions) [![](https://img.shields.io/crates/v/termcolor.svg)](https://crates.io/crates/termcolor) -Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org). +Dual-licensed under MIT or the [UNLICENSE](https://unlicense.org/). ### Documentation @@ -85,7 +85,7 @@ fn write_green() -> io::Result<()> { ### Automatic color selection When building a writer with termcolor, the caller must provide a -[`ColorChoice`](https://docs.rs/termcolor/1.0.5/termcolor/enum.ColorChoice.html) +[`ColorChoice`](https://docs.rs/termcolor/1.*/termcolor/enum.ColorChoice.html) selection. When the color choice is `Auto`, termcolor will attempt to determine whether colors should be enabled by inspecting the environment. Currently, termcolor will inspect the `TERM` and `NO_COLOR` environment variables: diff --git a/TEST_MAPPING b/TEST_MAPPING index f3742eb..ea6c5d1 100644 --- a/TEST_MAPPING +++ b/TEST_MAPPING @@ -1,36 +1,26 @@ // Generated by update_crate_tests.py for tests that depend on this crate. { - "presubmit": [ + "imports": [ { - "name": "diced_test" + "path": "packages/modules/Virtualization/virtualizationmanager" }, { - "name": "keystore2_test" + "path": "system/security/diced" }, { - "name": "keystore2_vintf_test" + "path": "system/security/keystore2" }, { - "name": "legacykeystore_test" - }, + "path": "system/security/keystore2/legacykeystore" + } + ], + "presubmit": [ { "name": "termcolor_test_src_lib" } ], "presubmit-rust": [ { - "name": "diced_test" - }, - { - "name": "keystore2_test" - }, - { - "name": "keystore2_vintf_test" - }, - { - "name": "legacykeystore_test" - }, - { "name": "termcolor_test_src_lib" } ] @@ -82,7 +82,7 @@ In many scenarios when using color, one often wants to enable colors automatically when writing to a terminal and disable colors automatically when writing to anything else. The typical way to achieve this in Unix environments is via libc's -[`isatty`](http://man7.org/linux/man-pages/man3/isatty.3.html) +[`isatty`](https://man7.org/linux/man-pages/man3/isatty.3.html) function. Unfortunately, this notoriously does not work well in Windows environments. To work around that, the currently recommended solution is to use the @@ -98,18 +98,10 @@ use atty; use termcolor::{ColorChoice, StandardStream}; let preference = argv.get_flag("color").unwrap_or("auto"); -let choice = match preference { - "always" => ColorChoice::Always, - "ansi" => ColorChoice::AlwaysAnsi, - "auto" => { - if atty::is(atty::Stream::Stdout) { - ColorChoice::Auto - } else { - ColorChoice::Never - } - } - _ => ColorChoice::Never, -}; +let mut choice = preference.parse::<ColorChoice>()?; +if choice == ColorChoice::Auto && !atty::is(atty::Stream::Stdout) { + choice = ColorChoice::Never; +} let stdout = StandardStream::stdout(choice); // ... write to stdout ``` @@ -117,7 +109,7 @@ let stdout = StandardStream::stdout(choice); Currently, `termcolor` does not provide anything to do this for you. */ -#![deny(missing_docs)] +#![deny(missing_debug_implementations, missing_docs)] // #[cfg(doctest)] // use doc_comment::doctest; @@ -203,6 +195,13 @@ impl<T: ?Sized + WriteColor> WriteColor for Box<T> { } /// ColorChoice represents the color preferences of an end user. +/// +/// The `Default` implementation for this type will select `Auto`, which tries +/// to do the right thing based on the current environment. +/// +/// The `FromStr` implementation for this type converts a lowercase kebab-case +/// string of the variant name to the corresponding variant. Any other string +/// results in an error. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum ColorChoice { /// Try very hard to emit colors. This includes emitting ANSI colors @@ -219,6 +218,29 @@ pub enum ColorChoice { Never, } +/// The default is `Auto`. +impl Default for ColorChoice { + fn default() -> ColorChoice { + ColorChoice::Auto + } +} + +impl FromStr for ColorChoice { + type Err = ColorChoiceParseError; + + fn from_str(s: &str) -> Result<ColorChoice, ColorChoiceParseError> { + match s.to_lowercase().as_str() { + "always" => Ok(ColorChoice::Always), + "always-ansi" => Ok(ColorChoice::AlwaysAnsi), + "never" => Ok(ColorChoice::Never), + "auto" => Ok(ColorChoice::Auto), + unknown => Err(ColorChoiceParseError { + unknown_choice: unknown.to_string(), + }), + } + } +} + impl ColorChoice { /// Returns true if we should attempt to write colored output. fn should_attempt_color(&self) -> bool { @@ -291,6 +313,25 @@ impl ColorChoice { } } +/// An error that occurs when parsing a `ColorChoice` fails. +#[derive(Clone, Debug)] +pub struct ColorChoiceParseError { + unknown_choice: String, +} + +impl std::error::Error for ColorChoiceParseError {} + +impl fmt::Display for ColorChoiceParseError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "unrecognized color choice '{}': valid choices are: \ + always, always-ansi, never, auto", + self.unknown_choice, + ) + } +} + /// `std::io` implements `Stdout` and `Stderr` (and their `Lock` variants) as /// separate types, which makes it difficult to abstract over them. We use /// some simple internal enum types to work around this. @@ -302,6 +343,7 @@ enum StandardStreamType { StderrBuffered, } +#[derive(Debug)] enum IoStandardStream { Stdout(io::Stdout), Stderr(io::Stderr), @@ -371,6 +413,7 @@ impl io::Write for IoStandardStream { // Same rigmarole for the locked variants of the standard streams. +#[derive(Debug)] enum IoStandardStreamLock<'a> { StdoutLock(io::StdoutLock<'a>), StderrLock(io::StderrLock<'a>), @@ -396,6 +439,7 @@ impl<'a> io::Write for IoStandardStreamLock<'a> { /// Satisfies `io::Write` and `WriteColor`, and supports optional coloring /// to either of the standard output streams, stdout and stderr. +#[derive(Debug)] pub struct StandardStream { wtr: LossyStandardStream<WriterInner<IoStandardStream>>, } @@ -407,17 +451,20 @@ pub struct StandardStream { /// /// The lifetime `'a` refers to the lifetime of the corresponding /// `StandardStream`. +#[derive(Debug)] pub struct StandardStreamLock<'a> { wtr: LossyStandardStream<WriterInnerLock<'a, IoStandardStreamLock<'a>>>, } /// Like `StandardStream`, but does buffered writing. +#[derive(Debug)] pub struct BufferedStandardStream { wtr: LossyStandardStream<WriterInner<IoStandardStream>>, } /// WriterInner is a (limited) generic representation of a writer. It is /// limited because W should only ever be stdout/stderr on Windows. +#[derive(Debug)] enum WriterInner<W> { NoColor(NoColor<W>), Ansi(Ansi<W>), @@ -430,6 +477,7 @@ enum WriterInner<W> { /// WriterInnerLock is a (limited) generic representation of a writer. It is /// limited because W should only ever be stdout/stderr on Windows. +#[derive(Debug)] enum WriterInnerLock<'a, W> { NoColor(NoColor<W>), Ansi(Ansi<W>), @@ -855,6 +903,7 @@ impl<'a, W: io::Write> WriteColor for WriterInnerLock<'a, W> { /// /// It is intended for a `BufferWriter` to be put in an `Arc` and written to /// from multiple threads simultaneously. +#[derive(Debug)] pub struct BufferWriter { stream: LossyStandardStream<IoStandardStream>, printed: AtomicBool, @@ -908,7 +957,7 @@ impl BufferWriter { } let stream = LossyStandardStream::new(IoStandardStream::new(sty)); BufferWriter { - stream: stream, + stream, printed: AtomicBool::new(false), separator: None, color_choice: choice, @@ -1013,9 +1062,11 @@ impl BufferWriter { /// method, which will take color preferences and the environment into /// account. However, buffers can also be manually created using `no_color`, /// `ansi` or `console` (on Windows). +#[derive(Debug)] pub struct Buffer(BufferInner); /// BufferInner is an enumeration of different buffer types. +#[derive(Debug)] enum BufferInner { /// No coloring information should be applied. This ignores all coloring /// directives. @@ -1195,6 +1246,7 @@ impl WriteColor for Buffer { } /// Satisfies `WriteColor` but ignores all color options. +#[derive(Debug)] pub struct NoColor<W>(W); impl<W: Write> NoColor<W> { @@ -1255,6 +1307,7 @@ impl<W: io::Write> WriteColor for NoColor<W> { } /// Satisfies `WriteColor` using standard ANSI escape sequences. +#[derive(Debug)] pub struct Ansi<W>(W); impl<W: Write> Ansi<W> { @@ -1286,6 +1339,17 @@ impl<W: io::Write> io::Write for Ansi<W> { self.0.write(buf) } + // Adding this method here is not required because it has a default impl, + // but it seems to provide a perf improvement in some cases when using + // a `BufWriter` with lots of writes. + // + // See https://github.com/BurntSushi/termcolor/pull/56 for more details + // and a minimized example. + #[inline] + fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { + self.0.write_all(buf) + } + #[inline] fn flush(&mut self) -> io::Result<()> { self.0.flush() @@ -1315,6 +1379,9 @@ impl<W: io::Write> WriteColor for Ansi<W> { if spec.underline { self.write_str("\x1B[4m")?; } + if spec.strikethrough { + self.write_str("\x1B[9m")?; + } if let Some(ref c) = spec.fg_color { self.write_color(true, c, spec.intense)?; } @@ -1450,6 +1517,20 @@ impl<W: io::Write> Ansi<W> { } } +impl WriteColor for io::Sink { + fn supports_color(&self) -> bool { + false + } + + fn set_color(&mut self, _: &ColorSpec) -> io::Result<()> { + Ok(()) + } + + fn reset(&mut self) -> io::Result<()> { + Ok(()) + } +} + /// An in-memory buffer that provides Windows console coloring. /// /// This doesn't actually communicate with the Windows console. Instead, it @@ -1572,6 +1653,7 @@ pub struct ColorSpec { dimmed: bool, italic: bool, reset: bool, + strikethrough: bool, } impl Default for ColorSpec { @@ -1585,6 +1667,7 @@ impl Default for ColorSpec { dimmed: false, italic: false, reset: true, + strikethrough: false, } } } @@ -1677,6 +1760,21 @@ impl ColorSpec { self } + /// Get whether this is strikethrough or not. + /// + /// Note that the strikethrough setting has no effect in a Windows console. + pub fn strikethrough(&self) -> bool { + self.strikethrough + } + + /// Set whether the text is strikethrough or not. + /// + /// Note that the strikethrough setting has no effect in a Windows console. + pub fn set_strikethrough(&mut self, yes: bool) -> &mut ColorSpec { + self.strikethrough = yes; + self + } + /// Get whether reset is enabled or not. /// /// reset is enabled by default. When disabled and using ANSI escape @@ -1738,6 +1836,7 @@ impl ColorSpec { && !self.dimmed && !self.italic && !self.intense + && !self.strikethrough } /// Clears this color specification so that it has no color/style settings. @@ -1749,6 +1848,7 @@ impl ColorSpec { self.intense = false; self.dimmed = false; self.italic = false; + self.strikethrough = false; } /// Writes this color spec to the given Windows console. @@ -1985,6 +2085,7 @@ impl FromStr for Color { } } +#[derive(Debug)] struct LossyStandardStream<W> { wtr: W, #[cfg(windows)] @@ -1994,14 +2095,14 @@ struct LossyStandardStream<W> { impl<W: io::Write> LossyStandardStream<W> { #[cfg(not(windows))] fn new(wtr: W) -> LossyStandardStream<W> { - LossyStandardStream { wtr: wtr } + LossyStandardStream { wtr } } #[cfg(windows)] fn new(wtr: W) -> LossyStandardStream<W> { let is_console = wincon::Console::stdout().is_ok() || wincon::Console::stderr().is_ok(); - LossyStandardStream { wtr: wtr, is_console: is_console } + LossyStandardStream { wtr, is_console } } #[cfg(not(windows))] @@ -2011,7 +2112,7 @@ impl<W: io::Write> LossyStandardStream<W> { #[cfg(windows)] fn wrap<Q: io::Write>(&self, wtr: Q) -> LossyStandardStream<Q> { - LossyStandardStream { wtr: wtr, is_console: self.is_console } + LossyStandardStream { wtr, is_console: self.is_console } } fn get_ref(&self) -> &W { @@ -2202,16 +2303,19 @@ mod tests { for underline in vec![false, true] { for intense in vec![false, true] { for italic in vec![false, true] { - for dimmed in vec![false, true] { - let mut color = ColorSpec::new(); - color.set_fg(fg); - color.set_bg(bg); - color.set_bold(bold); - color.set_underline(underline); - color.set_intense(intense); - color.set_dimmed(dimmed); - color.set_italic(italic); - result.push(color); + for strikethrough in vec![false, true] { + for dimmed in vec![false, true] { + let mut color = ColorSpec::new(); + color.set_fg(fg); + color.set_bg(bg); + color.set_bold(bold); + color.set_underline(underline); + color.set_intense(intense); + color.set_italic(italic); + color.set_dimmed(dimmed); + color.set_strikethrough(strikethrough); + result.push(color); + } } } } |