Skip to content

Commit a611fe4

Browse files
authored
Merge pull request #448 from o2sh/feature/ignore-bot-commits
ignore bots in commits
2 parents 0ede2b6 + eb526b2 commit a611fe4

File tree

3 files changed

+48
-6
lines changed

3 files changed

+48
-6
lines changed

Diff for: src/onefetch/cli.rs

+24
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use {
99
},
1010
clap::{crate_description, crate_name, crate_version, App, AppSettings, Arg},
1111
image::DynamicImage,
12+
regex::Regex,
1213
std::{convert::From, env, str::FromStr},
1314
strum::IntoEnumIterator,
1415
term_size,
@@ -30,6 +31,7 @@ pub struct Cli {
3031
pub no_color_palette: bool,
3132
pub number_of_authors: usize,
3233
pub excluded: Vec<String>,
34+
pub bot_regex_pattern: Option<Regex>,
3335
pub print_languages: bool,
3436
pub print_package_managers: bool,
3537
pub output: Option<SerializationFormat>,
@@ -208,6 +210,21 @@ impl Cli {
208210
.long("no-merges")
209211
.help("Ignores merge commits."),
210212
)
213+
.arg(
214+
Arg::with_name("no-bots")
215+
.long("no-bots")
216+
.min_values(0)
217+
.max_values(1)
218+
.value_name("REGEX")
219+
.help("Exclude [bot] commits. Use <REGEX> to override the default pattern.")
220+
.validator(|p| {
221+
if Regex::from_str(&p).is_err() {
222+
return Err(String::from("must be a valid regex pattern"));
223+
} else {
224+
Ok(())
225+
}
226+
}),
227+
)
211228
.arg(
212229
Arg::with_name("isotime")
213230
.short("z")
@@ -349,6 +366,12 @@ impl Cli {
349366
Vec::new()
350367
};
351368

369+
let bot_regex_pattern = matches.is_present("no-bots").then(|| {
370+
matches
371+
.value_of("no-bots")
372+
.map_or(Regex::from_str(r"\[bot\]").unwrap(), |s| Regex::from_str(s).unwrap())
373+
});
374+
352375
Ok(Cli {
353376
repo_path,
354377
ascii_input,
@@ -363,6 +386,7 @@ impl Cli {
363386
no_color_palette,
364387
number_of_authors,
365388
excluded,
389+
bot_regex_pattern,
366390
print_languages,
367391
print_package_managers,
368392
output,

Diff for: src/onefetch/info.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ impl Info {
211211
pub fn new(config: Cli) -> Result<Info> {
212212
let git_version = cli_utils::get_git_version();
213213
let repo = Repository::discover(&config.repo_path)?;
214-
let internal_repo = Repo::new(&repo, config.no_merges)?;
214+
let internal_repo = Repo::new(&repo, config.no_merges, &config.bot_regex_pattern)?;
215215
let (repo_name, repo_url) = internal_repo.get_name_and_url()?;
216216
let head_refs = internal_repo.get_head_refs()?;
217217
let pending_changes = internal_repo.get_pending_changes()?;

Diff for: src/onefetch/repo.rs

+23-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::onefetch::{commit_info::CommitInfo, error::*, utils};
22
use git2::{
3-
BranchType, Commit, Repository, RepositoryOpenFlags, Status, StatusOptions, StatusShow,
3+
BranchType, Commit, Repository, RepositoryOpenFlags, Signature, Status, StatusOptions,
4+
StatusShow,
45
};
56
use regex::Regex;
67
use std::path::Path;
@@ -11,12 +12,20 @@ pub struct Repo<'a> {
1112
}
1213

1314
impl<'a> Repo<'a> {
14-
pub fn new(repo: &'a Repository, no_merges: bool) -> Result<Self> {
15-
let logs = Repo::get_logs(repo, no_merges)?;
15+
pub fn new(
16+
repo: &'a Repository,
17+
no_merges: bool,
18+
bot_regex_pattern: &Option<Regex>,
19+
) -> Result<Self> {
20+
let logs = Repo::get_logs(repo, no_merges, bot_regex_pattern)?;
1621
Ok(Self { repo, logs })
1722
}
1823

19-
fn get_logs(repo: &'a Repository, no_merges: bool) -> Result<Vec<Commit<'a>>> {
24+
fn get_logs(
25+
repo: &'a Repository,
26+
no_merges: bool,
27+
bot_regex_pattern: &Option<Regex>,
28+
) -> Result<Vec<Commit<'a>>> {
2029
let mut revwalk = repo.revwalk()?;
2130
revwalk.push_head()?;
2231
let logs: Vec<Commit<'a>> = revwalk
@@ -25,7 +34,11 @@ impl<'a> Repo<'a> {
2534
Ok(r) => repo
2635
.find_commit(r)
2736
.ok()
28-
.filter(|commit| !(no_merges && commit.parents().len() > 1)),
37+
.filter(|commit| !(no_merges && commit.parents().len() > 1))
38+
.filter(|commit| {
39+
!(bot_regex_pattern.is_some()
40+
&& is_bot(commit.author(), &bot_regex_pattern))
41+
}),
2942
})
3043
.collect();
3144

@@ -269,3 +282,8 @@ pub fn is_valid(repo_path: &str) -> Result<bool> {
269282
let repo = Repository::open_ext(repo_path, RepositoryOpenFlags::empty(), Vec::<&Path>::new());
270283
Ok(repo.is_ok() && !repo?.is_bare())
271284
}
285+
286+
pub fn is_bot(author: Signature, bot_regex_pattern: &Option<Regex>) -> bool {
287+
let author_name = String::from_utf8_lossy(author.name_bytes()).into_owned();
288+
bot_regex_pattern.as_ref().unwrap().is_match(&author_name)
289+
}

0 commit comments

Comments
 (0)