feat: implement own listing of files
parent
4958257f6e
commit
29d6713486
|
@ -18,6 +18,7 @@ pub struct BackupManager {
|
|||
world_dir: PathBuf,
|
||||
max_backups: u64,
|
||||
start_time: Option<chrono::DateTime<chrono::Local>>,
|
||||
files: Vec<(PathBuf, PathBuf)>
|
||||
}
|
||||
|
||||
impl BackupManager {
|
||||
|
@ -33,9 +34,40 @@ impl BackupManager {
|
|||
world_dir,
|
||||
max_backups,
|
||||
start_time: None,
|
||||
files: Vec::new()
|
||||
}
|
||||
}
|
||||
|
||||
fn set_files_to_backup(&mut self) -> io::Result<()> {
|
||||
let mut dirs = vec![
|
||||
(PathBuf::from("worlds"), self.world_dir.clone()),
|
||||
(PathBuf::from("config"), self.config_dir.clone()),
|
||||
];
|
||||
self.files.clear();
|
||||
|
||||
while let Some((path_in_tar, path)) = dirs.pop() {
|
||||
for res in path.read_dir()? {
|
||||
let entry = res?;
|
||||
|
||||
if entry.file_name() == "cache" {
|
||||
continue;
|
||||
}
|
||||
|
||||
let new_path_in_tar = path_in_tar.join(entry.file_name());
|
||||
|
||||
// All dirs get expanded recursively, while all files get returned as output
|
||||
// NOTE: does this remove empty directories from backups? Is this a problem?
|
||||
if entry.file_type()?.is_dir() {
|
||||
dirs.push((new_path_in_tar, entry.path()));
|
||||
} else {
|
||||
self.files.push((new_path_in_tar, entry.path()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn create_archive(&mut self) -> io::Result<()> {
|
||||
let start_time = chrono::offset::Local::now();
|
||||
self.start_time = Some(start_time);
|
||||
|
@ -46,22 +78,10 @@ impl BackupManager {
|
|||
let enc = GzEncoder::new(tar_gz, Compression::default());
|
||||
let mut tar = tar::Builder::new(enc);
|
||||
|
||||
tar.append_dir_all("worlds", &self.world_dir)?;
|
||||
self.set_files_to_backup()?;
|
||||
|
||||
// Add all files from the config directory that aren't the cache
|
||||
for entry in self
|
||||
.config_dir
|
||||
.read_dir()?
|
||||
.filter_map(|e| e.ok())
|
||||
.filter(|e| e.file_name() != "cache")
|
||||
{
|
||||
let tar_path = Path::new("config").join(entry.file_name());
|
||||
|
||||
if entry.file_type()?.is_dir() {
|
||||
tar.append_dir_all(tar_path, entry.path())?;
|
||||
} else {
|
||||
tar.append_path_with_name(entry.path(), tar_path)?;
|
||||
}
|
||||
for (path_in_tar, path) in &self.files {
|
||||
tar.append_path_with_name(path, path_in_tar)?;
|
||||
}
|
||||
|
||||
// TODO re-add this info file in some way
|
||||
|
|
Loading…
Reference in New Issue