From 8ba348a93ee1b06dfbba111db6107211b2fbd0a1 Mon Sep 17 00:00:00 2001 From: Lumither Tao Date: Thu, 10 Apr 2025 21:51:12 -0700 Subject: [PATCH] fix(blog::components::check_update) handle local-remote git url mismatch --- .../blog/components/check_update/pull.rs | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/backend/server/src/modules/blog/components/check_update/pull.rs b/backend/server/src/modules/blog/components/check_update/pull.rs index b2c2224..9cff696 100644 --- a/backend/server/src/modules/blog/components/check_update/pull.rs +++ b/backend/server/src/modules/blog/components/check_update/pull.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, path::PathBuf}; +use std::{collections::HashMap, fs::remove_dir_all, path::PathBuf}; use crate::{ modules::blog::components::check_update::{ @@ -10,7 +10,7 @@ use crate::{ use markdown::MdFile; use git2::{Delta, Repository}; -use tracing::error; +use tracing::{error, warn}; use uuid::Uuid; pub async fn fetch_deltas( @@ -30,7 +30,27 @@ pub async fn fetch_deltas( }, }; - let mut remote = repo.find_remote(git_remote_name)?; + let mut remote = match repo.find_remote(git_remote_name) { + Ok(remote) => remote, + Err(e) => { + remove_dir_all(git_work_dir).unwrap(); + warn!( + "cannot find git remote ({}), reinitializing: {}", + git_remote_name, e + ); + return Err(e.into()); + } + }; + if remote.url().is_some_and(|url| url != git_url) { + remove_dir_all(git_work_dir).unwrap(); + warn!( + "git remote url mismatch (expected: {}, actual: {}), reinitializing", + git_url, + remote.url().unwrap() + ); + return Err(Error::GitUrlMismatch); + } + let fetched_commit = git::do_fetch(&repo, &[git_remote_branch], &mut remote)?; let commit_deltas = git::calculate_diff( &repo, @@ -44,6 +64,8 @@ pub async fn fetch_deltas( // process deleted deltas before merging commit to prevent "file not found" os error for delta in commit_deltas.into_iter() { + // todo: limit scanning scope to post only OR extract merging logic to external component + if delta.status == Delta::Deleted { let file_path = &git_work_dir.join( delta @@ -115,10 +137,7 @@ pub async fn fetch_deltas( fn extract_post_id(post: &MdFile) -> Option { match post.meta["uuid"].as_str() { - Some(id) => match Uuid::parse_str(id) { - Ok(id) => Some(id), - Err(_) => None, - }, + Some(id) => Uuid::parse_str(id).ok(), None => None, } }