aboutsummaryrefslogtreecommitdiff
path: root/src/cli/plugin.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/plugin.rs')
-rw-r--r--src/cli/plugin.rs62
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);
+ }
}