@@ -239,69 +239,96 @@ impl<T: Change> Tracker<T> {
239
239
. then_with ( || a. path . start . cmp ( & b. path . start ) . then ( a. path . end . cmp ( & b. path . end ) ) )
240
240
}
241
241
242
+ // Early abort: if there is no pair, don't do anything.
243
+ let has_work = {
244
+ let ( mut num_deletions, mut num_additions, mut num_modifications) = ( 0 , 0 , 0 ) ;
245
+ let mut has_work = false ;
246
+ for change in & self . items {
247
+ match change. change . kind ( ) {
248
+ ChangeKind :: Deletion => {
249
+ num_deletions += 1 ;
250
+ }
251
+ ChangeKind :: Modification => {
252
+ // This means we have copy-tracking enabled
253
+ num_modifications += 1 ;
254
+ }
255
+ ChangeKind :: Addition => num_additions += 1 ,
256
+ }
257
+ if ( num_deletions != 0 && num_additions != 0 )
258
+ || ( self . rewrites . copies . is_some ( ) && num_modifications + num_additions > 1 )
259
+ {
260
+ has_work = true ;
261
+ break ;
262
+ }
263
+ }
264
+ has_work
265
+ } ;
266
+
242
267
let mut out = Outcome {
243
268
options : self . rewrites ,
244
269
..Default :: default ( )
245
270
} ;
246
- self . items . sort_by ( by_id_and_location) ;
247
-
248
- // Rewrites by directory (without local changes) can be pruned out quickly,
249
- // by finding only parents, their counterpart, and then all children can be matched by
250
- // relationship ID.
251
- self . match_pairs_of_kind (
252
- visit:: SourceKind :: Rename ,
253
- & mut cb,
254
- None , /* by identity for parents */
255
- & mut out,
256
- diff_cache,
257
- objects,
258
- Some ( is_parent) ,
259
- ) ?;
260
-
261
- self . match_pairs_of_kind (
262
- visit:: SourceKind :: Rename ,
263
- & mut cb,
264
- self . rewrites . percentage ,
265
- & mut out,
266
- diff_cache,
267
- objects,
268
- None ,
269
- ) ?;
270
-
271
- self . match_renamed_directories ( & mut cb) ?;
272
-
273
- if let Some ( copies) = self . rewrites . copies {
271
+ if has_work {
272
+ self . items . sort_by ( by_id_and_location) ;
273
+
274
+ // Rewrites by directory (without local changes) can be pruned out quickly,
275
+ // by finding only parents, their counterpart, and then all children can be matched by
276
+ // relationship ID.
277
+ self . match_pairs_of_kind (
278
+ visit:: SourceKind :: Rename ,
279
+ & mut cb,
280
+ None , /* by identity for parents */
281
+ & mut out,
282
+ diff_cache,
283
+ objects,
284
+ Some ( is_parent) ,
285
+ ) ?;
286
+
274
287
self . match_pairs_of_kind (
275
- visit:: SourceKind :: Copy ,
288
+ visit:: SourceKind :: Rename ,
276
289
& mut cb,
277
- copies . percentage ,
290
+ self . rewrites . percentage ,
278
291
& mut out,
279
292
diff_cache,
280
293
objects,
281
294
None ,
282
295
) ?;
283
296
284
- match copies. source {
285
- CopySource :: FromSetOfModifiedFiles => { }
286
- CopySource :: FromSetOfModifiedFilesAndAllSources => {
287
- push_source_tree ( & mut |change, location| {
288
- if self . try_push_change ( change, location) . is_none ( ) {
289
- // make sure these aren't viable to be emitted anymore.
290
- self . items . last_mut ( ) . expect ( "just pushed" ) . emitted = true ;
291
- }
292
- } )
293
- . map_err ( |err| emit:: Error :: GetItemsForExhaustiveCopyDetection ( Box :: new ( err) ) ) ?;
294
- self . items . sort_by ( by_id_and_location) ;
295
-
296
- self . match_pairs_of_kind (
297
- visit:: SourceKind :: Copy ,
298
- & mut cb,
299
- copies. percentage ,
300
- & mut out,
301
- diff_cache,
302
- objects,
303
- None ,
304
- ) ?;
297
+ self . match_renamed_directories ( & mut cb) ?;
298
+
299
+ if let Some ( copies) = self . rewrites . copies {
300
+ self . match_pairs_of_kind (
301
+ visit:: SourceKind :: Copy ,
302
+ & mut cb,
303
+ copies. percentage ,
304
+ & mut out,
305
+ diff_cache,
306
+ objects,
307
+ None ,
308
+ ) ?;
309
+
310
+ match copies. source {
311
+ CopySource :: FromSetOfModifiedFiles => { }
312
+ CopySource :: FromSetOfModifiedFilesAndAllSources => {
313
+ push_source_tree ( & mut |change, location| {
314
+ if self . try_push_change ( change, location) . is_none ( ) {
315
+ // make sure these aren't viable to be emitted anymore.
316
+ self . items . last_mut ( ) . expect ( "just pushed" ) . emitted = true ;
317
+ }
318
+ } )
319
+ . map_err ( |err| emit:: Error :: GetItemsForExhaustiveCopyDetection ( Box :: new ( err) ) ) ?;
320
+ self . items . sort_by ( by_id_and_location) ;
321
+
322
+ self . match_pairs_of_kind (
323
+ visit:: SourceKind :: Copy ,
324
+ & mut cb,
325
+ copies. percentage ,
326
+ & mut out,
327
+ diff_cache,
328
+ objects,
329
+ None ,
330
+ ) ?;
331
+ }
305
332
}
306
333
}
307
334
}
0 commit comments