--- a/mercurial/parsers.c Tue Jan 15 22:34:56 2013 +0100
+++ b/mercurial/parsers.c Wed Dec 12 13:09:33 2012 -0800
@@ -1508,6 +1508,7 @@
PyObject *encodedir(PyObject *self, PyObject *args);
PyObject *pathencode(PyObject *self, PyObject *args);
+PyObject *lowerencode(PyObject *self, PyObject *args);
static PyMethodDef methods[] = {
{"pack_dirstate", pack_dirstate, METH_VARARGS, "pack a dirstate\n"},
@@ -1516,6 +1517,7 @@
{"parse_index2", parse_index2, METH_VARARGS, "parse a revlog index\n"},
{"encodedir", encodedir, METH_VARARGS, "encodedir a path\n"},
{"pathencode", pathencode, METH_VARARGS, "fncache-encode a path\n"},
+ {"lowerencode", lowerencode, METH_VARARGS, "lower-encode a path\n"},
{NULL, NULL}
};
--- a/mercurial/pathencode.c Tue Jan 15 22:34:56 2013 +0100
+++ b/mercurial/pathencode.c Wed Dec 12 13:09:33 2012 -0800
@@ -15,6 +15,7 @@
* required.
*/
+#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <assert.h>
#include <ctype.h>
@@ -481,6 +482,47 @@
static const Py_ssize_t maxstorepathlen = 120;
+static Py_ssize_t _lowerencode(char *dest, size_t destsize,
+ const char *src, Py_ssize_t len)
+{
+ static const uint32_t onebyte[8] = {
+ 1, 0x2bfffbfb, 0xe8000001, 0x2fffffff
+ };
+
+ static const uint32_t lower[8] = { 0, 0, 0x7fffffe };
+
+ Py_ssize_t i, destlen = 0;
+
+ for (i = 0; i < len; i++) {
+ if (inset(onebyte, src[i]))
+ charcopy(dest, &destlen, destsize, src[i]);
+ else if (inset(lower, src[i]))
+ charcopy(dest, &destlen, destsize, src[i] + 32);
+ else
+ escape3(dest, &destlen, destsize, src[i]);
+ }
+
+ return destlen;
+}
+
+PyObject *lowerencode(PyObject *self, PyObject *args)
+{
+ char *path;
+ Py_ssize_t len, newlen;
+ PyObject *ret;
+
+ if (!PyArg_ParseTuple(args, "s#:lowerencode", &path, &len))
+ return NULL;
+
+ newlen = _lowerencode(NULL, 0, path, len);
+ ret = PyString_FromStringAndSize(NULL, newlen);
+ if (ret)
+ newlen = _lowerencode(PyString_AS_STRING(ret), newlen,
+ path, len);
+
+ return ret;
+}
+
/*
* We currently implement only basic encoding.
*
--- a/mercurial/store.py Tue Jan 15 22:34:56 2013 +0100
+++ b/mercurial/store.py Wed Dec 12 13:09:33 2012 -0800
@@ -132,7 +132,7 @@
cmap[chr(x)] = chr(x).lower()
return lambda s: "".join([cmap[c] for c in s])
-lowerencode = _buildlowerencodefun()
+lowerencode = getattr(parsers, 'lowerencode', None) or _buildlowerencodefun()
# Windows reserved names: con, prn, aux, nul, com1..com9, lpt1..lpt9
_winres3 = ('aux', 'con', 'prn', 'nul') # length 3