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(()) }