From b4f10c06ac70a4f40a75937a599a143ecd85f832 Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 5 Apr 2020 19:30:59 +0200 Subject: [PATCH] fix crash when unstaging file in empty repo --- asyncgit/src/sync/reset.rs | 44 +++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/asyncgit/src/sync/reset.rs b/asyncgit/src/sync/reset.rs index 96cba6b6..77f2791c 100644 --- a/asyncgit/src/sync/reset.rs +++ b/asyncgit/src/sync/reset.rs @@ -9,19 +9,20 @@ pub fn reset_stage(repo_path: &str, path: &Path) -> bool { let repo = repo(repo_path); - let reference = repo.head().unwrap(); - let obj = repo - .find_object( - reference.target().unwrap(), - Some(ObjectType::Commit), - ) - .unwrap(); + let head = repo.head(); - if repo.reset_default(Some(&obj), &[path]).is_ok() { - return true; + if let Ok(reference) = head { + let obj = repo + .find_object( + reference.target().unwrap(), + Some(ObjectType::Commit), + ) + .unwrap(); + + repo.reset_default(Some(&obj), &[path]).is_ok() + } else { + repo.reset_default(None, &[path]).is_ok() } - - false } /// @@ -60,10 +61,10 @@ pub fn reset_workdir(repo_path: &str, path: &Path) -> bool { #[cfg(test)] mod tests { - use super::reset_workdir; + use super::{reset_stage, reset_workdir}; use crate::sync::{ status::{get_status, StatusType}, - tests::{debug_cmd_print, repo_init}, + tests::{debug_cmd_print, repo_init, repo_init_empty}, utils::stage_add, }; use std::{ @@ -229,4 +230,21 @@ mod tests { ); assert_eq!(get_status(repo_path, StatusType::Stage).len(), 1); } + + #[test] + fn unstage_in_empty_repo() { + let file_path = Path::new("foo.txt"); + let (_td, repo) = repo_init_empty(); + let root = repo.path().parent().unwrap(); + let repo_path = root.as_os_str().to_str().unwrap(); + + File::create(&root.join(file_path)) + .unwrap() + .write_all(b"test\nfoo") + .unwrap(); + + assert_eq!(stage_add(repo_path, file_path), true); + + assert_eq!(reset_stage(repo_path, file_path), true); + } }