fix: better database rebuild

This commit is contained in:
2026-07-18 20:46:27 +02:00
parent 638202b96c
commit b438a99999
6 changed files with 694 additions and 64 deletions

View File

@@ -255,13 +255,7 @@ fn sync_project_from_file(
data_dir: &Path,
project_id: &str,
) -> EngineResult<()> {
let metadata = crate::engine::meta::read_project_json(data_dir)?;
let mut project = qproject::get_project_by_id(conn, project_id)?;
project.name = metadata.name;
project.description = metadata.description;
project.updated_at = crate::util::now_unix_ms();
qproject::update_project(conn, &project)?;
Ok(())
crate::engine::meta::sync_project_from_file(conn, data_dir, project_id)
}
fn rewrite_project_from_database(
@@ -865,7 +859,7 @@ fn detect_orphan_files(
"posts" => ext == "md",
"media" => ext == "meta",
"templates" => ext == "liquid",
"scripts" => ext == "lua" || ext == "py",
"scripts" => ext == "lua",
_ => false,
};
@@ -967,8 +961,8 @@ mod tests {
use crate::db::queries::template::insert_template;
use crate::engine::post::{create_post, publish_post};
use crate::model::{
Media, Post, PostStatus, Script, ScriptKind, ScriptStatus, Template, TemplateKind,
TemplateStatus,
Media, Post, PostStatus, ProjectMetadata, Script, ScriptKind, ScriptStatus, Template,
TemplateKind, TemplateStatus,
};
use crate::util::frontmatter::{
ScriptFrontmatter, TemplateFrontmatter, write_script_file, write_template_file,
@@ -1067,6 +1061,57 @@ mod tests {
assert_eq!(title_diffs[0].file_value, "Tampered Title");
}
#[test]
fn detects_missing_project_description() {
let (db, dir) = setup();
crate::engine::meta::write_project_json(
dir.path(),
&ProjectMetadata {
name: "Project p1".into(),
description: None,
public_url: None,
main_language: None,
default_author: None,
max_posts_per_page: 50,
image_import_concurrency: 4,
blogmark_category: None,
pico_theme: None,
semantic_similarity_enabled: false,
blog_languages: vec![],
},
)
.unwrap();
let report = compute_metadata_diff(db.conn(), dir.path(), "p1").unwrap();
let project = report
.diffs
.iter()
.find(|item| item.entity_type == "project")
.unwrap();
assert!(project.fields.iter().any(|field| {
field.field_name == "description"
&& field.db_value == "A test project"
&& field.file_value.is_empty()
}));
}
#[test]
fn ignores_python_scripts_during_orphan_scan() {
let (db, dir) = setup();
let scripts = dir.path().join("scripts");
fs::create_dir_all(&scripts).unwrap();
fs::write(scripts.join("legacy.py"), "print('legacy')").unwrap();
let report = compute_metadata_diff(db.conn(), dir.path(), "p1").unwrap();
assert!(
report
.orphans
.iter()
.all(|orphan| !orphan.file_path.ends_with(".py"))
);
}
#[test]
fn repairs_one_post_diff_from_file_to_database() {
let (db, dir) = setup();