feat: specify output dirs for restore instead of using config & world
parent
36c441b8c2
commit
55c5f24937
|
@ -122,10 +122,11 @@ where
|
|||
&self,
|
||||
layer: &str,
|
||||
start_time: chrono::DateTime<Utc>,
|
||||
dirs: &Vec<(PathBuf, PathBuf)>,
|
||||
) -> Option<io::Result<()>> {
|
||||
self.managers
|
||||
.get(layer)
|
||||
.map(|manager| manager.restore_backup(start_time))
|
||||
.map(|manager| manager.restore_backup(start_time, dirs))
|
||||
}
|
||||
|
||||
pub fn managers(&self) -> &HashMap<String, Manager<T>> {
|
||||
|
|
|
@ -161,7 +161,11 @@ where
|
|||
|
||||
/// Restore the backup with the given start time by restoring its chain up to and including the
|
||||
/// backup, in order.
|
||||
pub fn restore_backup(&self, start_time: chrono::DateTime<Utc>) -> io::Result<()> {
|
||||
pub fn restore_backup(
|
||||
&self,
|
||||
start_time: chrono::DateTime<Utc>,
|
||||
dirs: &Vec<(PathBuf, PathBuf)>,
|
||||
) -> io::Result<()> {
|
||||
// Iterate over each chain, skipping elements until the element with the given start time
|
||||
// is possibly found.
|
||||
for chain in &self.chains {
|
||||
|
@ -172,7 +176,7 @@ where
|
|||
.position(|b| b.start_time.trunc_subsecs(0) == start_time)
|
||||
{
|
||||
for backup in chain.iter().take(index + 1) {
|
||||
backup.restore(&self.backup_dir, &self.dirs)?;
|
||||
backup.restore(&self.backup_dir, dirs)?;
|
||||
}
|
||||
|
||||
return Ok(());
|
||||
|
|
|
@ -38,9 +38,16 @@ pub struct BackupListArgs {
|
|||
pub struct BackupRestoreArgs {
|
||||
/// Path to the backup inside the backup directory
|
||||
path: PathBuf,
|
||||
/// Directory to store config in
|
||||
output_config: PathBuf,
|
||||
/// Directory to store worlds in
|
||||
output_worlds: PathBuf,
|
||||
/// Whether to overwrite the contents of the existing directories
|
||||
#[arg(short, long, default_value_t = false)]
|
||||
force: bool,
|
||||
/// Create output directories if they don't exist
|
||||
#[arg(short, long, default_value_t = false)]
|
||||
make: bool,
|
||||
}
|
||||
|
||||
impl BackupArgs {
|
||||
|
@ -69,6 +76,15 @@ impl BackupRestoreArgs {
|
|||
pub fn run(&self, cli: &Cli) -> io::Result<()> {
|
||||
let backup_dir = cli.backup.canonicalize()?;
|
||||
|
||||
// Create directories if needed
|
||||
if self.make {
|
||||
std::fs::create_dir_all(&self.output_config)?;
|
||||
std::fs::create_dir_all(&self.output_worlds)?;
|
||||
}
|
||||
|
||||
let output_config = self.output_config.canonicalize()?;
|
||||
let output_worlds = self.output_worlds.canonicalize()?;
|
||||
|
||||
// Parse input path
|
||||
let path = self.path.canonicalize()?;
|
||||
|
||||
|
@ -97,11 +113,9 @@ impl BackupRestoreArgs {
|
|||
let meta = cli.meta()?;
|
||||
|
||||
// Clear previous contents of directories
|
||||
let mut entries = cli
|
||||
.config
|
||||
.canonicalize()?
|
||||
let mut entries = output_config
|
||||
.read_dir()?
|
||||
.chain(cli.world.canonicalize()?.read_dir()?)
|
||||
.chain(output_worlds.read_dir()?)
|
||||
.peekable();
|
||||
|
||||
if entries.peek().is_some() && !self.force {
|
||||
|
@ -118,8 +132,13 @@ impl BackupRestoreArgs {
|
|||
}
|
||||
}
|
||||
|
||||
let dirs = vec![
|
||||
(PathBuf::from("config"), output_config),
|
||||
(PathBuf::from("worlds"), output_worlds),
|
||||
];
|
||||
|
||||
// Restore the backup
|
||||
if let Some(res) = meta.restore_backup(&layer, timestamp) {
|
||||
if let Some(res) = meta.restore_backup(&layer, timestamp, &dirs) {
|
||||
res
|
||||
} else {
|
||||
Err(other("Unknown layer"))
|
||||
|
|
Loading…
Reference in New Issue