| 94 | } |
| 95 | |
| 96 | pub fn get_memtrack_status() -> ToolStatus { |
| 97 | let tool_name = MEMTRACK_COMMAND.to_string(); |
| 98 | |
| 99 | let is_available = Command::new("which") |
| 100 | .arg(MEMTRACK_COMMAND) |
| 101 | .output() |
| 102 | .is_ok_and(|output| output.status.success()); |
| 103 | if !is_available { |
| 104 | return ToolStatus { |
| 105 | tool_name, |
| 106 | status: ToolInstallStatus::NotInstalled, |
| 107 | }; |
| 108 | } |
| 109 | |
| 110 | let Ok(version_output) = Command::new(MEMTRACK_COMMAND).arg("--version").output() else { |
| 111 | return ToolStatus { |
| 112 | tool_name, |
| 113 | status: ToolInstallStatus::NotInstalled, |
| 114 | }; |
| 115 | }; |
| 116 | |
| 117 | if !version_output.status.success() { |
| 118 | return ToolStatus { |
| 119 | tool_name, |
| 120 | status: ToolInstallStatus::NotInstalled, |
| 121 | }; |
| 122 | } |
| 123 | |
| 124 | let version = String::from_utf8_lossy(&version_output.stdout) |
| 125 | .trim() |
| 126 | .to_string(); |
| 127 | |
| 128 | // Parse the version number from output like "memtrack 1.2.2" |
| 129 | let expected = semver::Version::parse(MEMTRACK_CODSPEED_VERSION).unwrap(); |
| 130 | if let Some(version_str) = version.split_once(' ').map(|(_, v)| v.trim()) { |
| 131 | if let Ok(installed) = semver::Version::parse(version_str) { |
| 132 | if installed < expected { |
| 133 | return ToolStatus { |
| 134 | tool_name, |
| 135 | status: ToolInstallStatus::IncorrectVersion { |
| 136 | version, |
| 137 | message: format!( |
| 138 | "version too old, expecting {MEMTRACK_CODSPEED_VERSION} or higher", |
| 139 | ), |
| 140 | }, |
| 141 | }; |
| 142 | } |
| 143 | return ToolStatus { |
| 144 | tool_name, |
| 145 | status: ToolInstallStatus::Installed { version }, |
| 146 | }; |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | ToolStatus { |
| 151 | tool_name, |
| 152 | status: ToolInstallStatus::IncorrectVersion { |
| 153 | version, |