make status work with name

This commit is contained in:
grimhilt 2023-06-06 15:15:32 +02:00
parent fe990e4213
commit 3b629f6de7

View File

@ -2,7 +2,7 @@ use crate::utils;
use std::fs::File; use std::fs::File;
use crypto::digest::Digest; use crypto::digest::Digest;
use crypto::sha1::Sha1; use crypto::sha1::Sha1;
use std::collections::HashSet; use std::collections::HashMap;
use colored::Colorize; use colored::Colorize;
use std::path::PathBuf; use std::path::PathBuf;
use std::io; use std::io;
@ -16,7 +16,7 @@ enum RemoveSide {
// todo: relative path, filename, get modified // todo: relative path, filename, get modified
pub fn status() { pub fn status() {
let mut hashes = HashSet::new(); let mut hashes = HashMap::new();
let mut objects: Vec<String> = vec![]; let mut objects: Vec<String> = vec![];
let mut staged_objects: Vec<String> = vec![]; let mut staged_objects: Vec<String> = vec![];
@ -36,7 +36,8 @@ pub fn status() {
if let Ok(ip) = line { if let Ok(ip) = line {
dbg!(ip.clone().len()); dbg!(ip.clone().len());
if ip.clone().len() > 5 { if ip.clone().len() > 5 {
hashes.insert(String::from(ip)); let (hash, name) = ip.split_once(" ").unwrap();
hashes.insert(String::from(hash), String::from(name));
} }
} }
} }
@ -59,41 +60,44 @@ pub fn status() {
staged_objects.push(String::from(entry.unwrap())); staged_objects.push(String::from(entry.unwrap()));
} }
} }
print_status(staged_objects.clone(), hashes.clone(), objects.clone());
// print
let del_objs = hashes.clone().iter().map(|x| String::from(x.1)).collect();
print_status(staged_objects.clone(), del_objs, objects.clone());
dbg!(hashes); dbg!(hashes);
dbg!(objects); dbg!(objects);
} }
fn print_status(staged_objects: Vec<String>, hashes: HashSet<String>, objects: Vec<String>) { fn print_status(staged_objs: Vec<String>, del_objs: Vec<String>, new_objs: Vec<String>) {
if staged_objects.len() == 0 && hashes.len() == 0 && objects.len() == 0 { if staged_objs.len() == 0 && del_objs.len() == 0 && new_objs.len() == 0 {
println!("Nothing to push, working tree clean"); println!("Nothing to push, working tree clean");
return; return;
} }
// staged file // staged file
if staged_objects.len() != 0 { if staged_objs.len() != 0 {
println!("Changes to be pushed:"); println!("Changes to be pushed:");
println!(" (Use \"nextsync reset\" to unstage)"); println!(" (Use \"nextsync reset\" to unstage)");
for staged in staged_objects { for staged in staged_objs {
println!(" {} {}", String::from("staged:").green(), staged.green()); println!(" {} {}", String::from("staged:").green(), staged.green());
} }
} }
// not staged files // not staged files
if objects.len() != 0 || hashes.len() != 0 { if new_objs.len() != 0 || del_objs.len() != 0 {
println!("Changes not staged for push:"); println!("Changes not staged for push:");
println!(" (Use\"nextsync add <file>...\" to update what will be pushed)"); println!(" (Use\"nextsync add <file>...\" to update what will be pushed)");
} }
for object in objects { for object in new_objs {
println!(" {} {}", String::from("added:").red(), object.red()); println!(" {} {}", String::from("added:").red(), object.red());
} }
for hash in hashes { for object in del_objs {
println!(" {} {}", String::from("deleted:").red(), hash.red()); println!(" {} {}", String::from("deleted:").red(), object.red());
} }
} }
fn find_missing_elements(hashes: &mut HashSet<String>, objects: &mut Vec<String>, remove_option: RemoveSide) -> Vec<String> { fn find_missing_elements(hashes: &mut HashMap<String, String>, objects: &mut Vec<String>, remove_option: RemoveSide) -> Vec<String> {
let mut hasher = Sha1::new(); let mut hasher = Sha1::new();
let mut to_remove: Vec<usize> = vec![]; let mut to_remove: Vec<usize> = vec![];
let mut i = 0; let mut i = 0;
@ -106,7 +110,7 @@ fn find_missing_elements(hashes: &mut HashSet<String>, objects: &mut Vec<String>
hasher.reset(); hasher.reset();
// find it on the list of hashes // find it on the list of hashes
if hashes.contains(&hash) { if hashes.contains_key(&hash) {
duplicate.push(object.clone()); duplicate.push(object.clone());
if remove_option == RemoveSide::Left || remove_option == RemoveSide::Both { if remove_option == RemoveSide::Left || remove_option == RemoveSide::Both {
hashes.remove(&hash); hashes.remove(&hash);