diff options
Diffstat (limited to 'src/cli/plugin.rs')
| -rw-r--r-- | src/cli/plugin.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/cli/plugin.rs b/src/cli/plugin.rs index f391fa47..ffdcd711 100644 --- a/src/cli/plugin.rs +++ b/src/cli/plugin.rs @@ -26,6 +26,7 @@ pub(super) fn run_plugin_command(args: &[String]) -> std::io::Result<i32> { "uninstall" => plugin_uninstall(&args[1..]), "link" => plugin_link(&args[1..]), "list" => plugin_list(&args[1..]), + "config-dir" => plugin_config_dir_command(&args[1..]), "unlink" => plugin_unlink(&args[1..]), "enable" => plugin_set_enabled(&args[1..], true), "disable" => plugin_set_enabled(&args[1..], false), @@ -74,6 +75,21 @@ fn plugin_link(args: &[String]) -> std::io::Result<i32> { })) } +fn plugin_config_dir_command(args: &[String]) -> std::io::Result<i32> { + let Some(plugin_id) = args.first() else { + eprintln!("usage: herdr plugin config-dir <plugin_id>"); + return Ok(2); + }; + if args.len() != 1 { + eprintln!("usage: herdr plugin config-dir <plugin_id>"); + return Ok(2); + } + let path = crate::plugin_paths::plugin_config_dir(plugin_id); + crate::plugin_paths::ensure_plugin_user_dirs(plugin_id)?; + println!("{}", path.display()); + Ok(0) +} + fn plugin_list(args: &[String]) -> std::io::Result<i32> { let mut plugin_id = None; let mut json = false; @@ -224,6 +240,10 @@ fn plugin_install(args: &[String]) -> std::io::Result<i32> { Err(InstallFailure::KeepCheckout(err)) => return Err(err), }; println!("Installed {} from {}.", plugin.plugin_id, source.display()); + println!( + "Config: {}", + crate::plugin_paths::plugin_config_dir(&plugin.plugin_id).display() + ); Ok(0) })(); let _ = std::fs::remove_dir_all(&temp_root); @@ -892,6 +912,8 @@ fn register_installed_plugin( Err(err) if is_connection_error(&err) => { let mut plugins = crate::persist::plugin_registry::load(); plugins.retain(|entry| entry.plugin_id != plugin.plugin_id); + crate::plugin_paths::ensure_plugin_user_dirs(&plugin.plugin_id) + .map_err(InstallFailure::Rollback)?; plugins.push(plugin); crate::persist::plugin_registry::save(&plugins).map_err(InstallFailure::Rollback) } @@ -1082,6 +1104,10 @@ fn print_plugin_list_human(response: &serde_json::Value) -> std::io::Result<i32> source_display(&plugin), warning ); + println!( + " config: {}", + crate::plugin_paths::plugin_config_dir(&plugin.plugin_id).display() + ); for warning in plugin.warnings { println!(" warning: {warning}"); } @@ -1561,6 +1587,7 @@ fn print_plugin_help() { eprintln!(" herdr plugin uninstall <plugin_id|owner/repo[/subdir...]>"); eprintln!(" herdr plugin link <path> [--disabled]"); eprintln!(" herdr plugin list [--plugin ID] [--json]"); + eprintln!(" herdr plugin config-dir <plugin_id>"); eprintln!(" herdr plugin unlink <plugin_id>"); eprintln!(" herdr plugin enable <plugin_id>"); eprintln!(" herdr plugin disable <plugin_id>"); @@ -1586,6 +1613,14 @@ fn print_plugin_pane_help() { mod tests { use super::*; + fn unique_plugin_id(label: &str) -> String { + let nanos = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_nanos()) + .unwrap_or(0); + format!("test.{label}.{}.{nanos}", std::process::id()) + } + fn github_plugin( id: &str, owner: &str, @@ -1708,4 +1743,31 @@ mod tests { assert!(plugin_by_github_source([plugin], &source).is_none()); } + + #[test] + fn cli_user_dir_creation_seeds_legacy_config_before_printing_config_dir() { + let plugin_id = unique_plugin_id("legacy-config"); + let config_dir = crate::plugin_paths::plugin_config_dir(&plugin_id); + let state_dir = crate::plugin_paths::plugin_state_dir(&plugin_id); + let legacy_dir = crate::config::config_dir().join("plugins").join(&plugin_id); + let _ = std::fs::remove_dir_all(&config_dir); + let _ = std::fs::remove_dir_all(&state_dir); + let _ = std::fs::remove_dir_all(&legacy_dir); + std::fs::create_dir_all(&legacy_dir).unwrap(); + std::fs::write(legacy_dir.join(".env"), "TOKEN=legacy\n").unwrap(); + + assert_eq!( + plugin_config_dir_command(std::slice::from_ref(&plugin_id)).unwrap(), + 0 + ); + + assert_eq!( + std::fs::read_to_string(config_dir.join(".env")).unwrap(), + "TOKEN=legacy\n" + ); + + let _ = std::fs::remove_dir_all(config_dir); + let _ = std::fs::remove_dir_all(state_dir); + let _ = std::fs::remove_dir_all(legacy_dir); + } } |
