use chrono::{DateTime, TimeZone, Utc};
use git2::Repository;
use crate::error::Result;
#[derive(Debug, Clone)]
pub struct CommitInfo {
pub id: String,
pub short_id: String,
pub summary: String,
pub author: String,
pub time: DateTime<Utc>,
}
pub fn get_recent_commits(
repo: &Repository,
offset: usize,
limit: usize,
) -> Result<Vec<CommitInfo>> {
let mut revwalk = repo.revwalk()?;
revwalk.push_head()?;
let mut commits = Vec::new();
for oid in revwalk.skip(offset).take(limit) {
let oid = oid?;
let commit = repo.find_commit(oid)?;
let id = oid.to_string();
let short_id = id[..7.min(id.len())].to_string();
let summary = commit.summary().unwrap_or("(no message)").to_string();
let author = commit.author().name().unwrap_or("Unknown").to_string();
let time = Utc
.timestamp_opt(commit.time().seconds(), 0)
.single()
.unwrap_or_else(Utc::now);
commits.push(CommitInfo {
id,
short_id,
summary,
author,
time,
});
}
Ok(commits)
}