just playing with tangled
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: avoid an unnecessary clone

+39 -42
+39 -42
lib/src/fix.rs
··· 275 275 // Substitute the fixed file IDs into all of the affected commits. Currently, 276 276 // fixes cannot delete or rename files, change the executable bit, or modify 277 277 // other parts of the commit like the description. 278 - repo_mut.transform_descendants( 279 - root_commits.iter().cloned().collect_vec(), 280 - |mut rewriter| { 281 - // TODO: Build the trees in parallel before `transform_descendants()` and only 282 - // keep the tree IDs in memory, so we can pass them to the rewriter. 283 - let old_commit_id = rewriter.old_commit().id().clone(); 284 - let repo_paths = commit_paths.get(&old_commit_id).unwrap(); 285 - let old_tree = rewriter.old_commit().tree()?; 286 - let mut tree_builder = MergedTreeBuilder::new(old_tree.id().clone()); 287 - let mut changes = 0; 288 - for repo_path in repo_paths { 289 - let old_value = old_tree.path_value(repo_path)?; 290 - let new_value = old_value.map(|old_term| { 291 - if let Some(TreeValue::File { id, executable }) = old_term { 292 - let file_to_fix = FileToFix { 293 - file_id: id.clone(), 294 - repo_path: repo_path.clone(), 295 - }; 296 - if let Some(new_id) = fixed_file_ids.get(&file_to_fix) { 297 - return Some(TreeValue::File { 298 - id: new_id.clone(), 299 - executable: *executable, 300 - }); 301 - } 278 + repo_mut.transform_descendants(root_commits, |mut rewriter| { 279 + // TODO: Build the trees in parallel before `transform_descendants()` and only 280 + // keep the tree IDs in memory, so we can pass them to the rewriter. 281 + let old_commit_id = rewriter.old_commit().id().clone(); 282 + let repo_paths = commit_paths.get(&old_commit_id).unwrap(); 283 + let old_tree = rewriter.old_commit().tree()?; 284 + let mut tree_builder = MergedTreeBuilder::new(old_tree.id().clone()); 285 + let mut changes = 0; 286 + for repo_path in repo_paths { 287 + let old_value = old_tree.path_value(repo_path)?; 288 + let new_value = old_value.map(|old_term| { 289 + if let Some(TreeValue::File { id, executable }) = old_term { 290 + let file_to_fix = FileToFix { 291 + file_id: id.clone(), 292 + repo_path: repo_path.clone(), 293 + }; 294 + if let Some(new_id) = fixed_file_ids.get(&file_to_fix) { 295 + return Some(TreeValue::File { 296 + id: new_id.clone(), 297 + executable: *executable, 298 + }); 302 299 } 303 - old_term.clone() 304 - }); 305 - if new_value != old_value { 306 - tree_builder.set_or_remove(repo_path.clone(), new_value); 307 - changes += 1; 308 300 } 309 - } 310 - summary.num_checked_commits += 1; 311 - if changes > 0 { 312 - summary.num_fixed_commits += 1; 313 - let new_tree = tree_builder.write_tree(rewriter.mut_repo().store())?; 314 - let builder = rewriter.reparent(); 315 - let new_commit = builder.set_tree_id(new_tree).write()?; 316 - summary 317 - .rewrites 318 - .insert(old_commit_id, new_commit.id().clone()); 301 + old_term.clone() 302 + }); 303 + if new_value != old_value { 304 + tree_builder.set_or_remove(repo_path.clone(), new_value); 305 + changes += 1; 319 306 } 320 - Ok(()) 321 - }, 322 - )?; 307 + } 308 + summary.num_checked_commits += 1; 309 + if changes > 0 { 310 + summary.num_fixed_commits += 1; 311 + let new_tree = tree_builder.write_tree(rewriter.mut_repo().store())?; 312 + let builder = rewriter.reparent(); 313 + let new_commit = builder.set_tree_id(new_tree).write()?; 314 + summary 315 + .rewrites 316 + .insert(old_commit_id, new_commit.id().clone()); 317 + } 318 + Ok(()) 319 + })?; 323 320 324 321 tracing::debug!(?summary); 325 322 Ok(summary)