feat(add): prevent adding a file without changes
This commit is contained in:
parent
939b6f2fe3
commit
980d2d9a5d
@ -42,7 +42,10 @@ pub fn add(args: AddArgs) {
|
|||||||
let path = repo_root().join(Path::new(&f));
|
let path = repo_root().join(Path::new(&f));
|
||||||
match path.exists() {
|
match path.exists() {
|
||||||
true => {
|
true => {
|
||||||
add_entry(path, args.force, &mut added_files, rules.clone(), &mut ignored_f);
|
let mut obj = Obj::from_path(f.clone());
|
||||||
|
if obj.has_changes() {
|
||||||
|
add_entry(path, args.force, &mut added_files, rules.clone(), &mut ignored_f);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
false => {
|
false => {
|
||||||
if Obj::from_path(file.clone()).exists_on_remote() {
|
if Obj::from_path(file.clone()).exists_on_remote() {
|
||||||
|
@ -32,6 +32,7 @@ pub trait ObjMethods {
|
|||||||
fn rm_node(&mut self) -> io::Result<()>;
|
fn rm_node(&mut self) -> io::Result<()>;
|
||||||
fn rm_node_down(&mut self) -> io::Result<()>;
|
fn rm_node_down(&mut self) -> io::Result<()>;
|
||||||
fn exists_on_remote(&mut self) -> bool;
|
fn exists_on_remote(&mut self) -> bool;
|
||||||
|
fn has_changes(&mut self) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Obj {
|
pub struct Obj {
|
||||||
@ -133,6 +134,20 @@ impl ObjMethods for Obj {
|
|||||||
fn exists_on_remote(&mut self) -> bool {
|
fn exists_on_remote(&mut self) -> bool {
|
||||||
self.obj_path.exists()
|
self.obj_path.exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_changes(&mut self) -> bool {
|
||||||
|
if !self.obj_path.exists() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
match self.obj_type {
|
||||||
|
ObjType::BLOB => Blob::from_path(self.relative_file_path.clone()).has_changes(),
|
||||||
|
ObjType::TREE => Tree::from_path(self.relative_file_path.clone()).has_changes(),
|
||||||
|
ObjType::DEFAULT => {
|
||||||
|
unreachable!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ObjMethods for Blob {
|
impl ObjMethods for Blob {
|
||||||
@ -200,6 +215,10 @@ impl ObjMethods for Blob {
|
|||||||
fn exists_on_remote(&mut self) -> bool {
|
fn exists_on_remote(&mut self) -> bool {
|
||||||
self.obj.exists_on_remote()
|
self.obj.exists_on_remote()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_changes(&mut self) -> bool {
|
||||||
|
self.obj.has_changes()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ObjMethods for Tree {
|
impl ObjMethods for Tree {
|
||||||
@ -277,6 +296,10 @@ impl ObjMethods for Tree {
|
|||||||
fn exists_on_remote(&mut self) -> bool {
|
fn exists_on_remote(&mut self) -> bool {
|
||||||
self.obj.exists_on_remote()
|
self.obj.exists_on_remote()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_changes(&mut self) -> bool {
|
||||||
|
self.obj.has_changes()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Obj {
|
impl Obj {
|
||||||
|
@ -11,6 +11,7 @@ pub struct Tree {
|
|||||||
is_head: bool,
|
is_head: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Tree {
|
impl Tree {
|
||||||
pub fn new(obj: Obj) -> Self {
|
pub fn new(obj: Obj) -> Self {
|
||||||
Tree {
|
Tree {
|
||||||
@ -50,6 +51,11 @@ impl Tree {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn has_changes(&mut self) -> bool {
|
||||||
|
todo!();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn next(&mut self) -> Option<Box<dyn ObjMethods>> {
|
pub fn next(&mut self) -> Option<Box<dyn ObjMethods>> {
|
||||||
self.read();
|
self.read();
|
||||||
//if let Some(ref mut file) = self.buf_reader {
|
//if let Some(ref mut file) = self.buf_reader {
|
||||||
|
26
tests/add.rs
26
tests/add.rs
@ -40,6 +40,8 @@ fn collect_status_lines(client: &mut ClientTest) -> Vec<String> {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod add_tests {
|
mod add_tests {
|
||||||
|
use crate::utils::{server::ServerTest, status_utils::status_should_be_empty};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -95,14 +97,24 @@ mod add_tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add_no_change() {
|
fn add_file_no_changes() {
|
||||||
assert!(false);
|
|
||||||
// add a file push it and add it again
|
// add a file push it and add it again
|
||||||
// let id = get_random_test_id();
|
let id = get_random_test_id();
|
||||||
// let mut client = ClientTest::new(id).init();
|
let mut server = ServerTest::new(id.clone());
|
||||||
//
|
server.init();
|
||||||
//
|
let mut client = ClientTest::new(id).init();
|
||||||
// client.clean();
|
|
||||||
|
let _ = client.add_file("file1", "foo");
|
||||||
|
client.run_cmd_ok("add file1");
|
||||||
|
client.run_cmd_ok("push");
|
||||||
|
|
||||||
|
status_should_be_empty(&mut client);
|
||||||
|
|
||||||
|
client.run_cmd_ok("add file1");
|
||||||
|
status_should_be_empty(&mut client);
|
||||||
|
|
||||||
|
client.clean();
|
||||||
|
server.clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,13 +15,13 @@ pub fn status_should_be_empty(client: &mut ClientTest) {
|
|||||||
let (staged, not_staged) = client.get_status();
|
let (staged, not_staged) = client.get_status();
|
||||||
if staged.len() != 0 {
|
if staged.len() != 0 {
|
||||||
eprintln!("id: {}", client.test_id.clone());
|
eprintln!("id: {}", client.test_id.clone());
|
||||||
eprintln!("Staged should be empty but has '{}'", staged.len());
|
eprintln!("Staged should be empty but has '{}' line(s)", staged.len());
|
||||||
assert!(staged.len() == 0);
|
assert!(staged.len() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if staged.len() != 0 {
|
if staged.len() != 0 {
|
||||||
eprintln!("id: {}", client.test_id.clone());
|
eprintln!("id: {}", client.test_id.clone());
|
||||||
eprintln!("Not Staged should be empty but has '{}'", not_staged.len());
|
eprintln!("Not Staged should be empty but has '{}' line(s)", not_staged.len());
|
||||||
assert!(not_staged.len() == 0);
|
assert!(not_staged.len() == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user