Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 12 additions & 17 deletions src/uu/tail/src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@

use crate::paths::Input;
use crate::{parse, platform, Quotable};
use clap::crate_version;
use clap::{crate_version, value_parser};
use clap::{Arg, ArgAction, ArgMatches, Command};
use fundu::DurationParser;
use is_terminal::IsTerminal;
use same_file::Handle;
use std::collections::VecDeque;
use std::ffi::OsString;
use std::time::Duration;
use uucore::error::{UResult, USimpleError, UUsageError};
Expand Down Expand Up @@ -141,7 +140,8 @@ pub struct Settings {
pub use_polling: bool,
pub verbose: bool,
pub presume_input_pipe: bool,
pub inputs: VecDeque<Input>,
/// `FILE(s)` positional arguments
pub inputs: Vec<Input>,
}

impl Default for Settings {
Expand Down Expand Up @@ -173,11 +173,11 @@ impl Settings {
}
settings.mode = FilterMode::from_obsolete_args(args);
let input = if let Some(name) = name {
Input::from(&name)
Input::from(name)
} else {
Input::default()
};
settings.inputs.push_back(input);
settings.inputs.push(input);
settings
}

Expand Down Expand Up @@ -282,19 +282,13 @@ impl Settings {
}
}

let mut inputs: VecDeque<Input> = matches
.get_many::<String>(options::ARG_FILES)
.map(|v| v.map(|string| Input::from(&string)).collect())
.unwrap_or_default();
settings.inputs = matches
.get_many::<OsString>(options::ARG_FILES)
.map(|v| v.map(Input::from).collect())
.unwrap_or_else(|| vec![Input::default()]);

// apply default and add '-' to inputs if none is present
if inputs.is_empty() {
inputs.push_front(Input::default());
}

settings.verbose = inputs.len() > 1 && !matches.get_flag(options::verbosity::QUIET);

settings.inputs = inputs;
settings.verbose =
settings.inputs.len() > 1 && !matches.get_flag(options::verbosity::QUIET);

Ok(settings)
}
Expand Down Expand Up @@ -590,6 +584,7 @@ pub fn uu_app() -> Command {
Arg::new(options::ARG_FILES)
.action(ArgAction::Append)
.num_args(1..)
.value_parser(value_parser!(OsString))
.value_hint(clap::ValueHint::FilePath),
)
}
Expand Down
3 changes: 1 addition & 2 deletions src/uu/tail/src/follow/watch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ use crate::follow::files::{FileHandling, PathData};
use crate::paths::{Input, InputKind, MetadataExtTail, PathExtTail};
use crate::{platform, text};
use notify::{RecommendedWatcher, RecursiveMode, Watcher, WatcherKind};
use std::collections::VecDeque;
use std::io::BufRead;
use std::path::{Path, PathBuf};
use std::sync::mpsc::{self, channel, Receiver};
Expand Down Expand Up @@ -270,7 +269,7 @@ impl Observer {
self.follow_name() && self.retry
}

fn init_files(&mut self, inputs: &VecDeque<Input>) -> UResult<()> {
fn init_files(&mut self, inputs: &Vec<Input>) -> UResult<()> {
if let Some(watcher_rx) = &mut self.watcher_rx {
for input in inputs {
match input.kind() {
Expand Down
41 changes: 27 additions & 14 deletions src/uu/tail/src/paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,42 @@ pub enum InputKind {
Stdin,
}

#[cfg(unix)]
impl From<&OsStr> for InputKind {
fn from(value: &OsStr) -> Self {
if value == OsStr::new("-") {
Self::Stdin
} else {
Self::File(PathBuf::from(value))
}
}
}

#[cfg(not(unix))]
impl From<&OsStr> for InputKind {
fn from(value: &OsStr) -> Self {
if value == OsStr::new(text::DASH) {
Self::Stdin
} else {
Self::File(PathBuf::from(value))
}
}
}

#[derive(Debug, Clone)]
pub struct Input {
kind: InputKind,
pub display_name: String,
}

impl Input {
pub fn from<T: AsRef<OsStr>>(string: &T) -> Self {
let kind = if string.as_ref() == Path::new(text::DASH) {
InputKind::Stdin
} else {
InputKind::File(PathBuf::from(string.as_ref()))
};
pub fn from<T: AsRef<OsStr>>(string: T) -> Self {
let string = string.as_ref();

let kind = string.into();
let display_name = match kind {
InputKind::File(_) => string.as_ref().to_string_lossy().to_string(),
InputKind::Stdin => {
if cfg!(unix) {
text::STDIN_HEADER.to_string()
} else {
string.as_ref().to_string_lossy().to_string()
}
}
InputKind::File(_) => string.to_string_lossy().to_string(),
InputKind::Stdin => text::STDIN_HEADER.to_string(),
};

Self { kind, display_name }
Expand Down
6 changes: 1 addition & 5 deletions tests/by-util/test_tail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,8 @@ fn test_stdin_redirect_offset() {
}

#[test]
#[cfg(all(not(target_vendor = "apple"), not(target_os = "windows")))] // FIXME: for currently not working platforms
#[cfg(all(not(target_vendor = "apple")))] // FIXME: for currently not working platforms
fn test_stdin_redirect_offset2() {
// FIXME: windows: Failed because of difference in printed header. See below.
// actual : ==> - <==
// expected: ==> standard input <==

// like test_stdin_redirect_offset but with multiple files

let ts = TestScenario::new(util_name!());
Expand Down