merge-tree: use ll_merge() not xdl_merge()
ll_merge() interface was designed to merge contents under git control while taking per-path attributes into account. Update the three-way merge implementation used by merge-tree to use it. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
9914cf4689
commit
15b4f7a68d
16
merge-file.c
16
merge-file.c
@ -1,6 +1,7 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "xdiff-interface.h"
|
#include "xdiff-interface.h"
|
||||||
|
#include "ll-merge.h"
|
||||||
#include "blob.h"
|
#include "blob.h"
|
||||||
|
|
||||||
static int fill_mmfile_blob(mmfile_t *f, struct blob *obj)
|
static int fill_mmfile_blob(mmfile_t *f, struct blob *obj)
|
||||||
@ -24,16 +25,13 @@ static void free_mmfile(mmfile_t *f)
|
|||||||
free(f->ptr);
|
free(f->ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *three_way_filemerge(mmfile_t *base, mmfile_t *our, mmfile_t *their, unsigned long *size)
|
static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our, mmfile_t *their, unsigned long *size)
|
||||||
{
|
{
|
||||||
mmbuffer_t res;
|
|
||||||
xmparam_t xmp;
|
|
||||||
int merge_status;
|
int merge_status;
|
||||||
|
mmbuffer_t res;
|
||||||
|
|
||||||
memset(&xmp, 0, sizeof(xmp));
|
merge_status = ll_merge(&res, path, base,
|
||||||
merge_status = xdl_merge(base, our, ".our", their, ".their",
|
our, ".our", their, ".their", 0);
|
||||||
&xmp, XDL_MERGE_ZEALOUS, &res);
|
|
||||||
|
|
||||||
if (merge_status < 0)
|
if (merge_status < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -75,7 +73,7 @@ static int generate_common_file(mmfile_t *res, mmfile_t *f1, mmfile_t *f2)
|
|||||||
return xdi_diff(f1, f2, &xpp, &xecfg, &ecb);
|
return xdi_diff(f1, f2, &xpp, &xecfg, &ecb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *merge_file(struct blob *base, struct blob *our, struct blob *their, unsigned long *size)
|
void *merge_file(const char *path, struct blob *base, struct blob *our, struct blob *their, unsigned long *size)
|
||||||
{
|
{
|
||||||
void *res = NULL;
|
void *res = NULL;
|
||||||
mmfile_t f1, f2, common;
|
mmfile_t f1, f2, common;
|
||||||
@ -108,7 +106,7 @@ void *merge_file(struct blob *base, struct blob *our, struct blob *their, unsign
|
|||||||
if (generate_common_file(&common, &f1, &f2) < 0)
|
if (generate_common_file(&common, &f1, &f2) < 0)
|
||||||
goto out_free_f2_f1;
|
goto out_free_f2_f1;
|
||||||
}
|
}
|
||||||
res = three_way_filemerge(&common, &f1, &f2, size);
|
res = three_way_filemerge(path, &common, &f1, &f2, size);
|
||||||
free_mmfile(&common);
|
free_mmfile(&common);
|
||||||
out_free_f2_f1:
|
out_free_f2_f1:
|
||||||
free_mmfile(&f2);
|
free_mmfile(&f2);
|
||||||
|
@ -54,7 +54,7 @@ static const char *explanation(struct merge_list *entry)
|
|||||||
return "removed in remote";
|
return "removed in remote";
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void *merge_file(struct blob *, struct blob *, struct blob *, unsigned long *);
|
extern void *merge_file(const char *, struct blob *, struct blob *, struct blob *, unsigned long *);
|
||||||
|
|
||||||
static void *result(struct merge_list *entry, unsigned long *size)
|
static void *result(struct merge_list *entry, unsigned long *size)
|
||||||
{
|
{
|
||||||
@ -76,7 +76,7 @@ static void *result(struct merge_list *entry, unsigned long *size)
|
|||||||
their = NULL;
|
their = NULL;
|
||||||
if (entry)
|
if (entry)
|
||||||
their = entry->blob;
|
their = entry->blob;
|
||||||
return merge_file(base, our, their, size);
|
return merge_file(entry->path, base, our, their, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *origin(struct merge_list *entry, unsigned long *size)
|
static void *origin(struct merge_list *entry, unsigned long *size)
|
||||||
|
Loading…
Reference in New Issue
Block a user