@@ -1449,100 +1449,44 @@ static int merge_diff_list_insert_unmodified(
1449
1449
return error ;
1450
1450
}
1451
1451
1452
+ struct merge_diff_find_data {
1453
+ git_merge_diff_list * diff_list ;
1454
+ struct merge_diff_df_data df_data ;
1455
+ };
1456
+
1457
+ static int queue_difference (const git_index_entry * * entries , void * data )
1458
+ {
1459
+ struct merge_diff_find_data * find_data = data ;
1460
+ bool item_modified = false;
1461
+ size_t i ;
1462
+
1463
+ if (!entries [0 ] || !entries [1 ] || !entries [2 ]) {
1464
+ item_modified = true;
1465
+ } else {
1466
+ for (i = 1 ; i < 3 ; i ++ ) {
1467
+ if (index_entry_cmp (entries [0 ], entries [i ]) != 0 ) {
1468
+ item_modified = true;
1469
+ break ;
1470
+ }
1471
+ }
1472
+ }
1473
+
1474
+ return item_modified ?
1475
+ merge_diff_list_insert_conflict (
1476
+ find_data -> diff_list , & find_data -> df_data , entries ) :
1477
+ merge_diff_list_insert_unmodified (find_data -> diff_list , entries );
1478
+ }
1479
+
1452
1480
int git_merge_diff_list__find_differences (
1453
1481
git_merge_diff_list * diff_list ,
1454
1482
git_iterator * ancestor_iter ,
1455
1483
git_iterator * our_iter ,
1456
1484
git_iterator * their_iter )
1457
1485
{
1458
1486
git_iterator * iterators [3 ] = { ancestor_iter , our_iter , their_iter };
1459
- const git_index_entry * items [3 ] = {0 }, * best_cur_item , * cur_items [3 ];
1460
- git_vector_cmp entry_compare = git_index_entry_cmp ;
1461
- struct merge_diff_df_data df_data = {0 };
1462
- int cur_item_modified ;
1463
- size_t i , j ;
1464
- int error = 0 ;
1465
-
1466
- assert (diff_list && (our_iter || their_iter ));
1467
-
1468
- /* Set up the iterators */
1469
- for (i = 0 ; i < 3 ; i ++ ) {
1470
- error = git_iterator_current (& items [i ], iterators [i ]);
1471
-
1472
- if (error < 0 && error != GIT_ITEROVER )
1473
- goto done ;
1474
- }
1475
-
1476
- while (true) {
1477
- for (i = 0 ; i < 3 ; i ++ )
1478
- cur_items [i ] = NULL ;
1479
-
1480
- best_cur_item = NULL ;
1481
- cur_item_modified = 0 ;
1482
-
1483
- /* Find the next path(s) to consume from each iterator */
1484
- for (i = 0 ; i < 3 ; i ++ ) {
1485
- if (items [i ] == NULL ) {
1486
- cur_item_modified = 1 ;
1487
- continue ;
1488
- }
1489
-
1490
- if (best_cur_item == NULL ) {
1491
- best_cur_item = items [i ];
1492
- cur_items [i ] = items [i ];
1493
- } else {
1494
- int path_diff = entry_compare (items [i ], best_cur_item );
1495
-
1496
- if (path_diff < 0 ) {
1497
- /*
1498
- * Found an item that sorts before our current item, make
1499
- * our current item this one.
1500
- */
1501
- for (j = 0 ; j < i ; j ++ )
1502
- cur_items [j ] = NULL ;
1503
-
1504
- cur_item_modified = 1 ;
1505
- best_cur_item = items [i ];
1506
- cur_items [i ] = items [i ];
1507
- } else if (path_diff > 0 ) {
1508
- /* No entry for the current item, this is modified */
1509
- cur_item_modified = 1 ;
1510
- } else if (path_diff == 0 ) {
1511
- cur_items [i ] = items [i ];
1512
-
1513
- if (!cur_item_modified )
1514
- cur_item_modified = index_entry_cmp (best_cur_item , items [i ]);
1515
- }
1516
- }
1517
- }
1518
-
1519
- if (best_cur_item == NULL )
1520
- break ;
1521
-
1522
- if (cur_item_modified )
1523
- error = merge_diff_list_insert_conflict (diff_list , & df_data , cur_items );
1524
- else
1525
- error = merge_diff_list_insert_unmodified (diff_list , cur_items );
1526
- if (error < 0 )
1527
- goto done ;
1487
+ struct merge_diff_find_data find_data = { diff_list };
1528
1488
1529
- /* Advance each iterator that participated */
1530
- for (i = 0 ; i < 3 ; i ++ ) {
1531
- if (cur_items [i ] == NULL )
1532
- continue ;
1533
-
1534
- error = git_iterator_advance (& items [i ], iterators [i ]);
1535
-
1536
- if (error < 0 && error != GIT_ITEROVER )
1537
- goto done ;
1538
- }
1539
- }
1540
-
1541
- done :
1542
- if (error == GIT_ITEROVER )
1543
- error = 0 ;
1544
-
1545
- return error ;
1489
+ return git_iterator_walk (iterators , 3 , queue_difference , & find_data );
1546
1490
}
1547
1491
1548
1492
git_merge_diff_list * git_merge_diff_list__alloc (git_repository * repo )
0 commit comments