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