39d7e6b
use models::repo::repos;
use sea_orm::{ActiveModelTrait, DatabaseTransaction, EntityTrait, IntoActiveModel, Set};
use crate::service::repos::{count_commits, dir_size};
use crate::sync::error::{SyncError, SyncResult};
pub async fn sync_repo_stats(
txn: &DatabaseTransaction,
repo: &repos::Model,
repo_dir: &std::path::Path,
new_commits: usize,
branch_count: usize,
tag_count: usize,
command_timeout_secs: u64,
) -> SyncResult<()> {
let git_size = dir_size(repo_dir)
.await
.map_err(|e| SyncError::Internal(format!("dir_size: {e}")))? as i64;
let total_commits = count_commits(repo_dir, command_timeout_secs)
.await
.map_err(|e| SyncError::Internal(format!("count_commits: {e}")))?
as i32;
let fresh = repos::Entity::find_by_id(repo.id)
.one(txn)
.await
.map_err(SyncError::Db)?
.ok_or_else(|| SyncError::NotFound(format!("repo {}", repo.id)))?;
let now = time::OffsetDateTime::now_utc();
let mut am = fresh.clone().into_active_model();
am.git_size = Set(git_size);
am.nums_commits = Set(total_commits);
am.nums_branches = Set(branch_count as i32);
am.nums_tags = Set(tag_count as i32);
if new_commits > 0 {
am.last_pushed_at = Set(Some(now));
}
am.updated_at = Set(now);
am.update(txn).await.map_err(SyncError::Db)?;
tracing::debug!(
repo_id = %repo.id,
git_size,
total_commits,
branches = branch_count,
tags = tag_count,
new_commits,
"repo stats updated"
);
Ok(())
}