feat: improve list view
ci/woodpecker/push/lint Pipeline was successful Details
ci/woodpecker/push/clippy Pipeline was successful Details
ci/woodpecker/push/build Pipeline was successful Details

export-backup
Jef Roosens 2023-06-24 13:47:55 +02:00
parent 5159bfdddd
commit a4a03ca4c5
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
4 changed files with 31 additions and 4 deletions

View File

@ -9,7 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
* `backup` CLI command
* Incremental backups * Incremental backups
* Chain length describes how many incremental backups to create from the * Chain length describes how many incremental backups to create from the
same full backup same full backup
@ -18,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Backup layers * Backup layers
* Store multiple chains of backups in parallel, configuring each with * Store multiple chains of backups in parallel, configuring each with
different parameters (son-father-grandfather principle) different parameters (son-father-grandfather principle)
* CLI commands for creating, restoring & listing backups
### Changed ### Changed

View File

@ -1,5 +1,6 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::fmt;
use std::path::PathBuf; use std::path::PathBuf;
/// Represents the changes relative to the previous backup /// Represents the changes relative to the previous backup
@ -74,3 +75,12 @@ impl Delta {
} }
} }
} }
impl fmt::Display for Delta {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let added_count: usize = self.added.values().map(|s| s.len()).sum();
let removed_count: usize = self.removed.values().map(|s| s.len()).sum();
write!(f, "+{}-{}", added_count, removed_count)
}
}

View File

@ -14,6 +14,7 @@ use flate2::Compression;
use path::PathExt; use path::PathExt;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::fmt;
use std::fs::File; use std::fs::File;
use std::io; use std::io;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -205,3 +206,20 @@ impl<T: Clone> Backup<T> {
Ok(()) Ok(())
} }
} }
impl<T: Clone> fmt::Display for Backup<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let letter = match self.type_ {
BackupType::Full => 'F',
BackupType::Incremental => 'I',
};
write!(
f,
"{} ({}, {})",
self.start_time.format(Backup::FILENAME_FORMAT),
letter,
self.delta
)
}
}

View File

@ -136,11 +136,10 @@ impl BackupListArgs {
for chain in manager.chains().iter().filter(|c| !c.is_empty()) { for chain in manager.chains().iter().filter(|c| !c.is_empty()) {
let mut iter = chain.iter(); let mut iter = chain.iter();
let first = iter.next().unwrap(); println!(" {}", iter.next().unwrap());
println!(" {}", first.start_time.format(Backup::FILENAME_FORMAT));
for backup in iter { for backup in iter {
println!(" {}", backup.start_time.format(Backup::FILENAME_FORMAT)); println!(" {}", backup);
} }
} }
} }