feat: finish rust web dual pane document shell
This commit is contained in:
@@ -2655,6 +2655,15 @@ fn local_markdown_conflict_detection_key(
|
||||
document_id: &str,
|
||||
markdown_path: &Path,
|
||||
) -> Result<String, WebError> {
|
||||
let content = fs::read(markdown_path).map_err(|error| {
|
||||
WebError::bad_request_code(
|
||||
"local_markdown_read_failed",
|
||||
format!(
|
||||
"无法读取本地 Markdown 文件 {}: {error}",
|
||||
markdown_path.display()
|
||||
),
|
||||
)
|
||||
})?;
|
||||
let meta = fs::metadata(markdown_path).map_err(|error| {
|
||||
WebError::bad_request_code(
|
||||
"local_markdown_stat_failed",
|
||||
@@ -2665,8 +2674,11 @@ fn local_markdown_conflict_detection_key(
|
||||
)
|
||||
})?;
|
||||
let modified_ms = system_time_ms(meta.modified().unwrap_or(SystemTime::UNIX_EPOCH));
|
||||
let mut hasher = DefaultHasher::new();
|
||||
content.hash(&mut hasher);
|
||||
let content_hash = hasher.finish();
|
||||
Ok(format!(
|
||||
"local-md:{document_id}:{modified_ms}:{}",
|
||||
"local-md:{document_id}:{modified_ms}:{}:{content_hash:016x}",
|
||||
meta.len()
|
||||
))
|
||||
}
|
||||
@@ -2965,6 +2977,25 @@ mod tests {
|
||||
let _ = std::fs::remove_dir_all(&root);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn local_markdown_conflict_detection_key_changes_when_content_changes_with_same_size() {
|
||||
let root = temp_root("mnote-local-conflict-key-content");
|
||||
let file = root.join("README.md");
|
||||
std::fs::write(&file, "aaaa\n").expect("write first content");
|
||||
|
||||
let first = super::local_markdown_conflict_detection_key("local-md:README.md", &file)
|
||||
.expect("first conflict key");
|
||||
|
||||
std::fs::write(&file, "bbbb\n").expect("write second content");
|
||||
|
||||
let second = super::local_markdown_conflict_detection_key("local-md:README.md", &file)
|
||||
.expect("second conflict key");
|
||||
|
||||
assert_ne!(first, second);
|
||||
|
||||
let _ = std::fs::remove_dir_all(&root);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn local_markdown_parser_covers_basic_blocks_and_attachment_refs() {
|
||||
let blocks = crate::routes::local_markdown_parser::markdown_to_blocks(
|
||||
|
||||
Reference in New Issue
Block a user