diff --git a/casr/src/bin/casr-cluster.rs b/casr/src/bin/casr-cluster.rs index f9560681..97ad3e89 100644 --- a/casr/src/bin/casr-cluster.rs +++ b/casr/src/bin/casr-cluster.rs @@ -62,7 +62,7 @@ fn make_clusters( // Handle bad reports if !badreports.is_empty() { - util::save_badreports(badreports, format!("{}/clerr", &outpath.display()))?; + util::save_reports(badreports, format!("{}/clerr", &outpath.display()))?; } if casreps.len() < 2 { @@ -268,7 +268,7 @@ fn merge_dirs(input: &Path, output: &Path) -> Result { /// /// * `newpath` - path to directory with new CASR reports /// -/// * `oldpath` - target directory for exiting clusters +/// * `oldpath` - target directory for existing clusters /// /// * `jobs` - number of jobs for cluster updating process /// @@ -439,7 +439,7 @@ fn update_clusters( /// /// Number of moved to old clusters CASR reports /// Number of removed by crashline deduplication CASR reports -pub fn merge_clusters( +fn merge_clusters( olds: HashMap, news: &mut HashMap, dir: &Path, @@ -458,7 +458,7 @@ pub fn merge_clusters( continue; } // Copy casreps from new to old - for (casrep, stacktrace, crashline) in new.reports() { + for (casrep, (stacktrace, crashline)) in new.reports() { // Update cluster (and dedup crashline) if !old.insert( casrep.to_path_buf(), diff --git a/casr/src/util.rs b/casr/src/util.rs index cc2a84f6..eb2c0af8 100644 --- a/casr/src/util.rs +++ b/casr/src/util.rs @@ -537,18 +537,18 @@ pub fn save_clusters(clusters: &HashMap, dir: &Path) -> Result<( Ok(()) } -/// Save invalid CASR reports to given directory +/// Save CASR reports to given directory /// /// # Arguments /// -/// * `badreports` - A vector of invalid CASR reports +/// * `reports` - A vector of CASR reports /// /// * `dir` - out directory -pub fn save_badreports(badreports: Vec, dir: String) -> Result<()> { +pub fn save_reports(reports: Vec, dir: String) -> Result<()> { if !Path::new(&dir).exists() { fs::create_dir_all(&dir)?; } - for report in badreports { + for report in reports { fs::copy( &report, format!("{}/{}", dir, &report.file_name().unwrap().to_str().unwrap()), diff --git a/docs/usage.md b/docs/usage.md index 93fad32d..aa169040 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -339,6 +339,12 @@ If there are several `Inner` or `Outer` clusters for the report we choose the N.B. `Delta` strategy is a nonsensical strategy in `Inner` case +Example: + + $ casr-cluster -c casr/tests/casr_tests/casrep/test_clustering_small out + $ rm -f out/cl9/40.casrep out/cl7/20.casrep && rm -rf out/cl8 && mv out/cl9 out/cl8 + $ casr-cluster -u casr/tests/casr_tests/casrep/test_clustering_small out + ## casr-cli App provides text-based user interface to view CASR reports, prints joint statistics for diff --git a/libcasr/src/stacktrace.rs b/libcasr/src/stacktrace.rs index b83fdbac..119434ca 100644 --- a/libcasr/src/stacktrace.rs +++ b/libcasr/src/stacktrace.rs @@ -100,8 +100,8 @@ impl Cluster { crashlines: Vec, ) -> Self { let mut unique_crashlines: HashMap = HashMap::new(); - for (i, crashline) in crashlines.iter().enumerate() { - unique_crashlines.insert(crashline.clone(), i); + for (i, crashline) in crashlines.into_iter().enumerate() { + unique_crashlines.insert(crashline, i); } Cluster { number, @@ -146,8 +146,7 @@ impl Cluster { self.paths.push(path); self.stacktraces.push(stacktrace); self.diam = None; - self.crashlines - .insert(crashline.to_string(), self.paths.len() - 1); + self.crashlines.insert(crashline, self.paths.len() - 1); true } /// Get cluster diameter @@ -218,11 +217,11 @@ impl Cluster { stacktraces1.append(&mut stacktraces2); diam(&stacktraces1) < THRESHOLD } - /// Convert cluster to iterator - pub fn reports(&self) -> Vec<(PathBuf, Stacktrace, String)> { - let mut reports: Vec<(PathBuf, Stacktrace, String)> = Vec::new(); + /// Convert cluster to vector of reports + pub fn reports(&self) -> Vec { + let mut reports: Vec = Vec::new(); let mut crashlines = self.crashlines.clone(); - for i in 0..self.paths.len() { + for (i, path) in self.paths.iter().enumerate() { // Get crashline for cur casrep let mut crashline = String::new(); for (line, &number) in &crashlines { @@ -234,11 +233,7 @@ impl Cluster { // Drop cur crashline from crashlines crashlines.remove(&crashline); // Update results - reports.push(( - self.paths[i].clone(), - self.stacktraces[i].clone(), - crashline, - )); + reports.push((path.clone(), (self.stacktraces[i].clone(), crashline))); } reports }