diff --git a/gdn/src/repo.rs b/gdn/src/repo.rs index 733a1f3..bb3315e 100644 --- a/gdn/src/repo.rs +++ b/gdn/src/repo.rs @@ -4,7 +4,7 @@ mod v1; use std::path::Path; use anyhow::{anyhow, bail}; -use git2::{Commit, ErrorCode, Oid, Reference, Repository}; +use git2::{Commit, ErrorCode, FileMode, Oid, Reference, Repository, TreeBuilder}; use jiff::Zoned; pub use self::v1::{Note, Repo, VERSION}; @@ -40,6 +40,12 @@ fn read_version(repository: &Repository, commit: &Commit<'_>) -> anyhow::Result< Ok(version) } +fn write_version(repository: &Repository, tree: &mut TreeBuilder<'_>) -> anyhow::Result<()> { + let oid = repository.blob(VERSION.to_string().as_bytes())?; + tree.insert(VERSION_FILE, oid, FileMode::Blob.into())?; + Ok(()) +} + pub fn load_version(path: &Path) -> anyhow::Result { let repository = Repository::open_bare(path)?; let Some(head) = read_head(&repository)? else { @@ -71,7 +77,10 @@ pub fn load(path: &Path) -> anyhow::Result { pub fn save(path: &Path, repo: Repo) -> anyhow::Result { let repository = Repository::open_bare(path)?; - let tree = repo.save_to_tree(&repository)?; + let mut tree = repository.treebuilder(None)?; + write_version(&repository, &mut tree)?; + repo.save_to_tree(&repository, &mut tree)?; + let tree = repository.find_tree(tree.write()?)?; let signature = repository.signature()?; let message = Zoned::now().to_string(); diff --git a/gdn/src/repo/v1.rs b/gdn/src/repo/v1.rs index a5be619..73292b2 100644 --- a/gdn/src/repo/v1.rs +++ b/gdn/src/repo/v1.rs @@ -79,10 +79,13 @@ impl Repo { Ok(Self { notes }) } - pub fn save_to_tree(mut self, repository: &Repository) -> anyhow::Result> { + pub fn save_to_tree( + mut self, + repository: &Repository, + tree: &mut TreeBuilder<'_>, + ) -> anyhow::Result<()> { self.notes.sort_unstable_by_key(|it| it.id); - let mut root_tree = repository.treebuilder(None)?; let mut year = 0; let mut year_tree = repository.treebuilder(None)?; let mut month = 0; @@ -106,7 +109,7 @@ impl Repo { } if year != time.year() { - add_tree_to_tree(&mut root_tree, &year_tree, format!("{year:04}"))?; + add_tree_to_tree(tree, &year_tree, format!("{year:04}"))?; year_tree.clear()?; year = time.year(); } @@ -116,10 +119,9 @@ impl Repo { add_tree_to_tree(&mut month_tree, &day_tree, format!("{day:02}"))?; add_tree_to_tree(&mut year_tree, &month_tree, format!("{month:02}"))?; - add_tree_to_tree(&mut root_tree, &year_tree, format!("{year:04}"))?; + add_tree_to_tree(tree, &year_tree, format!("{year:04}"))?; - let tree = repository.find_tree(root_tree.write()?)?; - Ok(tree) + Ok(()) } pub fn migrate(self) -> Self {