##// END OF EJS Templates
hghave: list the module needed for the `vcr` check...
hghave: list the module needed for the `vcr` check I'm tired of having to look up modules each time I setup a system, and try to distinguish between similar package names to get the right one. Now that the search API has been disabled, it's even harder. There are other python packages here that should be listed like this, but this is the one that came up missing today, so it's a start. Differential Revision: https://phab.mercurial-scm.org/D9879

File last commit:

r45488:ee5f27d7 default
r47122:66e8e279 default
Show More
pyutil.cc
76 lines | 1.7 KiB | text/x-c | CppLexer
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include "pyutil.h"
Augie Fackler
fuzz: fix an unused result on getcwd() in pyutil...
r44259 #include <iostream>
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include <string>
namespace contrib
{
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #if PY_MAJOR_VERSION >= 3
#define HG_FUZZER_PY3 1
PyMODINIT_FUNC PyInit_parsers(void);
#else
PyMODINIT_FUNC initparsers(void);
#endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 static char cpypath[8192] = "\0";
static PyObject *mainmod;
static PyObject *globals;
void initpy(const char *cselfpath)
{
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #ifdef HG_FUZZER_PY3
Augie Fackler
pyutil: this has taken so long to fix, I'm using 3.8 now...
r45488 const std::string subdir = "/sanpy/lib/python3.8";
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 const std::string subdir = "/sanpy/lib/python2.7";
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 /* HACK ALERT: we need a full Python installation built without
pymalloc and with ASAN, so we dump one in
$OUT/sanpy/lib/python2.7. This helps us wire that up. */
std::string selfpath(cselfpath);
std::string pypath;
auto pos = selfpath.rfind("/");
if (pos == std::string::npos) {
char wd[8192];
Augie Fackler
fuzz: fix an unused result on getcwd() in pyutil...
r44259 if (!getcwd(wd, 8192)) {
std::cerr << "Failed to call getcwd: errno " << errno
<< std::endl;
exit(1);
}
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 pypath = std::string(wd) + subdir;
} else {
pypath = selfpath.substr(0, pos) + subdir;
}
strncpy(cpypath, pypath.c_str(), pypath.size());
setenv("PYTHONPATH", cpypath, 1);
setenv("PYTHONNOUSERSITE", "1", 1);
/* prevent Python from looking up users in the fuzz environment */
setenv("PYTHONUSERBASE", cpypath, 1);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #ifdef HG_FUZZER_PY3
std::wstring wcpypath(pypath.begin(), pypath.end());
Py_SetPythonHome(wcpypath.c_str());
#else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 Py_SetPythonHome(cpypath);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 Py_InitializeEx(0);
mainmod = PyImport_AddModule("__main__");
globals = PyModule_GetDict(mainmod);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311
#ifdef HG_FUZZER_PY3
PyObject *mod = PyInit_parsers();
#else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 initparsers();
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 PyObject *mod = PyImport_ImportModule("parsers");
#endif
PyDict_SetItemString(globals, "parsers", mod);
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 }
PyObject *pyglobals()
{
return globals;
}
} // namespace contrib