@@ -39,6 +39,7 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
39
39
p -> mode = q -> queue [i ]-> two -> mode ;
40
40
memcpy (p -> parent [n ].sha1 , q -> queue [i ]-> one -> sha1 , 20 );
41
41
p -> parent [n ].mode = q -> queue [i ]-> one -> mode ;
42
+ p -> parent [n ].status = q -> queue [i ]-> status ;
42
43
* tail = p ;
43
44
tail = & p -> next ;
44
45
}
@@ -62,6 +63,7 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
62
63
memcpy (p -> parent [n ].sha1 ,
63
64
q -> queue [i ]-> one -> sha1 , 20 );
64
65
p -> parent [n ].mode = q -> queue [i ]-> one -> mode ;
66
+ p -> parent [n ].status = q -> queue [i ]-> status ;
65
67
break ;
66
68
}
67
69
}
@@ -618,8 +620,8 @@ static void reuse_combine_diff(struct sline *sline, unsigned long cnt,
618
620
sline -> p_lno [i ] = sline -> p_lno [j ];
619
621
}
620
622
621
- int show_combined_diff (struct combine_diff_path * elem , int num_parent ,
622
- int dense , const char * header )
623
+ static int show_patch_diff (struct combine_diff_path * elem , int num_parent ,
624
+ int dense , const char * header )
623
625
{
624
626
unsigned long size , cnt , lno ;
625
627
char * result , * cp , * ep ;
@@ -716,10 +718,7 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
716
718
717
719
if (show_hunks || mode_differs ) {
718
720
const char * abb ;
719
- char null_abb [DEFAULT_ABBREV + 1 ];
720
721
721
- memset (null_abb , '0' , DEFAULT_ABBREV );
722
- null_abb [DEFAULT_ABBREV ] = 0 ;
723
722
if (header ) {
724
723
shown_header ++ ;
725
724
puts (header );
@@ -734,26 +733,33 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
734
733
for (i = 0 ; i < num_parent ; i ++ ) {
735
734
if (elem -> parent [i ].mode != elem -> mode )
736
735
mode_differs = 1 ;
737
- if (memcmp (elem -> parent [i ].sha1 , null_sha1 , 20 ))
738
- abb = find_unique_abbrev (elem -> parent [i ].sha1 ,
739
- DEFAULT_ABBREV );
740
- else
741
- abb = null_abb ;
736
+ abb = find_unique_abbrev (elem -> parent [i ].sha1 ,
737
+ DEFAULT_ABBREV );
742
738
printf ("%s%s" , i ? "," : "" , abb );
743
739
}
744
- if (memcmp (elem -> sha1 , null_sha1 , 20 ))
745
- abb = find_unique_abbrev (elem -> sha1 , DEFAULT_ABBREV );
746
- else
747
- abb = null_abb ;
740
+ abb = find_unique_abbrev (elem -> sha1 , DEFAULT_ABBREV );
748
741
printf ("..%s\n" , abb );
749
742
750
743
if (mode_differs ) {
751
- printf ("mode " );
752
- for (i = 0 ; i < num_parent ; i ++ ) {
753
- printf ("%s%06o" , i ? "," : "" ,
754
- elem -> parent [i ].mode );
744
+ int added = !!elem -> mode ;
745
+ for (i = 0 ; added && i < num_parent ; i ++ )
746
+ if (elem -> parent [i ].status !=
747
+ DIFF_STATUS_ADDED )
748
+ added = 0 ;
749
+ if (added )
750
+ printf ("new file mode %06o" , elem -> mode );
751
+ else {
752
+ if (!elem -> mode )
753
+ printf ("deleted file " );
754
+ printf ("mode " );
755
+ for (i = 0 ; i < num_parent ; i ++ ) {
756
+ printf ("%s%06o" , i ? "," : "" ,
757
+ elem -> parent [i ].mode );
758
+ }
759
+ if (elem -> mode )
760
+ printf ("..%06o" , elem -> mode );
755
761
}
756
- printf ( "..%06o\n" , elem -> mode );
762
+ putchar ( '\n' );
757
763
}
758
764
dump_sline (sline , cnt , num_parent );
759
765
}
@@ -776,16 +782,100 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent,
776
782
return shown_header ;
777
783
}
778
784
779
- int diff_tree_combined_merge (const unsigned char * sha1 ,
780
- const char * header , int dense )
785
+ #define COLONS "::::::::::::::::::::::::::::::::"
786
+
787
+ static void show_raw_diff (struct combine_diff_path * p , int num_parent , const char * header , struct diff_options * opt )
788
+ {
789
+ int i , offset , mod_type = 'A' ;
790
+ const char * prefix ;
791
+ int line_termination , inter_name_termination ;
792
+
793
+ line_termination = opt -> line_termination ;
794
+ inter_name_termination = '\t' ;
795
+ if (!line_termination )
796
+ inter_name_termination = 0 ;
797
+
798
+ if (header )
799
+ puts (header );
800
+
801
+ for (i = 0 ; i < num_parent ; i ++ ) {
802
+ if (p -> parent [i ].mode )
803
+ mod_type = 'M' ;
804
+ }
805
+ if (!p -> mode )
806
+ mod_type = 'D' ;
807
+
808
+ if (opt -> output_format == DIFF_FORMAT_RAW ) {
809
+ offset = strlen (COLONS ) - num_parent ;
810
+ if (offset < 0 )
811
+ offset = 0 ;
812
+ prefix = COLONS + offset ;
813
+
814
+ /* Show the modes */
815
+ for (i = 0 ; i < num_parent ; i ++ ) {
816
+ printf ("%s%06o" , prefix , p -> parent [i ].mode );
817
+ prefix = " " ;
818
+ }
819
+ printf ("%s%06o" , prefix , p -> mode );
820
+
821
+ /* Show sha1's */
822
+ for (i = 0 ; i < num_parent ; i ++ )
823
+ printf (" %s" , diff_unique_abbrev (p -> parent [i ].sha1 ,
824
+ opt -> abbrev ));
825
+ printf (" %s " , diff_unique_abbrev (p -> sha1 , opt -> abbrev ));
826
+ }
827
+
828
+ if (opt -> output_format == DIFF_FORMAT_RAW ||
829
+ opt -> output_format == DIFF_FORMAT_NAME_STATUS ) {
830
+ for (i = 0 ; i < num_parent ; i ++ )
831
+ putchar (p -> parent [i ].status );
832
+ putchar (inter_name_termination );
833
+ }
834
+
835
+ if (line_termination ) {
836
+ if (quote_c_style (p -> path , NULL , NULL , 0 ))
837
+ quote_c_style (p -> path , NULL , stdout , 0 );
838
+ else
839
+ printf ("%s" , p -> path );
840
+ putchar (line_termination );
841
+ }
842
+ else {
843
+ printf ("%s%c" , p -> path , line_termination );
844
+ }
845
+ }
846
+
847
+ int show_combined_diff (struct combine_diff_path * p ,
848
+ int num_parent ,
849
+ int dense ,
850
+ const char * header ,
851
+ struct diff_options * opt )
852
+ {
853
+ if (!p -> len )
854
+ return 0 ;
855
+ switch (opt -> output_format ) {
856
+ case DIFF_FORMAT_RAW :
857
+ case DIFF_FORMAT_NAME_STATUS :
858
+ case DIFF_FORMAT_NAME :
859
+ show_raw_diff (p , num_parent , header , opt );
860
+ return 1 ;
861
+
862
+ default :
863
+ case DIFF_FORMAT_PATCH :
864
+ return show_patch_diff (p , num_parent , dense , header );
865
+ }
866
+ }
867
+
868
+ const char * diff_tree_combined_merge (const unsigned char * sha1 ,
869
+ const char * header , int dense ,
870
+ struct diff_options * opt )
781
871
{
782
872
struct commit * commit = lookup_commit (sha1 );
783
873
struct diff_options diffopts ;
784
874
struct commit_list * parents ;
785
875
struct combine_diff_path * p , * paths = NULL ;
786
876
int num_parent , i , num_paths ;
787
877
788
- diff_setup ( & diffopts ) ;
878
+ diffopts = * opt ;
789
879
diffopts .output_format = DIFF_FORMAT_NO_OUTPUT ;
790
880
diffopts .recursive = 1 ;
791
881
@@ -802,6 +892,7 @@ int diff_tree_combined_merge(const unsigned char *sha1,
802
892
struct commit * parent = parents -> item ;
803
893
diff_tree_sha1 (parent -> object .sha1 , commit -> object .sha1 , "" ,
804
894
& diffopts );
895
+ diffcore_std (& diffopts );
805
896
paths = intersect_paths (paths , i , num_parent );
806
897
diff_flush (& diffopts );
807
898
}
@@ -813,9 +904,8 @@ int diff_tree_combined_merge(const unsigned char *sha1,
813
904
}
814
905
if (num_paths ) {
815
906
for (p = paths ; p ; p = p -> next ) {
816
- if (!p -> len )
817
- continue ;
818
- if (show_combined_diff (p , num_parent , dense , header ))
907
+ if (show_combined_diff (p , num_parent , dense ,
908
+ header , opt ))
819
909
header = NULL ;
820
910
}
821
911
}
@@ -826,5 +916,5 @@ int diff_tree_combined_merge(const unsigned char *sha1,
826
916
paths = paths -> next ;
827
917
free (tmp );
828
918
}
829
- return 0 ;
919
+ return header ;
830
920
}
0 commit comments