xdiff: renamed third-party xdiff functions

Summary:
Renamed xdiff functions to avoid linking issues when using both libgit2-sys and xdiff.

When using repo_import tool (https://fburl.com/diffusion/8p6fhjt2) we have libgit2-sys dependency for importing git repos. However, when we derive blame data types, we need to use xdiff functionalities (from_no_parents: https://fburl.com/diffusion/pitukmyo -> diff_hunks: https://fburl.com/diffusion/9f8caan9 -> xdl_diff: https://fburl.com/diffusion/260x66hf). Both libgit2 and eden/scm have vendored versions of xdiff library. Therefore, libgit2-sys and eden/scm share functions with the same signatures, but have different behaviours and when we tried to derive blame, it used libgit2-sys's xdl_diff instead of eden's. This resulted in getting segfaults (https://fburl.com/paste/04gwalpo).
Note: repo_import is the first tool that has tried to import both and the first to run into this issue.

Reviewed By: StanislavGlebik

Differential Revision: D22432330

fbshipit-source-id: f2b965f3926a2dc45de1bf20e41dad70ca09cdfd
This commit is contained in:
Viet Hung Nguyen 2020-07-09 01:18:48 -07:00 committed by Facebook GitHub Bot
parent bf42797bd7
commit b7817ffbd8
11 changed files with 46 additions and 43 deletions

View File

@ -70,7 +70,7 @@ int main(int argc, char const *argv[])
0, /* priv */
};
xdl_diff(&a, &b, &xpp, &xecfg, &ecb);
xdl_diff_vendored(&a, &b, &xpp, &xecfg, &ecb);
free(a.ptr);
free(b.ptr);

View File

@ -52,7 +52,7 @@ static PyObject* blocks(PyObject* self, PyObject* args) {
rl, /* priv */
};
if (xdl_diff(&a, &b, &xpp, &xecfg, &ecb) != 0) {
if (xdl_diff_vendored(&a, &b, &xpp, &xecfg, &ecb) != 0) {
Py_DECREF(rl);
return PyErr_NoMemory();
}

View File

@ -71,10 +71,10 @@ typedef struct s_xdemitconf {
#define xdl_free(ptr) free(ptr)
#define xdl_realloc(ptr,x) realloc(ptr,x)
void *xdl_mmfile_first(mmfile_t *mmf, int64_t *size);
int64_t xdl_mmfile_size(mmfile_t *mmf);
void *xdl_mmfile_first_vendored(mmfile_t *mmf, int64_t *size);
int64_t xdl_mmfile_size_vendored(mmfile_t *mmf);
int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
int xdl_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
xdemitconf_t const *xecfg, xdemitcb_t *ecb);
#ifdef __cplusplus

View File

@ -269,7 +269,7 @@ static int64_t xdl_split(uint64_t const *ha1, int64_t off1, int64_t lim1,
* the box splitting function. Note that the real job (marking changed lines)
* is done in the two boundary reaching checks.
*/
int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1,
int xdl_recs_cmp_vendored(diffdata_t *dd1, int64_t off1, int64_t lim1,
diffdata_t *dd2, int64_t off2, int64_t lim2,
int64_t *kvdf, int64_t *kvdb, int need_min, xdalgoenv_t *xenv) {
uint64_t const *ha1 = dd1->ha, *ha2 = dd2->ha;
@ -312,9 +312,9 @@ int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1,
/*
* ... et Impera.
*/
if (xdl_recs_cmp(dd1, off1, spl.i1, dd2, off2, spl.i2,
if (xdl_recs_cmp_vendored(dd1, off1, spl.i1, dd2, off2, spl.i2,
kvdf, kvdb, spl.min_lo, xenv) < 0 ||
xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2,
xdl_recs_cmp_vendored(dd1, spl.i1, lim1, dd2, spl.i2, lim2,
kvdf, kvdb, spl.min_hi, xenv) < 0) {
return -1;
@ -325,7 +325,7 @@ int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1,
}
int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
int xdl_do_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
xdfenv_t *xe) {
int64_t ndiags;
int64_t *kvd, *kvdf, *kvdb;
@ -367,7 +367,7 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
dd2.rchg = xe->xdf2.rchg;
dd2.rindex = xe->xdf2.rindex;
if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
if (xdl_recs_cmp_vendored(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) {
xdl_free(kvd);
@ -817,7 +817,7 @@ static void xdl_bug(const char *msg)
* This also helps in finding joinable change groups and reducing the diff
* size.
*/
int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags) {
int xdl_change_compact_vendored(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags) {
struct xdlgroup g, go;
int64_t earliest_end, end_matching_other;
int64_t groupsize;
@ -971,7 +971,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags) {
}
int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) {
int xdl_build_script_vendored(xdfenv_t *xe, xdchange_t **xscr) {
xdchange_t *cscr = NULL, *xch;
char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg;
int64_t i1, i2, l1, l2;
@ -985,7 +985,7 @@ int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) {
for (l2 = i2; rchg2[i2 - 1]; i2--);
if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) {
xdl_free_script(cscr);
xdl_free_script_vendored(cscr);
return -1;
}
cscr = xch;
@ -997,7 +997,7 @@ int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) {
}
void xdl_free_script(xdchange_t *xscr) {
void xdl_free_script_vendored(xdchange_t *xscr) {
xdchange_t *xch;
while ((xch = xscr) != NULL) {
@ -1012,7 +1012,7 @@ void xdl_free_script(xdchange_t *xscr) {
* inside the differential hunk according to the specified configuration.
* Also advance xscr if the first changes must be discarded.
*/
xdchange_t *xdl_get_hunk(xdchange_t **xscr)
xdchange_t *xdl_get_hunk_vendored(xdchange_t **xscr)
{
xdchange_t *xch, *xchp, *lxch;
uint64_t ignored = 0; /* number of ignored blank lines */
@ -1068,7 +1068,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
if ((xecfg->flags & XDL_EMIT_BDIFFHUNK) != 0) {
int64_t i1 = 0, i2 = 0, n1 = xe->xdf1.nrec, n2 = xe->xdf2.nrec;
for (xch = xscr; xch; xch = xche->next) {
xche = xdl_get_hunk(&xch);
xche = xdl_get_hunk_vendored(&xch);
if (!xch)
break;
if (xch != xche)
@ -1087,7 +1087,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
return -1;
} else {
for (xch = xscr; xch; xch = xche->next) {
xche = xdl_get_hunk(&xch);
xche = xdl_get_hunk_vendored(&xch);
if (!xch)
break;
if (xecfg->hunk_func(xch->i1 + p,
@ -1101,29 +1101,29 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
return 0;
}
int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
int xdl_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
xdemitconf_t const *xecfg, xdemitcb_t *ecb) {
xdchange_t *xscr;
xdfenv_t xe;
if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) {
if (xdl_do_diff_vendored(mf1, mf2, xpp, &xe) < 0) {
return -1;
}
if (xdl_change_compact(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 ||
xdl_change_compact(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 ||
xdl_build_script(&xe, &xscr) < 0) {
if (xdl_change_compact_vendored(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 ||
xdl_change_compact_vendored(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 ||
xdl_build_script_vendored(&xe, &xscr) < 0) {
xdl_free_env(&xe);
return -1;
}
if (xdl_call_hunk_func(&xe, xscr, ecb, xecfg) < 0) {
xdl_free_script(xscr);
xdl_free_script_vendored(xscr);
xdl_free_env(&xe);
return -1;
}
xdl_free_script(xscr);
xdl_free_script_vendored(xscr);
xdl_free_env(&xe);
return 0;

View File

@ -46,13 +46,13 @@ typedef struct s_xdchange {
int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1,
int xdl_recs_cmp_vendored(diffdata_t *dd1, int64_t off1, int64_t lim1,
diffdata_t *dd2, int64_t off2, int64_t lim2,
int64_t *kvdf, int64_t *kvdb, int need_min, xdalgoenv_t *xenv);
int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
int xdl_do_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
xdfenv_t *xe);
int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags);
int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr);
void xdl_free_script(xdchange_t *xscr);
int xdl_change_compact_vendored(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags);
int xdl_build_script_vendored(xdfenv_t *xe, xdchange_t **xscr);
void xdl_free_script_vendored(xdchange_t *xscr);
#endif /* #if !defined(XDIFFI_H) */

View File

@ -270,7 +270,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, int64_t narec,
}
nrec = 0;
if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) {
if ((cur = blk = xdl_mmfile_first_vendored(mf, &bsize)) != NULL) {
for (top = blk + bsize; cur < top; ) {
prev = cur;
hav = xdl_hash_record(&cur, top);

View File

@ -40,14 +40,14 @@ int64_t xdl_bogosqrt(int64_t n) {
}
void *xdl_mmfile_first(mmfile_t *mmf, int64_t *size)
void *xdl_mmfile_first_vendored(mmfile_t *mmf, int64_t *size)
{
*size = mmf->size;
return mmf->ptr;
}
int64_t xdl_mmfile_size(mmfile_t *mmf)
int64_t xdl_mmfile_size_vendored(mmfile_t *mmf)
{
return mmf->size;
}
@ -104,7 +104,7 @@ int64_t xdl_guess_lines(mmfile_t *mf, int64_t sample) {
int64_t nl = 0, size, tsize = 0;
char const *data, *cur, *top;
if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) {
if ((cur = data = xdl_mmfile_first_vendored(mf, &size)) != NULL) {
for (top = data + size; nl < sample && cur < top; ) {
nl++;
if (!(cur = memchr(cur, '\n', top - cur)))
@ -116,7 +116,7 @@ int64_t xdl_guess_lines(mmfile_t *mf, int64_t sample) {
}
if (nl && tsize)
nl = xdl_mmfile_size(mf) / (tsize / nl);
nl = xdl_mmfile_size_vendored(mf) / (tsize / nl);
return nl + 1;
}

View File

@ -13,7 +13,7 @@ extern crate xdiff_sys;
use std::env;
use std::fs;
use std::os::raw::{c_char, c_int, c_void};
use xdiff_sys::{mmfile_t, xdemitcb_t, xdemitconf_t, xdl_diff, xpparam_t};
use xdiff_sys::{mmfile_t, xdemitcb_t, xdemitconf_t, xdl_diff_vendored, xpparam_t};
extern "C" fn hunk_func(a1: i64, a2: i64, b1: i64, b2: i64, _priv: *mut c_void) -> c_int {
print!("@@ -{},{} +{},{} @@\n", a1, a2, b1, b2);
@ -48,7 +48,7 @@ fn main() -> Result<(), std::io::Error> {
};
unsafe {
xdl_diff(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb);
xdl_diff_vendored(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb);
}
Ok(())
}

View File

@ -214,13 +214,16 @@ fn bindgen_test_layout_s_xdemitconf() {
}
pub type xdemitconf_t = s_xdemitconf;
extern "C" {
pub fn xdl_mmfile_first(mmf: *mut mmfile_t, size: *mut i64) -> *mut ::std::os::raw::c_void;
pub fn xdl_mmfile_first_vendored(
mmf: *mut mmfile_t,
size: *mut i64,
) -> *mut ::std::os::raw::c_void;
}
extern "C" {
pub fn xdl_mmfile_size(mmf: *mut mmfile_t) -> i64;
pub fn xdl_mmfile_size_vendored(mmf: *mut mmfile_t) -> i64;
}
extern "C" {
pub fn xdl_diff(
pub fn xdl_diff_vendored(
mf1: *mut mmfile_t,
mf2: *mut mmfile_t,
xpp: *const xpparam_t,

View File

@ -5,7 +5,7 @@
* GNU General Public License version 2.
*/
// A small subset of xdiff bindings that is just enough to run xdl_diff
// A small subset of xdiff bindings that is just enough to run xdl_diff_vendored
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
@ -19,7 +19,7 @@ mod tests {
use std::os::raw::{c_char, c_int, c_void};
#[test]
fn test_xdl_diff() {
fn test_xdl_diff_vendored() {
extern "C" fn hunk_func(a1: i64, a2: i64, b1: i64, b2: i64, _priv: *mut c_void) -> c_int {
let mut _priv = unsafe { (_priv as *mut Vec<(i64, i64, i64, i64)>).as_mut() };
if let Some(result) = _priv {
@ -49,7 +49,7 @@ mod tests {
};
unsafe {
xdl_diff(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb);
xdl_diff_vendored(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb);
}
assert_eq!(result, [(1, 1, 1, 0), (4, 0, 3, 1)]);
}

View File

@ -102,7 +102,7 @@ where
};
unsafe {
ffi::xdl_diff(&mut old_mmfile, &mut new_mmfile, &xpp, &xecfg, &mut ecb);
ffi::xdl_diff_vendored(&mut old_mmfile, &mut new_mmfile, &xpp, &xecfg, &mut ecb);
}
return result;
}