diff --git a/gengo/languages.yaml b/gengo/languages.yaml index 94bbbf34..79592c0a 100644 --- a/gengo/languages.yaml +++ b/gengo/languages.yaml @@ -79,6 +79,14 @@ C: - cake - cs - csx +CMake: + category: programming + color: "#CCCCCC" + matchers: + extensions: + - cmake + filenames: + - CMakeLists.txt CSS: category: markup color: "#AA88AA" @@ -156,6 +164,7 @@ JavaScript: matchers: extensions: - js + - jsx interpreters: - node Makefile: @@ -271,6 +280,7 @@ TypeScript: matchers: extensions: - ts + - tsx interpreters: - deno Vue: diff --git a/gengo/src/generated.rs b/gengo/src/generated.rs index 1c238871..5e6cb61b 100644 --- a/gengo/src/generated.rs +++ b/gengo/src/generated.rs @@ -1,3 +1,4 @@ +use super::GLOB_MATCH_OPTIONS; use glob::Pattern; use std::path::Path; @@ -17,7 +18,9 @@ impl Generated { } fn is_generated_no_read>(&self, filepath: P) -> bool { - self.globs.iter().any(|g| g.matches_path(filepath.as_ref())) + self.globs + .iter() + .any(|g| g.matches_path_with(filepath.as_ref(), GLOB_MATCH_OPTIONS)) } fn is_generated_with_read>(&self, _filepath: P, contents: &[u8]) -> bool { @@ -33,7 +36,7 @@ impl Generated { } fn globs() -> Vec { - ["dist/**", "*.min.css", "*.min.js"] + ["dist/**", "**/*.min.css", "**/*.min.js"] .into_iter() .map(|s| Pattern::new(s).unwrap()) .collect() diff --git a/gengo/src/languages/matcher.rs b/gengo/src/languages/matcher.rs index 95be1284..62ec2ea8 100644 --- a/gengo/src/languages/matcher.rs +++ b/gengo/src/languages/matcher.rs @@ -3,6 +3,7 @@ use indexmap::IndexSet; use once_cell::sync::Lazy; use regex::Regex; +use crate::GLOB_MATCH_OPTIONS; use std::ffi::{OsStr, OsString}; use std::fmt::Display; use std::path::Path; @@ -74,7 +75,7 @@ impl FilepathPattern { pub fn matches>(&self, filename: P) -> bool { self.patterns .iter() - .any(|p| p.matches_path(filename.as_ref())) + .any(|p| p.matches_path_with(filename.as_ref(), GLOB_MATCH_OPTIONS)) } } @@ -153,6 +154,12 @@ mod tests { assert!(analyzer.matches(filename)); } + #[rstest(pattern, filename, case("Makefile.*", "Makefile.in/foo"))] + fn test_rejects_pattern(pattern: &str, filename: &str) { + let analyzer = FilepathPattern::new(&[pattern.into()]); + assert!(!analyzer.matches(filename)); + } + #[test] fn test_matches_shebang() { let analyzer = Shebang::new(&["python", "python3"]); diff --git a/gengo/src/lib.rs b/gengo/src/lib.rs index cec3e15b..d5d9e726 100644 --- a/gengo/src/lib.rs +++ b/gengo/src/lib.rs @@ -2,6 +2,7 @@ pub use builder::Builder; use documentation::Documentation; use generated::Generated; use git2::{AttrCheckFlags, AttrValue, Blob, Commit, ObjectType, Repository, Tree}; +use glob::MatchOptions; use indexmap::IndexMap; pub use languages::analyzer::Analyzers; use languages::Category; @@ -16,6 +17,13 @@ mod generated; pub mod languages; mod vendored; +/// Shared match options for consistent behavior. +const GLOB_MATCH_OPTIONS: MatchOptions = MatchOptions { + case_sensitive: true, + require_literal_separator: true, + require_literal_leading_dot: false, +}; + /// The main entry point for Gengo. pub struct Gengo { repository: Repository,