Add operations to manage NormalFile
This commit is contained in:
parent
d2656a3571
commit
53d1d0010d
@ -291,6 +291,67 @@ impl Source {
|
||||
}
|
||||
}
|
||||
|
||||
impl NormalFile {
|
||||
fn get_file_to_copy_and_autodep(
|
||||
&self,
|
||||
src_dir: &str,
|
||||
target_dir: &str,
|
||||
) -> (Vec<(String, String)>, Vec<String>) {
|
||||
let target_dir_path = PathBuf::from(target_dir);
|
||||
let src_dir_path = PathBuf::from(src_dir);
|
||||
let mut file_to_copy = Vec::new();
|
||||
let mut file_autodep = Vec::new();
|
||||
match self {
|
||||
NormalFile::FileName(file_name) => {
|
||||
let src_file_path = src_dir_path.join(file_name);
|
||||
// This unwrap should never fail
|
||||
let src_file_name = src_file_path
|
||||
.file_name()
|
||||
.unwrap()
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
let src_file = src_file_path.to_string_lossy().to_string();
|
||||
let target_file = target_dir_path
|
||||
.join(src_file_name)
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
file_to_copy.push((src_file.clone(), target_file));
|
||||
// default : autodep is true
|
||||
file_autodep.push(src_file);
|
||||
}
|
||||
NormalFile::FileWithOption(file_with_option) => {
|
||||
let file_name = &file_with_option.name;
|
||||
let src_file_path = src_dir_path.join(file_name);
|
||||
//This unwrap should never fail
|
||||
let src_file_name = src_file_path
|
||||
.file_name()
|
||||
.unwrap()
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
let src_file = src_file_path.to_string_lossy().to_string();
|
||||
// check file hash
|
||||
if let Some(ref hash) = file_with_option.hash {
|
||||
check_file_hash(&src_file, hash);
|
||||
}
|
||||
// autodep
|
||||
if file_with_option.autodep.clone().unwrap_or(true) {
|
||||
file_autodep.push(src_file.clone())
|
||||
}
|
||||
// rename file
|
||||
let target_file = match file_with_option.rename {
|
||||
Some(ref rename) => target_dir_path.join(rename).to_string_lossy().to_string(),
|
||||
None => target_dir_path
|
||||
.join(src_file_name)
|
||||
.to_string_lossy()
|
||||
.to_string(),
|
||||
};
|
||||
file_to_copy.push((src_file, target_file));
|
||||
}
|
||||
}
|
||||
(file_to_copy, file_autodep)
|
||||
}
|
||||
}
|
||||
|
||||
impl BomManagement {
|
||||
fn add_target_management(&mut self, mut target_management: TargetManagement, root_dir: &str) {
|
||||
// First, we need to resolve environmental variables
|
||||
|
@ -22,6 +22,31 @@ pub fn dest_in_root(root_dir: &str, dest: &str) -> PathBuf {
|
||||
return root_path.join(dest_relative);
|
||||
}
|
||||
|
||||
/// check if hash of the file is equal to the passed hash value.
|
||||
pub fn check_file_hash(filename: &str, hash: &str) {
|
||||
let file_hash = calculate_file_hash(filename);
|
||||
if file_hash != hash.to_string() {
|
||||
error!(
|
||||
"The hash value of {} should be {:?}. Please correct it.",
|
||||
filename, file_hash
|
||||
);
|
||||
std::process::exit(INCORRECT_HASH_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/// Use sha256 to calculate hash for file content. The returned hash is a hex-encoded string.
|
||||
pub fn calculate_file_hash(filename: &str) -> String {
|
||||
let mut file = std::fs::File::open(filename).unwrap_or_else(|e| {
|
||||
println!("can not open file {}. {}", filename, e);
|
||||
std::process::exit(FILE_NOT_EXISTS_ERROR);
|
||||
});
|
||||
let mut hasher = Sha256::new();
|
||||
std::io::copy(&mut file, &mut hasher).unwrap();
|
||||
let hash = hasher.finalize();
|
||||
let hash = HEXUPPER.encode(&hash);
|
||||
hash
|
||||
}
|
||||
|
||||
/// find an included file in the file system. If we can find the bom file, return the path
|
||||
/// otherwise, the process exit with error
|
||||
/// if included dir is relative path, if will be viewed as path relative to the `current` path (where we execute command)
|
||||
|
Loading…
Reference in New Issue
Block a user