|
@@ -2,7 +2,7 @@ use async_std::sync::{Arc, Mutex};
|
|
|
use std::{
|
|
use std::{
|
|
|
fs::{create_dir_all, read_dir},
|
|
fs::{create_dir_all, read_dir},
|
|
|
mem::discriminant,
|
|
mem::discriminant,
|
|
|
- path::PathBuf,
|
|
|
|
|
|
|
+ path::{Path, PathBuf},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
use async_executor::Executor;
|
|
use async_executor::Executor;
|
|
@@ -25,6 +25,7 @@ use darkfi::{
|
|
|
cli::{get_log_config, get_log_level, spawn_config},
|
|
cli::{get_log_config, get_log_level, spawn_config},
|
|
|
expand_path,
|
|
expand_path,
|
|
|
file::{load_file, load_json_file, save_file, save_json_file},
|
|
file::{load_file, load_json_file, save_file, save_json_file},
|
|
|
|
|
+ gen_id,
|
|
|
path::get_config_path,
|
|
path::get_config_path,
|
|
|
},
|
|
},
|
|
|
Error, Result,
|
|
Error, Result,
|
|
@@ -34,7 +35,7 @@ mod error;
|
|
|
mod jsonrpc;
|
|
mod jsonrpc;
|
|
|
mod patch;
|
|
mod patch;
|
|
|
|
|
|
|
|
-use error::DarkWikiResult;
|
|
|
|
|
|
|
+use error::{DarkWikiError, DarkWikiResult};
|
|
|
use jsonrpc::JsonRpcInterface;
|
|
use jsonrpc::JsonRpcInterface;
|
|
|
use patch::{OpMethod, Patch};
|
|
use patch::{OpMethod, Patch};
|
|
|
|
|
|
|
@@ -78,6 +79,29 @@ fn str_to_chars(s: &str) -> Vec<&str> {
|
|
|
s.graphemes(true).collect::<Vec<&str>>()
|
|
s.graphemes(true).collect::<Vec<&str>>()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+fn get_from_index(local_path: &Path, title: &str) -> DarkWikiResult<String> {
|
|
|
|
|
+ let index = load_json_file::<FxHashMap<String, String>>(&local_path.join("index"))?;
|
|
|
|
|
+
|
|
|
|
|
+ for (i, t) in index {
|
|
|
|
|
+ if t == title {
|
|
|
|
|
+ return Ok(i)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Err(DarkWikiError::FileNotFound)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+fn save_to_index(local_path: &Path, id: &str, title: &str) -> DarkWikiResult<()> {
|
|
|
|
|
+ let mut index = load_json_file::<FxHashMap<String, String>>(&local_path.join("index"))?;
|
|
|
|
|
+ index.insert(id.to_owned(), title.to_owned());
|
|
|
|
|
+ save_json_file(&local_path.join("index"), &index)?;
|
|
|
|
|
+ Ok(())
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+fn extract_title(content: &str) -> String {
|
|
|
|
|
+ str_to_chars(content).into_iter().skip_while(|&c| c == "#").take_while(|&c| c == "\n").collect()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
fn lcs(a: &str, b: &str) -> Vec<OpMethod> {
|
|
fn lcs(a: &str, b: &str) -> Vec<OpMethod> {
|
|
|
let a: Vec<_> = str_to_chars(a);
|
|
let a: Vec<_> = str_to_chars(a);
|
|
|
let b: Vec<_> = str_to_chars(b);
|
|
let b: Vec<_> = str_to_chars(b);
|
|
@@ -146,15 +170,25 @@ fn on_receive_update(settings: &DarkWikiSettings) -> DarkWikiResult<Vec<Patch>>
|
|
|
// then merged with sync patches if any received
|
|
// then merged with sync patches if any received
|
|
|
let docs = read_dir(&docs_path).map_err(Error::from)?;
|
|
let docs = read_dir(&docs_path).map_err(Error::from)?;
|
|
|
for doc in docs {
|
|
for doc in docs {
|
|
|
- let doc_id = doc.as_ref().unwrap().file_name();
|
|
|
|
|
- let doc_path = docs_path.join(&doc_id);
|
|
|
|
|
|
|
+ let doc_title = doc.as_ref().unwrap().file_name();
|
|
|
|
|
+ let doc_title = doc_title.to_str().unwrap();
|
|
|
|
|
+
|
|
|
|
|
+ let doc_id = match get_from_index(&local_path, doc_title) {
|
|
|
|
|
+ Ok(id) => id,
|
|
|
|
|
+ Err(_) => {
|
|
|
|
|
+ let id = gen_id(30);
|
|
|
|
|
+ save_to_index(&local_path, &id, doc_title)?;
|
|
|
|
|
+ id
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
// load doc content
|
|
// load doc content
|
|
|
- let edit = load_file(&doc_path).map_err(Error::from)?;
|
|
|
|
|
|
|
+ // TODO
|
|
|
|
|
+ let edit = load_file(&docs_path.join(doc_title)).map_err(Error::from)?;
|
|
|
let edit = edit.trim();
|
|
let edit = edit.trim();
|
|
|
|
|
|
|
|
// create new patch
|
|
// create new patch
|
|
|
- let mut new_patch = Patch::new(doc_id.to_str().unwrap(), &settings.author);
|
|
|
|
|
|
|
+ let mut new_patch = Patch::new(&doc_id, &settings.author);
|
|
|
|
|
|
|
|
// check for any changes found with local doc and darkwiki doc
|
|
// check for any changes found with local doc and darkwiki doc
|
|
|
if let Ok(local_edit) = load_file(&local_path.join(&doc_id)) {
|
|
if let Ok(local_edit) = load_file(&local_path.join(&doc_id)) {
|
|
@@ -183,7 +217,7 @@ fn on_receive_update(settings: &DarkWikiSettings) -> DarkWikiResult<Vec<Patch>>
|
|
|
if sync_patch.to_string() != local_edit {
|
|
if sync_patch.to_string() != local_edit {
|
|
|
let sync_patch_t = new_patch.transform(&sync_patch);
|
|
let sync_patch_t = new_patch.transform(&sync_patch);
|
|
|
new_patch = new_patch.merge(&sync_patch_t);
|
|
new_patch = new_patch.merge(&sync_patch_t);
|
|
|
- save_file(&doc_path, &new_patch.to_string())?;
|
|
|
|
|
|
|
+ save_file(&docs_path.join(doc_title), &new_patch.to_string())?;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
@@ -200,6 +234,7 @@ fn on_receive_update(settings: &DarkWikiSettings) -> DarkWikiResult<Vec<Patch>>
|
|
|
let sync_files = read_dir(&sync_path).map_err(Error::from)?;
|
|
let sync_files = read_dir(&sync_path).map_err(Error::from)?;
|
|
|
for file in sync_files {
|
|
for file in sync_files {
|
|
|
let file_id = file.as_ref().unwrap().file_name();
|
|
let file_id = file.as_ref().unwrap().file_name();
|
|
|
|
|
+ let file_id = file_id.to_str().unwrap();
|
|
|
let file_path = sync_path.join(&file_id);
|
|
let file_path = sync_path.join(&file_id);
|
|
|
let sync_patch: Patch = load_json_file(&file_path)?;
|
|
let sync_patch: Patch = load_json_file(&file_path)?;
|
|
|
|
|
|
|
@@ -209,8 +244,12 @@ fn on_receive_update(settings: &DarkWikiSettings) -> DarkWikiResult<Vec<Patch>>
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- save_file(&docs_path.join(&file_id), &sync_patch.to_string())?;
|
|
|
|
|
- save_file(&local_path.join(file_id), &sync_patch.to_string())?;
|
|
|
|
|
|
|
+ let sync_patch_str = sync_patch.to_string();
|
|
|
|
|
+ let file_title = extract_title(&sync_patch_str);
|
|
|
|
|
+ save_to_index(&local_path, file_id, &file_title)?;
|
|
|
|
|
+
|
|
|
|
|
+ save_file(&docs_path.join(&file_title), &sync_patch_str)?;
|
|
|
|
|
+ save_file(&local_path.join(file_id), &sync_patch_str)?;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Ok(patches)
|
|
Ok(patches)
|