use crate::package_repair::RepairEnvironment;
use crate::package_repair_command::{ToolCommand, ToolRun, find_program, run_tool};
use crate::package_repair_report::{Finding, Tool, finding_from, missing_tool};
use crate::shell_quote::shell_quote;
use std::ffi::OsString;
use std::path::{Path, PathBuf};
const PROGRAM: &str = "pnpm";
const LOCKFILE: &str = "pnpm-lock.yaml";
const MODULES: &str = "node_modules";
const ARGUMENTS: [&str; 3] = ["install", "--offline", "--frozen-lockfile"];
pub fn manual_command(destination: &Path) -> String {
return format!("{PROGRAM} --dir {} {}", shell_quote(destination.as_os_str().as_encoded_bytes()), ARGUMENTS.join(" "));
}
pub fn repair_pnpm(destination: &Path, environment: &RepairEnvironment) -> Option<Finding> {
if !destination.join(LOCKFILE).is_file() || !destination.join(MODULES).is_dir() {
crate::diagnostic_log::debug("packageRepairPnpm", format!("{}: no lockfile or no node_modules, nothing to relink", destination.display()).as_str());
return None;
}
let manual: String = manual_command(destination);
let Some(program) = find_program(PROGRAM, environment.path()) else {
return Some(missing_tool(Tool::Pnpm, PROGRAM, manual.as_str()));
};
let command: ToolCommand = ToolCommand { arguments: ARGUMENTS.iter().map(OsString::from).collect(), directory: PathBuf::from(destination), set: Vec::new() };
let run: ToolRun = run_tool(program.as_path(), &command, environment.quiet_window);
crate::diagnostic_log::debug("packageRepairPnpm", format!("{}: {} ended {:?} after {} ms", destination.display(), program.display(), run.end, run.millis).as_str());
return Some(finding_from(Tool::Pnpm, &run, "pnpm relinked node_modules", manual.as_str()));
}
#[cfg(test)]
#[path = "package_repair_pnpm_tests.rs"]
mod tests;