From 74a42f2467ae942e581e28c08214bed64cac95c1 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 29 Apr 2026 14:27:09 +0000 Subject: [PATCH 1/3] fix: match mise linter presets by dep name Signed-off-by: Gregor Zeitlinger --- .github/renovate.json5 | 2 +- default.json | 2 +- src/registry/tests.rs | 49 ++++++++++++++++++++++++++++++++---------- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 31eb68f2..2a9ed81b 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -62,7 +62,7 @@ ], packageRules: [ { - matchPackageNames: [ + matchDepNames: [ "actionlint", "aqua:owenlamont/ryl", "biome", diff --git a/default.json b/default.json index 8807cb69..3942d6ff 100644 --- a/default.json +++ b/default.json @@ -36,7 +36,7 @@ ], "packageRules": [ { - "matchPackageNames": [ + "matchDepNames": [ "actionlint", "aqua:owenlamont/ryl", "biome", diff --git a/src/registry/tests.rs b/src/registry/tests.rs index 9d976965..04c84509 100644 --- a/src/registry/tests.rs +++ b/src/registry/tests.rs @@ -397,7 +397,7 @@ fn default_renovate_preset_covers_all_linter_tools_weekly() { .find(|rule| rule["groupName"].as_str() == Some("linters")) .expect("default.json must define a packageRules entry with groupName 'linters'"); - let actual = package_names(linters_rule); + let actual = dep_names(linters_rule); let expected: Vec<&str> = builtin() .into_iter() .filter(|check| check.uses_binary()) @@ -413,8 +413,8 @@ fn default_renovate_preset_covers_all_linter_tools_weekly() { ); assert_eq!( actual, - sorted_package_names(linters_rule), - "default.json weekly linters rule matchPackageNames must be sorted" + sorted_dep_names(linters_rule), + "default.json weekly linters rule matchDepNames must be sorted" ); assert_eq!( @@ -461,14 +461,14 @@ fn repo_renovate_config_stays_aligned_with_shared_preset_contract() { "package rule {group_name:?} schedule in .github/renovate.json5 drifted from default.json" ); assert_eq!( - package_names(default_rule), - package_names(repo_rule), - "package rule {group_name:?} matchPackageNames in .github/renovate.json5 drifted from default.json" + rule_names(default_rule), + rule_names(repo_rule), + "package rule {group_name:?} package matcher in .github/renovate.json5 drifted from default.json" ); assert_eq!( - package_names(repo_rule), - sorted_package_names(repo_rule), - "package rule {group_name:?} matchPackageNames in .github/renovate.json5 must be sorted" + rule_names(repo_rule), + sorted_rule_names(repo_rule), + "package rule {group_name:?} package matcher in .github/renovate.json5 must be sorted" ); } @@ -553,8 +553,35 @@ fn package_names(rule: &serde_json::Value) -> Vec<&str> { .collect() } -fn sorted_package_names(rule: &serde_json::Value) -> Vec<&str> { - let mut names = package_names(rule); +fn dep_names(rule: &serde_json::Value) -> Vec<&str> { + rule["matchDepNames"] + .as_array() + .expect("package rule must declare matchDepNames") + .iter() + .map(|value| { + value + .as_str() + .expect("package rule matchDepNames entries must be strings") + }) + .collect() +} + +fn sorted_dep_names(rule: &serde_json::Value) -> Vec<&str> { + let mut names = dep_names(rule); + names.sort_unstable(); + names +} + +fn rule_names(rule: &serde_json::Value) -> Vec<&str> { + if rule.get("matchDepNames").is_some() { + dep_names(rule) + } else { + package_names(rule) + } +} + +fn sorted_rule_names(rule: &serde_json::Value) -> Vec<&str> { + let mut names = rule_names(rule); names.sort_unstable(); names } From f0d26788f3ea6d6de053d2f1b58430e99a24bb91 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 29 Apr 2026 14:56:36 +0000 Subject: [PATCH 2/3] test: catch renovate matcher field drift Signed-off-by: Gregor Zeitlinger --- src/registry/tests.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/registry/tests.rs b/src/registry/tests.rs index 04c84509..d3da90fd 100644 --- a/src/registry/tests.rs +++ b/src/registry/tests.rs @@ -460,6 +460,11 @@ fn repo_renovate_config_stays_aligned_with_shared_preset_contract() { default_rule["schedule"], repo_rule["schedule"], "package rule {group_name:?} schedule in .github/renovate.json5 drifted from default.json" ); + assert_eq!( + rule_name_field(default_rule), + rule_name_field(repo_rule), + "package rule {group_name:?} matcher field in .github/renovate.json5 drifted from default.json" + ); assert_eq!( rule_names(default_rule), rule_names(repo_rule), @@ -572,6 +577,14 @@ fn sorted_dep_names(rule: &serde_json::Value) -> Vec<&str> { names } +fn rule_name_field(rule: &serde_json::Value) -> &'static str { + if rule.get("matchDepNames").is_some() { + "matchDepNames" + } else { + "matchPackageNames" + } +} + fn rule_names(rule: &serde_json::Value) -> Vec<&str> { if rule.get("matchDepNames").is_some() { dep_names(rule) From 05b7938721ed687935fc40df552618df28b44de3 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 30 Apr 2026 14:44:36 +0000 Subject: [PATCH 3/3] test: enforce renovate matcher key parity Signed-off-by: Gregor Zeitlinger --- src/registry/tests.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/registry/tests.rs b/src/registry/tests.rs index d3da90fd..82de8154 100644 --- a/src/registry/tests.rs +++ b/src/registry/tests.rs @@ -578,18 +578,26 @@ fn sorted_dep_names(rule: &serde_json::Value) -> Vec<&str> { } fn rule_name_field(rule: &serde_json::Value) -> &'static str { - if rule.get("matchDepNames").is_some() { - "matchDepNames" - } else { - "matchPackageNames" + match ( + rule.get("matchDepNames").is_some(), + rule.get("matchPackageNames").is_some(), + ) { + (true, false) => "matchDepNames", + (false, true) => "matchPackageNames", + (true, true) => { + panic!("package rule must not declare both matchDepNames and matchPackageNames") + } + (false, false) => { + panic!("package rule must declare matchDepNames or matchPackageNames") + } } } fn rule_names(rule: &serde_json::Value) -> Vec<&str> { - if rule.get("matchDepNames").is_some() { - dep_names(rule) - } else { - package_names(rule) + match rule_name_field(rule) { + "matchDepNames" => dep_names(rule), + "matchPackageNames" => package_names(rule), + _ => unreachable!("unexpected rule_name_field result"), } }