summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/git-undo-restore-autosave.rs16
-rw-r--r--src/lib.rs5
2 files changed, 21 insertions, 0 deletions
diff --git a/src/bin/git-undo-restore-autosave.rs b/src/bin/git-undo-restore-autosave.rs
new file mode 100644
index 0000000..c3d00df
--- /dev/null
+++ b/src/bin/git-undo-restore-autosave.rs
@@ -0,0 +1,16 @@
+use git2::{Repository, build::CheckoutBuilder};
+
+fn main() -> Result<(), anyhow::Error> {
+ let force = std::env::args().any(|arg| arg == "--force");
+
+ let repository = Repository::discover(".")?;
+ let tree = git_autosave::load_undo_tree(&repository)?;
+
+ let mut options = CheckoutBuilder::new();
+ if force {
+ options.force();
+ }
+ repository.checkout_tree(tree.as_object(), Some(&mut options))?;
+
+ Ok(())
+}
diff --git a/src/lib.rs b/src/lib.rs
index 91d82fc..2662948 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -256,3 +256,8 @@ pub fn saved_restored_autosave(
Ok(())
}
+
+pub fn load_undo_tree(repository: &Repository) -> Result<Tree<'_>, git2::Error> {
+ let reference = repository.find_reference(UNDO_RESTORE_REF)?;
+ reference.peel_to_tree()
+}