33#include "xdiff-interface.h"
44#include "blob.h"
55
6- static void rm_temp_file (const char * filename )
7- {
8- unlink (filename );
9- free ((void * )filename );
10- }
11-
12- static const char * write_temp_file (mmfile_t * f )
13- {
14- int fd ;
15- const char * tmp = getenv ("TMPDIR" );
16- char * filename ;
17-
18- if (!tmp )
19- tmp = "/tmp" ;
20- filename = mkpath ("%s/%s" , tmp , "git-tmp-XXXXXX" );
21- fd = mkstemp (filename );
22- if (fd < 0 )
23- return NULL ;
24- filename = xstrdup (filename );
25- if (f -> size != xwrite (fd , f -> ptr , f -> size )) {
26- rm_temp_file (filename );
27- return NULL ;
28- }
29- close (fd );
30- return filename ;
31- }
32-
33- static void * read_temp_file (const char * filename , unsigned long * size )
34- {
35- struct stat st ;
36- char * buf = NULL ;
37- int fd = open (filename , O_RDONLY );
38- if (fd < 0 )
39- return NULL ;
40- if (!fstat (fd , & st )) {
41- * size = st .st_size ;
42- buf = xmalloc (st .st_size );
43- if (st .st_size != xread (fd , buf , st .st_size )) {
44- free (buf );
45- buf = NULL ;
46- }
47- }
48- close (fd );
49- return buf ;
50- }
51-
526static int fill_mmfile_blob (mmfile_t * f , struct blob * obj )
537{
548 void * buf ;
@@ -72,22 +26,19 @@ static void free_mmfile(mmfile_t *f)
7226
7327static void * three_way_filemerge (mmfile_t * base , mmfile_t * our , mmfile_t * their , unsigned long * size )
7428{
75- void * res ;
76- const char * t1 , * t2 , * t3 ;
77-
78- t1 = write_temp_file (base );
79- t2 = write_temp_file (our );
80- t3 = write_temp_file (their );
81- res = NULL ;
82- if (t1 && t2 && t3 ) {
83- int code = run_command ("merge" , t2 , t1 , t3 , NULL );
84- if (!code || code == -1 )
85- res = read_temp_file (t2 , size );
86- }
87- rm_temp_file (t1 );
88- rm_temp_file (t2 );
89- rm_temp_file (t3 );
90- return res ;
29+ mmbuffer_t res ;
30+ xpparam_t xpp ;
31+ int merge_status ;
32+
33+ memset (& xpp , 0 , sizeof (xpp ));
34+ merge_status = xdl_merge (base , our , ".our" , their , ".their" ,
35+ & xpp , XDL_MERGE_ZEALOUS , & res );
36+
37+ if (merge_status < 0 )
38+ return NULL ;
39+
40+ * size = res .size ;
41+ return res .ptr ;
9142}
9243
9344static int common_outf (void * priv_ , mmbuffer_t * mb , int nbuf )
0 commit comments