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..82de8154 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,19 @@ 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_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!( - package_names(repo_rule), - sorted_package_names(repo_rule), - "package rule {group_name:?} matchPackageNames in .github/renovate.json5 must be sorted" + rule_names(default_rule), + rule_names(repo_rule), + "package rule {group_name:?} package matcher in .github/renovate.json5 drifted from default.json" + ); + assert_eq!( + rule_names(repo_rule), + sorted_rule_names(repo_rule), + "package rule {group_name:?} package matcher in .github/renovate.json5 must be sorted" ); } @@ -553,8 +558,51 @@ 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_name_field(rule: &serde_json::Value) -> &'static str { + 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> { + match rule_name_field(rule) { + "matchDepNames" => dep_names(rule), + "matchPackageNames" => package_names(rule), + _ => unreachable!("unexpected rule_name_field result"), + } +} + +fn sorted_rule_names(rule: &serde_json::Value) -> Vec<&str> { + let mut names = rule_names(rule); names.sort_unstable(); names }