Mercurial > hgrepos > Python > libs > ConfigMix
changeset 637:4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
This fixes the handling of these deletion markers when merging
configurations: sometimes they were tried to be interpolated -- and
this failed.
| author | Franz Glasner <f.glasner@feldmann-mg.com> |
|---|---|
| date | Fri, 04 Mar 2022 17:35:27 +0100 |
| parents | 301cf2337fde |
| children | ef485419d723 |
| files | CHANGES.txt configmix/_speedups.c configmix/config.py configmix/constants.py |
| diffstat | 4 files changed, 44 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGES.txt Sun Jan 23 17:34:11 2022 +0100 +++ b/CHANGES.txt Fri Mar 04 17:35:27 2022 +0100 @@ -12,6 +12,16 @@ Pre-1.0 Series -------------- +none (n/a) +~~~~~~~~~~ + +- **[bugfix]** + The ``{{::DEL::}}`` is not subject to interpolation any more. + This fixes the handling of these deletion markers when merging + configurations: sometimes they were tried to be interpolated -- and + this failed. + + 0.20.4 (2022-01-17) ~~~~~~~~~~~~~~~~~~~
--- a/configmix/_speedups.c Sun Jan 23 17:34:11 2022 +0100 +++ b/configmix/_speedups.c Fri Mar 04 17:35:27 2022 +0100 @@ -34,6 +34,7 @@ PyObject *STARTTOK; PyObject *ENDTOK; PyObject *REF_NAMESPACE; + PyObject *DEL_VALUE; }; @@ -713,6 +714,7 @@ PyObject *s; PyObject *cache; + int cmp; Py_ssize_t s_len; Py_ssize_t idx; Py_ssize_t i, j; @@ -751,6 +753,14 @@ return NULL; } + cmp = PyUnicode_Compare(s, sstate->DEL_VALUE); + if ((cmp < 0) && PyErr_Occurred()) { + return NULL; + } + if (cmp == 0) { + return Py_NewRef(s); + } + idx = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); if (idx < 0) { PyErr_Clear(); @@ -957,6 +967,7 @@ PyObject *s; PyObject *cache = NULL; + int cmp; Py_ssize_t s_len; Py_ssize_t start, rest, end; PyObject *tmp; @@ -991,6 +1002,14 @@ return NULL; } + cmp = PyUnicode_Compare(s, sstate->DEL_VALUE); + if ((cmp < 0) && PyErr_Occurred()) { + return NULL; + } + if (cmp == 0) { + return Py_NewRef(s); + } + start = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); if (start == -2) { return NULL; @@ -1653,6 +1672,12 @@ } PyUnicode_InternInPlace(&(sstate->REF_NAMESPACE)); + sstate->DEL_VALUE = PyUnicode_FromStringAndSize("{{::DEL::}}", 3); + if (sstate->DEL_VALUE == NULL) { + return -1; + } + PyUnicode_InternInPlace(&(sstate->DEL_VALUE)); + return 0; } @@ -1677,6 +1702,7 @@ Py_VISIT(sstate->STARTTOK); Py_VISIT(sstate->ENDTOK); Py_VISIT(sstate->REF_NAMESPACE); + Py_VISIT(sstate->DEL_VALUE); } return 0; } @@ -1702,6 +1728,7 @@ Py_CLEAR(sstate->STARTTOK); Py_CLEAR(sstate->ENDTOK); Py_CLEAR(sstate->REF_NAMESPACE); + Py_CLEAR(sstate->DEL_VALUE); } return 0; }
--- a/configmix/config.py Sun Jan 23 17:34:11 2022 +0100 +++ b/configmix/config.py Fri Mar 04 17:35:27 2022 +0100 @@ -29,7 +29,7 @@ from .variables import lookup_varns, lookup_filter from .compat import u, uchr, n, str_and_u, PY2 -from .constants import REF_NAMESPACE, NONE_FILTER, EMPTY_FILTER +from .constants import REF_NAMESPACE, NONE_FILTER, EMPTY_FILTER, DEL_VALUE try: from ._speedups import (fast_unquote, fast_quote, fast_pathstr2path, _fast_split_ns, _fast_split_filters, @@ -931,6 +931,8 @@ len_s = len(s) if len_s < 4: return s + if s == DEL_VALUE: + return s start = s.find(_STARTTOK, 0) if start < 0: return s
--- a/configmix/constants.py Sun Jan 23 17:34:11 2022 +0100 +++ b/configmix/constants.py Fri Mar 04 17:35:27 2022 +0100 @@ -27,7 +27,10 @@ DEL_VALUE = _u("{{::DEL::}}") """Value for configuration items to signal that the corresponding -key-value is to be deleted when configurations are merged +key-value is to be deleted when configurations are merged. + +Despite having "interpolation" syntax this value will **never** be +substituted. """
