Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions rust/plugin/src/file_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ impl FileContent {

// NOTE: Probably not appropriate to put here, should have this in BranchState
pub fn hydrate_content_at(file_entry: ObjId, doc: &Automerge, path: &String, heads: &Vec<ChangeHash>) -> Result<FileContent, Result<DocumentId, io::Error>> {
if let Ok(Some((_, _))) = doc.get_at(&file_entry, "deleted", &heads) {
return Ok(FileContent::Deleted);
}
let structured_content = doc
.get_at(&file_entry, "structured_content", heads)
.unwrap()
Expand All @@ -120,10 +123,6 @@ impl FileContent {
return Ok(FileContent::Scene(scene));
}

if let Ok(Some((_, _))) = doc.get_at(&file_entry, "deleted", &heads) {
return Ok(FileContent::Deleted);
}

// try to read file as text
let content = doc.get_at(&file_entry, "content", &heads);

Expand Down
71 changes: 60 additions & 11 deletions rust/plugin/src/godot_project_driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -919,6 +919,10 @@ impl DriverState {
change_type
});

if let Ok(Some((_, _))) = tx.get(&file_entry, "deleted") {
let _ = tx.delete(&file_entry, "deleted");
}

// delete url in file entry if it previously had one
if let Ok(Some((_, _))) = tx.get(&file_entry, "url") {
let _ = tx.delete(&file_entry, "url");
Expand All @@ -942,10 +946,25 @@ impl DriverState {
// write scene entries to doc
for (path, godot_scene) in scene_entries {
// get the change flag
let change_type = match tx.get(&files, &path) {
Ok(Some(_)) => ChangeType::Modified,
_ => ChangeType::Added
let (file_entry, change_type) = match tx.get(&files, &path) {
Ok(Some((automerge::Value::Object(ObjType::Map), file_entry))) => (file_entry, ChangeType::Modified),
_ => (tx.put_object(&files, &path, ObjType::Map).unwrap(), ChangeType::Added)
};

if let Ok(Some((_, _))) = tx.get(&file_entry, "deleted") {
let _ = tx.delete(&file_entry, "deleted");
}

// delete content in file entry if it previously had one
if let Ok(Some((_, _))) = tx.get(&file_entry, "content") {
let _ = tx.delete(&file_entry, "content");
}

// delete url in file entry if it previously had one
if let Ok(Some((_, _))) = tx.get(&file_entry, "url") {
let _ = tx.delete(&file_entry, "url");
}

godot_scene.reconcile(&mut tx, path.clone());
changes.push(ChangedFile {
path,
Expand All @@ -956,14 +975,27 @@ impl DriverState {
// write binary entries to doc
for (path, binary_doc_handle) in binary_entries {
// get the change flag
let change_type = match tx.get(&files, &path) {
Ok(Some(_)) => ChangeType::Modified,
_ => ChangeType::Added
let (file_entry, change_type) = match tx.get(&files, &path) {
Ok(Some((automerge::Value::Object(ObjType::Map), file_entry))) => (file_entry, ChangeType::Modified),
_ => (tx.put_object(&files, &path, ObjType::Map).unwrap(), ChangeType::Added)
};

let file_entry = tx.put_object(&files, &path, ObjType::Map);
if let Ok(Some((_, _))) = tx.get(&file_entry, "deleted") {
let _ = tx.delete(&file_entry, "deleted");
}

// delete structured content in file entry if it previously had one
if let Ok(Some((_, _))) = tx.get(&file_entry, "structured_content") {
let _ = tx.delete(&file_entry, "structured_content");
}

// delete content in file entry if it previously had one
if let Ok(Some((_, _))) = tx.get(&file_entry, "content") {
let _ = tx.delete(&file_entry, "content");
}

let _ = tx.put(
file_entry.unwrap(),
file_entry,
"url",
format!("automerge:{}", &binary_doc_handle.document_id()),
);
Expand All @@ -975,11 +1007,28 @@ impl DriverState {
}

for path in deleted_entries {
let _ = tx.delete(&files, &path);
changes.push(ChangedFile {
path,
changes.push(ChangedFile {
path: path.clone(),
change_type: ChangeType::Removed
});
let file_entry = match tx.get(&files, &path) {
Ok(Some((automerge::Value::Object(ObjType::Map), file_entry))) => file_entry,
_ => {
continue;
}
};

// do NOT delete the url if it previously had one, we need it to know which linked docs to retrieved
// delete structured content in file entry if it previously had one
if let Ok(Some((_, _))) = tx.get(&file_entry, "structured_content") {
let _ = tx.delete(&file_entry, "structured_content");
}

if let Ok(Some((_, _))) = tx.get(&file_entry, "content") {
let _ = tx.delete(&file_entry, "content");
}

let _ = tx.put(&file_entry, "deleted", true);
}

commit_with_attribution_and_timestamp(
Expand Down