##// END OF EJS Templates
revlog: introduce an explicit tracking of what the revlog is about...
revlog: introduce an explicit tracking of what the revlog is about Since the dawn of time, people have been forced to rely to lossy introspection of the index filename to determine what the purpose and role of the revlog they encounter is. This is hacky, error prone, inflexible, abstraction-leaky, <insert-your-own-complaints-here>. In f63299ee7e4d Raphaël introduced a new attribute to track this information: `revlog_kind`. However it is initialized in an odd place and various instances end up not having it set. In addition is only tracking some of the information we end up having to introspect in various pieces of code. So we add a new attribute that holds more data and is more strictly enforced. This work is done in collaboration with Raphaël. The `revlog_kind` one will be removed/adapted in the next changeset. We expect to be able to clean up various existing piece of code and to simplify coming work around the newer revlog format. Differential Revision: https://phab.mercurial-scm.org/D10352

File last commit:

r44311:8766728d default
r47838:4c041c71 default
Show More
revlog.cc
61 lines | 1.6 KiB | text/x-c | CppLexer
Augie Fackler
fuzz: new fuzzer for revlog's parse_index2 method...
r41050 #include <Python.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include "pyutil.h"
extern "C" {
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 static PYCODETYPE *code;
Augie Fackler
fuzz: new fuzzer for revlog's parse_index2 method...
r41050
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
{
contrib::initpy(*argv[0]);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 code = (PYCODETYPE *)Py_CompileString(R"py(
Augie Fackler
fuzz: new fuzzer for revlog's parse_index2 method...
r41050 for inline in (True, False):
try:
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 index, cache = parsers.parse_index2(data, inline)
Augie Fackler
fuzz: exercise more of the revlog API...
r41340 index.slicechunktodensity(list(range(len(index))), 0.5, 262144)
Augie Fackler
fuzz: exercise a little more revlog code...
r43421 index.stats()
index.findsnapshots({}, 0)
10 in index
Augie Fackler
fuzz: exercise more of the revlog API...
r41340 for rev in range(len(index)):
Augie Fackler
fuzz: exercise a little more revlog code...
r43421 index.reachableroots(0, [len(index)-1], [rev])
Augie Fackler
fuzz: exercise more of the revlog API...
r41340 node = index[rev][7]
partial = index.shortest(node)
index.partialmatch(node[:partial])
Augie Fackler
fuzz: exercise a little more revlog code...
r43421 index.deltachain(rev, None, True)
Augie Fackler
fuzz: new fuzzer for revlog's parse_index2 method...
r41050 except Exception as e:
pass
# uncomment this print if you're editing this Python code
# to debug failures.
# print e
)py",
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 "fuzzer", Py_file_input);
Augie Fackler
fuzz: new fuzzer for revlog's parse_index2 method...
r41050 return 0;
}
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
{
Augie Fackler
fuzz: don't allow enormous revlog inputs either...
r41339 // Don't allow fuzzer inputs larger than 60k, since we'll just bog
// down and not accomplish much.
if (Size > 60000) {
return 0;
}
Augie Fackler
fuzz: new fuzzer for revlog's parse_index2 method...
r41050 PyObject *text =
PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
PyObject *locals = PyDict_New();
PyDict_SetItemString(locals, "data", text);
PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
if (!res) {
PyErr_Print();
}
Py_XDECREF(res);
Py_DECREF(locals);
Py_DECREF(text);
return 0; // Non-zero return values are reserved for future use.
}
}