Replace HashSet with IndexSet to preserve order
Also clean up some match arms.
This commit is contained in:
23
Cargo.lock
generated
23
Cargo.lock
generated
@@ -154,12 +154,24 @@ version = "0.8.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
|
||||
[[package]]
|
||||
name = "find-msvc-tools"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
@@ -190,6 +202,16 @@ dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "is_terminal_polyfill"
|
||||
version = "1.70.2"
|
||||
@@ -417,4 +439,5 @@ version = "0.2.3"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"clap",
|
||||
"indexmap",
|
||||
]
|
||||
|
||||
@@ -7,3 +7,4 @@ publish = false
|
||||
[dependencies]
|
||||
chrono = "0.4.44"
|
||||
clap = { version = "4.6.1", features = ["derive"] }
|
||||
indexmap = "2.14.0"
|
||||
|
||||
32
src/job.rs
32
src/job.rs
@@ -2,12 +2,13 @@ use crate::command;
|
||||
use crate::progress::BackupEvent;
|
||||
use crate::progress::filter;
|
||||
use chrono::{Local, NaiveDateTime};
|
||||
use indexmap::set::IndexSet;
|
||||
use std::collections::HashSet;
|
||||
use std::fmt;
|
||||
use std::sync::mpsc::Sender;
|
||||
|
||||
pub struct Job {
|
||||
datasets: HashSet<String>,
|
||||
datasets: IndexSet<String>,
|
||||
target: String,
|
||||
source_zfs_command: Vec<String>,
|
||||
target_zfs_command: Vec<String>,
|
||||
@@ -284,24 +285,23 @@ fn parse_command(commandstr: &str) -> Vec<String> {
|
||||
|
||||
for c in commandstr.chars() {
|
||||
match c {
|
||||
'\'' if !in_double_quote => {
|
||||
in_single_quote = !in_single_quote;
|
||||
}
|
||||
'\'' => {
|
||||
if !in_double_quote {
|
||||
in_single_quote = !in_single_quote;
|
||||
} else {
|
||||
arg.push(c);
|
||||
}
|
||||
arg.push(c);
|
||||
}
|
||||
'"' if !in_single_quote => {
|
||||
in_double_quote = !in_double_quote;
|
||||
}
|
||||
'"' => {
|
||||
if !in_single_quote {
|
||||
in_double_quote = !in_double_quote;
|
||||
} else {
|
||||
arg.push(c);
|
||||
}
|
||||
arg.push(c);
|
||||
}
|
||||
' ' if in_single_quote || in_double_quote => {
|
||||
arg.push(c);
|
||||
}
|
||||
' ' => {
|
||||
if in_single_quote || in_double_quote {
|
||||
arg.push(c);
|
||||
} else if !arg.is_empty() {
|
||||
if !arg.is_empty() {
|
||||
command.push(arg.clone());
|
||||
arg.clear();
|
||||
}
|
||||
@@ -362,7 +362,7 @@ impl JobBuilder {
|
||||
}
|
||||
|
||||
pub fn build(self) -> Result<Job, String> {
|
||||
let mut datasets: HashSet<String> = HashSet::new();
|
||||
let mut datasets: IndexSet<String> = IndexSet::new();
|
||||
for source in &self.sources {
|
||||
let recurse = source.ends_with("/...");
|
||||
let source = source.trim_end_matches("/...");
|
||||
@@ -382,7 +382,7 @@ impl JobBuilder {
|
||||
return Err(String::from("no matching source datasets found"));
|
||||
}
|
||||
Ok(Job {
|
||||
datasets: datasets,
|
||||
datasets,
|
||||
target: self.target,
|
||||
source_zfs_command: self.source_zfs_command,
|
||||
target_zfs_command: self.target_zfs_command,
|
||||
|
||||
Reference in New Issue
Block a user