From e6970dd77e1000ac62d7e19263e7ba1a85966764 Mon Sep 17 00:00:00 2001 From: Michele Bertasi Date: Fri, 8 Jan 2016 22:49:25 +0000 Subject: [PATCH 1/6] Added test on new backup for collections mod --- src/collections/mod.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/collections/mod.rs b/src/collections/mod.rs index 1b84286..475c265 100644 --- a/src/collections/mod.rs +++ b/src/collections/mod.rs @@ -731,4 +731,33 @@ mod test { assert_eq!(inc.end_time(), parse_time_str("20150617t182650z").unwrap()); } } + + #[test] + fn multi_chain() { + let fnames = vec!["duplicity-full.20160108T223144Z.manifest", + "duplicity-full.20160108T223144Z.vol1.difftar.gz", + "duplicity-full.20160108T223209Z.manifest", + "duplicity-full.20160108T223209Z.vol1.difftar.gz", + "duplicity-full-signatures.20160108T223144Z.sigtar.gz", + "duplicity-full-signatures.20160108T223209Z.sigtar.gz", + "duplicity-inc.20160108T223144Z.to.20160108T223159Z.manifest", + "duplicity-inc.20160108T223144Z.to.20160108T223159Z.vol1.difftar.gz", + "duplicity-inc.20160108T223209Z.to.20160108T223217Z.manifest", + "duplicity-inc.20160108T223209Z.to.20160108T223217Z.vol1.difftar.gz", + "duplicity-new-signatures.20160108T223144Z.to.20160108T223159Z.sigtar.gz", + "duplicity-new-signatures.20160108T223209Z.to.20160108T223217Z.sigtar.gz"]; + let collection = Collections::from_filenames(&fnames); + assert_eq!(collection.backup_chains().count(), 2); + assert_eq!(collection.signature_chains().count(), 2); + // first chain + let chain = collection.backup_chains().nth(0).unwrap(); + assert_eq!(chain.inc_sets().count(), 1); + let chain = collection.signature_chains().nth(0).unwrap(); + assert_eq!(chain.inc_signatures().count(), 1); + // second chain + let chain = collection.backup_chains().nth(1).unwrap(); + assert_eq!(chain.inc_sets().count(), 1); + let chain = collection.signature_chains().nth(1).unwrap(); + assert_eq!(chain.inc_signatures().count(), 1); + } } From 629f088aaf06bda31fc45dd6e0321fe5ceaffc0e Mon Sep 17 00:00:00 2001 From: Michele Bertasi Date: Fri, 8 Jan 2016 22:39:37 +0000 Subject: [PATCH 2/6] Added a multi chain backup to test --- Docs.md | 6 ++++++ ...ity-full-signatures.20160108T223144Z.sigtar.gz | Bin 0 -> 195 bytes ...ity-full-signatures.20160108T223209Z.sigtar.gz | Bin 0 -> 192 bytes .../duplicity-full.20160108T223144Z.manifest | 6 ++++++ ...uplicity-full.20160108T223144Z.vol1.difftar.gz | Bin 0 -> 145 bytes .../duplicity-full.20160108T223209Z.manifest | 6 ++++++ ...uplicity-full.20160108T223209Z.vol1.difftar.gz | Bin 0 -> 141 bytes ....20160108T223144Z.to.20160108T223159Z.manifest | 6 ++++++ ...08T223144Z.to.20160108T223159Z.vol1.difftar.gz | Bin 0 -> 152 bytes ....20160108T223209Z.to.20160108T223217Z.manifest | 6 ++++++ ...08T223209Z.to.20160108T223217Z.vol1.difftar.gz | Bin 0 -> 151 bytes ...20160108T223144Z.to.20160108T223159Z.sigtar.gz | Bin 0 -> 192 bytes ...20160108T223209Z.to.20160108T223217Z.sigtar.gz | Bin 0 -> 196 bytes 13 files changed, 30 insertions(+) create mode 100644 tests/backups/multi_chain/duplicity-full-signatures.20160108T223144Z.sigtar.gz create mode 100644 tests/backups/multi_chain/duplicity-full-signatures.20160108T223209Z.sigtar.gz create mode 100644 tests/backups/multi_chain/duplicity-full.20160108T223144Z.manifest create mode 100644 tests/backups/multi_chain/duplicity-full.20160108T223144Z.vol1.difftar.gz create mode 100644 tests/backups/multi_chain/duplicity-full.20160108T223209Z.manifest create mode 100644 tests/backups/multi_chain/duplicity-full.20160108T223209Z.vol1.difftar.gz create mode 100644 tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.manifest create mode 100644 tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.vol1.difftar.gz create mode 100644 tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.manifest create mode 100644 tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.vol1.difftar.gz create mode 100644 tests/backups/multi_chain/duplicity-new-signatures.20160108T223144Z.to.20160108T223159Z.sigtar.gz create mode 100644 tests/backups/multi_chain/duplicity-new-signatures.20160108T223209Z.to.20160108T223217Z.sigtar.gz diff --git a/Docs.md b/Docs.md index 9c964ad..65e2641 100644 --- a/Docs.md +++ b/Docs.md @@ -39,6 +39,12 @@ To list all the backup snapshots contained in a directory: duplicity collection-status --no-encryption file:// ``` +If you don't have enough space on `/tmp` directory mount it to a more capable drive: + +``` +sudo mount -o bind /path/to/hd /tmp +``` + ### Time formats duplicity uses time strings in two places. Firstly, many of the files duplicity creates will have the time in their filenames in the w3 datetime format as described in a [w3 note](http://www.w3.org/TR/NOTE-datetime). Basically they look like "2001-07-15T04:09:38-07:00", which means what it looks like. The "-07:00" section means the time zone is 7 hours behind UTC. diff --git a/tests/backups/multi_chain/duplicity-full-signatures.20160108T223144Z.sigtar.gz b/tests/backups/multi_chain/duplicity-full-signatures.20160108T223144Z.sigtar.gz new file mode 100644 index 0000000000000000000000000000000000000000..36bad35ed1151a5511d549f5e880c0d176f795e2 GIT binary patch literal 195 zcmb2|=3uyBF(HiU|J#e!d`%7l4G)i=I?|VMo;M-&=H6~uLk*R#w$@vxE2R4$sitsW zVbkQ1di>wi_@s{^fAli<+48RfdepNdC-2bk6|z0vH^F;th{)=QZM8;boq~==k9^8| z*Iw4*II=I|`AxmoZ>3k2cb9y0zmXKZtTZ_F;j)U2ccbsvZVCJQzhD0U^uXKdQ?=RU uEg#MQzkky_v7|?rUOstpcHO_9kMzSn=bvX~KmrLjc(t!Y9AMC3U;qF|wOFSB literal 0 HcmV?d00001 diff --git a/tests/backups/multi_chain/duplicity-full-signatures.20160108T223209Z.sigtar.gz b/tests/backups/multi_chain/duplicity-full-signatures.20160108T223209Z.sigtar.gz new file mode 100644 index 0000000000000000000000000000000000000000..99925e9c8fdd70a006c417124479d863190ace3d GIT binary patch literal 192 zcmb2|=3sbfF(HiU|J#f9d`$)t?GGP4dGzjvbU;pKezFq}m)pevi^lH;afi+x)?_|5 zL!sF*xn};;>rY;P`1{dy)AyU}xQ-TF=`AjtJhA&~@-`Qf&Bruyw`_EBy%njOVw2!s zzIFYiAg_&Q#UpolTL1rg^|s@!KZ17gqMo7CGk2Vc_xV08P5#=fcfVgh|1F(9b%K24 sqxtvue`yp=x?*#Dv9rO<+n1l#%vrbpt~dh{Xs8RnyFuQUL4$z-00R+Sy#N3J literal 0 HcmV?d00001 diff --git a/tests/backups/multi_chain/duplicity-full.20160108T223144Z.manifest b/tests/backups/multi_chain/duplicity-full.20160108T223144Z.manifest new file mode 100644 index 0000000..e255334 --- /dev/null +++ b/tests/backups/multi_chain/duplicity-full.20160108T223144Z.manifest @@ -0,0 +1,6 @@ +Hostname dellxps +Localdir . +Volume 1: + StartingPath . + EndingPath file + Hash SHA1 94bdf3c601d9e1569679c1717c0136c27c1d0493 diff --git a/tests/backups/multi_chain/duplicity-full.20160108T223144Z.vol1.difftar.gz b/tests/backups/multi_chain/duplicity-full.20160108T223144Z.vol1.difftar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8a3ebe0f812bc3bfaff45049a10fcf29c1338669 GIT binary patch literal 145 zcmV;C0B-*uiwFSFIFMEX|0~W*EGW*%FVWZ2XP^}@00MJ!QxI)vZfbx`!vKS!k(r5! zfw76PAyA#6iJ_qhgMul|T!aKli%SxV6ciY8Gm|q?b5e1tBP0*=2#g*gpcoeaX_7$37+^jMvs3pLo)^ix&-1#kAGvXfp)?u7(f63&a*U@00sa6&dfGj literal 0 HcmV?d00001 diff --git a/tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.manifest b/tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.manifest new file mode 100644 index 0000000..84f270c --- /dev/null +++ b/tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.manifest @@ -0,0 +1,6 @@ +Hostname dellxps +Localdir . +Volume 1: + StartingPath . + EndingPath file + Hash SHA1 fa30f19cdbc1df480bd7fe8e607bcd7c64cfefc9 diff --git a/tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.vol1.difftar.gz b/tests/backups/multi_chain/duplicity-inc.20160108T223144Z.to.20160108T223159Z.vol1.difftar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bb92843156a798c9e8fe5e39108802c86138f1f7 GIT binary patch literal 152 zcmV;J0B8RniwFSUIFMEX|0~W*EGW*%FVWZ2XP^}@00MJ!QxI)vZfbx`!vKS!k(r5! zfw76Pu_1$jp^2fP5rcv$&0K^8N{dSpixdybjelb^GeZUix&-0~kN=`#CNoFoVk54BcE~6g5C8zUm#I7e G1^@sy(mFQ) literal 0 HcmV?d00001 diff --git a/tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.manifest b/tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.manifest new file mode 100644 index 0000000..29c32ee --- /dev/null +++ b/tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.manifest @@ -0,0 +1,6 @@ +Hostname dellxps +Localdir . +Volume 1: + StartingPath . + EndingPath file + Hash SHA1 a68ccd119638628c16640d91e768fb8bad1aef17 diff --git a/tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.vol1.difftar.gz b/tests/backups/multi_chain/duplicity-inc.20160108T223209Z.to.20160108T223217Z.vol1.difftar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc5918bd14ae32581e6d1f52b09d51bde6b8448f GIT binary patch literal 151 zcmV;I0BHXoiwFSmIFMEX|0~W*EGW*%FVWZ2XP^}@00MJ!QxI)vZfbx`!vKS!k(r5! zfw76PsX2pzp^2f95rcv$&0K^8N{dSpixdzNe?N?Df7HacCt1BZW_dgH$(pJ&^Ew_KkyzS$ZDPR0vTIzK>Th1I z`&b&~sabYZ>-@Hx5B6`YviF#8e@J|`(c0Ns+}DqGzr1(pt+MBt4}ZUY{@c5G;{^H0 sNAvIR|KzB2WKH$C^y3MIT+=^Y+V(vEJ1YYcNVp?mcq!VU(u8ON(S92Emicytbi-q0R?A6xP6_wn=J!>_p< w`hP;`|DS(LKlcbMer756cF)PWGCN=X>5sSnW@11B7v6LIsLQot&|qKy0Jm>k4*&oF literal 0 HcmV?d00001 From 0a3309d17fc877d08d98fda0075266740c37c136 Mon Sep 17 00:00:00 2001 From: Michele Bertasi Date: Fri, 8 Jan 2016 23:25:04 +0000 Subject: [PATCH 3/6] Fixed wrong signature chains creation TODO: Tests on related backup with `Backup`. Closes #45. --- src/collections/mod.rs | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/collections/mod.rs b/src/collections/mod.rs index 475c265..904ec44 100644 --- a/src/collections/mod.rs +++ b/src/collections/mod.rs @@ -588,28 +588,27 @@ fn compute_backup_sets(fname_infos: &[FileNameInfo]) -> Vec { } fn compute_signature_chains(fname_infos: &[FileNameInfo]) -> Vec { - // create a new signature chain for each fill signature - let mut sig_chains = fname_infos.iter() - .filter(|f| matches!(f.info.tp, fnm::Type::FullSig{..})) - .map(|f| SignatureChain::from_filename_info(f)) - .collect::>(); - // and collect all the new signatures, sorted by start time - let mut new_sig = fname_infos.iter() - .filter(|f| matches!(f.info.tp, fnm::Type::NewSig{..})) - .collect::>(); - new_sig.sort_by(|a, b| a.info.tp.time_range().0.cmp(&b.info.tp.time_range().0)); - - // add the new signatures to signature chains - for sig in new_sig.into_iter() { - let mut added = false; - for chain in &mut sig_chains { - if chain.add_new_sig(&sig) { - added = true; - break; + // sort infos by start time + let sorted_infos = { + let mut i = fname_infos.iter().collect::>(); + i.sort_by(|a, b| a.info.tp.time_range().0.cmp(&b.info.tp.time_range().0)); + i + }; + let mut sig_chains = Vec::new(); + for f in sorted_infos { + match f.info.tp { + fnm::Type::FullSig{..} => { + sig_chains.push(SignatureChain::from_filename_info(f)); } - } - if !added { - // TODO: add to orphaned filenames + fnm::Type::NewSig{start_time, ..} => { + if let Some(ref mut chain) = sig_chains.last_mut() { + if chain.end_time() == start_time && chain.add_new_sig(f) { + continue; + } + } + // TODO: otherwise add to orphaned incremental signatures + } + _ => (), } } sig_chains From a6a46908511a4225a766894773db106332e313a1 Mon Sep 17 00:00:00 2001 From: Michele Bertasi Date: Sat, 9 Jan 2016 15:41:02 +0000 Subject: [PATCH 4/6] Fixed wrong orphaned inc signature This could happen when sorting choose to put an inc signature before its full signature, when they have the same timestamp. The solution was to sort them by using also the signature type, and put the full signature always before the inc signature. --- src/backend/local.rs | 34 ++++++++++++++++ src/collections/mod.rs | 21 ++++++++-- src/lib.rs | 89 +++++++++++++++++++++++++++++++++--------- 3 files changed, 123 insertions(+), 21 deletions(-) diff --git a/src/backend/local.rs b/src/backend/local.rs index 6826c8d..1432657 100644 --- a/src/backend/local.rs +++ b/src/backend/local.rs @@ -76,3 +76,37 @@ impl Iterator for FileNameIterator { None } } + + +#[cfg(test)] +mod test { + use super::*; + use backend::Backend; + + #[test] + fn multi_chain_files() { + let backend = LocalBackend::new("tests/backups/multi_chain"); + let files = backend.file_names().unwrap().collect::>(); + let actual = { + let mut r = files.iter() + .map(|p| p.to_str().unwrap()) + .filter(|p| p.starts_with("duplicity-")) + .collect::>(); + r.sort(); + r + }; + let expected = vec!["duplicity-full-signatures.20160108T223144Z.sigtar.gz", + "duplicity-full-signatures.20160108T223209Z.sigtar.gz", + "duplicity-full.20160108T223144Z.manifest", + "duplicity-full.20160108T223144Z.vol1.difftar.gz", + "duplicity-full.20160108T223209Z.manifest", + "duplicity-full.20160108T223209Z.vol1.difftar.gz", + "duplicity-inc.20160108T223144Z.to.20160108T223159Z.manifest", + "duplicity-inc.20160108T223144Z.to.20160108T223159Z.vol1.difftar.gz", + "duplicity-inc.20160108T223209Z.to.20160108T223217Z.manifest", + "duplicity-inc.20160108T223209Z.to.20160108T223217Z.vol1.difftar.gz", + "duplicity-new-signatures.20160108T223144Z.to.20160108T223159Z.sigtar.gz", + "duplicity-new-signatures.20160108T223209Z.to.20160108T223217Z.sigtar.gz"]; + assert_eq!(actual, expected); + } +} diff --git a/src/collections/mod.rs b/src/collections/mod.rs index 904ec44..3daf0a2 100644 --- a/src/collections/mod.rs +++ b/src/collections/mod.rs @@ -6,6 +6,7 @@ mod file_naming; use std::collections::HashMap; +use std::cmp::Ordering; use std::fmt::{Display, Error, Formatter}; use std::path::Path; use std::slice; @@ -424,7 +425,7 @@ impl SignatureChain { /// Adds the given incremental signature to the signature chain if possible, /// returns false otherwise. pub fn add_new_sig(&mut self, fname: &FileNameInfo) -> bool { - if let fnm::Type::NewSig{ .. } = fname.info.tp { + if matches!(fname.info.tp, fnm::Type::NewSig{ .. }) { self.incsigs.push(SignatureFile::from_filename_info(fname)); true } else { @@ -588,10 +589,24 @@ fn compute_backup_sets(fname_infos: &[FileNameInfo]) -> Vec { } fn compute_signature_chains(fname_infos: &[FileNameInfo]) -> Vec { - // sort infos by start time let sorted_infos = { + // sort infos by start time and full before inc let mut i = fname_infos.iter().collect::>(); - i.sort_by(|a, b| a.info.tp.time_range().0.cmp(&b.info.tp.time_range().0)); + i.sort_by(|a, b| { + match a.info.tp.time_range().0.cmp(&b.info.tp.time_range().0) { + Ordering::Less => Ordering::Less, + Ordering::Greater => Ordering::Greater, + Ordering::Equal => { + // compare by type + match (&a.info.tp, &b.info.tp) { + (&fnm::Type::FullSig{..}, &fnm::Type::FullSig{..}) => Ordering::Equal, + (&fnm::Type::FullSig{..}, _) => Ordering::Less, + (_, &fnm::Type::FullSig{..}) => Ordering::Greater, + _ => Ordering::Equal, + } + } + } + }); i }; let mut sig_chains = Vec::new(); diff --git a/src/lib.rs b/src/lib.rs index 3eb65ed..0a78a78 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -247,7 +247,7 @@ impl<'a> Snapshot<'a> { sig_id: self.sig_id, }) } else { - Err(io::Error::new(io::ErrorKind::NotFound, "The signature chain is incomplete")) + Err(not_found("The signature chain is incomplete")) } } } @@ -284,9 +284,8 @@ impl ResourceCache for Backup { let new_sig = try!(Chain::from_sigchain(sigchain, &self.backend)); *sig = Some(new_sig); } else { - return Err(io::Error::new(io::ErrorKind::NotFound, - "The given backup snapshot does not have a \ - corresponding signature")); + return Err(not_found("The given backup snapshot does not have a \ + corresponding signature")); } } } @@ -298,15 +297,20 @@ impl ResourceCache for Backup { } +fn not_found(msg: &str) -> io::Error { + io::Error::new(io::ErrorKind::NotFound, msg) +} + + #[cfg(test)] mod test { use super::*; use backend::local::LocalBackend; use collections::{BackupSet, Collections}; use signatures::{Chain, Entry}; + use time_utils::parse_time_str; - use std::path::PathBuf; - + use std::path::{Path, PathBuf}; use time::Timespec; @@ -334,6 +338,19 @@ mod test { gname: file.groupname().unwrap().to_owned(), } } + + pub fn from_info(path: &str, + mtime: &str, + uname: &str, + gname: &str) + -> Self { + EntryTest { + path: Path::new(path).to_path_buf(), + mtime: parse_time_str(mtime).unwrap(), + uname: uname.to_owned(), + gname: gname.to_owned(), + } + } } fn from_backup_set(set: &BackupSet, full: bool) -> SnapshotTest { @@ -387,9 +404,23 @@ mod test { .collect::>() } + fn from_backup(backup: &Backup) -> Vec> { + backup.snapshots() + .unwrap() + .map(|s| { + s.entries() + .unwrap() + .as_signature() + .map(|f| EntryTest::from_entry(&f)) + .filter(|f| f.path.to_str().is_some()) + .collect::>() + }) + .collect::>() + } + #[test] - fn same_collections() { + fn same_collections_single_vol() { let backend = LocalBackend::new("tests/backups/single_vol"); let filenames = backend.file_names().unwrap(); let coll = Collections::from_filenames(filenames); @@ -400,6 +431,18 @@ mod test { assert_eq!(actual, expected); } + #[test] + fn same_collections_multi_chain() { + let backend = LocalBackend::new("tests/backups/multi_chain"); + let filenames = backend.file_names().unwrap(); + let coll = Collections::from_filenames(filenames); + let backup = Backup::new(backend).unwrap(); + + let expected = from_collection(&coll); + let actual = to_test_snapshot(&backup); + assert_eq!(actual, expected); + } + #[test] fn same_files() { let sigchain = single_vol_signature_chain(); @@ -407,17 +450,27 @@ mod test { let backend = LocalBackend::new("tests/backups/single_vol"); let backup = Backup::new(backend).unwrap(); - let actual = backup.snapshots() - .unwrap() - .map(|s| { - s.entries() - .unwrap() - .as_signature() - .map(|f| EntryTest::from_entry(&f)) - .filter(|f| f.path.to_str().is_some()) - .collect::>() - }) - .collect::>(); + let actual = from_backup(&backup); assert_eq!(actual, expected); } + + #[test] + fn multi_chain_files() { + let backend = LocalBackend::new("tests/backups/multi_chain"); + let backup = Backup::new(backend).unwrap(); + let actual = from_backup(&backup); + let expected = vec![vec![make_entry_test("", "20160108t223141z"), + make_entry_test("file", "20160108t222924z")], + vec![make_entry_test("", "20160108t223153z"), + make_entry_test("file", "20160108t223153z")], + vec![make_entry_test("", "20160108t223206z"), + make_entry_test("file", "20160108t223206z")], + vec![make_entry_test("", "20160108t223215z"), + make_entry_test("file", "20160108t223215z")]]; + assert_eq!(actual, expected); + + fn make_entry_test(path: &str, mtime: &str) -> EntryTest { + EntryTest::from_info(path, mtime, "michele", "michele") + } + } } From 1b3aabaa39842cbea7e9d016e7ecfa10d9902cde Mon Sep 17 00:00:00 2001 From: Michele Bertasi Date: Sat, 9 Jan 2016 15:59:06 +0000 Subject: [PATCH 5/6] Better implementation for compute_signature_chains Now it is very similar to compute_backup_chains --- src/collections/file_naming.rs | 4 +++ src/collections/mod.rs | 56 ++++++++++++++-------------------- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/collections/file_naming.rs b/src/collections/file_naming.rs index 7b27aec..14f3847 100644 --- a/src/collections/file_naming.rs +++ b/src/collections/file_naming.rs @@ -64,6 +64,10 @@ impl<'a> FileNameInfo<'a> { info: info, } } + + pub fn start_time(&self) -> Timespec { + self.info.tp.time_range().0 + } } impl Type { diff --git a/src/collections/mod.rs b/src/collections/mod.rs index 3daf0a2..9ef4a89 100644 --- a/src/collections/mod.rs +++ b/src/collections/mod.rs @@ -589,41 +589,31 @@ fn compute_backup_sets(fname_infos: &[FileNameInfo]) -> Vec { } fn compute_signature_chains(fname_infos: &[FileNameInfo]) -> Vec { - let sorted_infos = { - // sort infos by start time and full before inc - let mut i = fname_infos.iter().collect::>(); - i.sort_by(|a, b| { - match a.info.tp.time_range().0.cmp(&b.info.tp.time_range().0) { - Ordering::Less => Ordering::Less, - Ordering::Greater => Ordering::Greater, - Ordering::Equal => { - // compare by type - match (&a.info.tp, &b.info.tp) { - (&fnm::Type::FullSig{..}, &fnm::Type::FullSig{..}) => Ordering::Equal, - (&fnm::Type::FullSig{..}, _) => Ordering::Less, - (_, &fnm::Type::FullSig{..}) => Ordering::Greater, - _ => Ordering::Equal, - } - } - } - }); - i + // collect full signatures, sort them by start time and make the chains from them + let mut sig_chains = fname_infos.iter() + .filter(|f| matches!(f.info.tp, fnm::Type::FullSig{..})) + .map(SignatureChain::from_filename_info) + .collect::>(); + sig_chains.sort_by(|a, b| a.start_time().cmp(&b.start_time())); + // collect inc signatures and sort them by start time + let inc_sigs = { + let mut is = fname_infos.iter() + .filter(|f| matches!(f.info.tp, fnm::Type::NewSig{..})) + .collect::>(); + is.sort_by(|a, b| a.start_time().cmp(&b.start_time())); + is }; - let mut sig_chains = Vec::new(); - for f in sorted_infos { - match f.info.tp { - fnm::Type::FullSig{..} => { - sig_chains.push(SignatureChain::from_filename_info(f)); - } - fnm::Type::NewSig{start_time, ..} => { - if let Some(ref mut chain) = sig_chains.last_mut() { - if chain.end_time() == start_time && chain.add_new_sig(f) { - continue; - } - } - // TODO: otherwise add to orphaned incremental signatures + // add inc signatures to chains + for inc in inc_sigs { + let mut added = false; + for chain in &mut sig_chains { + if chain.end_time() == inc.start_time() && chain.add_new_sig(inc) { + added = true; + break; } - _ => (), + } + if !added { + // TODO: add to orphaned incremental signatures } } sig_chains From 37187b34c1f0843374913652ab03f5ebfb49a440 Mon Sep 17 00:00:00 2001 From: Michele Bertasi Date: Sat, 9 Jan 2016 16:02:19 +0000 Subject: [PATCH 6/6] Fixed unused import --- src/collections/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/collections/mod.rs b/src/collections/mod.rs index 9ef4a89..95ade76 100644 --- a/src/collections/mod.rs +++ b/src/collections/mod.rs @@ -6,7 +6,6 @@ mod file_naming; use std::collections::HashMap; -use std::cmp::Ordering; use std::fmt::{Display, Error, Formatter}; use std::path::Path; use std::slice;