cli: use is_tty() from crossterm crate instead of atty

The `atty` crate seems unmaintained. There's
https://rustsec.org/advisories/RUSTSEC-2021-0145 filed against it,
which `cargo-deny` complains about. A fix for that has been open for
well over a year without being fixed
(https://github.com/softprops/atty/pull/51). It turns out the
functionality is also available via the `crossterm` crate (thanks,
@yuja), which we already depend on.

Since we also depend on `atty` via `clap`, I also added an exception
to the `cargo-deny` config.
This commit is contained in:
Martin von Zweigbergk 2022-11-23 08:14:13 -08:00 committed by Martin von Zweigbergk
parent 94815a7cb5
commit 3e0f6ef2b9
4 changed files with 6 additions and 7 deletions

1
Cargo.lock generated
View file

@ -716,7 +716,6 @@ name = "jujutsu"
version = "0.5.1"
dependencies = [
"assert_cmd",
"atty",
"chrono",
"clap 4.0.26",
"clap_complete",

View file

@ -34,7 +34,6 @@ harness = false
members = ["lib"]
[dependencies]
atty = "0.2.14"
chrono = { version = "0.4.23", default-features = false, features = ["std", "clock"] }
clap = { version = "4.0.26", features = ["derive", "deprecated"] }
clap_complete = "4.0.5"

View file

@ -51,6 +51,7 @@ notice = "warn"
# output a note when they are encountered.
ignore = [
#"RUSTSEC-0000-0000",
"RUSTSEC-2021-0145",
]
# Threshold for security vulnerabilities, any vulnerability with a CVSS score
# lower than the range specified will be ignored. Note that ignored advisories

View file

@ -17,7 +17,7 @@ use std::path::{Path, PathBuf};
use std::str::FromStr;
use std::{fmt, io};
use atty::Stream;
use crossterm::tty::IsTty;
use jujutsu_lib::settings::UserSettings;
use crate::formatter::{Formatter, FormatterFactory};
@ -80,7 +80,7 @@ fn use_color(choice: ColorChoice) -> bool {
match choice {
ColorChoice::Always => true,
ColorChoice::Never => false,
ColorChoice::Auto => atty::is(Stream::Stdout),
ColorChoice::Auto => io::stdout().is_tty(),
}
}
@ -154,7 +154,7 @@ impl Ui {
/// Whether continuous feedback should be displayed for long-running
/// operations
pub fn use_progress_indicator(&self) -> bool {
self.settings().use_progress_indicator() && atty::is(Stream::Stdout)
self.settings().use_progress_indicator() && io::stdout().is_tty()
}
pub fn write(&mut self, text: &str) -> io::Result<()> {
@ -208,7 +208,7 @@ impl Ui {
}
pub fn prompt(&mut self, prompt: &str) -> io::Result<String> {
if !atty::is(Stream::Stdout) {
if !io::stdout().is_tty() {
return Err(io::Error::new(
io::ErrorKind::Unsupported,
"Cannot prompt for input since the output is not connected to a terminal",
@ -222,7 +222,7 @@ impl Ui {
}
pub fn prompt_password(&mut self, prompt: &str) -> io::Result<String> {
if !atty::is(Stream::Stdout) {
if !io::stdout().is_tty() {
return Err(io::Error::new(
io::ErrorKind::Unsupported,
"Cannot prompt for input since the output is not connected to a terminal",