Include version number when saving notes

This commit is contained in:
Joscha 2025-05-03 16:46:07 +02:00
parent e2436328b7
commit 65f555fcb3
2 changed files with 19 additions and 8 deletions

View file

@ -4,7 +4,7 @@ mod v1;
use std::path::Path; use std::path::Path;
use anyhow::{anyhow, bail}; use anyhow::{anyhow, bail};
use git2::{Commit, ErrorCode, Oid, Reference, Repository}; use git2::{Commit, ErrorCode, FileMode, Oid, Reference, Repository, TreeBuilder};
use jiff::Zoned; use jiff::Zoned;
pub use self::v1::{Note, Repo, VERSION}; pub use self::v1::{Note, Repo, VERSION};
@ -40,6 +40,12 @@ fn read_version(repository: &Repository, commit: &Commit<'_>) -> anyhow::Result<
Ok(version) 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<u32> { pub fn load_version(path: &Path) -> anyhow::Result<u32> {
let repository = Repository::open_bare(path)?; let repository = Repository::open_bare(path)?;
let Some(head) = read_head(&repository)? else { let Some(head) = read_head(&repository)? else {
@ -71,7 +77,10 @@ pub fn load(path: &Path) -> anyhow::Result<Repo> {
pub fn save(path: &Path, repo: Repo) -> anyhow::Result<Oid> { pub fn save(path: &Path, repo: Repo) -> anyhow::Result<Oid> {
let repository = Repository::open_bare(path)?; 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 signature = repository.signature()?;
let message = Zoned::now().to_string(); let message = Zoned::now().to_string();

View file

@ -79,10 +79,13 @@ impl Repo {
Ok(Self { notes }) Ok(Self { notes })
} }
pub fn save_to_tree(mut self, repository: &Repository) -> anyhow::Result<Tree<'_>> { pub fn save_to_tree(
mut self,
repository: &Repository,
tree: &mut TreeBuilder<'_>,
) -> anyhow::Result<()> {
self.notes.sort_unstable_by_key(|it| it.id); self.notes.sort_unstable_by_key(|it| it.id);
let mut root_tree = repository.treebuilder(None)?;
let mut year = 0; let mut year = 0;
let mut year_tree = repository.treebuilder(None)?; let mut year_tree = repository.treebuilder(None)?;
let mut month = 0; let mut month = 0;
@ -106,7 +109,7 @@ impl Repo {
} }
if year != time.year() { 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_tree.clear()?;
year = time.year(); 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 month_tree, &day_tree, format!("{day:02}"))?;
add_tree_to_tree(&mut year_tree, &month_tree, format!("{month: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(())
Ok(tree)
} }
pub fn migrate(self) -> Self { pub fn migrate(self) -> Self {