@@ -859,8 +859,12 @@ static PyObject *fm1readmarkers(PyObject
const char *data, *dataend;
int datalen;
+ int withoffsets = 0;
Py_ssize_t offset, stop;
PyObject *markers = NULL;
+ PyObject *offsets = NULL;
+ PyObject *result = NULL;
- if (!PyArg_ParseTuple(args, "s#nn", &data, &datalen, &offset, &stop)) {
+ if (!PyArg_ParseTuple(args, "s#nn|i", &data, &datalen, &offset, &stop,
+ &withoffsets)) {
return NULL;
}
@@ -868,6 +872,10 @@ static PyObject *fm1readmarkers(PyObject
data += offset;
markers = PyList_New(0);
- if (!markers) {
- return NULL;
+ if (!markers)
+ goto bail;
+ if (withoffsets) {
+ offsets = PyList_New(0);
+ if (!offsets)
+ goto bail;
}
while (offset < stop) {
@@ -883,10 +891,29 @@ static PyObject *fm1readmarkers(PyObject
goto bail;
}
+ if (withoffsets) {
+ PyObject *pyoffset = PyInt_FromSsize_t(offset);
+ if (!pyoffset)
+ goto bail;
+ error = PyList_Append(offsets, pyoffset);
+ Py_DECREF(pyoffset);
+ if (error)
+ goto bail;
+ }
data += msize;
offset += msize;
}
- return markers;
+ if (withoffsets) {
+ result = Py_BuildValue("(OO)", markers, offsets);
+ if (!result)
+ goto bail;
+ Py_DECREF(markers);
+ Py_DECREF(offsets);
+ } else {
+ result = markers;
+ }
+ return result;
bail:
- Py_DECREF(markers);
+ Py_XDECREF(markers);
+ Py_XDECREF(offsets);
return NULL;
}
@@ -925,5 +952,5 @@ void manifest_module_init(PyObject *mod)
void revlog_module_init(PyObject *mod);
-static const int version = 1;
+static const int version = 2;
static void module_init(PyObject *mod)
@@ -179,7 +179,11 @@ usingsha256 = 2
_fm0fnodesize = _calcsize(_fm0node)
-def _fm0readmarkers(data, off, stop):
+def _fm0readmarkers(data, off, stop, withoffsets=False):
# Loop on markers
+ markers = []
+ offsets = []
while off < stop:
+ if withoffsets:
+ offsets.append(off)
# read fixed part
cur = data[off:off + _fm0fsize]
@@ -228,5 +232,9 @@ def _fm0readmarkers(data, off, stop):
metadata = tuple(sorted(metadata.iteritems()))
- yield (pre, sucs, flags, metadata, date, parents)
+ markers.append((pre, sucs, flags, metadata, date, parents))
+ if withoffsets:
+ return markers, offsets
+ else:
+ return markers
def _fm0encodeonemarker(marker):
@@ -317,5 +325,5 @@ def _fm0decodemeta(data):
_fm1metapairsize = _calcsize('BB')
-def _fm1purereadmarkers(data, off, stop):
+def _fm1purereadmarkers(data, off, stop, withoffsets=False):
# make some global constants local for performance
noneflag = _fm1parentnone
@@ -333,5 +341,9 @@ def _fm1purereadmarkers(data, off, stop)
ufixed = struct.Struct(_fm1fixed).unpack
+ markers = []
+ offsets = []
while off < stop:
+ if withoffsets:
+ offsets.append(off)
# read fixed part
o1 = off + fsize
@@ -389,5 +401,10 @@ def _fm1purereadmarkers(data, off, stop)
off = o2
- yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents)
+ markers.append((prec, sucs, flags, tuple(metadata), (secs, tz * 60),
+ parents))
+ if withoffsets:
+ return markers, offsets
+ else:
+ return markers
def _fm1encodeonemarker(marker):
@@ -427,9 +444,9 @@ def _fm1encodeonemarker(marker):
return ''.join(data)
-def _fm1readmarkers(data, off, stop):
+def _fm1readmarkers(data, off, stop, withoffsets=False):
native = getattr(parsers, 'fm1readmarkers', None)
if not native:
- return _fm1purereadmarkers(data, off, stop)
- return native(data, off, stop)
+ return _fm1purereadmarkers(data, off, stop, withoffsets)
+ return native(data, off, stop, withoffsets)
# mapping to read/write various marker formats
@@ -442,5 +459,5 @@ def _readmarkerversion(data):
@util.nogc
-def _readmarkers(data, off=None, stop=None):
+def _readmarkers(data, off=None, stop=None, withoffsets=False):
"""Read and enumerate markers from raw data"""
diskversion = _readmarkerversion(data)
@@ -452,5 +469,5 @@ def _readmarkers(data, off=None, stop=No
msg = _('parsing obsolete marker: unknown version %r') % diskversion
raise error.UnknownVersion(msg, version=diskversion)
- return diskversion, formats[diskversion][0](data, off, stop)
+ return diskversion, formats[diskversion][0](data, off, stop, withoffsets)
def encodeheader(version=_fm0version):
@@ -76,5 +76,5 @@ def _importfrom(pkgname, modname):
(r'cext', r'mpatch'): 1,
(r'cext', r'osutil'): 1,
- (r'cext', r'parsers'): 1,
+ (r'cext', r'parsers'): 2,
(r'cext', r'radixlink'): 1,
}