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:
Lionel Mendes
2025-05-08 17:32:25 +02:00
committed by GitHub
parent dae500f492
commit 55c8ee013b
5 changed files with 66 additions and 18 deletions

View 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(())
}

View File

@@ -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::*;

View File

@@ -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());
}
}

View File

@@ -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(&regex);
}
#[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

Binary file not shown.