diff --git a/src/config.rs b/src/config.rs index 11f50fc..961e468 100644 --- a/src/config.rs +++ b/src/config.rs @@ -76,6 +76,12 @@ impl<'de> Deserialize<'de> for AcmedConfig { if key.starts_with(crate::INTERNAL_HOOK_PREFIX) { return Err(de::Error::custom(format!("{key}: invalid group name"))); } + // Group name must not be a hook name + if unchecked.hook.contains_key(key) { + return Err(de::Error::custom(format!( + "{key}: hooks and groups must not share the same name" + ))); + } // Group must only contain valid hook names for hook_name in hook_lst { if !unchecked.hook.contains_key(hook_name) { @@ -328,6 +334,24 @@ internal-grp = ["internaltest"] assert!(res.is_err()); } + #[test] + fn hook_group_dup() { + let cfg = r#" +[hook."test"] +cmd = "cat" +type = ["file-pre-edit"] + +[hook."my-hook"] +cmd = "cat" +type = ["file-pre-edit"] + +[group] +test = ["my-hook"] +"#; + let res = load_str::(cfg); + assert!(res.is_err()); + } + #[test] fn hook_account() { let cfg = r#"