xdiff/xpatience: factor out fall-back-diff function
This is in preparation for the histogram diff algorithm, which will also re-use much of the code to call the default Meyers diff algorithm. Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
159607a8f1
commit
1d26b252f1
@ -287,34 +287,11 @@ static int walk_common_sequence(struct hashmap *map, struct entry *first,
|
|||||||
static int fall_back_to_classic_diff(struct hashmap *map,
|
static int fall_back_to_classic_diff(struct hashmap *map,
|
||||||
int line1, int count1, int line2, int count2)
|
int line1, int count1, int line2, int count2)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* This probably does not work outside Git, since
|
|
||||||
* we have a very simple mmfile structure.
|
|
||||||
*
|
|
||||||
* Note: ideally, we would reuse the prepared environment, but
|
|
||||||
* the libxdiff interface does not (yet) allow for diffing only
|
|
||||||
* ranges of lines instead of the whole files.
|
|
||||||
*/
|
|
||||||
mmfile_t subfile1, subfile2;
|
|
||||||
xpparam_t xpp;
|
xpparam_t xpp;
|
||||||
xdfenv_t env;
|
|
||||||
|
|
||||||
subfile1.ptr = (char *)map->env->xdf1.recs[line1 - 1]->ptr;
|
|
||||||
subfile1.size = map->env->xdf1.recs[line1 + count1 - 2]->ptr +
|
|
||||||
map->env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr;
|
|
||||||
subfile2.ptr = (char *)map->env->xdf2.recs[line2 - 1]->ptr;
|
|
||||||
subfile2.size = map->env->xdf2.recs[line2 + count2 - 2]->ptr +
|
|
||||||
map->env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr;
|
|
||||||
xpp.flags = map->xpp->flags & ~XDF_PATIENCE_DIFF;
|
xpp.flags = map->xpp->flags & ~XDF_PATIENCE_DIFF;
|
||||||
if (xdl_do_diff(&subfile1, &subfile2, &xpp, &env) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
memcpy(map->env->xdf1.rchg + line1 - 1, env.xdf1.rchg, count1);
|
return xdl_fall_back_diff(map->env, &xpp,
|
||||||
memcpy(map->env->xdf2.rchg + line2 - 1, env.xdf2.rchg, count2);
|
line1, count1, line2, count2);
|
||||||
|
|
||||||
xdl_free_env(&env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -402,3 +402,34 @@ int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
|
||||||
|
int line1, int count1, int line2, int count2)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This probably does not work outside Git, since
|
||||||
|
* we have a very simple mmfile structure.
|
||||||
|
*
|
||||||
|
* Note: ideally, we would reuse the prepared environment, but
|
||||||
|
* the libxdiff interface does not (yet) allow for diffing only
|
||||||
|
* ranges of lines instead of the whole files.
|
||||||
|
*/
|
||||||
|
mmfile_t subfile1, subfile2;
|
||||||
|
xdfenv_t env;
|
||||||
|
|
||||||
|
subfile1.ptr = (char *)diff_env->xdf1.recs[line1 - 1]->ptr;
|
||||||
|
subfile1.size = diff_env->xdf1.recs[line1 + count1 - 2]->ptr +
|
||||||
|
diff_env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr;
|
||||||
|
subfile2.ptr = (char *)diff_env->xdf2.recs[line2 - 1]->ptr;
|
||||||
|
subfile2.size = diff_env->xdf2.recs[line2 + count2 - 2]->ptr +
|
||||||
|
diff_env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr;
|
||||||
|
if (xdl_do_diff(&subfile1, &subfile2, xpp, &env) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memcpy(diff_env->xdf1.rchg + line1 - 1, env.xdf1.rchg, count1);
|
||||||
|
memcpy(diff_env->xdf2.rchg + line2 - 1, env.xdf2.rchg, count2);
|
||||||
|
|
||||||
|
xdl_free_env(&env);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -41,6 +41,8 @@ int xdl_num_out(char *out, long val);
|
|||||||
long xdl_atol(char const *str, char const **next);
|
long xdl_atol(char const *str, char const **next);
|
||||||
int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
|
int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
|
||||||
const char *func, long funclen, xdemitcb_t *ecb);
|
const char *func, long funclen, xdemitcb_t *ecb);
|
||||||
|
int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
|
||||||
|
int line1, int count1, int line2, int count2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user