last: fix some hostnames are not shown properly with --hostname option issue 212 (#246)
* last: fix not all hostnames are shown in the last column with --hostlast option * last: fix not all hostnames are shown in the last column with --hostlast option * Added test case related to the hostlast option in last command. * Change binary input fixture name for last command and Fix format source code. * feat: add macOS platform & update tests for compatibility * fix: correct formatting in platform and test files for macOS compatibility * fix: format * fix: correct variable name and improve test output handling
This commit is contained in:
17
src/uu/last/src/platform/macos.rs
Normal file
17
src/uu/last/src/platform/macos.rs
Normal file
@@ -0,0 +1,17 @@
|
||||
// This file is part of the uutils util-linux package.
|
||||
//
|
||||
// For the full copyright and license information, please view the LICENSE
|
||||
// file that was distributed with this source code.
|
||||
|
||||
// Specific implementation for OpenBSD: tool unsupported (utmpx not supported)
|
||||
|
||||
use crate::uu_app;
|
||||
|
||||
use uucore::error::UResult;
|
||||
|
||||
pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
||||
let _matches = uu_app().try_get_matches_from(args)?;
|
||||
|
||||
println!("unsupported command on macOS");
|
||||
Ok(())
|
||||
}
|
||||
@@ -3,9 +3,9 @@
|
||||
// For the full copyright and license information, please view the LICENSE
|
||||
// file that was distributed with this source code.
|
||||
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
mod unix;
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
pub use self::unix::*;
|
||||
|
||||
#[cfg(target_os = "openbsd")]
|
||||
@@ -17,3 +17,8 @@ pub use self::openbsd::*;
|
||||
mod windows;
|
||||
#[cfg(windows)]
|
||||
pub use self::windows::*;
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
mod macos;
|
||||
#[cfg(target_os = "macos")]
|
||||
pub use self::macos::*;
|
||||
|
||||
@@ -369,7 +369,7 @@ impl Last {
|
||||
.unwrap_or_else(|| time::OffsetDateTime::from_unix_timestamp(0).unwrap());
|
||||
let time_delta = duration_string(calculate_time_delta(&curr_datetime, &shutdown));
|
||||
if ut.is_user_process() {
|
||||
proc_status = Some("- down");
|
||||
proc_status = Some("- down ");
|
||||
}
|
||||
(
|
||||
self.end_time_string(proc_status, &shutdown),
|
||||
@@ -520,16 +520,18 @@ impl Last {
|
||||
write!(buf, " {host_to_print:<16}").unwrap_or_default();
|
||||
}
|
||||
|
||||
let time_size = 3 + 2 + 2 + 1 + 2;
|
||||
if self.host_last && !self.no_host && self.time_format != "notime" {
|
||||
write!(buf, " {time:<time_size$}").unwrap_or_default();
|
||||
write!(buf, " {end_time:<8}").unwrap_or_default();
|
||||
write!(buf, " {host_to_print}").unwrap_or_default();
|
||||
} else if self.time_format != "notime" {
|
||||
write!(buf, " {time:<time_size$}").unwrap_or_default();
|
||||
write!(buf, " {end_time:<8}").unwrap_or_default();
|
||||
if self.time_format != "notime" {
|
||||
let time_fmt = 12;
|
||||
let end_time_delta = format!("{end_time:<6} {delta}");
|
||||
let end_time_delta_fmt = 18;
|
||||
|
||||
write!(buf, " {time:<time_fmt$}").unwrap_or_default();
|
||||
write!(buf, " {end_time_delta:<end_time_delta_fmt$}").unwrap_or_default();
|
||||
}
|
||||
|
||||
if self.host_last && !self.no_host {
|
||||
write!(buf, " {host_to_print:<16}").unwrap_or_default();
|
||||
}
|
||||
write!(buf, " {delta:^6}").unwrap_or_default();
|
||||
println!("{}", buf.trim_end());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ fn test_invalid_arg() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn test_last() {
|
||||
let regex = Regex::new("still running|still logged in").unwrap();
|
||||
TestScenario::new(util_name!())
|
||||
@@ -27,7 +27,7 @@ fn test_last() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn test_limit_arg() {
|
||||
let line_check = |input: &str| input.lines().count() == 3;
|
||||
new_ucmd!()
|
||||
@@ -58,7 +58,7 @@ fn test_timestamp_format_no_time() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn test_timestamp_format_short() {
|
||||
let regex = Regex::new(" [0-9][0-9]:[0-9][0-9] ").unwrap();
|
||||
new_ucmd!()
|
||||
@@ -68,7 +68,7 @@ fn test_timestamp_format_short() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn test_timestamp_format_full() {
|
||||
let regex = Regex::new(" [0-9][0-9]:[0-9][0-9]:[0-9][0-9] ").unwrap();
|
||||
new_ucmd!()
|
||||
@@ -79,7 +79,7 @@ fn test_timestamp_format_full() {
|
||||
|
||||
// 2024-07-11T19:30:44+08:00
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn test_timestamp_format_iso() {
|
||||
let regex =
|
||||
Regex::new(" [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]")
|
||||
@@ -91,7 +91,7 @@ fn test_timestamp_format_iso() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn test_short_invalid_utmp_file() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let file = "testfile";
|
||||
@@ -108,3 +108,27 @@ fn test_short_invalid_utmp_file() {
|
||||
.succeeds()
|
||||
.stdout_matches(®ex);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "openbsd")))]
|
||||
fn test_display_hostname_last_column() {
|
||||
let output_expected = vec![
|
||||
"ferris tty2 Sat Mar 8 16:29 still logged in :0",
|
||||
"ferris tty2 Sat Mar 8 16:24 - 16:29 (00:04) :0",
|
||||
"reboot system boot Sat Mar 8 16:24 still running 6.8.0-55-generic",
|
||||
];
|
||||
|
||||
let hostlast_arg = "--hostlast";
|
||||
let result = new_ucmd!()
|
||||
.arg("--file")
|
||||
.arg("last.input.1")
|
||||
.arg(hostlast_arg)
|
||||
.arg("-n")
|
||||
.arg("3")
|
||||
.succeeds();
|
||||
|
||||
// Keep only the three 1st lines to compare easier with the expected output (so without the information about the begin date of file)
|
||||
let output_result: Vec<_> = result.stdout_str().lines().take(3).collect();
|
||||
|
||||
assert_eq!(output_expected, output_result);
|
||||
}
|
||||
|
||||
BIN
tests/fixtures/last/last.input.1
vendored
Normal file
BIN
tests/fixtures/last/last.input.1
vendored
Normal file
Binary file not shown.
Reference in New Issue
Block a user