From b039908b9bf1b5cf7e9e066088ac3bc5a2cc29d8 Mon Sep 17 00:00:00 2001 From: Spenser Black Date: Fri, 18 Aug 2023 10:59:47 -0400 Subject: [PATCH 1/3] Add `.jsx` to JS, `.tsx` to TS (#61) --- gengo/languages.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gengo/languages.yaml b/gengo/languages.yaml index 6e07fba9..90bc1727 100644 --- a/gengo/languages.yaml +++ b/gengo/languages.yaml @@ -149,6 +149,7 @@ JavaScript: matchers: extensions: - js + - jsx interpreters: - node Makefile: @@ -264,6 +265,7 @@ TypeScript: matchers: extensions: - ts + - tsx interpreters: - deno Vue: From 3e6db371637ee08d67910fb6ca477f3e31b5a760 Mon Sep 17 00:00:00 2001 From: Spenser Black Date: Fri, 18 Aug 2023 11:09:05 -0400 Subject: [PATCH 2/3] Support CMake (#60) --- gengo/languages.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gengo/languages.yaml b/gengo/languages.yaml index 90bc1727..669aa002 100644 --- a/gengo/languages.yaml +++ b/gengo/languages.yaml @@ -72,6 +72,14 @@ Assembly: - cake - cs - csx +CMake: + category: programming + color: "#CCCCCC" + matchers: + extensions: + - cmake + filenames: + - CMakeLists.txt CSS: category: markup color: "#AA88AA" From f0fa463f2bb4fad2cdebc2920c12e81cb017cdb2 Mon Sep 17 00:00:00 2001 From: Spenser Black Date: Fri, 18 Aug 2023 11:36:27 -0400 Subject: [PATCH 3/3] Fix glob patterns matching path separators (#62) --- gengo/src/generated.rs | 7 +++++-- gengo/src/languages/matcher.rs | 9 ++++++++- gengo/src/lib.rs | 8 ++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) 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,