use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CommitInfo {
pub hash: String,
pub short_hash: String,
pub author: String,
pub author_email: String,
pub date: DateTime<Utc>,
pub message: String,
pub full_message: String,
pub affected_packages: Vec<String>,
pub files_changed: usize,
pub lines_added: usize,
pub lines_deleted: usize,
}
impl CommitInfo {
#[must_use]
pub fn new(
hash: String,
author: String,
author_email: String,
date: DateTime<Utc>,
message: String,
) -> Self {
let short_hash = if hash.len() >= 7 { hash[..7].to_string() } else { hash.clone() };
Self {
hash,
short_hash,
author,
author_email,
date,
full_message: message.clone(),
message: message.lines().next().unwrap_or("").to_string(),
affected_packages: Vec::new(),
files_changed: 0,
lines_added: 0,
lines_deleted: 0,
}
}
#[must_use]
pub fn from_git_commit(
commit: &sublime_git_tools::RepoCommit,
affected_packages: Vec<String>,
) -> Self {
let short_hash =
if commit.hash.len() >= 7 { commit.hash[..7].to_string() } else { commit.hash.clone() };
let date = chrono::DateTime::parse_from_rfc2822(&commit.author_date)
.map(|dt| dt.with_timezone(&Utc))
.unwrap_or_else(|_| {
chrono::DateTime::parse_from_rfc3339(&commit.author_date)
.map(|dt| dt.with_timezone(&Utc))
.unwrap_or_else(|_| Utc::now())
});
let message = commit.message.lines().next().unwrap_or("").to_string();
Self {
hash: commit.hash.clone(),
short_hash,
author: commit.author_name.clone(),
author_email: commit.author_email.clone(),
date,
message,
full_message: commit.message.clone(),
affected_packages,
files_changed: 0,
lines_added: 0,
lines_deleted: 0,
}
}
#[must_use]
pub fn is_merge_commit(&self) -> bool {
self.message.starts_with("Merge ")
|| self.message.starts_with("Merge pull request")
|| self.message.starts_with("Merge branch")
}
#[must_use]
pub fn affects_package(&self, package_name: &str) -> bool {
self.affected_packages.iter().any(|p| p == package_name)
}
#[must_use]
pub fn net_lines_changed(&self) -> i64 {
self.lines_added as i64 - self.lines_deleted as i64
}
#[must_use]
pub fn total_lines_changed(&self) -> usize {
self.lines_added + self.lines_deleted
}
}