|
| 1 | +#![feature(rustc_private)] |
| 2 | + |
| 3 | +use std::collections::HashMap; |
| 4 | +use std::fs; |
| 5 | + |
| 6 | +use clippy_lints::declared_lints::LINTS; |
| 7 | +use clippy_lints::deprecated_lints::RENAMED; |
| 8 | +use pulldown_cmark::{Event, HeadingLevel, Parser, Tag, TagEnd}; |
| 9 | +use test_utils::IS_RUSTC_TEST_SUITE; |
| 10 | + |
| 11 | +mod test_utils; |
| 12 | + |
| 13 | +#[test] |
| 14 | +fn versions_match_changelog() { |
| 15 | + if IS_RUSTC_TEST_SUITE { |
| 16 | + return; |
| 17 | + } |
| 18 | + |
| 19 | + let changelog = fs::read_to_string("CHANGELOG.md").unwrap(); |
| 20 | + |
| 21 | + let mut versions_by_name: HashMap<_, _> = LINTS.iter().map(|&lint| (lint.name_lower(), lint)).collect(); |
| 22 | + |
| 23 | + for (from, to) in RENAMED { |
| 24 | + let from = from.strip_prefix("clippy::").unwrap(); |
| 25 | + if let Some(to) = to.strip_prefix("clippy::") { |
| 26 | + versions_by_name.insert(from.to_owned(), versions_by_name[to]); |
| 27 | + } |
| 28 | + } |
| 29 | + |
| 30 | + let mut heading = None; |
| 31 | + let mut changelog_version = None; |
| 32 | + let mut in_new_lints = true; |
| 33 | + let mut checked = 0; |
| 34 | + |
| 35 | + for event in Parser::new(&changelog) { |
| 36 | + match event { |
| 37 | + Event::Start(Tag::Heading { level, .. }) => { |
| 38 | + in_new_lints = false; |
| 39 | + heading = Some(level); |
| 40 | + }, |
| 41 | + Event::End(TagEnd::Heading(_)) => heading = None, |
| 42 | + Event::Text(text) => match heading { |
| 43 | + Some(HeadingLevel::H2) => { |
| 44 | + if let Some(v) = text.strip_prefix("Rust ") { |
| 45 | + changelog_version = Some(v.to_owned()); |
| 46 | + } |
| 47 | + }, |
| 48 | + Some(HeadingLevel::H3) => { |
| 49 | + in_new_lints = text.eq_ignore_ascii_case("new lints"); |
| 50 | + }, |
| 51 | + _ => {}, |
| 52 | + }, |
| 53 | + Event::Start(Tag::Link { id, .. }) if in_new_lints => { |
| 54 | + if let Some(name) = id.strip_prefix('`') |
| 55 | + && let Some(name) = name.strip_suffix('`') |
| 56 | + && let Some(&lint) = versions_by_name.get(name) |
| 57 | + { |
| 58 | + let lint_version = lint.version.strip_suffix(".0").unwrap(); |
| 59 | + let changelog_version = changelog_version.as_deref().unwrap(); |
| 60 | + assert_eq!( |
| 61 | + lint_version, |
| 62 | + changelog_version, |
| 63 | + "{name} has version {lint_version} but appears in the changelog for {changelog_version}\n\ |
| 64 | + \n\ |
| 65 | + update {} to `#[clippy::version = \"{changelog_version}.0\"]`", |
| 66 | + lint.location_terminal(), |
| 67 | + ); |
| 68 | + checked += 1; |
| 69 | + } |
| 70 | + }, |
| 71 | + _ => {}, |
| 72 | + } |
| 73 | + } |
| 74 | + |
| 75 | + assert!( |
| 76 | + checked > 400, |
| 77 | + "only checked {checked} versions, did the changelog format change?" |
| 78 | + ); |
| 79 | +} |
0 commit comments