From ed7165a492e1197deb0e401d3e79019858426739 Mon Sep 17 00:00:00 2001 From: Adrian Groh Date: Wed, 22 Jan 2025 19:42:58 +0100 Subject: [PATCH 1/2] Add winget support --- Cargo.toml | 2 +- src/traits.rs | 2 ++ src/windows/mod.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4dfc503..57f1885 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,7 @@ windows = { version = "0.39.0", features = [ [target.'cfg(not(target_os = "windows"))'.dependencies] if-addrs = "0.10.2" -[target.'cfg(any(target_os="freebsd", target_os = "linux"))'.dependencies] +[target.'cfg(any(target_os="freebsd", target_os = "linux", target_os = "windows"))'.dependencies] sqlite = "0.36.0" [target.'cfg(any(target_os="freebsd", target_os = "netbsd"))'.dependencies] diff --git a/src/traits.rs b/src/traits.rs index f3071c0..baf2195 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -668,6 +668,7 @@ pub enum PackageManager { Pkg, Scoop, Nix, + Winget, } impl std::fmt::Display for PackageManager { @@ -691,6 +692,7 @@ impl std::fmt::Display for PackageManager { PackageManager::Pkg => write!(f, "pkg"), PackageManager::Scoop => write!(f, "Scoop"), PackageManager::Nix => write!(f, "nix"), + PackageManager::Winget => write!(f, "winget"), } } } diff --git a/src/windows/mod.rs b/src/windows/mod.rs index c99eedc..2425f34 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -1,5 +1,6 @@ use crate::traits::*; use std::collections::HashMap; +use std::env; use std::path::{Path, PathBuf}; use winreg::enums::*; use winreg::RegKey; @@ -421,6 +422,9 @@ impl PackageReadout for WindowsPackageReadout { if let Some(c) = WindowsPackageReadout::count_scoop() { packages.push((PackageManager::Scoop, c)); } + if let Some(c) = WindowsPackageReadout::count_winget() { + packages.push((PackageManager::Winget, c)); + } packages } } @@ -440,6 +444,28 @@ impl WindowsPackageReadout { _ => None, } } + + fn count_winget() -> Option { + if let Ok(username) = env::var("USERNAME") { + let db = format!("C:\\Users\\{username}\\AppData\\Local\\Packages\\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\\LocalState\\Microsoft.Winget.Source_8wekyb3d8bbwe\\installed.db"); + if !Path::new(&db).is_file() { + return None; + } + let connection = sqlite::open(db); + if let Ok(con) = connection { + let statement = con.prepare("SELECT COUNT(*) FROM ids"); + if let Ok(mut s) = statement { + if s.next().is_ok() { + return match s.read::, _>(0) { + Ok(Some(count)) => Some(count as usize), + _ => None, + }; + } + } + } + } + None + } } pub struct WindowsNetworkReadout; From b54ba2f2e1a10e37c2a21714fd4ce81e3771fcbc Mon Sep 17 00:00:00 2001 From: Adrian Groh Date: Wed, 22 Jan 2025 20:50:41 +0100 Subject: [PATCH 2/2] Add chocolatey support --- src/traits.rs | 2 ++ src/windows/mod.rs | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/traits.rs b/src/traits.rs index baf2195..4f56dc5 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -669,6 +669,7 @@ pub enum PackageManager { Scoop, Nix, Winget, + Chocolatey, } impl std::fmt::Display for PackageManager { @@ -693,6 +694,7 @@ impl std::fmt::Display for PackageManager { PackageManager::Scoop => write!(f, "Scoop"), PackageManager::Nix => write!(f, "nix"), PackageManager::Winget => write!(f, "winget"), + PackageManager::Chocolatey => write!(f, "choco"), } } } diff --git a/src/windows/mod.rs b/src/windows/mod.rs index 2425f34..392e9c0 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -1,6 +1,7 @@ use crate::traits::*; use std::collections::HashMap; use std::env; +use std::fs::read_dir; use std::path::{Path, PathBuf}; use winreg::enums::*; use winreg::RegKey; @@ -425,6 +426,9 @@ impl PackageReadout for WindowsPackageReadout { if let Some(c) = WindowsPackageReadout::count_winget() { packages.push((PackageManager::Winget, c)); } + if let Some(c) = WindowsPackageReadout::count_chocolatey() { + packages.push((PackageManager::Chocolatey, c)); + } packages } } @@ -466,6 +470,16 @@ impl WindowsPackageReadout { } None } + + fn count_chocolatey() -> Option { + let chocolatey_dir = Path::new("C:\\ProgramData\\chocolatey\\lib"); + if chocolatey_dir.is_dir() { + if let Ok(read_dir) = read_dir(chocolatey_dir) { + return Some(read_dir.count()); + } + } + None + } } pub struct WindowsNetworkReadout;