diff options
| author | Mica White <botahamec@outlook.com> | 2025-09-28 11:55:32 -0400 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2025-09-28 11:55:32 -0400 |
| commit | 10eea2dc8f8343742a1b7accf785a1e0d597047c (patch) | |
| tree | c71ff86468b69ddb505a4559564ed2ba92ee4c8d | |
| parent | eb0a3f7a022fa6dce2a43a5427262d54b2001e71 (diff) | |
Read/write objects
| -rw-r--r-- | Cargo.lock | 98 | ||||
| -rw-r--r-- | Cargo.toml | 4 | ||||
| -rw-r--r-- | src/lib.rs | 68 |
3 files changed, 152 insertions, 18 deletions
@@ -18,14 +18,52 @@ dependencies = [ ] [[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] name = "pj" version = "0.1.0" dependencies = [ "fast-glob", + "serde", + "serde_json", "walkdir", ] [[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -35,6 +73,66 @@ dependencies = [ ] [[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -5,4 +5,6 @@ edition = "2024" [dependencies] walkdir = "2" -fast-glob = "1"
\ No newline at end of file +fast-glob = "1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" @@ -6,13 +6,21 @@ use std::fs::{File, Metadata}; use std::path::{Path, PathBuf}; use std::time::Instant; +use serde::{Deserialize, Serialize}; + +mod object; mod workarea; +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] struct ContributorId(String); +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] struct ChannelId(String); +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] struct PatchId(String); +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] struct FileId(String); -struct SpanId(String); +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +struct SpanNodeId(String); struct Remote { url: String, @@ -35,34 +43,46 @@ struct Channel { patches: Vec<PatchId>, } +#[derive(Debug, Clone, Deserialize, Serialize)] struct Patch { id: PatchId, authors: Vec<ContributorId>, recorder: ContributorId, metadata: HashMap<String, String>, - added_spans: Vec<SpanId>, - deleted_spans: Vec<SpanId>, - added_files: Vec<FileId>, - deleted_files: Vec<FileId>, + affected_files: Vec<FileId>, + contents: String, } +#[derive(Debug, Clone, Deserialize, Serialize)] struct FileInfo { id: FileId, - inode: Option<u64>, - spans: Vec<SpanId>, + root_span: SpanNodeId, + name_changes: Vec<(PatchId, FilenameOperation)>, + spans: Vec<SpanNode>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +enum FilenameOperation { + Add { filename: PathBuf }, + Rename { filename: PathBuf }, + Delete, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct SpanNode { + id: SpanNodeId, + span: Span, added_by: Vec<PatchId>, - renamed_by: Vec<(PatchId, PathBuf)>, deleted_by: Vec<PatchId>, + preceding_nodes: Vec<SpanNodeId>, + successor_nodes: Vec<SpanNodeId>, } +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] struct Span { - id: SpanId, - file: FileId, - after: Vec<SpanId>, - before: Vec<SpanId>, - contents: Vec<u8>, - added_by: Vec<PatchId>, - deleted_by: Vec<PatchId>, + patch: PatchId, + start: usize, + len: usize, } type DiffAlgorithm = fn(File, File) -> Diff; @@ -84,6 +104,22 @@ enum LogEntry { type RevertAlgorithm = fn(Patch) -> Patch; +trait Id { + fn id(&self) -> &str; +} + +impl Id for Patch { + fn id(&self) -> &str { + &self.id.0 + } +} + +impl Id for FileInfo { + fn id(&self) -> &str { + &self.id.0 + } +} + trait StagingArea { fn list_files() -> std::io::Result<Metadata>; fn open_file(path: &Path) -> std::io::Result<File>; @@ -127,6 +163,4 @@ trait Repository { fn active_files(&self) -> Vec<FileId>; fn file(&self, id: FileId) -> Option<FileInfo>; fn write_file_from_patch(&self, id: FileId, patch: PatchId) -> Vec<u8>; - - fn span(&self, id: SpanId) -> Option<Span>; } |
