@@ -93,7 +93,9 @@ struct sline {
93
93
unsigned long * p_lno ;
94
94
};
95
95
96
- static char * grab_blob (const unsigned char * sha1 , unsigned int mode , unsigned long * size )
96
+ static char * grab_blob (const unsigned char * sha1 , unsigned int mode ,
97
+ unsigned long * size , struct userdiff_driver * textconv ,
98
+ const char * path )
97
99
{
98
100
char * blob ;
99
101
enum object_type type ;
@@ -106,6 +108,11 @@ static char *grab_blob(const unsigned char *sha1, unsigned int mode, unsigned lo
106
108
/* deleted blob */
107
109
* size = 0 ;
108
110
return xcalloc (1 , 1 );
111
+ } else if (textconv ) {
112
+ struct diff_filespec * df = alloc_filespec (path );
113
+ fill_filespec (df , sha1 , mode );
114
+ * size = fill_textconv (textconv , df , & blob );
115
+ free_filespec (df );
109
116
} else {
110
117
blob = read_sha1_file (sha1 , & type , size );
111
118
if (type != OBJ_BLOB )
@@ -205,7 +212,9 @@ static void consume_line(void *state_, char *line, unsigned long len)
205
212
static void combine_diff (const unsigned char * parent , unsigned int mode ,
206
213
mmfile_t * result_file ,
207
214
struct sline * sline , unsigned int cnt , int n ,
208
- int num_parent , int result_deleted )
215
+ int num_parent , int result_deleted ,
216
+ struct userdiff_driver * textconv ,
217
+ const char * path )
209
218
{
210
219
unsigned int p_lno , lno ;
211
220
unsigned long nmask = (1UL << n );
@@ -218,7 +227,7 @@ static void combine_diff(const unsigned char *parent, unsigned int mode,
218
227
if (result_deleted )
219
228
return ; /* result deleted */
220
229
221
- parent_file .ptr = grab_blob (parent , mode , & sz );
230
+ parent_file .ptr = grab_blob (parent , mode , & sz , textconv , path );
222
231
parent_file .size = sz ;
223
232
memset (& xpp , 0 , sizeof (xpp ));
224
233
xpp .flags = 0 ;
@@ -771,16 +780,20 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
771
780
int working_tree_file = is_null_sha1 (elem -> sha1 );
772
781
mmfile_t result_file ;
773
782
struct userdiff_driver * userdiff ;
783
+ struct userdiff_driver * textconv = NULL ;
774
784
int is_binary ;
775
785
776
786
context = opt -> context ;
777
787
userdiff = userdiff_find_by_path (elem -> path );
778
788
if (!userdiff )
779
789
userdiff = userdiff_find_by_name ("default" );
790
+ if (DIFF_OPT_TST (opt , ALLOW_TEXTCONV ))
791
+ textconv = userdiff_get_textconv (userdiff );
780
792
781
793
/* Read the result of merge first */
782
794
if (!working_tree_file )
783
- result = grab_blob (elem -> sha1 , elem -> mode , & result_size );
795
+ result = grab_blob (elem -> sha1 , elem -> mode , & result_size ,
796
+ textconv , elem -> path );
784
797
else {
785
798
/* Used by diff-tree to read from the working tree */
786
799
struct stat st ;
@@ -803,9 +816,16 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
803
816
} else if (S_ISDIR (st .st_mode )) {
804
817
unsigned char sha1 [20 ];
805
818
if (resolve_gitlink_ref (elem -> path , "HEAD" , sha1 ) < 0 )
806
- result = grab_blob (elem -> sha1 , elem -> mode , & result_size );
819
+ result = grab_blob (elem -> sha1 , elem -> mode ,
820
+ & result_size , NULL , NULL );
807
821
else
808
- result = grab_blob (sha1 , elem -> mode , & result_size );
822
+ result = grab_blob (sha1 , elem -> mode ,
823
+ & result_size , NULL , NULL );
824
+ } else if (textconv ) {
825
+ struct diff_filespec * df = alloc_filespec (elem -> path );
826
+ fill_filespec (df , null_sha1 , st .st_mode );
827
+ result_size = fill_textconv (textconv , df , & result );
828
+ free_filespec (df );
809
829
} else if (0 <= (fd = open (elem -> path , O_RDONLY ))) {
810
830
size_t len = xsize_t (st .st_size );
811
831
ssize_t done ;
@@ -862,7 +882,9 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
862
882
}
863
883
}
864
884
865
- if (userdiff -> binary != -1 )
885
+ if (textconv )
886
+ is_binary = 0 ;
887
+ else if (userdiff -> binary != -1 )
866
888
is_binary = userdiff -> binary ;
867
889
else {
868
890
is_binary = buffer_is_binary (result , result_size );
@@ -871,7 +893,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
871
893
unsigned long size ;
872
894
buf = grab_blob (elem -> parent [i ].sha1 ,
873
895
elem -> parent [i ].mode ,
874
- & size );
896
+ & size , NULL , NULL );
875
897
if (buffer_is_binary (buf , size ))
876
898
is_binary = 1 ;
877
899
free (buf );
@@ -932,7 +954,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
932
954
combine_diff (elem -> parent [i ].sha1 ,
933
955
elem -> parent [i ].mode ,
934
956
& result_file , sline ,
935
- cnt , i , num_parent , result_deleted );
957
+ cnt , i , num_parent , result_deleted ,
958
+ textconv , elem -> path );
936
959
}
937
960
938
961
show_hunks = make_hunks (sline , cnt , num_parent , dense );
0 commit comments