Add: add commits info for projects

This commit is contained in:
Kirill Samoylenkov 2025-11-28 20:50:26 +05:00
parent bc5eacf367
commit d8aa24600f
5 changed files with 1851 additions and 8 deletions

1791
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -4,10 +4,12 @@ version = "0.1.0"
edition = "2024"
[dependencies]
chrono = "0.4.42"
clap = { version = "4.5.53", features = ["derive"] }
crossterm = "0.29.0"
directories = "6.0.0"
fs_extra = "1.3.0"
gix = "0.75.0"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
thiserror = "2.0.17"

View file

@ -2,6 +2,7 @@ mod cli;
mod config;
mod core;
mod misc;
mod projects;
mod templates;
mod timer;
@ -10,6 +11,7 @@ use std::{fs, process};
use cli::{CLI, Commands, PomodoroAction, ProjectsAction, TemplateAction};
use config::{Config, load_config, save_config};
use projects::commits_info;
use templates::{list_templates, load_template};
use timer::run_timer;
@ -178,7 +180,18 @@ fn process_command(mut cfg: Config) {
eprintln!("Projects:");
for project in cfg.projects {
match project.file_name() {
Some(name) => eprintln!("{}", name.display()),
Some(name) => {
if let Ok(info) = commits_info(project.clone()) {
eprintln!(
"{}:\n\t{} commits\n\tlast update: {}",
name.display(),
info.cnt,
info.format_date()
);
} else {
eprintln!("{}: can't get info", name.display());
};
}
None => eprintln!(
"Error: project folder/file empty name '{}'",
project.display()

48
src/projects/info.rs Normal file
View file

@ -0,0 +1,48 @@
use chrono::{DateTime, Local, Utc};
use gix::discover;
use std::{
io::{Error, ErrorKind},
path::PathBuf,
};
pub struct CommitsInfo {
pub cnt: usize,
pub updated: DateTime<Local>,
}
impl CommitsInfo {
pub fn new(commits_cnt: usize, last_commit_seconds: i64) -> CommitsInfo {
CommitsInfo {
cnt: commits_cnt,
updated: from_seconds_to_local(last_commit_seconds),
}
}
pub fn format_date(&self) -> String {
format!("{}, {}", self.updated.date_naive(), self.updated.time()).to_string()
}
}
fn from_seconds_to_local(seconds: i64) -> DateTime<Local> {
let dt_utc: DateTime<Utc> = DateTime::from_timestamp(seconds, 0).expect("");
dt_utc.with_timezone(&Local)
}
pub fn commits_info(repository_path: PathBuf) -> Result<CommitsInfo, Error> {
let repository = match discover(repository_path) {
Ok(repo) => repo,
Err(err) => {
return Err(Error::new(ErrorKind::InvalidData, err));
}
};
let head_commit = repository.head_commit().unwrap();
let revwalk = repository.rev_walk([head_commit.id()]);
Ok(CommitsInfo::new(
revwalk.all().unwrap().count(),
head_commit.time().unwrap().seconds,
))
}

3
src/projects/mod.rs Normal file
View file

@ -0,0 +1,3 @@
mod info;
pub use info::commits_info;