feat(migration): Added automatic migration (#54)

This commit is contained in:
Redblueflame
2020-08-28 17:48:01 +02:00
committed by GitHub
parent 2b1ed49e9a
commit 38b7d9724e
8 changed files with 123 additions and 4 deletions

60
build.rs Normal file
View File

@@ -0,0 +1,60 @@
use std::fs;
use std::path::{Path, PathBuf};
fn main() {
let dir = std::env::var("OUT_DIR").unwrap();
let mut target = PathBuf::from(dir);
target.pop();
target.pop();
target.pop();
target.push("migrations");
println!("Output: {}", target.to_str().unwrap());
copy("migrations", target).unwrap();
}
pub fn copy<U: AsRef<Path>, V: AsRef<Path>>(from: U, to: V) -> Result<(), std::io::Error> {
let mut stack = Vec::new();
stack.push(PathBuf::from(from.as_ref()));
let output_root = PathBuf::from(to.as_ref());
let input_root = PathBuf::from(from.as_ref()).components().count();
while let Some(working_path) = stack.pop() {
println!("process: {:?}", &working_path);
// Generate a relative path
let src: PathBuf = working_path.components().skip(input_root).collect();
// Create a destination if missing
let dest = if src.components().count() == 0 {
output_root.clone()
} else {
output_root.join(&src)
};
if fs::metadata(&dest).is_err() {
println!(" mkdir: {:?}", dest);
fs::create_dir_all(&dest)?;
}
for entry in fs::read_dir(working_path)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
stack.push(path);
} else {
match path.file_name() {
Some(filename) => {
let dest_path = dest.join(filename);
println!(" copy: {:?} -> {:?}", &path, &dest_path);
fs::copy(&path, &dest_path)?;
}
None => {
println!("failed: {:?}", path);
}
}
}
}
}
Ok(())
}