Skip to content

Commit

Permalink
Make discarding discard old file
Browse files Browse the repository at this point in the history
  • Loading branch information
Mifom committed Jan 8, 2022
1 parent 72c7926 commit 79a41ca
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 44 deletions.
2 changes: 1 addition & 1 deletion asyncgit/src/sync/merge.rs
Expand Up @@ -42,7 +42,7 @@ pub fn abort_pending_state(repo_path: &RepoPath) -> Result<()> {
let repo = repo(repo_path)?;

reset_stage(repo_path, "*")?;
reset_workdir(repo_path, "*")?;
reset_workdir(repo_path, None, "*")?;

repo.cleanup_state()?;

Expand Down
23 changes: 16 additions & 7 deletions asyncgit/src/sync/reset.rs
Expand Up @@ -22,7 +22,11 @@ pub fn reset_stage(repo_path: &RepoPath, path: &str) -> Result<()> {
}

///
pub fn reset_workdir(repo_path: &RepoPath, path: &str) -> Result<()> {
pub fn reset_workdir(
repo_path: &RepoPath,
old_path: Option<&str>,
new_path: &str,
) -> Result<()> {
scope_time!("reset_workdir");

let repo = repo(repo_path)?;
Expand All @@ -32,7 +36,11 @@ pub fn reset_workdir(repo_path: &RepoPath, path: &str) -> Result<()> {
.update_index(true) // windows: needs this to be true WTF?!
.remove_untracked(true)
.force()
.path(path);
.path(new_path);

if let Some(path) = old_path {
checkout_opts.path(path);
}

repo.checkout_index(None, Some(&mut checkout_opts))?;
Ok(())
Expand Down Expand Up @@ -121,7 +129,7 @@ mod tests {

assert_eq!(get_statuses(repo_path), (1, 1));

reset_workdir(repo_path, "bar.txt").unwrap();
reset_workdir(repo_path, None, "bar.txt").unwrap();

debug_cmd_print(repo_path, "git status");

Expand All @@ -147,7 +155,7 @@ mod tests {

assert_eq!(get_statuses(repo_path), (1, 0));

reset_workdir(repo_path, "foo/bar.txt").unwrap();
reset_workdir(repo_path, None, "foo/bar.txt").unwrap();

debug_cmd_print(repo_path, "git status");

Expand Down Expand Up @@ -193,7 +201,7 @@ mod tests {

assert_eq!(get_statuses(repo_path), (4, 1));

reset_workdir(repo_path, "foo").unwrap();
reset_workdir(repo_path, None, "foo").unwrap();

assert_eq!(get_statuses(repo_path), (1, 1));

Expand Down Expand Up @@ -233,7 +241,7 @@ mod tests {

assert_eq!(get_statuses(repo_path), (1, 1));

reset_workdir(repo_path, file).unwrap();
reset_workdir(repo_path, None, file).unwrap();

debug_cmd_print(repo_path, "git status");

Expand Down Expand Up @@ -285,6 +293,7 @@ mod tests {

reset_workdir(
&root.join("foo").as_os_str().to_str().unwrap().into(),
None,
"foo/bar.txt",
)
.unwrap();
Expand Down Expand Up @@ -313,7 +322,7 @@ mod tests {

assert_eq!(get_statuses(repo_path), (1, 0));

reset_workdir(repo_path, "foo/bar").unwrap();
reset_workdir(repo_path, None, "foo/bar").unwrap();

debug_cmd_print(repo_path, "git status");

Expand Down
57 changes: 26 additions & 31 deletions asyncgit/src/sync/status.rs
Expand Up @@ -197,13 +197,13 @@ pub fn get_status(

#[cfg(test)]
mod tests {
use git2::{Delta, StatusOptions};

use crate::{
error::Result,
sync::{
commit, stage_add_file, stage_addremoved,
tests::repo_init_empty, RepoPath,
status::{get_status, StatusItemType, StatusType},
tests::repo_init_empty,
RepoPath,
},
};
use std::{
Expand All @@ -215,7 +215,7 @@ mod tests {
#[test]
fn test_rename_file() -> Result<()> {
let bar = Path::new("bar");
let baz = Path::new("baz");
let foo = Path::new("foo");
let (_td, repo) = repo_init_empty()?;
let root = repo.path().parent().unwrap();
let repo_path: &RepoPath =
Expand All @@ -224,41 +224,36 @@ mod tests {
let mut file = File::create(&root.join(bar))?;
file.write_all(b"\x00")?;

let mut opts = StatusOptions::new();
opts.show(git2::StatusShow::Index)
.renames_index_to_workdir(true)
.renames_head_to_index(true);

let statuses = repo.statuses(Some(&mut opts))?;
for status in statuses.iter() {
let diff = status.index_to_workdir().unwrap();
assert_eq!(diff.status(), Delta::Added);
assert_eq!(diff.old_file().path(), None);
assert_eq!(diff.new_file().path(), Some(bar));
let statuses =
get_status(repo_path, StatusType::Stage, None).unwrap();
for diff in statuses.iter() {
assert_eq!(diff.status, StatusItemType::New);
assert_eq!(diff.old_path, Some("bar".to_string()));
assert_eq!(diff.new_path, "bar".to_string());
}

stage_add_file(repo_path, bar)?;
let _id = commit(repo_path, "")?;

fs::rename(&root.join(bar), &root.join(baz))?;
stage_add_file(repo_path, baz)?;
fs::rename(&root.join(bar), &root.join(foo))?;
stage_add_file(repo_path, foo)?;
stage_addremoved(repo_path, bar)?;
let statuses = repo.statuses(Some(&mut opts))?;
for status in statuses.iter() {
let diff = status.head_to_index().unwrap();
assert_eq!(diff.status(), Delta::Renamed);
assert_eq!(diff.old_file().path(), Some(bar));
assert_eq!(diff.new_file().path(), Some(baz));
let statuses =
get_status(repo_path, StatusType::Stage, None).unwrap();
for diff in statuses.iter() {
assert_eq!(diff.status, StatusItemType::Renamed);
assert_eq!(diff.old_path, Some("bar".to_string()));
assert_eq!(diff.new_path, "foo".to_string());
}

fs::remove_file(&root.join(baz))?;
stage_addremoved(repo_path, baz)?;
let statuses = repo.statuses(Some(&mut opts))?;
for status in statuses.iter() {
let diff = status.head_to_index().unwrap();
assert_eq!(diff.status(), Delta::Deleted);
assert_eq!(diff.old_file().path(), Some(bar));
assert_eq!(diff.new_file().path(), Some(bar));
fs::remove_file(&root.join(foo))?;
stage_addremoved(repo_path, foo)?;
let statuses =
get_status(repo_path, StatusType::Stage, None).unwrap();
for diff in statuses.iter() {
assert_eq!(diff.status, StatusItemType::Deleted);
assert_eq!(diff.old_path, Some("bar".to_string()));
assert_eq!(diff.new_path, "bar".to_string());
}
Ok(())
}
Expand Down
7 changes: 6 additions & 1 deletion src/components/changes.rs
Expand Up @@ -188,9 +188,14 @@ impl ChangesComponent {
if let Some(tree_item) = self.selection() {
let is_folder =
matches!(tree_item.kind, FileTreeItemKind::Path(_));
let old_path = match tree_item.kind {
FileTreeItemKind::Path(_) => None,
FileTreeItemKind::File(status) => status.old_path,
};
self.queue.push(InternalEvent::ConfirmAction(
Action::Reset(ResetItem {
path: tree_item.info.full_path,
old_path,
new_path: tree_item.info.full_path,
is_folder,
}),
));
Expand Down
3 changes: 2 additions & 1 deletion src/components/diff.rs
Expand Up @@ -595,7 +595,8 @@ impl DiffComponent {
fn reset_untracked(&self) {
self.queue.push(InternalEvent::ConfirmAction(Action::Reset(
ResetItem {
path: self.current.new_path.clone(),
old_path: self.current.old_path.clone(),
new_path: self.current.new_path.clone(),
is_folder: false,
},
)));
Expand Down
6 changes: 4 additions & 2 deletions src/queue.rs
Expand Up @@ -23,8 +23,10 @@ bitflags! {

/// data of item that is supposed to be reset
pub struct ResetItem {
/// path to the item (folder/file)
pub path: String,
/// old path to the item (folder/file)
pub old_path: Option<String>,
/// new path to the item (folder/file)
pub new_path: String,
/// are talking about a folder here? otherwise it's a single file
pub is_folder: bool,
}
Expand Down
3 changes: 2 additions & 1 deletion src/tabs/status.rs
Expand Up @@ -559,7 +559,8 @@ impl Status {
pub fn reset(&mut self, item: &ResetItem) -> bool {
if let Err(e) = sync::reset_workdir(
&self.repo.borrow(),
item.path.as_str(),
item.old_path.as_deref(),
item.new_path.as_str(),
) {
self.queue.push(InternalEvent::ShowErrorMsg(format!(
"reset failed:\n{}",
Expand Down

0 comments on commit 79a41ca

Please sign in to comment.