From e26b376d513132e3dbe3bee0f57ee71de2c7b62b Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Mon, 23 Feb 2026 18:55:36 +0100 Subject: [PATCH] tart list: remove "SizeOnDisk" and add "Accessed" field (#1202) * tart list: introduce "Accessed" field to show last accessed date of a VM * tart list: remove "SizeOnDisk" field as it's unused --- Sources/tart/Commands/List.swift | 34 +++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Sources/tart/Commands/List.swift b/Sources/tart/Commands/List.swift index c1a24b4..6261157 100644 --- a/Sources/tart/Commands/List.swift +++ b/Sources/tart/Commands/List.swift @@ -7,7 +7,7 @@ fileprivate struct VMInfo: Encodable { let Name: String let Disk: Int let Size: Int - let SizeOnDisk: Int + let Accessed: String let Running: Bool let State: String } @@ -39,13 +39,29 @@ struct List: AsyncParsableCommand { if source == nil || source == "local" { infos += sortedInfos(try VMStorageLocal().list().map { (name, vmDir) in - try VMInfo(Source: "local", Name: name, Disk: vmDir.sizeGB(), Size: vmDir.allocatedSizeGB(), SizeOnDisk: vmDir.allocatedSizeGB() - vmDir.deduplicatedSizeGB(), Running: vmDir.running(), State: vmDir.state().rawValue) + try VMInfo( + Source: "local", + Name: name, + Disk: vmDir.sizeGB(), + Size: vmDir.allocatedSizeGB(), + Accessed: formatAccessDate(try vmDir.accessDate()), + Running: vmDir.running(), + State: vmDir.state().rawValue + ) }) } if source == nil || source == "oci" { infos += sortedInfos(try VMStorageOCI().list().map { (name, vmDir, _) in - try VMInfo(Source: "OCI", Name: name, Disk: vmDir.sizeGB(), Size: vmDir.allocatedSizeGB(), SizeOnDisk: vmDir.allocatedSizeGB() - vmDir.deduplicatedSizeGB(), Running: vmDir.running(), State: vmDir.state().rawValue) + try VMInfo( + Source: "OCI", + Name: name, + Disk: vmDir.sizeGB(), + Size: vmDir.allocatedSizeGB(), + Accessed: formatAccessDate(try vmDir.accessDate()), + Running: vmDir.running(), + State: vmDir.state().rawValue + ) }) } @@ -61,4 +77,16 @@ struct List: AsyncParsableCommand { private func sortedInfos(_ infos: [VMInfo]) -> [VMInfo] { infos.sorted(by: { left, right in left.Name < right.Name }) } + + private func formatAccessDate(_ accessDate: Date) -> String { + switch format { + case .text: + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .full + return formatter.localizedString(for: accessDate, relativeTo: Date()) + case .json: + let formatter = ISO8601DateFormatter() + return formatter.string(from: accessDate) + } + } }