@@ -519,17 +519,46 @@ static int string_list_df_name_compare(const char *one, const char *two)
519
519
return onelen - twolen ;
520
520
}
521
521
522
+ struct directory_versions {
523
+ struct string_list versions ;
524
+ };
525
+
526
+ static void record_entry_for_tree (struct directory_versions * dir_metadata ,
527
+ const char * path ,
528
+ struct merged_info * mi )
529
+ {
530
+ const char * basename ;
531
+
532
+ if (mi -> is_null )
533
+ /* nothing to record */
534
+ return ;
535
+
536
+ basename = path + mi -> basename_offset ;
537
+ assert (strchr (basename , '/' ) == NULL );
538
+ string_list_append (& dir_metadata -> versions ,
539
+ basename )-> util = & mi -> result ;
540
+ }
541
+
522
542
/* Per entry merge function */
523
543
static void process_entry (struct merge_options * opt ,
524
544
const char * path ,
525
- struct conflict_info * ci )
545
+ struct conflict_info * ci ,
546
+ struct directory_versions * dir_metadata )
526
547
{
527
548
VERIFY_CI (ci );
528
549
assert (ci -> filemask >= 0 && ci -> filemask <= 7 );
529
550
/* ci->match_mask == 7 was handled in collect_merge_info_callback() */
530
551
assert (ci -> match_mask == 0 || ci -> match_mask == 3 ||
531
552
ci -> match_mask == 5 || ci -> match_mask == 6 );
532
553
554
+ if (ci -> dirmask ) {
555
+ record_entry_for_tree (dir_metadata , path , & ci -> merged );
556
+ if (ci -> filemask == 0 )
557
+ /* nothing else to handle */
558
+ return ;
559
+ assert (ci -> df_conflict );
560
+ }
561
+
533
562
if (ci -> df_conflict ) {
534
563
die ("Not yet implemented." );
535
564
}
@@ -598,6 +627,7 @@ static void process_entry(struct merge_options *opt,
598
627
*/
599
628
if (!ci -> merged .clean )
600
629
strmap_put (& opt -> priv -> conflicted , path , ci );
630
+ record_entry_for_tree (dir_metadata , path , & ci -> merged );
601
631
}
602
632
603
633
static void process_entries (struct merge_options * opt ,
@@ -607,6 +637,7 @@ static void process_entries(struct merge_options *opt,
607
637
struct strmap_entry * e ;
608
638
struct string_list plist = STRING_LIST_INIT_NODUP ;
609
639
struct string_list_item * entry ;
640
+ struct directory_versions dir_metadata = { STRING_LIST_INIT_NODUP };
610
641
611
642
if (strmap_empty (& opt -> priv -> paths )) {
612
643
oidcpy (result_oid , opt -> repo -> hash_algo -> empty_tree );
@@ -636,13 +667,16 @@ static void process_entries(struct merge_options *opt,
636
667
*/
637
668
struct merged_info * mi = entry -> util ;
638
669
639
- if (!mi -> clean ) {
670
+ if (mi -> clean )
671
+ record_entry_for_tree (& dir_metadata , path , mi );
672
+ else {
640
673
struct conflict_info * ci = (struct conflict_info * )mi ;
641
- process_entry (opt , path , ci );
674
+ process_entry (opt , path , ci , & dir_metadata );
642
675
}
643
676
}
644
677
645
678
string_list_clear (& plist , 0 );
679
+ string_list_clear (& dir_metadata .versions , 0 );
646
680
die ("Tree creation not yet implemented" );
647
681
}
648
682
0 commit comments