summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock98
-rw-r--r--Cargo.toml4
-rw-r--r--src/lib.rs68
3 files changed, 152 insertions, 18 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c537729..228f238 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 1b4b7ce..ab2500a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/src/lib.rs b/src/lib.rs
index 7f6b86f..b7994d3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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>;
}