@@ -519,17 +519,46 @@ static int string_list_df_name_compare(const char *one, const char *two)
519519 return onelen - twolen ;
520520}
521521
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+
522542/* Per entry merge function */
523543static void process_entry (struct merge_options * opt ,
524544 const char * path ,
525- struct conflict_info * ci )
545+ struct conflict_info * ci ,
546+ struct directory_versions * dir_metadata )
526547{
527548 VERIFY_CI (ci );
528549 assert (ci -> filemask >= 0 && ci -> filemask <= 7 );
529550 /* ci->match_mask == 7 was handled in collect_merge_info_callback() */
530551 assert (ci -> match_mask == 0 || ci -> match_mask == 3 ||
531552 ci -> match_mask == 5 || ci -> match_mask == 6 );
532553
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+
533562 if (ci -> df_conflict ) {
534563 die ("Not yet implemented." );
535564 }
@@ -598,6 +627,7 @@ static void process_entry(struct merge_options *opt,
598627 */
599628 if (!ci -> merged .clean )
600629 strmap_put (& opt -> priv -> conflicted , path , ci );
630+ record_entry_for_tree (dir_metadata , path , & ci -> merged );
601631}
602632
603633static void process_entries (struct merge_options * opt ,
@@ -607,6 +637,7 @@ static void process_entries(struct merge_options *opt,
607637 struct strmap_entry * e ;
608638 struct string_list plist = STRING_LIST_INIT_NODUP ;
609639 struct string_list_item * entry ;
640+ struct directory_versions dir_metadata = { STRING_LIST_INIT_NODUP };
610641
611642 if (strmap_empty (& opt -> priv -> paths )) {
612643 oidcpy (result_oid , opt -> repo -> hash_algo -> empty_tree );
@@ -636,13 +667,16 @@ static void process_entries(struct merge_options *opt,
636667 */
637668 struct merged_info * mi = entry -> util ;
638669
639- if (!mi -> clean ) {
670+ if (mi -> clean )
671+ record_entry_for_tree (& dir_metadata , path , mi );
672+ else {
640673 struct conflict_info * ci = (struct conflict_info * )mi ;
641- process_entry (opt , path , ci );
674+ process_entry (opt , path , ci , & dir_metadata );
642675 }
643676 }
644677
645678 string_list_clear (& plist , 0 );
679+ string_list_clear (& dir_metadata .versions , 0 );
646680 die ("Tree creation not yet implemented" );
647681}
648682
0 commit comments