# HG changeset patch # User Boris Feld # Date 2018-11-09 17:45:23 # Node ID 0650be877a37afe370119bb21b426966c2dcb8b9 # Parent 4ec6a24029d2e53baede73d2fdab91c6631673a9 sparse-revlog: add a `trim_endidx` function in C We are about to implement a native version of `slicechunktodensity`. For clarity, we introduce the helper functions first. This function implement a subpart of the python function `_trimchunk` in `mercurial/revlogutils/deltas.py`. Handling of actual Python objects is left to the caller function. diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c --- a/mercurial/cext/revlog.c +++ b/mercurial/cext/revlog.c @@ -1078,6 +1078,24 @@ index_segment_span(indexObject *self, Py return (end_offset - start_offset) + (int64_t)end_size; } +/* returns revs[startidx:endidx] without empty trailing revs */ +static Py_ssize_t trim_endidx(indexObject *self, const Py_ssize_t *revs, + Py_ssize_t startidx, Py_ssize_t endidx) +{ + int length; + while (endidx > 1 && endidx > startidx) { + length = index_get_length(self, revs[endidx - 1]); + if (length < 0) { + return -1; + } + if (length != 0) { + break; + } + endidx -= 1; + } + return endidx; +} + static inline int nt_level(const char *node, Py_ssize_t level) { int v = node[level >> 1];