From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id A99071FF0B7 for ; Fri, 02 Oct 2026 09:10:48 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id E6FB7216CB; Fri, 02 Oct 2026 09:10:43 +0200 (CEST) From: Erik Fastermann To: pbs-devel@lists.proxmox.com, pdm-devel@lists.proxmox.com Subject: [PATCH proxmox-backup v2 1/2] fix #7746: cli: manager: show installed instead of candidate version Date: Fri, 2 Oct 2026 09:09:59 +0200 Message-ID: <20261002071000.131772-2-e.fastermann@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261002071000.131772-1-e.fastermann@proxmox.com> References: <20261002071000.131772-1-e.fastermann@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1790925040746 X-SPAM-LEVEL: Spam detection results: 0 AWL 1.859 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: GJBNJAJISIHE56W2CAZCK3LYXAG4IU4M X-Message-ID-Hash: GJBNJAJISIHE56W2CAZCK3LYXAG4IU4M X-MailFrom: e.fastermann@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Erik Fastermann X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: The 'versions' command printed 'Version' from the API result, which carries the version apt would upgrade to, not the one that is installed. Whenever the apt cache knows a newer version, the command therefore reported a version that is not installed at all, and the output changed after a plain 'apt update'. This also affects the 'report' command, which runs 'versions --verbose'. The installed version is available as 'OldVersion', which is what the GUI reads as well. The name is unfortunate for a listing of installed packages, but as far as I can tell every other consumer uses it correctly. The only exceptions were this command and its equivalent in Proxmox Datacenter Manager, which is fixed in a separate patch. Use a renderer for the column, as 'OldVersion' is not set for packages that are not installed, where the table would otherwise show an empty cell instead of 'unknown', matching the previous behavior. The header is not shown while 'noborder' is set, as the table formatter then suppresses headers as well. Still label it 'Version' rather than 'Old Version', as from the user's point of view it is the current version, and the label stays correct should the borders ever be enabled. The naming is inherited from PVE, where the same record is used for both the available updates and the installed package listing. Giving the versions endpoint its own type would avoid the trap for future callers, but that is a more complex API change and can be done in a future commit. Reviewed-by: Christian Ebner Tested-by: Christian Ebner Signed-off-by: Erik Fastermann --- src/bin/proxmox-backup-manager.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index 86bfae44f..46bbc514c 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -649,7 +649,11 @@ async fn get_versions(verbose: bool, param: Value) -> Result { .disable_sort() .noborder(true) // just not helpful for version info which gets copy pasted often .column(ColumnConfig::new("Package")) - .column(ColumnConfig::new("Version")) + .column( + ColumnConfig::new("OldVersion") + .header("Version") + .renderer(|value, _record| Ok(value.as_str().unwrap_or("unknown").to_string())), + ) .column(ColumnConfig::new("ExtraInfo").header("Extra Info")); let return_type = &crate::api2::node::apt::API_METHOD_GET_VERSIONS.returns; -- 2.47.3