@@ -28,15 +28,19 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
2828 continue ;
2929 path = q -> queue [i ]-> two -> path ;
3030 len = strlen (path );
31-
32- p = xmalloc (sizeof (* p ) + len + 1 + num_parent * 20 );
33- p -> path = (char * ) & (p -> parent_sha1 [num_parent ][0 ]);
31+ p = xmalloc (combine_diff_path_size (num_parent , len ));
32+ p -> path = (char * ) & (p -> parent [num_parent ]);
3433 memcpy (p -> path , path , len );
3534 p -> path [len ] = 0 ;
3635 p -> len = len ;
3736 p -> next = NULL ;
37+ memset (p -> parent , 0 ,
38+ sizeof (p -> parent [0 ]) * num_parent );
39+
3840 memcpy (p -> sha1 , q -> queue [i ]-> two -> sha1 , 20 );
39- memcpy (p -> parent_sha1 [n ], q -> queue [i ]-> one -> sha1 , 20 );
41+ p -> mode = q -> queue [i ]-> two -> mode ;
42+ memcpy (p -> parent [n ].sha1 , q -> queue [i ]-> one -> sha1 , 20 );
43+ p -> parent [n ].mode = q -> queue [i ]-> one -> mode ;
4044 * tail = p ;
4145 tail = & p -> next ;
4246 }
@@ -57,8 +61,9 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
5761 len = strlen (path );
5862 if (len == p -> len && !memcmp (path , p -> path , len )) {
5963 found = 1 ;
60- memcpy (p -> parent_sha1 [n ],
64+ memcpy (p -> parent [n ]. sha1 ,
6165 q -> queue [i ]-> one -> sha1 , 20 );
66+ p -> parent [n ].mode = q -> queue [i ]-> one -> mode ;
6267 break ;
6368 }
6469 }
@@ -613,6 +618,7 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
613618 unsigned long size , cnt , lno ;
614619 char * result , * cp , * ep ;
615620 struct sline * sline ; /* survived lines */
621+ int mode_differs = 0 ;
616622 int i , show_hunks , shown_header = 0 ;
617623 char ourtmp_buf [TMPPATHLEN ];
618624 char * ourtmp = ourtmp_buf ;
@@ -688,20 +694,22 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
688694 for (i = 0 ; i < num_parent ; i ++ ) {
689695 int j ;
690696 for (j = 0 ; j < i ; j ++ ) {
691- if (!memcmp (elem -> parent_sha1 [i ],
692- elem -> parent_sha1 [j ], 20 )) {
697+ if (!memcmp (elem -> parent [i ]. sha1 ,
698+ elem -> parent [j ]. sha1 , 20 )) {
693699 reuse_combine_diff (sline , cnt , i , j );
694700 break ;
695701 }
696702 }
697703 if (i <= j )
698- combine_diff (elem -> parent_sha1 [i ], ourtmp , sline ,
704+ combine_diff (elem -> parent [i ]. sha1 , ourtmp , sline ,
699705 cnt , i , num_parent );
706+ if (elem -> parent [i ].mode != elem -> mode )
707+ mode_differs = 1 ;
700708 }
701709
702710 show_hunks = make_hunks (sline , cnt , num_parent , dense );
703711
704- if (show_hunks ) {
712+ if (show_hunks || mode_differs ) {
705713 const char * abb ;
706714 char null_abb [DEFAULT_ABBREV + 1 ];
707715
@@ -719,8 +727,10 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
719727 putchar ('\n' );
720728 printf ("index " );
721729 for (i = 0 ; i < num_parent ; i ++ ) {
722- if (memcmp (elem -> parent_sha1 [i ], null_sha1 , 20 ))
723- abb = find_unique_abbrev (elem -> parent_sha1 [i ],
730+ if (elem -> parent [i ].mode != elem -> mode )
731+ mode_differs = 1 ;
732+ if (memcmp (elem -> parent [i ].sha1 , null_sha1 , 20 ))
733+ abb = find_unique_abbrev (elem -> parent [i ].sha1 ,
724734 DEFAULT_ABBREV );
725735 else
726736 abb = null_abb ;
@@ -731,6 +741,16 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
731741 else
732742 abb = null_abb ;
733743 printf ("..%s\n" , abb );
744+
745+ if (mode_differs ) {
746+ printf ("mode " );
747+ for (i = 0 ; i < num_parent ; i ++ ) {
748+ printf ("%s%06o" , i ? "," : "" ,
749+ elem -> parent [i ].mode );
750+ }
751+ printf ("..%06o\n" , elem -> mode );
752+ }
753+ /* if (show_hunks) perhaps */
734754 dump_sline (sline , cnt , num_parent );
735755 }
736756 if (ourtmp == ourtmp_buf )
0 commit comments